/*! * Copyright (c) 2024 PLANKA Software GmbH * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md */ import React, { useCallback, useMemo } from 'react'; import PropTypes from 'prop-types'; import { useDispatch, useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; import { Menu } from 'semantic-ui-react'; import { Popup } from '../../../../lib/custom-ui'; import selectors from '../../../../selectors'; import entryActions from '../../../../entry-actions'; import { useSteps } from '../../../../hooks'; import SelectRoleStep from './SelectRoleStep'; import ConfirmationStep from '../../ConfirmationStep'; import EditUserInformationStep from '../../../users/EditUserInformationStep'; import EditUserUsernameStep from '../../../users/EditUserUsernameStep'; import EditUserEmailStep from '../../../users/EditUserEmailStep'; import EditUserPasswordStep from '../../../users/EditUserPasswordStep'; import styles from './ActionsStep.module.scss'; const StepTypes = { EDIT_INFORMATION: 'EDIT_INFORMATION', EDIT_USERNAME: 'EDIT_USERNAME', EDIT_EMAIL: 'EDIT_EMAIL', EDIT_PASSWORD: 'EDIT_PASSWORD', EDIT_ROLE: 'EDIT_ROLE', ACTIVATE: 'ACTIVATE', DEACTIVATE: 'DEACTIVATE', DELETE: 'DELETE', }; const ActionsStep = React.memo(({ userId, onClose }) => { const selectUserById = useMemo(() => selectors.makeSelectUserById(), []); const activeUsersLimit = useSelector(selectors.selectActiveUsersLimit); const activeUsersTotal = useSelector(selectors.selectActiveUsersTotal); const user = useSelector((state) => selectUserById(state, userId)); const dispatch = useDispatch(); const [t] = useTranslation(); const [step, openStep, handleBack] = useSteps(); const handleRoleSelect = useCallback( (role) => { dispatch( entryActions.updateUser(userId, { role, }), ); }, [userId, dispatch], ); const handleActivateConfirm = useCallback(() => { dispatch( entryActions.updateUser(userId, { isDeactivated: false, }), ); onClose(); }, [userId, onClose, dispatch]); const handleDeactivateConfirm = useCallback(() => { dispatch( entryActions.updateUser(userId, { isDeactivated: true, }), ); onClose(); }, [userId, onClose, dispatch]); const handleDeleteConfirm = useCallback(() => { dispatch(entryActions.deleteUser(userId)); }, [userId, dispatch]); const handleEditInformationClick = useCallback(() => { openStep(StepTypes.EDIT_INFORMATION); }, [openStep]); const handleEditUsernameClick = useCallback(() => { openStep(StepTypes.EDIT_USERNAME); }, [openStep]); const handleEditEmailClick = useCallback(() => { openStep(StepTypes.EDIT_EMAIL); }, [openStep]); const handleEditPasswordClick = useCallback(() => { openStep(StepTypes.EDIT_PASSWORD); }, [openStep]); const handleEditRoleClick = useCallback(() => { openStep(StepTypes.EDIT_ROLE); }, [openStep]); const handleActivateClick = useCallback(() => { openStep(StepTypes.ACTIVATE); }, [openStep]); const handleDeactivateClick = useCallback(() => { openStep(StepTypes.DEACTIVATE); }, [openStep]); const handleDeleteClick = useCallback(() => { openStep(StepTypes.DELETE); }, [openStep]); if (step) { switch (step.type) { case StepTypes.EDIT_INFORMATION: return ; case StepTypes.EDIT_USERNAME: return ; case StepTypes.EDIT_EMAIL: return ; case StepTypes.EDIT_PASSWORD: return ; case StepTypes.EDIT_ROLE: return ( ); case StepTypes.ACTIVATE: return ( ); case StepTypes.DEACTIVATE: return ( ); case StepTypes.DELETE: return ( ); default: } } return ( <> {t('common.userActions', { context: 'title', })} {t('action.editInformation', { context: 'title', })} {!user.lockedFieldNames.includes('username') && ( {t('action.editUsername', { context: 'title', })} )} {!user.lockedFieldNames.includes('email') && ( {t('action.editEmail', { context: 'title', })} )} {!user.lockedFieldNames.includes('password') && ( {t('action.editPassword', { context: 'title', })} )} {!user.lockedFieldNames.includes('role') && ( {t('action.editRole', { context: 'title', })} )} = activeUsersLimit } className={styles.menuItem} onClick={user.isDeactivated ? handleActivateClick : handleDeactivateClick} > {user.isDeactivated ? t('action.activateUser', { context: 'title', }) : t('action.deactivateUser', { context: 'title', })} {user.isDeactivated && !user.isDefaultAdmin && ( {t('action.deleteUser', { context: 'title', })} )} ); }); ActionsStep.propTypes = { userId: PropTypes.string.isRequired, onClose: PropTypes.func.isRequired, }; export default ActionsStep;