MM-55146_fix activate/deactivate ux when ldap users (#25167)

Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
Pablo Andrés Vélez Vidal
2023-11-02 16:31:45 +01:00
коммит произвёл GitHub
родитель aecfba2cfb
Коммит 614a1f4a48
5 изменённых файлов: 73 добавлений и 12 удалений

Просмотреть файл

@@ -22,6 +22,8 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use
username: 'other-user', username: 'other-user',
}); });
const mockMouseEvent = TestHelper.getMockMouseButtonEvent();
const requiredProps: Props = { const requiredProps: Props = {
user, user,
mfaEnabled: true, mfaEnabled: true,
@@ -57,21 +59,29 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use
test('handleMakeActive() should have called updateUserActive', async () => { test('handleMakeActive() should have called updateUserActive', async () => {
const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...requiredProps}/>); const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...requiredProps}/>);
const event = {preventDefault: jest.fn()}; wrapper.instance().handleMakeActive(mockMouseEvent, false);
wrapper.instance().handleMakeActive(event);
expect(requiredProps.actions.updateUserActive).toHaveBeenCalledTimes(1); expect(requiredProps.actions.updateUserActive).toHaveBeenCalledTimes(1);
expect(requiredProps.actions.updateUserActive).toHaveBeenCalledWith(requiredProps.user.id, true); expect(requiredProps.actions.updateUserActive).toHaveBeenCalledWith(requiredProps.user.id, true);
}); });
test('handleMakeActive() should not have called updateUserActive if user auth service is LDAP', async () => {
const ldapUserProps = {...requiredProps, user: {...requiredProps.user, auth_service: 'ldap'}};
const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...ldapUserProps}/>);
wrapper.instance().handleMakeActive(mockMouseEvent, true);
expect(requiredProps.actions.updateUserActive).toHaveBeenCalledTimes(0);
});
test('handleMakeActive() should have called onError', async () => { test('handleMakeActive() should have called onError', async () => {
const retVal = {error: {server_error_id: 'id', message: 'error'}}; const retVal = {error: {server_error_id: 'id', message: 'error'}};
const updateUserActive = jest.fn().mockResolvedValue(retVal); const updateUserActive = jest.fn().mockResolvedValue(retVal);
const props = {...requiredProps, actions: {...requiredProps.actions, updateUserActive}}; const props = {...requiredProps, actions: {...requiredProps.actions, updateUserActive}};
const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...props}/>); const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...props}/>);
const event = {preventDefault: jest.fn()}; await wrapper.instance().handleMakeActive(mockMouseEvent, false);
await wrapper.instance().handleMakeActive(event);
expect(requiredProps.onError).toHaveBeenCalledTimes(1); expect(requiredProps.onError).toHaveBeenCalledTimes(1);
expect(requiredProps.onError).toHaveBeenCalledWith({id: retVal.error.server_error_id, ...retVal.error}); expect(requiredProps.onError).toHaveBeenCalledWith({id: retVal.error.server_error_id, ...retVal.error});
@@ -86,6 +96,18 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use
expect(requiredProps.actions.updateUserActive).toHaveBeenCalledWith(requiredProps.user.id, false); expect(requiredProps.actions.updateUserActive).toHaveBeenCalledWith(requiredProps.user.id, false);
}); });
test('handleShowDeactivateMemberModal() should not have show the deactivation modal if user auth service is LDAP', async () => {
const ldapUserProps = {...requiredProps, user: {...requiredProps.user, auth_service: 'ldap'}};
const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...ldapUserProps}/>);
await wrapper.instance().handleShowDeactivateMemberModal(mockMouseEvent, true);
wrapper.update();
expect(wrapper.state('showDeactivateMemberModal')).toBeFalsy();
});
test('handleDeactivateMember() should have called onError', async () => { test('handleDeactivateMember() should have called onError', async () => {
const retVal = {error: {server_error_id: 'id', message: 'error'}}; const retVal = {error: {server_error_id: 'id', message: 'error'}};
const updateUserActive = jest.fn().mockResolvedValue(retVal); const updateUserActive = jest.fn().mockResolvedValue(retVal);
@@ -121,8 +143,7 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use
test('handleShowDeactivateMemberModal should not call the loadBots if the setting is not true', async () => { test('handleShowDeactivateMemberModal should not call the loadBots if the setting is not true', async () => {
const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...requiredProps}/>); const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...requiredProps}/>);
const event = {preventDefault: jest.fn()}; await wrapper.instance().handleShowDeactivateMemberModal(mockMouseEvent, false);
await wrapper.instance().handleShowDeactivateMemberModal(event);
expect(requiredProps.actions.loadBots).toHaveBeenCalledTimes(0); expect(requiredProps.actions.loadBots).toHaveBeenCalledTimes(0);
}); });
@@ -135,8 +156,7 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use
}; };
const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...{...requiredProps, config: overrideConfig, bots: {}}}/>); const wrapper = shallow<SystemUsersDropdown>(<SystemUsersDropdown {...{...requiredProps, config: overrideConfig, bots: {}}}/>);
const event = {preventDefault: jest.fn()}; await wrapper.instance().handleShowDeactivateMemberModal(mockMouseEvent, false);
await wrapper.instance().handleShowDeactivateMemberModal(event);
expect(requiredProps.actions.loadBots).toHaveBeenCalledTimes(1); expect(requiredProps.actions.loadBots).toHaveBeenCalledTimes(1);
}); });

Просмотреть файл

@@ -84,8 +84,12 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
}; };
} }
handleMakeActive = (e: {preventDefault: () => void}) => { handleMakeActive = (e: React.MouseEvent<HTMLButtonElement>, disableActivationToggle: boolean) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation();
if (disableActivationToggle) {
return;
}
this.props.actions.updateUserActive(this.props.user.id, true). this.props.actions.updateUserActive(this.props.user.id, true).
then(this.onUpdateActiveResult); then(this.onUpdateActiveResult);
}; };
@@ -123,8 +127,11 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
adminResetMfa(this.props.user.id, null, this.props.onError); adminResetMfa(this.props.user.id, null, this.props.onError);
}; };
handleShowDeactivateMemberModal = async (e: {preventDefault: () => void}) => { handleShowDeactivateMemberModal = async (e: React.MouseEvent<HTMLButtonElement>, disableActivationToggle: boolean) => {
e.preventDefault(); e.preventDefault();
if (disableActivationToggle) {
return;
}
if (this.shouldDisableBotsWhenOwnerIsDeactivated()) { if (this.shouldDisableBotsWhenOwnerIsDeactivated()) {
await this.props.actions.loadBots( await this.props.actions.loadBots(
Constants.Integrations.START_PAGE_NUM, Constants.Integrations.START_PAGE_NUM,
@@ -637,6 +644,12 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
const demoteToGuestModal = this.renderDemoteToGuestModal(); const demoteToGuestModal = this.renderDemoteToGuestModal();
const createGroupSyncablesMembershipsModal = this.renderCreateGroupSyncablesMembershipsModal(); const createGroupSyncablesMembershipsModal = this.renderCreateGroupSyncablesMembershipsModal();
const getExtraText = (disableActivationToggle: boolean) => {
return disableActivationToggle ? {
extraText: Utils.localizeMessage('admin.user_item.managedByLdap', 'Managed by LDAP'),
} : {};
};
const {index, totalUsers} = this.props; const {index, totalUsers} = this.props;
return ( return (
<React.Fragment> <React.Fragment>
@@ -664,15 +677,17 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
> >
<Menu.ItemAction <Menu.ItemAction
show={showMakeActive} show={showMakeActive}
onClick={this.handleMakeActive} onClick={(e: React.MouseEvent<HTMLButtonElement>) => this.handleMakeActive(e, disableActivationToggle)}
text={Utils.localizeMessage('admin.user_item.makeActive', 'Activate')} text={Utils.localizeMessage('admin.user_item.makeActive', 'Activate')}
disabled={disableActivationToggle} disabled={disableActivationToggle}
{...getExtraText(disableActivationToggle)}
/> />
<Menu.ItemAction <Menu.ItemAction
show={showMakeNotActive} show={showMakeNotActive}
onClick={this.handleShowDeactivateMemberModal} onClick={(e: React.MouseEvent<HTMLButtonElement>) => this.handleShowDeactivateMemberModal(e, disableActivationToggle)}
text={Utils.localizeMessage('admin.user_item.makeInactive', 'Deactivate')} text={Utils.localizeMessage('admin.user_item.makeInactive', 'Deactivate')}
disabled={disableActivationToggle} disabled={disableActivationToggle}
{...getExtraText(disableActivationToggle)}
/> />
<Menu.ItemAction <Menu.ItemAction
show={showManageRoles} show={showManageRoles}

Просмотреть файл

@@ -91,6 +91,20 @@
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
&.disabled {
color: rgba(var(--center-channel-color-rgb), 0.48);
cursor: default;
pointer-events: none;
&:hover {
background: none;
}
.icon {
color: rgba(var(--center-channel-color-rgb), 0.48);
}
}
&.MenuItem__with-help { &.MenuItem__with-help {
display: block; display: block;
height: auto; height: auto;

Просмотреть файл

@@ -2553,6 +2553,7 @@
"admin.user_item.makeInactive": "Deactivate", "admin.user_item.makeInactive": "Deactivate",
"admin.user_item.makeMember": "Make Team Member", "admin.user_item.makeMember": "Make Team Member",
"admin.user_item.makeTeamAdmin": "Make Team Admin", "admin.user_item.makeTeamAdmin": "Make Team Admin",
"admin.user_item.managedByLdap": "Managed by LDAP",
"admin.user_item.manageRoles": "Manage Roles", "admin.user_item.manageRoles": "Manage Roles",
"admin.user_item.manageTeams": "Manage Teams", "admin.user_item.manageTeams": "Manage Teams",
"admin.user_item.manageTokens": "Manage Tokens", "admin.user_item.manageTokens": "Manage Tokens",

Просмотреть файл

@@ -559,4 +559,15 @@ export class TestHelper {
...override, ...override,
}; };
} }
public static getMockMouseButtonEvent() {
return {
preventDefault: jest.fn(),
stopPropagation: jest.fn(),
currentTarget: {
click: jest.fn(),
value: 'test value',
},
} as unknown as React.MouseEvent<HTMLButtonElement>;
}
} }