Files
frontend-app-authoring/src/course-updates/update-form/UpdateForm.jsx
2023-08-31 10:56:45 -04:00

142 lines
4.6 KiB
JavaScript

import React from 'react';
import PropTypes from 'prop-types';
import {
ActionRow,
Button,
Form,
Icon,
} from '@edx/paragon';
import classNames from 'classnames';
import DatePicker from 'react-datepicker/dist';
import { useIntl } from '@edx/frontend-platform/i18n';
import { Calendar as CalendarIcon, Error as ErrorIcon } from '@edx/paragon/icons';
import { Formik } from 'formik';
import {
convertToStringFromDate,
convertToDateFromString,
isValidDate,
} from '../../utils';
import { DATE_FORMAT, DEFAULT_EMPTY_WYSIWYG_VALUE } from '../../constants';
import { WysiwygEditor } from '../../generic/WysiwygEditor';
import { REQUEST_TYPES } from '../constants';
import { geUpdateFormSettings } from './utils';
import messages from './messages';
const UpdateForm = ({
close,
requestType,
onSubmit,
courseUpdatesInitialValues,
isInnerForm,
isFirstUpdate,
}) => {
const intl = useIntl();
const {
currentContent,
formTitle,
validationSchema,
contentFieldName,
submitButtonText,
} = geUpdateFormSettings(requestType, courseUpdatesInitialValues, intl);
return (
<div className={classNames('update-form', {
'update-form__inner': isInnerForm,
'update-form__inner-first': isFirstUpdate,
})}
>
<Formik
initialValues={courseUpdatesInitialValues}
validationSchema={validationSchema}
validateOnMount
validateOnBlur
onSubmit={onSubmit}
>
{({
values, handleSubmit, isValid, setFieldValue,
}) => (
<>
<h3 className="update-form-title">{formTitle}</h3>
{(requestType !== REQUEST_TYPES.edit_handouts) && (
<Form.Group className="mb-4 datepicker-field datepicker-custom">
<Form.Control.Feedback className="datepicker-float-labels">
{intl.formatMessage(messages.updateFormDate)}
</Form.Control.Feedback>
<div className="position-relative">
<Icon
src={CalendarIcon}
className="datepicker-custom-control-icon"
alt={intl.formatMessage(messages.updateFormCalendarAltText)}
/>
<DatePicker
name="date"
data-testid="course-updates-datepicker"
selected={isValidDate(values.date) ? convertToDateFromString(values.date) : ''}
dateFormat={DATE_FORMAT}
className={classNames('datepicker-custom-control', {
'datepicker-custom-control_isInvalid': !isValid,
})}
autoComplete="off"
selectsStart
showPopperArrow={false}
onChange={(value) => {
if (!isValidDate(value)) {
return;
}
setFieldValue('date', convertToStringFromDate(value));
}}
/>
</div>
{!isValid && (
<div className="datepicker-field-error">
<Icon src={ErrorIcon} alt={intl.formatMessage(messages.updateFormErrorAltText)} />
<span className="message-error">{intl.formatMessage(messages.updateFormInValid)}</span>
</div>
)}
</Form.Group>
)}
<Form.Group className="m-0 mb-3">
<WysiwygEditor
initialValue={currentContent}
data-testid="course-updates-wisiwyg-editor"
name={contentFieldName}
minHeight={300}
onChange={(value) => {
setFieldValue(contentFieldName, value || DEFAULT_EMPTY_WYSIWYG_VALUE);
}}
/>
</Form.Group>
<ActionRow>
<Button variant="tertiary" type="button" onClick={close}>
{intl.formatMessage(messages.cancelButton)}
</Button>
<Button onClick={handleSubmit} type="submit" disabled={!isValid}>
{submitButtonText}
</Button>
</ActionRow>
</>
)}
</Formik>
</div>
);
};
UpdateForm.defaultProps = {
isInnerForm: false,
isFirstUpdate: false,
};
UpdateForm.propTypes = {
// eslint-disable-next-line react/forbid-prop-types
courseUpdatesInitialValues: PropTypes.object.isRequired,
close: PropTypes.func.isRequired,
requestType: PropTypes.string.isRequired,
onSubmit: PropTypes.func.isRequired,
isInnerForm: PropTypes.bool,
isFirstUpdate: PropTypes.bool,
};
export default UpdateForm;