UNPKG

@plone/volto

Version:
209 lines (200 loc) 5.98 kB
/** * FormFieldWrapper component. * @module components/manage/Widgets/FormFieldWrapper */ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Form, Grid, Icon as IconOld, Label } from 'semantic-ui-react'; import map from 'lodash/map'; import cx from 'classnames'; import { defineMessages, injectIntl } from 'react-intl'; import LanguageSVG from '@plone/volto/icons/language.svg'; import Icon from '@plone/volto/components/theme/Icon/Icon'; const messages = defineMessages({ edit: { id: 'Edit', defaultMessage: 'Edit', }, delete: { id: 'Delete', defaultMessage: 'Delete', }, language_independent: { id: 'Language independent field.', defaultMessage: 'Language independent field.', }, language_independent_icon_title: { id: 'Language independent icon title', defaultMessage: 'This is a language independent field. Any value you enter here will overwrite the corresponding field of all members of the translation group when you save this form.', }, }); /** * FormFieldWrapper component class. * @class FormFieldWrapper * @extends Component */ class FormFieldWrapper extends Component { /** * Property types. * @property {Object} propTypes Property types. * @static */ static propTypes = { id: PropTypes.string.isRequired, title: PropTypes.string.isRequired, description: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), required: PropTypes.bool, error: PropTypes.arrayOf(PropTypes.string), wrapped: PropTypes.bool, columns: PropTypes.number, draggable: PropTypes.bool, isDisabled: PropTypes.bool, onEdit: PropTypes.func, className: PropTypes.string, onDelete: PropTypes.func, intl: PropTypes.object, }; /** * Default properties * @property {Object} defaultProps Default properties. * @static */ static defaultProps = { description: null, required: false, error: [], wrapped: true, columns: 2, onDelete: null, intl: null, isDisabled: null, draggable: null, }; /** * Render method. * @method render * @returns {string} Markup for the component. */ render() { const { id, title, description, fieldSet, required, error, wrapped, columns, draggable, onEdit, className, isDisabled, onDelete, intl, noForInFieldLabel, multilingual_options, } = this.props; const languageIndependent = multilingual_options?.language_independent; const wdg = ( <> {this.props.children} {map(error, (message) => ( <Label key={message} basic color="red" className="form-error-label"> {message} </Label> ))} </> ); return wrapped ? ( <Form.Field inline required={required} error={error && error.length > 0} className={cx( description ? 'help' : '', className, `field-wrapper-${id}`, languageIndependent ? 'language-independent-field' : null, )} > <Grid> <Grid.Row stretched> {columns === 2 && ( <Grid.Column width="4"> <div className="wrapper"> <label id={`fieldset-${fieldSet}-field-label-${id}`} htmlFor={noForInFieldLabel ? null : `field-${id}`} > {draggable && onEdit && ( <i aria-hidden="true" className="grey bars icon drag handle" /> )} {title} {languageIndependent && ( <div className="languageIndependent-icon"> <Icon title={intl.formatMessage( messages.language_independent_icon_title, )} name={LanguageSVG} size="24px" color="#555" /> </div> )} </label> </div> </Grid.Column> )} <Grid.Column width={columns === 2 ? 8 : 12}> {onEdit && !isDisabled && ( <div className="toolbar" style={{ zIndex: '2' }}> <button aria-label={intl.formatMessage(messages.edit)} className="item ui noborder button" onClick={(evt) => { evt.preventDefault(); onEdit(id); }} > <IconOld name="write square" size="large" color="blue" /> </button> <button aria-label={intl.formatMessage(messages.delete)} className="item ui noborder button" onClick={(evt) => { evt.preventDefault(); onDelete(id); }} > <IconOld name="close" size="large" color="red" /> </button> </div> )} {wdg} </Grid.Column> </Grid.Row> {description && ( <Grid.Row stretched> <Grid.Column stretched width="12"> <p className="help"> {this.props.multilingual_options ? `${intl.formatMessage(messages.language_independent)} ` : null} {description} </p> </Grid.Column> </Grid.Row> )} </Grid> </Form.Field> ) : ( <>{wdg}</> ); } } export default injectIntl(FormFieldWrapper);