Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
01ae05ffd1
commit
a53c0ca02c
|
@ -1 +1 @@
|
|||
ef061fd0ccb16fadf3d8550c12b27c4cb3159990
|
||||
59efecafe0838b6c940f67b00726c8c748d7dad5
|
||||
|
|
|
@ -3,6 +3,7 @@ import { buildApiUrl } from './api_utils';
|
|||
import { DEFAULT_PER_PAGE } from './constants';
|
||||
|
||||
const GROUPS_PATH = '/api/:version/groups.json';
|
||||
const GROUPS_MEMBERS_SINGLE_PATH = '/api/:version/groups/:group_id/members/:id';
|
||||
|
||||
export function getGroups(query, options, callback = () => {}) {
|
||||
const url = buildApiUrl(GROUPS_PATH);
|
||||
|
@ -20,3 +21,11 @@ export function getGroups(query, options, callback = () => {}) {
|
|||
return data;
|
||||
});
|
||||
}
|
||||
|
||||
export function removeMemberFromGroup(groupId, memberId, options) {
|
||||
const url = buildApiUrl(GROUPS_MEMBERS_SINGLE_PATH)
|
||||
.replace(':group_id', groupId)
|
||||
.replace(':id', memberId);
|
||||
|
||||
return axios.delete(url, { params: { ...options } });
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import $ from 'jquery';
|
|||
import Cookies from 'js-cookie';
|
||||
import { uniq } from 'lodash';
|
||||
import * as Emoji from '~/emoji';
|
||||
import { scrollToElement } from '~/lib/utils/common_utils';
|
||||
import { dispose, fixTitle } from '~/tooltips';
|
||||
import { deprecatedCreateFlash as flash } from './flash';
|
||||
import axios from './lib/utils/axios_utils';
|
||||
|
@ -495,12 +496,7 @@ export class AwardsHandler {
|
|||
}
|
||||
|
||||
scrollToAwards() {
|
||||
const options = {
|
||||
scrollTop: $('.awards').offset().top - 110,
|
||||
};
|
||||
|
||||
// eslint-disable-next-line no-jquery/no-animate
|
||||
return $('body, html').animate(options, 200);
|
||||
scrollToElement('.awards', { offset: -110 });
|
||||
}
|
||||
|
||||
addEmojiToFrequentlyUsedList(emoji) {
|
||||
|
|
|
@ -12,8 +12,6 @@ function showDenylistType() {
|
|||
}
|
||||
|
||||
export default function adminInit() {
|
||||
const modal = $('.change-owner-holder');
|
||||
|
||||
$('input#user_force_random_password').on('change', function randomPasswordClick() {
|
||||
const $elems = $('#user_password, #user_password_confirmation');
|
||||
if ($(this).attr('checked')) {
|
||||
|
@ -28,36 +26,6 @@ export default function adminInit() {
|
|||
$('.js-toggle-colors-container').toggleClass('hide');
|
||||
});
|
||||
|
||||
$('.log-tabs a').on('click', function logTabsClick(e) {
|
||||
e.preventDefault();
|
||||
$(this).tab('show');
|
||||
});
|
||||
|
||||
$('.log-bottom').on('click', (e) => {
|
||||
e.preventDefault();
|
||||
const $visibleLog = $('.file-content:visible');
|
||||
|
||||
// eslint-disable-next-line no-jquery/no-animate
|
||||
$visibleLog.animate(
|
||||
{
|
||||
scrollTop: $visibleLog.find('ol').height(),
|
||||
},
|
||||
'fast',
|
||||
);
|
||||
});
|
||||
|
||||
$('.change-owner-link').on('click', function changeOwnerLinkClick(e) {
|
||||
e.preventDefault();
|
||||
$(this).hide();
|
||||
modal.show();
|
||||
});
|
||||
|
||||
$('.change-owner-cancel-link').on('click', (e) => {
|
||||
e.preventDefault();
|
||||
modal.hide();
|
||||
$('.change-owner-link').show();
|
||||
});
|
||||
|
||||
$('li.project_member, li.group_member').on('ajax:success', refreshCurrentPage);
|
||||
|
||||
$("input[name='denylist_type']").on('click', showDenylistType);
|
||||
|
|
|
@ -90,7 +90,10 @@ Please update your Git repository remotes as soon as possible.`),
|
|||
this.isRequestPending = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
Flash(error.response.data.message);
|
||||
Flash(
|
||||
error?.response?.data?.message ||
|
||||
s__('Profiles|An error occurred while updating your username, please try again.'),
|
||||
);
|
||||
this.isRequestPending = false;
|
||||
throw error;
|
||||
});
|
||||
|
@ -121,7 +124,8 @@ Please update your Git repository remotes as soon as possible.`),
|
|||
</div>
|
||||
<gl-button
|
||||
v-gl-modal-directive="$options.modalId"
|
||||
:disabled="isRequestPending || newUsername === username"
|
||||
:disabled="newUsername === username"
|
||||
:loading="isRequestPending"
|
||||
category="primary"
|
||||
variant="warning"
|
||||
data-testid="username-change-confirmation-modal"
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add loading indicator to "Update username" button in account settings
|
||||
merge_request: 53142
|
||||
author: Kev @KevSlashNull
|
||||
type: changed
|
|
@ -5661,6 +5661,16 @@ State of a requirement.
|
|||
| `ARCHIVED` | |
|
||||
| `OPENED` | |
|
||||
|
||||
### RequirementStatusFilter
|
||||
|
||||
Status of a requirement based on last test report.
|
||||
|
||||
| Value | Description |
|
||||
| ----- | ----------- |
|
||||
| `FAILED` | |
|
||||
| `MISSING` | Requirements without any test report. |
|
||||
| `PASSED` | |
|
||||
|
||||
### SastUiComponentSize
|
||||
|
||||
Size of UI component in SAST configuration page.
|
||||
|
|
|
@ -4739,6 +4739,9 @@ msgstr ""
|
|||
msgid "Billing|An error occurred while loading billable members list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|An error occurred while removing a billable member"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|Enter at least three characters to search."
|
||||
msgstr ""
|
||||
|
||||
|
@ -4751,12 +4754,24 @@ msgstr ""
|
|||
msgid "Billing|Private"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|Remove user %{username} from your subscription"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|Type %{username} to confirm"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|Type to search"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|User was successfully removed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|Users occupying seats in"
|
||||
msgstr ""
|
||||
|
||||
msgid "Billing|You are about to remove user %{username} from your subscription. If you continue, the user will be removed from the %{namespace} group and all its subgroups and projects. This action can't be undone."
|
||||
msgstr ""
|
||||
|
||||
msgid "Bitbucket Server Import"
|
||||
msgstr ""
|
||||
|
||||
|
@ -22807,6 +22822,9 @@ msgstr ""
|
|||
msgid "Profiles|Add status emoji"
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles|An error occurred while updating your username, please try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "Profiles|Avatar cropper"
|
||||
msgstr ""
|
||||
|
||||
|
@ -24908,6 +24926,9 @@ msgstr ""
|
|||
msgid "Remove time estimate"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remove user"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remove user & report"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -2,10 +2,13 @@ import { GlModal } from '@gitlab/ui';
|
|||
import { shallowMount } from '@vue/test-utils';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import { TEST_HOST } from 'helpers/test_constants';
|
||||
import { deprecatedCreateFlash as createFlash } from '~/flash';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
|
||||
import UpdateUsername from '~/profile/account/components/update_username.vue';
|
||||
|
||||
jest.mock('~/flash');
|
||||
|
||||
describe('UpdateUsername component', () => {
|
||||
const rootUrl = TEST_HOST;
|
||||
const actionUrl = `${TEST_HOST}/update/username`;
|
||||
|
@ -105,7 +108,8 @@ describe('UpdateUsername component', () => {
|
|||
|
||||
axiosMock.onPut(actionUrl).replyOnce(() => {
|
||||
expect(input.attributes('disabled')).toBe('disabled');
|
||||
expect(openModalBtn.props('disabled')).toBe(true);
|
||||
expect(openModalBtn.props('disabled')).toBe(false);
|
||||
expect(openModalBtn.props('loading')).toBe(true);
|
||||
|
||||
return [200, { message: 'Username changed' }];
|
||||
});
|
||||
|
@ -115,6 +119,7 @@ describe('UpdateUsername component', () => {
|
|||
|
||||
expect(input.attributes('disabled')).toBe(undefined);
|
||||
expect(openModalBtn.props('disabled')).toBe(true);
|
||||
expect(openModalBtn.props('loading')).toBe(false);
|
||||
});
|
||||
|
||||
it('does not set the username after a erroneous update', async () => {
|
||||
|
@ -122,7 +127,8 @@ describe('UpdateUsername component', () => {
|
|||
|
||||
axiosMock.onPut(actionUrl).replyOnce(() => {
|
||||
expect(input.attributes('disabled')).toBe('disabled');
|
||||
expect(openModalBtn.props('disabled')).toBe(true);
|
||||
expect(openModalBtn.props('disabled')).toBe(false);
|
||||
expect(openModalBtn.props('loading')).toBe(true);
|
||||
|
||||
return [400, { message: 'Invalid username' }];
|
||||
});
|
||||
|
@ -130,6 +136,29 @@ describe('UpdateUsername component', () => {
|
|||
await expect(wrapper.vm.onConfirm()).rejects.toThrow();
|
||||
expect(input.attributes('disabled')).toBe(undefined);
|
||||
expect(openModalBtn.props('disabled')).toBe(false);
|
||||
expect(openModalBtn.props('loading')).toBe(false);
|
||||
});
|
||||
|
||||
it('shows an error message if the error response has a `message` property', async () => {
|
||||
axiosMock.onPut(actionUrl).replyOnce(() => {
|
||||
return [400, { message: 'Invalid username' }];
|
||||
});
|
||||
|
||||
await expect(wrapper.vm.onConfirm()).rejects.toThrow();
|
||||
|
||||
expect(createFlash).toBeCalledWith('Invalid username');
|
||||
});
|
||||
|
||||
it("shows a fallback error message if the error response doesn't have a `message` property", async () => {
|
||||
axiosMock.onPut(actionUrl).replyOnce(() => {
|
||||
return [400];
|
||||
});
|
||||
|
||||
await expect(wrapper.vm.onConfirm()).rejects.toThrow();
|
||||
|
||||
expect(createFlash).toBeCalledWith(
|
||||
'An error occurred while updating your username, please try again.',
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue