import type { FC } from 'react'; import React, { useCallback, useState, useMemo } from 'react'; import { getIdForRef, isPopulated, type IGrantedGroup, 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: IGrantedGroup[], deleteUserGroup?: IUserGroupHasId, onDelete?: (deleteGroupId: string, actionName: PageActionOnGroupDelete, transferToUserGroup: IGrantedGroup | null) => Promise | void, isShow: boolean, onHide?: () => Promise | void, }; type AvailableOption = { id: number, actionForPages: PageActionOnGroupDelete, 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, label: t('admin:user_group_management.delete_modal.publish_pages'), }, { id: 2, actionForPages: PageActionOnGroupDelete.delete, label: t('admin:user_group_management.delete_modal.delete_pages'), }, { id: 3, actionForPages: PageActionOnGroupDelete.transfer, label: t('admin:user_group_management.delete_modal.transfer_pages'), }, ]; }, [t]); /* * State */ const [actionName, setActionName] = useState(null); const [transferToUserGroup, setTransferToUserGroup] = useState(null); /* * Function */ const resetStates = useCallback(() => { setActionName(null); setTransferToUserGroup(null); }, []); 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; const selectedGroup = userGroups.find(group => getIdForRef(group.item) === transferToUserGroupId) ?? null; setTransferToUserGroup(selectedGroup); }, [userGroups]); const handleSubmit = useCallback((e) => { if (onDelete == null || deleteUserGroup == null || actionName == null) { return; } e.preventDefault(); onDelete( deleteUserGroup._id, actionName, transferToUserGroup, ); }, [onDelete, deleteUserGroup, actionName, transferToUserGroup]); const renderPageActionSelector = useCallback(() => { const options = availableOptions.map((opt) => { return ; }); // TODO: Use GROWI original dropdown. // refs: https://redmine.weseek.co.jp/issues/142614 return ( ); }, [availableOptions, actionName, handleActionChange, t]); const renderGroupSelector = useCallback(() => { if (deleteUserGroup == null) { return; } const groups = userGroups.filter((group) => { return getIdForRef(group.item) !== deleteUserGroup._id; }); const options = groups.map((group) => { const groupId = getIdForRef(group.item); const groupName = isPopulated(group.item) ? group.item.name : null; return { id: groupId, name: groupName }; }).filter(obj => obj.name != null) .map(obj => ); 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, transferToUserGroup, handleGroupChange]); const validateForm = useCallback(() => { let isValid = true; if (actionName === null) { isValid = false; } else if (actionName === PageActionOnGroupDelete.transfer) { isValid = transferToUserGroup != null; } return isValid; }, [actionName, transferToUserGroup]); 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')}
)}
); };