import React, { FC, useCallback, useState, useMemo, } from 'react'; import type { IUserGroupHasId } from '@growi/core'; import { useTranslation } from 'next-i18next'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; /** * Delete User Group Select component * * @export * @class GrantSelector * @extends {React.Component} */ type Props = { userGroups: IUserGroupHasId[], deleteUserGroup?: IUserGroupHasId, onDelete?: (deleteGroupId: string, actionName: string, transferToUserGroupId: string) => Promise | void, isShow: boolean, onHide?: () => Promise | void, }; type AvailableOption = { id: number, actionForPages: string, iconClass: string, styleClass: string, label: string, }; // actionName master constants const actionForPages = { public: 'public', delete: 'delete', transfer: 'transfer', }; export const UserGroupDeleteModal: FC = (props: Props) => { const { t } = useTranslation(); const { onHide, onDelete, userGroups, deleteUserGroup, } = props; const availableOptions = useMemo(() => { return [ { id: 1, actionForPages: actionForPages.public, iconClass: 'icon-people', styleClass: '', label: t('admin:user_group_management.delete_modal.publish_pages'), }, { id: 2, actionForPages: actionForPages.delete, iconClass: 'icon-trash', styleClass: 'text-danger', label: t('admin:user_group_management.delete_modal.delete_pages'), }, { id: 3, actionForPages: actionForPages.transfer, iconClass: 'icon-options', styleClass: '', label: t('admin:user_group_management.delete_modal.transfer_pages'), }, ]; }, [t]); /* * State */ const [actionName, setActionName] = useState(''); const [transferToUserGroupId, setTransferToUserGroupId] = useState(''); /* * Function */ const resetStates = useCallback(() => { setActionName(''); 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) { 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 === '') { isValid = false; } else if (actionName === actionForPages.transfer) { isValid = transferToUserGroupId !== ''; } return isValid; }, [actionName, transferToUserGroupId]); return ( {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()}
); };