import type { FC } from 'react'; import React, { useCallback, useState, useMemo } from 'react'; import type { IUserGroupHasId } from '@growi/core'; import { useTranslation } from 'next-i18next'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { PageActionOnGroupDelete } from '~/interfaces/user-group'; /** * Delete User Group Select component * * @export * @class GrantSelector * @extends {React.Component} */ type Props = { userGroups: IUserGroupHasId[], deleteUserGroup?: IUserGroupHasId, onDelete?: (deleteGroupId: string, actionName: PageActionOnGroupDelete, transferToUserGroupId: string) => Promise | void, isShow: boolean, onHide?: () => Promise | void, }; type AvailableOption = { id: number, actionForPages: PageActionOnGroupDelete, iconClass: string, styleClass: string, label: string, }; export const UserGroupDeleteModal: FC = (props: Props) => { const { t } = useTranslation(); const { onHide, onDelete, userGroups, deleteUserGroup, } = props; const availableOptions = useMemo(() => { return [ { id: 1, actionForPages: PageActionOnGroupDelete.publicize, iconClass: 'icon-people', styleClass: '', label: t('admin:user_group_management.delete_modal.publish_pages'), }, { id: 2, actionForPages: PageActionOnGroupDelete.delete, iconClass: 'icon-trash', styleClass: 'text-danger', label: t('admin:user_group_management.delete_modal.delete_pages'), }, { id: 3, actionForPages: PageActionOnGroupDelete.transfer, iconClass: 'icon-options', styleClass: '', label: t('admin:user_group_management.delete_modal.transfer_pages'), }, ]; }, [t]); /* * State */ const [actionName, setActionName] = useState(null); const [transferToUserGroupId, setTransferToUserGroupId] = useState(''); /* * Function */ const resetStates = useCallback(() => { setActionName(null); setTransferToUserGroupId(''); }, []); const toggleHandler = useCallback(() => { if (onHide == null) { return; } resetStates(); onHide(); }, [onHide, resetStates]); const handleActionChange = useCallback((e) => { const actionName = e.target.value; setActionName(actionName); }, [setActionName]); const handleGroupChange = useCallback((e) => { const transferToUserGroupId = e.target.value; setTransferToUserGroupId(transferToUserGroupId); }, []); const handleSubmit = useCallback((e) => { if (onDelete == null || deleteUserGroup == null || actionName == null) { return; } e.preventDefault(); onDelete( deleteUserGroup._id, actionName, transferToUserGroupId, ); }, [onDelete, deleteUserGroup, actionName, transferToUserGroupId]); const renderPageActionSelector = useCallback(() => { const options = availableOptions.map((opt) => { return ; }); return ( ); }, [availableOptions, actionName, handleActionChange, t]); const renderGroupSelector = useCallback(() => { if (deleteUserGroup == null) { return; } const groups = userGroups.filter((group) => { return group._id !== deleteUserGroup._id; }); const options = groups.map((group) => { return ; }); const defaultOptionText = groups.length === 0 ? t('admin:user_group_management.delete_modal.no_groups') : t('admin:user_group_management.delete_modal.select_group'); return ( ); }, [deleteUserGroup, userGroups, t, actionName, transferToUserGroupId, handleGroupChange]); const validateForm = useCallback(() => { let isValid = true; if (actionName === null) { isValid = false; } else if (actionName === PageActionOnGroupDelete.transfer) { isValid = transferToUserGroupId !== ''; } return isValid; }, [actionName, transferToUserGroupId]); return ( delete_forever {t('admin:user_group_management.delete_modal.header')}
{t('admin:user_group_management.group_name')} : "{props?.deleteUserGroup?.name || ''}"
{t('admin:user_group_management.delete_modal.desc')}
{renderPageActionSelector()} {renderGroupSelector()}
{actionName === PageActionOnGroupDelete.publicize && (
{t('admin:user_group_management.delete_modal.option_explanation')}
)}
); };