application/components/common/rich-editor/pull-quote.js
- import React from 'react';
- import {Card, CardActions, CardHeader, CardMedia, CardTitle, CardText} from 'material-ui/Card';
- import FlatButton from 'material-ui/FlatButton';
- import TextField from 'material-ui/TextField';
-
- import {AtomicBlockUtils, Entity} from 'draft-js';
-
- import {info} from './../../../util/console';
- import BaseView from './../../base-view';
-
- /**
- * Render a pull quote box. This is one of the few components
- * that doesn't really have a set style and requires the
- * output client to handle all rendering.
- */
- class PullQuoteBlock extends BaseView {
- constructor(props) {
- super(props);
-
- this.getValue = this.getValue.bind(this);
- this.handleSave = this.handleSave.bind(this);
- this.handleCancel = this.handleCancel.bind(this);
- this.handleClick = this.handleClick.bind(this);
-
- this.startEdit = this.startEdit.bind(this);
- this.finishEdit = this.finishEdit.bind(this);
-
- this.state = {
- editMode: false
- };
- }
-
- /**
- * Return quote content
- * @return {String}
- */
- getValue() {
- if (!this.props.block) {
- return;
- }
- return this.props.contentState
- .getEntity(this.props.block.getEntityAt(0))
- .getData()['content'];
- }
-
- /**
- * Return quote credit
- * @return {String}
- */
- getCredit() {
- if (!this.props.block) {
- return;
- }
- return this.props.contentState
- .getEntity(this.props.block.getEntityAt(0))
- .getData()['credit'];
- }
-
- startEdit() {
- if (this.props.blockProps && this.props.blockProps.onStartEdit) {
- this.props.blockProps.onStartEdit(this.props.block.getKey());
- }
- }
-
- finishEdit() {
- if (this.props.blockProps && this.props.blockProps.onFinishEdit) {
- this.props.blockProps.onFinishEdit(this.props.block.getKey());
- }
- }
-
- handleClick() {
- if (this.state.editMode) {
- return;
- }
-
- this.setState({
- editMode: true,
- quote: this.getValue(),
- credit: this.getCredit()
- }, () => { this.startEdit() });
-
- setTimeout(() => {
- this.refs.content.focus();
- }, 1);
- }
-
- handleCancel() {
- this.setState({editMode: false}, () => { this.finishEdit() });
- }
-
- handleSave() {
- const newContents = this.state.quote;
- const newCredit = this.state.credit;
-
- if (this.props.block) {
- const key = this.props.block.getEntityAt(0);
- this.props.contentState.mergeEntityData(key, {content: newContents, credit: newCredit});
- } else {
- info('No block properties set, cannot save meta data');
- }
-
- this.setState({editMode: false}, () => { this.finishEdit() });
- }
-
- handleChange(e) {
- if (e.target.name === 'content') {
- this.setState({'quote': e.target.value});
- } else if (e.target.name === 'credit') {
- this.setState({'credit': e.target.value});
- }
- }
-
- render() {
-
- let contents;
- let className = 'RichEditor-pullQuote';
-
- if (this.state.editMode) {
- contents = (
- <Card>
- <CardHeader
- title="Pull Quote"
- subtitle="Like regular quotes, but bigger!"
- />
- <CardText>
- <TextField
- fullWidth={true}
- name="content"
- ref="content"
- value={this.state.quote}
- onChange={this.handleChange.bind(this)}
- multiLine={true}
- floatingLabelText='Quote'
- />
- <TextField
- fullWidth={true}
- name="credit"
- ref="credit"
- value={this.state.credit}
- onChange={this.handleChange.bind(this)}
- floatingLabelText='Credit'
- />
-
- </CardText>
- <CardActions>
- <FlatButton onClick={this.handleSave} label='Done' />
- <FlatButton onClick={this.handleCancel} label='Cancel' />
- </CardActions>
- </Card>
- );
-
- className = className + ' active';
- } else {
- contents = (
- <Card>
- <CardHeader
- title="Pull Quote"
- subtitle="Like regular quotes, but bigger!"
- />
- <CardText>
- <div className='pullquote-quote'>
- {this.getValue()}
- </div>
- <div className='pullquote-credit'>
- <strong>{this.getCredit() ? '- ' + this.getCredit() : ''}</strong>
- </div>
- </CardText>
- </Card>
- );
- }
-
- return (
- <div style={{marginRight:'20px'}} onClick={this.handleClick}>
- {contents}
- </div>
- );
- }
- }
-
- /**
- * Simple callback to insert the quote wrapper into the editor
- */
- const insertPullQuote = (editorState, quoteText = null) => {
-
- if (!quoteText) {
- quoteText = 'In Soviet Russia, quotes pull YOU';
- }
-
- const newContentState = editorState.getCurrentContent().createEntity(
- 'TOKEN',
- 'IMMUTABLE',
- {customType: 'pull-quote', content: quoteText, credit: ''}
- );
- const entityKey = newContentState.getLastCreatedEntityKey();
-
- return AtomicBlockUtils.insertAtomicBlock(
- editorState,
- entityKey,
- ' '
- );
- };
-
- export {PullQuoteBlock as default, insertPullQuote};