import { useIntl } from '@edx/frontend-platform/i18n'; import { Button, Form, TransitionReplace } from '@openedx/paragon'; import PropTypes from 'prop-types'; import React, { useState } from 'react'; import { GroupTypes, TeamSizes } from 'CourseAuthoring/data/constants'; import CollapsableEditor from 'CourseAuthoring/generic/CollapsableEditor'; import FormikControl from 'CourseAuthoring/generic/FormikControl'; import messages from './messages'; import { isGroupTypeEnabled } from './utils'; // Maps a team type to its corresponding intl message const TeamTypeNameMessage = { [GroupTypes.OPEN]: { label: messages.groupTypeOpen, description: messages.groupTypeOpenDescription, }, [GroupTypes.OPEN_MANAGED]: { label: messages.groupTypeOpenManaged, description: messages.groupTypeOpenManagedDescription, }, [GroupTypes.PUBLIC_MANAGED]: { label: messages.groupTypePublicManaged, description: messages.groupTypePublicManagedDescription, }, [GroupTypes.PRIVATE_MANAGED]: { label: messages.groupTypePrivateManaged, description: messages.groupTypePrivateManagedDescription, }, }; const GroupEditor = ({ group, onDelete, onChange, onBlur, fieldNameCommonBase, errors, }) => { const intl = useIntl(); const [isDeleting, setDeleting] = useState(false); const [isOpen, setOpen] = useState(group.id === null); const initiateDeletion = () => setDeleting(true); const cancelDeletion = () => setDeleting(false); const handleToggle = (open) => setOpen(Boolean(errors.name || errors.maxTeamSize || errors.description) || open); const formGroupClasses = 'mb-4 mx-2'; return ( {isDeleting ? (

{intl.formatMessage(messages.groupDeleteHeading)}

{intl.formatMessage(messages.groupDeleteBody).split('\n').map(text =>

{text}

)}
) : ( {intl.formatMessage(messages.configureGroup)} ) : (
{intl.formatMessage(TeamTypeNameMessage[group.type ? group.type : GroupTypes.OPEN].label)}
{group.name}
{group.description}
) } > {intl.formatMessage(messages.groupFormTypeLabel)} {Object.values(GroupTypes).map(groupType => isGroupTypeEnabled(groupType) && ( {intl.formatMessage(TeamTypeNameMessage[groupType].label)} ))} {intl.formatMessage(messages.teamSize)}} className="mx-2" placeholder={TeamSizes.DEFAULT} />
)}
); }; export const groupShape = PropTypes.shape({ id: PropTypes.string, name: PropTypes.string.isRequired, description: PropTypes.string.isRequired, type: PropTypes.string.isRequired, maxTeamSize: PropTypes.number.isRequired, }); GroupEditor.propTypes = { fieldNameCommonBase: PropTypes.string.isRequired, errors: PropTypes.shape({ name: PropTypes.string, description: PropTypes.string, maxTeamSize: PropTypes.string, }), group: groupShape.isRequired, onDelete: PropTypes.func.isRequired, onChange: PropTypes.func.isRequired, onBlur: PropTypes.func.isRequired, }; GroupEditor.defaultProps = { errors: { name: null, description: null, maxTeamSize: null, }, }; export default GroupEditor;