import { useIntl } from '@edx/frontend-platform/i18n'; import { Button, Form } from '@openedx/paragon'; import { Add } from '@openedx/paragon/icons'; import { FieldArray } from 'formik'; import PropTypes from 'prop-types'; import React from 'react'; import { v4 as uuid } from 'uuid'; import * as Yup from 'yup'; import { GroupTypes, TeamSizes } from 'CourseAuthoring/data/constants'; import FormikControl from 'CourseAuthoring/generic/FormikControl'; import { setupYupExtensions, useAppSetting } from 'CourseAuthoring/utils'; import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; import GroupEditor from './GroupEditor'; import messages from './messages'; setupYupExtensions(); const TeamSettings = ({ onClose, }) => { const intl = useIntl(); const [teamsConfiguration, saveSettings] = useAppSetting('teamsConfiguration'); const blankNewGroup = { name: '', description: '', type: GroupTypes.OPEN, maxTeamSize: null, userPartitionId: null, id: null, key: uuid(), }; const handleSettingsSave = async (values) => { // For newly-added teams, fill in an id. const groups = values.groups?.map(group => ({ id: group.id || uuid(), name: group.name, type: group.type, description: group.description, max_team_size: group.maxTeamSize, user_partition_id: group.userPartitionId, })); return saveSettings({ team_sets: groups, max_team_size: values.maxTeamSize, enabled: values.enabled, }); }; const enableAppError = { title: intl.formatMessage(messages.noGroupsErrorTitle), message: intl.formatMessage(messages.noGroupsErrorMessage), }; return ( (!value || context.parent.groups.length > 0), ), maxTeamSize: Yup.number() .required(intl.formatMessage(messages.maxTeamSizeEmpty)) .min(TeamSizes.MIN, intl.formatMessage(messages.maxTeamSizeInvalid)) .max( TeamSizes.MAX, intl.formatMessage(messages.maxTeamSizeTooHigh, { max: TeamSizes.MAX, }), ), groups: Yup.array().of( Yup.object({ id: Yup.string().nullable(), name: Yup.string() .required(intl.formatMessage(messages.groupFormNameEmpty)) .trim(), type: Yup.string().oneOf(Object.values(GroupTypes)), description: Yup.string() .required(intl.formatMessage(messages.groupFormDescriptionError)) .trim(), maxTeamSize: Yup.number() .nullable() .min(TeamSizes.MIN, intl.formatMessage(messages.maxTeamSizeInvalid)) .max( TeamSizes.MAX, intl.formatMessage(messages.maxTeamSizeTooHigh, { max: TeamSizes.MAX, }), ) .default(null), }), ) .when('enabled', { is: true, // oxlint-disable-next-line unicorn/no-thenable then: Yup.array().min(1), }) .default([]) .uniqueProperty('name', intl.formatMessage(messages.groupFormNameExists)), }} onSettingsSave={handleSettingsSave} configureBeforeEnable > { ({ handleChange, handleBlur, values, errors, }) => ( <>

{intl.formatMessage(messages.teamSize)}

{intl.formatMessage(messages.groups)}

{intl.formatMessage(messages.groupsHelp)} {({ push, remove }) => ( <> {values.groups?.map((group, index) => ( remove(index)} onChange={handleChange} onBlur={handleBlur} /> ))} )}
) }
); }; TeamSettings.propTypes = { onClose: PropTypes.func.isRequired, }; export default TeamSettings;