UNPKG

design-comuni-plone-theme

Version:
177 lines (168 loc) 5.36 kB
/** * Edit Accordion block. * @module components/ItaliaTheme/Blocks/Accordion/Block/EditBlock */ import React from 'react'; import { compose } from 'redux'; import { injectIntl, defineMessages } from 'react-intl'; import { injectDNDSubblocks, SubblockEdit, Subblock } from 'volto-subblocks'; import { UniversalLink } from '@plone/volto/components'; import { Button } from 'design-react-kit'; import { Icon } from 'design-comuni-plone-theme/components/ItaliaTheme'; import { TextEditorWidget } from 'design-comuni-plone-theme/components/ItaliaTheme'; const messages = defineMessages({ titlePlaceholder: { id: 'Title placeholder', defaultMessage: 'Title...', }, textPlaceholder: { id: 'Text placeholder', defaultMessage: 'Text...', }, vedi: { id: 'Vedi', defaultMessage: 'Vedi', }, }); /** * Edit Accordion block class. * @class Edit * @extends Component */ class EditBlock extends SubblockEdit { /** * Constructor * @method constructor * @param {Object} props Component properties * @constructs Accordion Edit */ constructor(props) { super(props); this.state = { focusOn: 'title', }; this.accordion_item_ref = React.createRef(); } /** * Render method. * @method render * @returns {string} Markup for the component. */ render() { if (__SERVER__) { return <div />; } return ( <Subblock subblock={this} className="subblock-edit"> <div ref={this.accordion_item_ref} key={this.props.data.index}> <h3 className="accordion-header"> <Button color="link" tag="button" onClick={(e) => { if (this.props.selected) { e.stopPropagation(); e.preventDefault(); this.props.onSubblockChangeFocus(-1); } }} > <Icon color="primary" icon={this.props.selected ? 'it-minus' : 'it-plus'} padding={false} /> </Button> {/* eslint-disable */} <div onClick={() => { this.setState({ focusOn: 'title' }); }} > <TextEditorWidget {...this.props} key="title" showToolbar={false} data={this.props.data} fieldName="title" onChangeBlock={(block, _data) => { this.onChange(_data); }} placeholder={this.props.intl.formatMessage( messages.titlePlaceholder, )} selected={this.props.selected && this.state.focusOn === 'title'} setSelected={(f) => { this.setState({ focusOn: f, }); }} focusNextField={() => { this.setState({ focusOn: 'text' }); }} focusPrevField={ this.props.isFirst ? this.props.onFocusPreviousBlock : () => { this.props.onSubblockChangeFocus(this.props.index - 1); } } /> </div> </h3> {this.props.selected && ( <div className="accordion-content open" onClick={() => { this.setState({ focusOn: 'text' }); }} > <div className="accordion-inner"> <TextEditorWidget {...this.props} key="text" data={this.props.data} fieldName="text" selected={ this.props.selected && this.state.focusOn === 'text' } placeholder={this.props.intl.formatMessage( messages.textPlaceholder, )} onChangeBlock={(block, _data) => { this.onChange(_data); }} setSelected={(f) => this.setState({ focusOn: f })} focusNextField={ !this.props.isLast ? () => { this.setState({ focusOn: null, subIndexSelected: this.props.index + 1, }); } : null //default go to next block } focusPrevField={() => { this.setState({ focusOn: 'title' }); }} /> </div> {this.props.data.href && ( <div className="link-more"> <UniversalLink href={this.props.data.href}> {this.props.data.linkMoreTitle || this.props.intl.formatMessage(messages.vedi)} <Icon icon="it-arrow-right" /> </UniversalLink> </div> )} </div> )} </div> {/* eslint-enable */} </Subblock> ); } } export default compose(injectIntl, injectDNDSubblocks)(EditBlock);