Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
0c27b33a8d
commit
19c226e242
28 changed files with 166 additions and 94 deletions
|
@ -13,7 +13,7 @@ export const ListType = {
|
||||||
blank: 'blank',
|
blank: 'blank',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const inactiveListId = 0;
|
export const inactiveId = 0;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
BoardType,
|
BoardType,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { inactiveListId } from '~/boards/constants';
|
import { inactiveId } from '~/boards/constants';
|
||||||
|
|
||||||
export default () => ({
|
export default () => ({
|
||||||
endpoints: {},
|
endpoints: {},
|
||||||
isShowingLabels: true,
|
isShowingLabels: true,
|
||||||
activeListId: inactiveListId,
|
activeId: inactiveId,
|
||||||
});
|
});
|
||||||
|
|
|
@ -237,6 +237,8 @@ export default {
|
||||||
:data-id="issuable.id"
|
:data-id="issuable.id"
|
||||||
:data-labels="labelIdsString"
|
:data-labels="labelIdsString"
|
||||||
:data-url="issuable.web_url"
|
:data-url="issuable.web_url"
|
||||||
|
data-qa-selector="issue_container"
|
||||||
|
:data-qa-issue-title="issuable.title"
|
||||||
>
|
>
|
||||||
<div class="gl-display-flex">
|
<div class="gl-display-flex">
|
||||||
<!-- Bulk edit checkbox -->
|
<!-- Bulk edit checkbox -->
|
||||||
|
@ -265,7 +267,12 @@ export default {
|
||||||
:title="$options.confidentialTooltipText"
|
:title="$options.confidentialTooltipText"
|
||||||
:aria-label="$options.confidentialTooltipText"
|
:aria-label="$options.confidentialTooltipText"
|
||||||
/>
|
/>
|
||||||
<gl-link :href="issuable.web_url" :target="linkTarget" data-testid="issuable-title">
|
<gl-link
|
||||||
|
:href="issuable.web_url"
|
||||||
|
:target="linkTarget"
|
||||||
|
data-testid="issuable-title"
|
||||||
|
data-qa-selector="issue_link"
|
||||||
|
>
|
||||||
{{ issuable.title }}
|
{{ issuable.title }}
|
||||||
<gl-icon
|
<gl-icon
|
||||||
v-if="isJiraIssue"
|
v-if="isJiraIssue"
|
||||||
|
@ -355,6 +362,7 @@ export default {
|
||||||
:title="__('Weight')"
|
:title="__('Weight')"
|
||||||
class="gl-display-none d-sm-inline-block"
|
class="gl-display-none d-sm-inline-block"
|
||||||
data-testid="weight"
|
data-testid="weight"
|
||||||
|
data-qa-selector="issuable_weight_content"
|
||||||
>
|
>
|
||||||
<gl-icon name="weight" class="align-text-bottom" />
|
<gl-icon name="weight" class="align-text-bottom" />
|
||||||
{{ issuable.weight }}
|
{{ issuable.weight }}
|
||||||
|
|
|
@ -88,6 +88,7 @@ export default {
|
||||||
:img-size="iconSize"
|
:img-size="iconSize"
|
||||||
class="js-no-trigger"
|
class="js-no-trigger"
|
||||||
tooltip-placement="bottom"
|
tooltip-placement="bottom"
|
||||||
|
data-qa-selector="assignee_link"
|
||||||
>
|
>
|
||||||
<span class="js-assignee-tooltip">
|
<span class="js-assignee-tooltip">
|
||||||
<span class="bold d-block">{{ __('Assignee') }}</span> {{ assignee.name }}
|
<span class="bold d-block">{{ __('Assignee') }}</span> {{ assignee.name }}
|
||||||
|
@ -100,6 +101,7 @@ export default {
|
||||||
:title="assigneesCounterTooltip"
|
:title="assigneesCounterTooltip"
|
||||||
class="avatar-counter"
|
class="avatar-counter"
|
||||||
data-placement="bottom"
|
data-placement="bottom"
|
||||||
|
data-qa-selector="avatar_counter_content"
|
||||||
>{{ assigneeCounterLabel }}</span
|
>{{ assigneeCounterLabel }}</span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@ module FormHelper
|
||||||
content_tag(:h4, headline) <<
|
content_tag(:h4, headline) <<
|
||||||
content_tag(:ul) do
|
content_tag(:ul) do
|
||||||
messages = model.errors.map do |attribute, message|
|
messages = model.errors.map do |attribute, message|
|
||||||
message = model.errors.full_message(attribute, message)
|
message = html_escape_once(model.errors.full_message(attribute, message)).html_safe
|
||||||
message = content_tag(:span, message, class: 'str-truncated-100') if truncate.include?(attribute)
|
message = content_tag(:span, message, class: 'str-truncated-100') if truncate.include?(attribute)
|
||||||
|
|
||||||
content_tag(:li, message)
|
content_tag(:li, message)
|
||||||
|
|
|
@ -355,6 +355,12 @@ class User < ApplicationRecord
|
||||||
scope :order_recent_last_activity, -> { reorder(Gitlab::Database.nulls_last_order('last_activity_on', 'DESC')) }
|
scope :order_recent_last_activity, -> { reorder(Gitlab::Database.nulls_last_order('last_activity_on', 'DESC')) }
|
||||||
scope :order_oldest_last_activity, -> { reorder(Gitlab::Database.nulls_first_order('last_activity_on', 'ASC')) }
|
scope :order_oldest_last_activity, -> { reorder(Gitlab::Database.nulls_first_order('last_activity_on', 'ASC')) }
|
||||||
|
|
||||||
|
def preferred_language
|
||||||
|
read_attribute('preferred_language') ||
|
||||||
|
I18n.default_locale.to_s.presence_in(Gitlab::I18n::AVAILABLE_LANGUAGES.keys) ||
|
||||||
|
'en'
|
||||||
|
end
|
||||||
|
|
||||||
def active_for_authentication?
|
def active_for_authentication?
|
||||||
super && can?(:log_in)
|
super && can?(:log_in)
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,7 +21,7 @@ class HtmlSafetyValidator < ActiveModel::EachValidator
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.error_message
|
def self.error_message
|
||||||
_("cannot contain HTML/XML tags, including any word between angle brackets (<,>).")
|
_("cannot contain HTML/XML tags, including any word between angle brackets (<,>).")
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
= sprite_icon('close', size: 16, css_class: 'gl-icon')
|
= sprite_icon('close', size: 16, css_class: 'gl-icon')
|
||||||
.gl-alert-body
|
.gl-alert-body
|
||||||
%h4.gl-alert-title= s_('AdminSettings|Some settings have moved')
|
%h4.gl-alert-title= s_('AdminSettings|Some settings have moved')
|
||||||
= s_('AdminSettings|Elasticsearch, PlantUML, Slack application, Third party offers, Snowplow, Amazon EKS have moved to Settings > General.')
|
= html_escape_once(s_('AdminSettings|Elasticsearch, PlantUML, Slack application, Third party offers, Snowplow, Amazon EKS have moved to Settings > General.')).html_safe
|
||||||
.gl-alert-actions
|
.gl-alert-actions
|
||||||
= link_to s_('AdminSettings|Go to General Settings'), general_admin_application_settings_path, class: 'btn gl-alert-action btn-info new-gl-button'
|
= link_to s_('AdminSettings|Go to General Settings'), general_admin_application_settings_path, class: 'btn gl-alert-action btn-info new-gl-button'
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
%tbody
|
%tbody
|
||||||
- @u2f_registrations.each do |registration|
|
- @u2f_registrations.each do |registration|
|
||||||
%tr
|
%tr
|
||||||
%td= registration.name.presence || _("<no name set>")
|
%td= registration.name.presence || html_escape_once(_("<no name set>")).html_safe
|
||||||
%td= registration.created_at.to_date.to_s(:medium)
|
%td= registration.created_at.to_date.to_s(:medium)
|
||||||
%td= link_to _('Delete'), profile_u2f_registration_path(registration), method: :delete, class: "btn btn-danger float-right", data: { confirm: _('Are you sure you want to delete this device? This action cannot be undone.') }
|
%td= link_to _('Delete'), profile_u2f_registration_path(registration), method: :delete, class: "btn btn-danger float-right", data: { confirm: _('Are you sure you want to delete this device? This action cannot be undone.') }
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
-# DANGER: Any changes to this file need to be reflected in issuables_list/components/issuable.vue!
|
-# DANGER: Any changes to this file need to be reflected in issuables_list/components/issuable.vue!
|
||||||
%li{ id: dom_id(issue), class: issue_css_classes(issue), url: issue_path(issue), data: { labels: issue.label_ids, id: issue.id, qa_selector: 'issue', qa_issue_title: issue.title } }
|
%li{ id: dom_id(issue), class: issue_css_classes(issue), url: issue_path(issue), data: { labels: issue.label_ids, id: issue.id, qa_selector: 'issue_container', qa_issue_title: issue.title } }
|
||||||
.issue-box
|
.issue-box
|
||||||
- if @can_bulk_update
|
- if @can_bulk_update
|
||||||
.issue-check.hidden
|
.issue-check.hidden
|
||||||
|
|
|
@ -18,6 +18,6 @@
|
||||||
- help_page = help_page_path('/user/project/pages/pages_access_control')
|
- help_page = help_page_path('/user/project/pages/pages_access_control')
|
||||||
- link_start = '<a href="%{url}" target="_blank" class="alert-link" rel="noopener noreferrer">'.html_safe % { url: help_page }
|
- link_start = '<a href="%{url}" target="_blank" class="alert-link" rel="noopener noreferrer">'.html_safe % { url: help_page }
|
||||||
- link_end = '</a>'.html_safe
|
- link_end = '</a>'.html_safe
|
||||||
= s_('GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project\'s %{strong_start}Settings > General > Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information.').html_safe % { link_start: link_start, link_end: link_end, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe }
|
= html_escape_once(s_('GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project\'s %{strong_start}Settings > General > Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information.')).html_safe % { link_start: link_start, link_end: link_end, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe }
|
||||||
.card-footer.alert-primary
|
.card-footer.alert-primary
|
||||||
= s_('GitLabPages|It may take up to 30 minutes before the site is available after the first deployment.')
|
= s_('GitLabPages|It may take up to 30 minutes before the site is available after the first deployment.')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- pretty_name = @project&.full_name || _('<project name>')
|
- pretty_name = @project&.full_name || _('<project name>')
|
||||||
- run_actions_text = s_("ProjectService|Perform common operations on GitLab project: %{project_name}") % { project_name: pretty_name }
|
- run_actions_text = html_escape_once(s_("ProjectService|Perform common operations on GitLab project: %{project_name}") % { project_name: pretty_name })
|
||||||
|
|
||||||
.info-well
|
.info-well
|
||||||
.well-segment
|
.well-segment
|
||||||
|
@ -67,7 +67,7 @@
|
||||||
.form-group
|
.form-group
|
||||||
= label_tag :autocomplete_description, _('Autocomplete description'), class: 'col-12 col-form-label label-bold'
|
= label_tag :autocomplete_description, _('Autocomplete description'), class: 'col-12 col-form-label label-bold'
|
||||||
.col-12.input-group
|
.col-12.input-group
|
||||||
= text_field_tag :autocomplete_description, run_actions_text, class: 'form-control form-control-sm', readonly: 'readonly'
|
= text_field_tag :autocomplete_description, run_actions_text.html_safe, class: 'form-control form-control-sm', readonly: 'readonly'
|
||||||
.input-group-append
|
.input-group-append
|
||||||
= clipboard_button(target: '#autocomplete_description', class: 'input-group-text')
|
= clipboard_button(target: '#autocomplete_description', class: 'input-group-text')
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
= _('In %{time_to_now}') % { time_to_now: distance_of_time_in_words_to_now(token.expires_at) }
|
= _('In %{time_to_now}') % { time_to_now: distance_of_time_in_words_to_now(token.expires_at) }
|
||||||
- else
|
- else
|
||||||
%span.token-never-expires-label= _('Never')
|
%span.token-never-expires-label= _('Never')
|
||||||
%td= token.scopes.present? ? token.scopes.join(', ') : _('<no scopes selected>')
|
%td= token.scopes.present? ? token.scopes.join(', ') : html_escape_once(_('<no scopes selected>')).html_safe
|
||||||
%td= link_to _('Revoke'), revoke_route_helper.call(token), method: :put, class: 'btn btn-danger float-right qa-revoke-button', data: { confirm: _('Are you sure you want to revoke this %{type}? This action cannot be undone.') % { type: type } }
|
%td= link_to _('Revoke'), revoke_route_helper.call(token), method: :put, class: 'btn btn-danger float-right qa-revoke-button', data: { confirm: _('Are you sure you want to revoke this %{type}? This action cannot be undone.') % { type: type } }
|
||||||
- else
|
- else
|
||||||
.settings-message.text-center
|
.settings-message.text-center
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
In #{distance_of_time_in_words_to_now(token.expires_at)}
|
In #{distance_of_time_in_words_to_now(token.expires_at)}
|
||||||
- else
|
- else
|
||||||
%span.token-never-expires-label= _('Never')
|
%span.token-never-expires-label= _('Never')
|
||||||
%td= token.scopes.present? ? token.scopes.join(", ") : _('<no scopes selected>')
|
%td= token.scopes.present? ? token.scopes.join(", ") : html_escape_once(_('<no scopes selected>')).html_safe
|
||||||
%td= link_to s_('DeployTokens|Revoke'), "#", class: "btn btn-danger float-right", data: { toggle: "modal", target: "#revoke-modal-#{token.id}"}
|
%td= link_to s_('DeployTokens|Revoke'), "#", class: "btn btn-danger float-right", data: { toggle: "modal", target: "#revoke-modal-#{token.id}"}
|
||||||
= render 'shared/deploy_tokens/revoke_modal', token: token, group_or_project: group_or_project
|
= render 'shared/deploy_tokens/revoke_modal', token: token, group_or_project: group_or_project
|
||||||
- else
|
- else
|
||||||
|
|
|
@ -7,4 +7,4 @@
|
||||||
= link_to_member(@project, assignee, name: false, title: "Assigned to :name")
|
= link_to_member(@project, assignee, name: false, title: "Assigned to :name")
|
||||||
|
|
||||||
- if more_assignees_count.positive?
|
- if more_assignees_count.positive?
|
||||||
%span{ class: 'avatar-counter has-tooltip', data: { container: 'body', placement: 'bottom', 'line-type' => 'old', 'original-title' => "+#{more_assignees_count} more assignees", qa_selector: 'avatar_counter' } } +#{more_assignees_count}
|
%span{ class: 'avatar-counter has-tooltip', data: { container: 'body', placement: 'bottom', 'line-type' => 'old', 'original-title' => "+#{more_assignees_count} more assignees", qa_selector: 'avatar_counter_content' } } +#{more_assignees_count}
|
||||||
|
|
5
changelogs/unreleased/231329-use-cloudflare-comments.yml
Normal file
5
changelogs/unreleased/231329-use-cloudflare-comments.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Use Cloudflare in comments
|
||||||
|
merge_request: 37764
|
||||||
|
author: Takuya Noguchi
|
||||||
|
type: other
|
5
changelogs/unreleased/ab-keyset-blank-parameters.yml
Normal file
5
changelogs/unreleased/ab-keyset-blank-parameters.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Fix issue with blank keyset pagination parameters
|
||||||
|
merge_request: 37351
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Ensure User's preferred_language always has a value.
|
||||||
|
merge_request: 37464
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -196,9 +196,11 @@ To get the access credentials that your application needs to communicate with Gi
|
||||||
1. Click the **Configure** button to view the following:
|
1. Click the **Configure** button to view the following:
|
||||||
- **API URL**: URL where the client (application) connects to get a list of feature flags.
|
- **API URL**: URL where the client (application) connects to get a list of feature flags.
|
||||||
- **Instance ID**: Unique token that authorizes the retrieval of the feature flags.
|
- **Instance ID**: Unique token that authorizes the retrieval of the feature flags.
|
||||||
- **Application name**: The name of the running environment. For instance,
|
- **Application name**: The name of the *environment* the application runs in
|
||||||
if the application runs for a production server, the application name would be
|
(not the name of the application itself).
|
||||||
`production` or similar. This value is used for the environment spec evaluation.
|
|
||||||
|
For example, if the application runs for a production server, the **Application name**
|
||||||
|
could be `production` or similar. This value is used for the environment spec evaluation.
|
||||||
|
|
||||||
NOTE: **Note:**
|
NOTE: **Note:**
|
||||||
The meaning of these fields might change over time. For example, we are not sure
|
The meaning of these fields might change over time. For example, we are not sure
|
||||||
|
@ -247,7 +249,7 @@ func init() {
|
||||||
unleash.Initialize(
|
unleash.Initialize(
|
||||||
unleash.WithUrl("https://gitlab.com/api/v4/feature_flags/unleash/42"),
|
unleash.WithUrl("https://gitlab.com/api/v4/feature_flags/unleash/42"),
|
||||||
unleash.WithInstanceId("29QmjsW6KngPR5JNPMWx"),
|
unleash.WithInstanceId("29QmjsW6KngPR5JNPMWx"),
|
||||||
unleash.WithAppName("production"),
|
unleash.WithAppName("production"), // Set to the running environment of your application
|
||||||
unleash.WithListener(&metricsInterface{}),
|
unleash.WithListener(&metricsInterface{}),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -280,7 +282,7 @@ require 'unleash/context'
|
||||||
|
|
||||||
unleash = Unleash::Client.new({
|
unleash = Unleash::Client.new({
|
||||||
url: 'http://gitlab.com/api/v4/feature_flags/unleash/42',
|
url: 'http://gitlab.com/api/v4/feature_flags/unleash/42',
|
||||||
app_name: 'production',
|
app_name: 'production', # Set to the running environment of your application
|
||||||
instance_id: '29QmjsW6KngPR5JNPMWx'
|
instance_id: '29QmjsW6KngPR5JNPMWx'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -559,8 +559,8 @@ module API
|
||||||
finder_params[:search_namespaces] = true if params[:search_namespaces].present?
|
finder_params[:search_namespaces] = true if params[:search_namespaces].present?
|
||||||
finder_params[:user] = params.delete(:user) if params[:user]
|
finder_params[:user] = params.delete(:user) if params[:user]
|
||||||
finder_params[:custom_attributes] = params[:custom_attributes] if params[:custom_attributes]
|
finder_params[:custom_attributes] = params[:custom_attributes] if params[:custom_attributes]
|
||||||
finder_params[:id_after] = params[:id_after] if params[:id_after]
|
finder_params[:id_after] = sanitize_id_param(params[:id_after]) if params[:id_after]
|
||||||
finder_params[:id_before] = params[:id_before] if params[:id_before]
|
finder_params[:id_before] = sanitize_id_param(params[:id_before]) if params[:id_before]
|
||||||
finder_params[:last_activity_after] = params[:last_activity_after] if params[:last_activity_after]
|
finder_params[:last_activity_after] = params[:last_activity_after] if params[:last_activity_after]
|
||||||
finder_params[:last_activity_before] = params[:last_activity_before] if params[:last_activity_before]
|
finder_params[:last_activity_before] = params[:last_activity_before] if params[:last_activity_before]
|
||||||
finder_params[:repository_storage] = params[:repository_storage] if params[:repository_storage]
|
finder_params[:repository_storage] = params[:repository_storage] if params[:repository_storage]
|
||||||
|
@ -659,6 +659,10 @@ module API
|
||||||
def ip_address
|
def ip_address
|
||||||
env["action_dispatch.remote_ip"].to_s || request.ip
|
env["action_dispatch.remote_ip"].to_s || request.ip
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sanitize_id_param(id)
|
||||||
|
id.present? ? id.to_i : nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -74,50 +74,6 @@
|
||||||
- "< 1 hora"
|
- "< 1 hora"
|
||||||
- "< 1 saat"
|
- "< 1 saat"
|
||||||
- "< 1 Stunde"
|
- "< 1 Stunde"
|
||||||
"<namespace / project>":
|
|
||||||
plural_id:
|
|
||||||
translations:
|
|
||||||
- "<namespace / project>"
|
|
||||||
- "<простір імен / проєкт>"
|
|
||||||
"<no name set>":
|
|
||||||
translations:
|
|
||||||
- "<nenhum nome definido>"
|
|
||||||
- "<no name set>"
|
|
||||||
- "<未設定名稱>"
|
|
||||||
- "<nenhum nome definido>"
|
|
||||||
- "<no name set>"
|
|
||||||
- "<未设置名称>"
|
|
||||||
- "<ім’я не задане>"
|
|
||||||
- "<no name set>"
|
|
||||||
- "<sense nom establert>"
|
|
||||||
- "<no tiene el nombre establecido>"
|
|
||||||
- "<isim belirlenmemiş>"
|
|
||||||
"<no scopes selected>":
|
|
||||||
translations:
|
|
||||||
- "<nenhum escopo selecionado>"
|
|
||||||
- "<スコープが選択されていません>"
|
|
||||||
- "<未選擇範圍>"
|
|
||||||
- "<nenhum escopo selecionado>"
|
|
||||||
- "<no scopes selected>"
|
|
||||||
- "<未选择范围>"
|
|
||||||
- "<область дії не вибрано>"
|
|
||||||
- "<keine Bereiche ausgewählt>"
|
|
||||||
- "<ningún alcance seleccionado>"
|
|
||||||
- "<hiçbir kapsam seçilmedi>"
|
|
||||||
"<project name>":
|
|
||||||
translations:
|
|
||||||
- "<название проекта>"
|
|
||||||
- "<project name>"
|
|
||||||
- "<proje adı>"
|
|
||||||
- "<naziv projekta>"
|
|
||||||
- "<ім’я проєкту>"
|
|
||||||
"AdminSettings|Elasticsearch, PlantUML, Slack application, Third party offers, Snowplow, Amazon EKS have moved to Settings > General.":
|
|
||||||
translations:
|
|
||||||
- "Elasticsearch、PlantUML、Slackアプリケーション、サードパーティのオファー、Snowplow、Amazon EKS は 設定 > 全般 に移動しました。"
|
|
||||||
- "Elasticsearch, PlantUML, приложение Slack, предложения от третьих лиц, Snowplow, Amazon EKS были перемещены в Настройки > Общие"
|
|
||||||
- "Elasticsearch, PlantUML, застосунок Slack, пропозиції від третіх осіб, Snowplow, Amazon EKS були переміщені до Налаштувань > Загальне."
|
|
||||||
"cannot contain HTML/XML tags, including any word between angle brackets (<,>).":
|
|
||||||
translations:
|
|
||||||
"<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> will add \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\\\"#\\\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.":
|
"<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> will add \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\\\"#\\\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.":
|
||||||
plural_id:
|
plural_id:
|
||||||
translations:
|
translations:
|
||||||
|
@ -1053,3 +1009,47 @@
|
||||||
- "아래 프로젝트 목록에서 <strong>프로젝트 이름</strong>을 눌러 프로젝트 마일스톤을 봅니다."
|
- "아래 프로젝트 목록에서 <strong>프로젝트 이름</strong>을 눌러 프로젝트 마일스톤을 봅니다."
|
||||||
- "Cliquez sur n’importe quel <strong>nom de projet</strong> dans la liste des projets ci‐dessous pour naviguer jusqu’au jalon du projet."
|
- "Cliquez sur n’importe quel <strong>nom de projet</strong> dans la liste des projets ci‐dessous pour naviguer jusqu’au jalon du projet."
|
||||||
- "Haga clic en cualquier <strong>nombre de proyecto</strong> en la lista de proyectos que se muestra a continuación para navegar hasta el hito de proyecto correspondiente."
|
- "Haga clic en cualquier <strong>nombre de proyecto</strong> en la lista de proyectos que se muestra a continuación para navegar hasta el hito de proyecto correspondiente."
|
||||||
|
"<namespace / project>":
|
||||||
|
plural_id:
|
||||||
|
translations:
|
||||||
|
- "<namespace / project>"
|
||||||
|
- "<простір імен / проєкт>"
|
||||||
|
"<no name set>":
|
||||||
|
translations:
|
||||||
|
- "<nenhum nome definido>"
|
||||||
|
- "<no name set>"
|
||||||
|
- "<未設定名稱>"
|
||||||
|
- "<nenhum nome definido>"
|
||||||
|
- "<no name set>"
|
||||||
|
- "<未设置名称>"
|
||||||
|
- "<ім’я не задане>"
|
||||||
|
- "<no name set>"
|
||||||
|
- "<sense nom establert>"
|
||||||
|
- "<no tiene el nombre establecido>"
|
||||||
|
- "<isim belirlenmemiş>"
|
||||||
|
"<no scopes selected>":
|
||||||
|
translations:
|
||||||
|
- "<nenhum escopo selecionado>"
|
||||||
|
- "<スコープが選択されていません>"
|
||||||
|
- "<未選擇範圍>"
|
||||||
|
- "<nenhum escopo selecionado>"
|
||||||
|
- "<no scopes selected>"
|
||||||
|
- "<未选择范围>"
|
||||||
|
- "<область дії не вибрано>"
|
||||||
|
- "<keine Bereiche ausgewählt>"
|
||||||
|
- "<ningún alcance seleccionado>"
|
||||||
|
- "<hiçbir kapsam seçilmedi>"
|
||||||
|
"<project name>":
|
||||||
|
translations:
|
||||||
|
- "<название проекта>"
|
||||||
|
- "<project name>"
|
||||||
|
- "<proje adı>"
|
||||||
|
- "<naziv projekta>"
|
||||||
|
- "<ім’я проєкту>"
|
||||||
|
"AdminSettings|Elasticsearch, PlantUML, Slack application, Third party offers, Snowplow, Amazon EKS have moved to Settings > General.":
|
||||||
|
translations:
|
||||||
|
- "Elasticsearch、PlantUML、Slackアプリケーション、サードパーティのオファー、Snowplow、Amazon EKS は 設定 > 全般 に移動しました。"
|
||||||
|
- "Elasticsearch, PlantUML, приложение Slack, предложения от третьих лиц, Snowplow, Amazon EKS были перемещены в Настройки > Общие"
|
||||||
|
- "Elasticsearch, PlantUML, застосунок Slack, пропозиції від третіх осіб, Snowplow, Amazon EKS були переміщені до Налаштувань > Загальне."
|
||||||
|
"cannot contain HTML/XML tags, including any word between angle brackets (<,>).":
|
||||||
|
translations:
|
||||||
|
|
|
@ -762,6 +762,15 @@ msgstr ""
|
||||||
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
|
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "<no name set>"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "<no scopes selected>"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "<project name>"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "'%{level}' is not a valid visibility level"
|
msgid "'%{level}' is not a valid visibility level"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1019,12 +1028,6 @@ msgstr ""
|
||||||
msgid "<code>Protected</code> to expose them to protected branches or tags only."
|
msgid "<code>Protected</code> to expose them to protected branches or tags only."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "<no name set>"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "<no scopes selected>"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "<project name>"
|
msgid "<project name>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1729,7 +1732,7 @@ msgstr ""
|
||||||
msgid "AdminSettings|Auto DevOps domain"
|
msgid "AdminSettings|Auto DevOps domain"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AdminSettings|Elasticsearch, PlantUML, Slack application, Third party offers, Snowplow, Amazon EKS have moved to Settings > General."
|
msgid "AdminSettings|Elasticsearch, PlantUML, Slack application, Third party offers, Snowplow, Amazon EKS have moved to Settings > General."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AdminSettings|Enable shared runners for new projects"
|
msgid "AdminSettings|Enable shared runners for new projects"
|
||||||
|
@ -10309,6 +10312,9 @@ msgstr ""
|
||||||
msgid "FeatureFlags|Rollout Strategy"
|
msgid "FeatureFlags|Rollout Strategy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "FeatureFlags|Status"
|
msgid "FeatureFlags|Status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -11281,7 +11287,7 @@ msgstr ""
|
||||||
msgid "GitLabPages|%{domain} is not verified. To learn how to verify ownership, visit your %{link_start}domain details%{link_end}."
|
msgid "GitLabPages|%{domain} is not verified. To learn how to verify ownership, visit your %{link_start}domain details%{link_end}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project's %{strong_start}Settings > General > Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information."
|
msgid "GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project's %{strong_start}Settings > General > Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "GitLabPages|Access pages"
|
msgid "GitLabPages|Access pages"
|
||||||
|
@ -27869,7 +27875,7 @@ msgstr ""
|
||||||
msgid "cannot block others"
|
msgid "cannot block others"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "cannot contain HTML/XML tags, including any word between angle brackets (<,>)."
|
msgid "cannot contain HTML/XML tags, including any word between angle brackets (<,>)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "cannot include leading slash or directory traversal."
|
msgid "cannot include leading slash or directory traversal."
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
"@babel/preset-env": "^7.10.1",
|
"@babel/preset-env": "^7.10.1",
|
||||||
"@gitlab/at.js": "1.5.5",
|
"@gitlab/at.js": "1.5.5",
|
||||||
"@gitlab/svgs": "1.153.0",
|
"@gitlab/svgs": "1.153.0",
|
||||||
"@gitlab/ui": "17.35.2",
|
"@gitlab/ui": "17.36.2",
|
||||||
"@gitlab/visual-review-tools": "1.6.1",
|
"@gitlab/visual-review-tools": "1.6.1",
|
||||||
"@rails/actioncable": "^6.0.3-1",
|
"@rails/actioncable": "^6.0.3-1",
|
||||||
"@sentry/browser": "^5.10.2",
|
"@sentry/browser": "^5.10.2",
|
||||||
|
|
|
@ -5,8 +5,14 @@ module QA
|
||||||
module Project
|
module Project
|
||||||
module Issue
|
module Issue
|
||||||
class Index < Page::Base
|
class Index < Page::Base
|
||||||
view 'app/helpers/projects_helper.rb' do
|
view 'app/assets/javascripts/issuables_list/components/issuable.vue' do
|
||||||
|
element :issue_container
|
||||||
|
element :issue_link
|
||||||
|
end
|
||||||
|
|
||||||
|
view 'app/assets/javascripts/vue_shared/components/issue/issue_assignees.vue' do
|
||||||
element :assignee_link
|
element :assignee_link
|
||||||
|
element :avatar_counter_content
|
||||||
end
|
end
|
||||||
|
|
||||||
view 'app/views/projects/issues/export_csv/_button.html.haml' do
|
view 'app/views/projects/issues/export_csv/_button.html.haml' do
|
||||||
|
@ -23,21 +29,12 @@ module QA
|
||||||
element :import_from_jira_link
|
element :import_from_jira_link
|
||||||
end
|
end
|
||||||
|
|
||||||
view 'app/views/projects/issues/_issue.html.haml' do
|
|
||||||
element :issue
|
|
||||||
element :issue_link, 'link_to issue.title' # rubocop:disable QA/ElementWithPattern
|
|
||||||
end
|
|
||||||
|
|
||||||
view 'app/views/shared/issuable/_assignees.html.haml' do
|
|
||||||
element :avatar_counter
|
|
||||||
end
|
|
||||||
|
|
||||||
view 'app/views/shared/issuable/_nav.html.haml' do
|
view 'app/views/shared/issuable/_nav.html.haml' do
|
||||||
element :closed_issues_link
|
element :closed_issues_link
|
||||||
end
|
end
|
||||||
|
|
||||||
def avatar_counter
|
def avatar_counter
|
||||||
find_element(:avatar_counter)
|
find_element(:avatar_counter_content)
|
||||||
end
|
end
|
||||||
|
|
||||||
def click_issue_link(title)
|
def click_issue_link(title)
|
||||||
|
@ -80,7 +77,7 @@ module QA
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_issue?(issue)
|
def has_issue?(issue)
|
||||||
has_element? :issue, issue_title: issue.title
|
has_element? :issue_container, issue_title: issue.title
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -92,7 +92,7 @@ module QA
|
||||||
CMD
|
CMD
|
||||||
end
|
end
|
||||||
|
|
||||||
# Ping CloudFlare DNS, should fail
|
# Ping Cloudflare DNS, should fail
|
||||||
# Ping Registry, should fail to resolve
|
# Ping Registry, should fail to resolve
|
||||||
def prove_airgap
|
def prove_airgap
|
||||||
gitlab_ip = Resolv.getaddress 'registry.gitlab.com'
|
gitlab_ip = Resolv.getaddress 'registry.gitlab.com'
|
||||||
|
|
|
@ -241,6 +241,22 @@ RSpec.describe User do
|
||||||
it { is_expected.to validate_length_of(:last_name).is_at_most(127) }
|
it { is_expected.to validate_length_of(:last_name).is_at_most(127) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'preferred_language' do
|
||||||
|
context 'when its value is nil in the database' do
|
||||||
|
let(:user) { build(:user, preferred_language: nil) }
|
||||||
|
|
||||||
|
it 'falls back to I18n.default_locale when empty in the database' do
|
||||||
|
expect(user.preferred_language).to eq I18n.default_locale.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'falls back to english when I18n.default_locale is not an available language' do
|
||||||
|
I18n.default_locale = :kl
|
||||||
|
|
||||||
|
expect(user.preferred_language).to eq 'en'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'username' do
|
describe 'username' do
|
||||||
it 'validates presence' do
|
it 'validates presence' do
|
||||||
expect(subject).to validate_presence_of(:username)
|
expect(subject).to validate_presence_of(:username)
|
||||||
|
|
|
@ -386,6 +386,14 @@ RSpec.describe API::Projects do
|
||||||
let(:current_user) { user }
|
let(:current_user) { user }
|
||||||
let(:projects) { [public_project, project, project2, project3].select { |p| p.id > project2.id } }
|
let(:projects) { [public_project, project, project2, project3].select { |p| p.id > project2.id } }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'regression: empty string is ignored' do
|
||||||
|
it_behaves_like 'projects response' do
|
||||||
|
let(:filter) { { id_after: '' } }
|
||||||
|
let(:current_user) { user }
|
||||||
|
let(:projects) { [public_project, project, project2, project3] }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'and using id_before' do
|
context 'and using id_before' do
|
||||||
|
@ -394,6 +402,14 @@ RSpec.describe API::Projects do
|
||||||
let(:current_user) { user }
|
let(:current_user) { user }
|
||||||
let(:projects) { [public_project, project, project2, project3].select { |p| p.id < project2.id } }
|
let(:projects) { [public_project, project, project2, project3].select { |p| p.id < project2.id } }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'regression: empty string is ignored' do
|
||||||
|
it_behaves_like 'projects response' do
|
||||||
|
let(:filter) { { id_before: '' } }
|
||||||
|
let(:current_user) { user }
|
||||||
|
let(:projects) { [public_project, project, project2, project3] }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'and using both id_after and id_before' do
|
context 'and using both id_after and id_before' do
|
||||||
|
|
|
@ -848,10 +848,10 @@
|
||||||
resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.153.0.tgz#79db0598382e6990d242f2e8dc0911903b1f558c"
|
resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.153.0.tgz#79db0598382e6990d242f2e8dc0911903b1f558c"
|
||||||
integrity sha512-9letemutba300jT8BgxmYjUjMGDJifFFulPBNT4bxT+U2Ki+X+xs57Il3o/FNv5feJOPAlYS8Z/aEII8145g1g==
|
integrity sha512-9letemutba300jT8BgxmYjUjMGDJifFFulPBNT4bxT+U2Ki+X+xs57Il3o/FNv5feJOPAlYS8Z/aEII8145g1g==
|
||||||
|
|
||||||
"@gitlab/ui@17.35.2":
|
"@gitlab/ui@17.36.2":
|
||||||
version "17.35.2"
|
version "17.36.2"
|
||||||
resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-17.35.2.tgz#5bbabf8723bbb96cd08bca14a0d0f5356bcddd64"
|
resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-17.36.2.tgz#745a04357c631f28677bd37bc81433602b8cf71f"
|
||||||
integrity sha512-VsL8v9y8VzhM6AJ9fs+14/juBffKTLB0FRf9LKPXAUJOB3kpGnXfDNDVab6oqEA04OxoQTjxX33MIjn3ZNT1Iw==
|
integrity sha512-aO85RZYYMfWmTzhuGlSIZFSVaGYeOTMT6gmgr1UQrMnrgM7noxSh9An3byuZLbQSa7EuxjCQ2w7u2Au5WiIRKw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/standalone" "^7.0.0"
|
"@babel/standalone" "^7.0.0"
|
||||||
"@gitlab/vue-toasted" "^1.3.0"
|
"@gitlab/vue-toasted" "^1.3.0"
|
||||||
|
|
Loading…
Reference in a new issue