From 614a1f4a48765b7c45b42f93c399eb90abc0e833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Andr=C3=A9s=20V=C3=A9lez=20Vidal?= Date: Thu, 2 Nov 2023 16:31:45 +0100 Subject: [PATCH] MM-55146_fix activate/deactivate ux when ldap users (#25167) Co-authored-by: Mattermost Build --- .../system_users_dropdown.test.tsx | 36 ++++++++++++++----- .../system_users_dropdown.tsx | 23 +++++++++--- .../widgets/menu/menu_items/menu_item.scss | 14 ++++++++ webapp/channels/src/i18n/en.json | 1 + webapp/channels/src/utils/test_helper.ts | 11 ++++++ 5 files changed, 73 insertions(+), 12 deletions(-) diff --git a/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.test.tsx b/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.test.tsx index ddea9d226e..64cdbb6947 100644 --- a/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.test.tsx +++ b/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.test.tsx @@ -22,6 +22,8 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use username: 'other-user', }); + const mockMouseEvent = TestHelper.getMockMouseButtonEvent(); + const requiredProps: Props = { user, mfaEnabled: true, @@ -57,21 +59,29 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use test('handleMakeActive() should have called updateUserActive', async () => { const wrapper = shallow(); - const event = {preventDefault: jest.fn()}; - wrapper.instance().handleMakeActive(event); + wrapper.instance().handleMakeActive(mockMouseEvent, false); expect(requiredProps.actions.updateUserActive).toHaveBeenCalledTimes(1); 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(); + + wrapper.instance().handleMakeActive(mockMouseEvent, true); + + expect(requiredProps.actions.updateUserActive).toHaveBeenCalledTimes(0); + }); + test('handleMakeActive() should have called onError', async () => { const retVal = {error: {server_error_id: 'id', message: 'error'}}; const updateUserActive = jest.fn().mockResolvedValue(retVal); const props = {...requiredProps, actions: {...requiredProps.actions, updateUserActive}}; const wrapper = shallow(); - const event = {preventDefault: jest.fn()}; - await wrapper.instance().handleMakeActive(event); + await wrapper.instance().handleMakeActive(mockMouseEvent, false); expect(requiredProps.onError).toHaveBeenCalledTimes(1); 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); }); + 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(); + + await wrapper.instance().handleShowDeactivateMemberModal(mockMouseEvent, true); + + wrapper.update(); + + expect(wrapper.state('showDeactivateMemberModal')).toBeFalsy(); + }); + test('handleDeactivateMember() should have called onError', async () => { const retVal = {error: {server_error_id: 'id', message: 'error'}}; 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 () => { const wrapper = shallow(); - const event = {preventDefault: jest.fn()}; - await wrapper.instance().handleShowDeactivateMemberModal(event); + await wrapper.instance().handleShowDeactivateMemberModal(mockMouseEvent, false); expect(requiredProps.actions.loadBots).toHaveBeenCalledTimes(0); }); @@ -135,8 +156,7 @@ describe('components/admin_console/system_users/system_users_dropdown/system_use }; const wrapper = shallow(); - const event = {preventDefault: jest.fn()}; - await wrapper.instance().handleShowDeactivateMemberModal(event); + await wrapper.instance().handleShowDeactivateMemberModal(mockMouseEvent, false); expect(requiredProps.actions.loadBots).toHaveBeenCalledTimes(1); }); diff --git a/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.tsx b/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.tsx index d6f7a11a7a..b47feae266 100644 --- a/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.tsx +++ b/webapp/channels/src/components/admin_console/system_users/system_users_dropdown/system_users_dropdown.tsx @@ -84,8 +84,12 @@ export default class SystemUsersDropdown extends React.PureComponent void}) => { + handleMakeActive = (e: React.MouseEvent, disableActivationToggle: boolean) => { e.preventDefault(); + e.stopPropagation(); + if (disableActivationToggle) { + return; + } this.props.actions.updateUserActive(this.props.user.id, true). then(this.onUpdateActiveResult); }; @@ -123,8 +127,11 @@ export default class SystemUsersDropdown extends React.PureComponent void}) => { + handleShowDeactivateMemberModal = async (e: React.MouseEvent, disableActivationToggle: boolean) => { e.preventDefault(); + if (disableActivationToggle) { + return; + } if (this.shouldDisableBotsWhenOwnerIsDeactivated()) { await this.props.actions.loadBots( Constants.Integrations.START_PAGE_NUM, @@ -637,6 +644,12 @@ export default class SystemUsersDropdown extends React.PureComponent { + return disableActivationToggle ? { + extraText: Utils.localizeMessage('admin.user_item.managedByLdap', 'Managed by LDAP'), + } : {}; + }; + const {index, totalUsers} = this.props; return ( @@ -664,15 +677,17 @@ export default class SystemUsersDropdown extends React.PureComponent ) => this.handleMakeActive(e, disableActivationToggle)} text={Utils.localizeMessage('admin.user_item.makeActive', 'Activate')} disabled={disableActivationToggle} + {...getExtraText(disableActivationToggle)} /> ) => this.handleShowDeactivateMemberModal(e, disableActivationToggle)} text={Utils.localizeMessage('admin.user_item.makeInactive', 'Deactivate')} disabled={disableActivationToggle} + {...getExtraText(disableActivationToggle)} /> ; + } }