Commit bc684654 authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents 97b2ec92 b71733d0
...@@ -126,7 +126,7 @@ export default { ...@@ -126,7 +126,7 @@ export default {
return this.$apollo.queries.content.loading; return this.$apollo.queries.content.loading;
}, },
isBlobContentError() { isBlobContentError() {
return this.failureType === LOAD_FAILURE_NO_FILE || this.failureType === LOAD_FAILURE_UNKNOWN; return this.failureType === LOAD_FAILURE_NO_FILE;
}, },
isCiConfigDataLoading() { isCiConfigDataLoading() {
return this.$apollo.queries.ciConfigData.loading; return this.$apollo.queries.ciConfigData.loading;
......
...@@ -1378,7 +1378,14 @@ class User < ApplicationRecord ...@@ -1378,7 +1378,14 @@ class User < ApplicationRecord
def set_username_errors def set_username_errors
namespace_path_errors = self.errors.delete(:"namespace.path") namespace_path_errors = self.errors.delete(:"namespace.path")
self.errors[:username].concat(namespace_path_errors) if namespace_path_errors
return unless namespace_path_errors&.any?
if namespace_path_errors.include?('has already been taken') && !User.exists?(username: username)
self.errors.add(:base, :username_exists_as_a_different_namespace)
else
self.errors[:username].concat(namespace_path_errors)
end
end end
def username_changed_hook def username_changed_hook
......
...@@ -154,7 +154,7 @@ ...@@ -154,7 +154,7 @@
.sidebar-collapsed-icon{ data: { toggle: 'tooltip', placement: 'left', container: 'body', boundary: 'viewport' }, title: _('Move issue') } .sidebar-collapsed-icon{ data: { toggle: 'tooltip', placement: 'left', container: 'body', boundary: 'viewport' }, title: _('Move issue') }
= custom_icon('icon_arrow_right') = custom_icon('icon_arrow_right')
.dropdown.sidebar-move-issue-dropdown.hide-collapsed .dropdown.sidebar-move-issue-dropdown.hide-collapsed
%button.btn.btn-default.btn-block.js-sidebar-dropdown-toggle.js-move-issue{ type: 'button', %button.gl-button.btn.btn-default.btn-block.js-sidebar-dropdown-toggle.js-move-issue{ type: 'button',
data: { toggle: 'dropdown', display: 'static', track_label: "right_sidebar", track_property: "move_issue", track_event: "click_button", track_value: "" } } data: { toggle: 'dropdown', display: 'static', track_label: "right_sidebar", track_property: "move_issue", track_event: "click_button", track_value: "" } }
= _('Move issue') = _('Move issue')
.dropdown-menu.dropdown-menu-selectable.dropdown-extended-height .dropdown-menu.dropdown-menu-selectable.dropdown-extended-height
...@@ -163,7 +163,7 @@ ...@@ -163,7 +163,7 @@
= dropdown_content = dropdown_content
= dropdown_loading = dropdown_loading
= dropdown_footer add_content_class: true do = dropdown_footer add_content_class: true do
%button.btn.btn-success.sidebar-move-issue-confirmation-button.js-move-issue-confirmation-button{ type: 'button', disabled: true } %button.gl-button.btn.btn-success.sidebar-move-issue-confirmation-button.js-move-issue-confirmation-button{ type: 'button', disabled: true }
= _('Move') = _('Move')
= loading_icon(css_class: 'gl-vertical-align-text-bottom sidebar-move-issue-confirmation-loading-icon') = loading_icon(css_class: 'gl-vertical-align-text-bottom sidebar-move-issue-confirmation-loading-icon')
......
---
title: Improve error message when username and namespace conflict
merge_request: 47537
author:
type: changed
---
title: Add `gl-button` to move issue button in issue sidebar
merge_request: 51285
author: Yogi (@yo)
type: other
...@@ -169,6 +169,7 @@ en: ...@@ -169,6 +169,7 @@ en:
format: "%{attribute} %{message}" format: "%{attribute} %{message}"
messages: messages:
label_already_exists_at_group_level: "already exists at group level for %{group}. Please choose another one." label_already_exists_at_group_level: "already exists at group level for %{group}. Please choose another one."
username_exists_as_a_different_namespace: A user, alias, or group already exists with that username.
wrong_size: "is the wrong size (should be %{file_size})" wrong_size: "is the wrong size (should be %{file_size})"
size_too_small: "is too small (should be at least %{file_size})" size_too_small: "is too small (should be at least %{file_size})"
size_too_big: "is too big (should be at most %{file_size})" size_too_big: "is too big (should be at most %{file_size})"
......
...@@ -448,16 +448,7 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => { ...@@ -448,16 +448,7 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => {
const expectedAlertMsg = const expectedAlertMsg =
'There is no .gitlab-ci.yml file in this repository, please add one and visit the Pipeline Editor again.'; 'There is no .gitlab-ci.yml file in this repository, please add one and visit the Pipeline Editor again.';
it('does not show editor or commit form', async () => { it('shows a 404 error message and does not show editor or commit form', async () => {
mockBlobContentData.mockRejectedValueOnce(new Error('My error!'));
createComponentWithApollo();
await waitForPromises();
expect(findEditorLite().exists()).toBe(false);
expect(findTextEditor().exists()).toBe(false);
});
it('shows a 404 error message', async () => {
mockBlobContentData.mockRejectedValueOnce({ mockBlobContentData.mockRejectedValueOnce({
response: { response: {
status: httpStatusCodes.NOT_FOUND, status: httpStatusCodes.NOT_FOUND,
...@@ -468,9 +459,11 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => { ...@@ -468,9 +459,11 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => {
await waitForPromises(); await waitForPromises();
expect(findAlert().text()).toBe(expectedAlertMsg); expect(findAlert().text()).toBe(expectedAlertMsg);
expect(findEditorLite().exists()).toBe(false);
expect(findTextEditor().exists()).toBe(false);
}); });
it('shows a 400 error message', async () => { it('shows a 400 error message and does not show editor or commit form', async () => {
mockBlobContentData.mockRejectedValueOnce({ mockBlobContentData.mockRejectedValueOnce({
response: { response: {
status: httpStatusCodes.BAD_REQUEST, status: httpStatusCodes.BAD_REQUEST,
...@@ -481,6 +474,8 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => { ...@@ -481,6 +474,8 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => {
await waitForPromises(); await waitForPromises();
expect(findAlert().text()).toBe(expectedAlertMsg); expect(findAlert().text()).toBe(expectedAlertMsg);
expect(findEditorLite().exists()).toBe(false);
expect(findTextEditor().exists()).toBe(false);
}); });
it('shows a unkown error message', async () => { it('shows a unkown error message', async () => {
...@@ -489,6 +484,8 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => { ...@@ -489,6 +484,8 @@ describe('~/pipeline_editor/pipeline_editor_app.vue', () => {
await waitForPromises(); await waitForPromises();
expect(findAlert().text()).toBe('The CI configuration was not loaded, please try again.'); expect(findAlert().text()).toBe('The CI configuration was not loaded, please try again.');
expect(findEditorLite().exists()).toBe(true);
expect(findTextEditor().exists()).toBe(true);
}); });
}); });
}); });
......
...@@ -4280,7 +4280,7 @@ RSpec.describe User do ...@@ -4280,7 +4280,7 @@ RSpec.describe User do
it 'adds the namespace errors to the user' do it 'adds the namespace errors to the user' do
user.update(username: new_username) user.update(username: new_username)
expect(user.errors.full_messages.first).to eq('Username has already been taken') expect(user.errors.full_messages.first).to eq('A user, alias, or group already exists with that username.')
end end
end end
end end
......
...@@ -31,7 +31,7 @@ RSpec.describe Users::UpdateService do ...@@ -31,7 +31,7 @@ RSpec.describe Users::UpdateService do
result = update_user(user, { username: 'taken' }) result = update_user(user, { username: 'taken' })
end.not_to change { user.reload.username } end.not_to change { user.reload.username }
expect(result[:status]).to eq(:error) expect(result[:status]).to eq(:error)
expect(result[:message]).to eq('Username has already been taken') expect(result[:message]).to eq('A user, alias, or group already exists with that username.')
end end
it 'updates the status if status params were given' do it 'updates the status if status params were given' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment