MM-55146_fix activate/deactivate ux when ldap users (#25167)
Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
aecfba2cfb
Коммит
614a1f4a48
@@ -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>;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user