studpad/studpad

View on GitHub
app/assets/javascripts/components/post_text.js.jsx

Summary

Maintainability
A
2 hrs
Test Coverage
var PostText = React.createClass({
  //BEGIN***************************************************DECLARE
  propTypes: {
    focus: React.PropTypes.bool,
    addImage: React.PropTypes.func.isRequired,
    addDivider: React.PropTypes.func.isRequired,
    removeTextElement: React.PropTypes.func.isRequired,
    text_elements: React.PropTypes.array.isRequired
  },
  //END*****************************************************DECLARE
  render: function() {
    var elements = this.props.text_elements;
    var length = elements.length;
    rendered_elements = elements.map(function (e, position) {
      switch (e.type) {
        case ElementTypes.text:
          return (
            <PostTextTextarea
              key={position}
              text={e.text}
              focus={e.focus}
              position={position}
              onChangeElementText={this.props.changeElementText}
              removeTextElement={this.props.removeTextElement}
              typePost={this.props.typePost}/>
          );
        case ElementTypes.image:
          return (
            <PostTextImage
              key={position}
              url={e.url}
              position={position}
              removeTextElement={this.props.removeTextElement}/>
          );
        case ElementTypes.divider:
          return (
            <PostTextDivider
              key={position}
              position={position}
              removeTextElement={this.props.removeTextElement}/>
            );
        default:
          CE('Undefined PostText type');
      }
      // return <PostTextElement
      //           key={position}
      //           element={e}
      //           position={position}
      //           onChangeElementText={this.props.changeElementText}
      //           removeTextElement={this.props.removeTextElement}
      //           lengthElements={length}/>
    }.bind(this));

    return (
      <div>
        <PostTextManagmentPanel
          showTips={this.props.showTips}
          addImage={this.props.addImage}
          addDivider={this.props.addDivider}/>
        {rendered_elements}
      </div>
    );
  }
});

var PostTextTextarea = React.createClass({
  //BEGIN***************************************************DECLARE
  // propTypes: {
  //   element: React.PropTypes.shape({
  //     type: React.PropTypes.string.isRequired,
  //     text: React.PropTypes.string
  //   })
  // },
  //END*****************************************************DECLARE
  handleChange: function(e) {
    this.props.onChangeElementText(
      this.props.position,
      e.target.value
    );
  },
  handleRemoveElementPost: function() {
    this.props.removeTextElement(
      this.props.position
    );
  },
  // componentDidMount: function() {
  //   var node = this.refs.textElement.getDOMNode();
  //   $(node).autoResize({
  //     limit:600,
  //     extraSpace:0,
  //     animate:true
  //   });
  //   CW('text DidMount');
  //   //for copy/paste
  //   $(node).bind('paste', function () {
  //       var $textarea = $(this);
  //       setTimeout(function () {
  //         $textarea.trigger("change.dynSiz");
  //       }, 250);
  //   });
  //   $(node).change();
  //   if (this.props.focus)
  //     $(node).focus();
  // },
  // componentWillUnmount: function() {
  //   var node = this.refs.textElement.getDOMNode();
  //   // node = $(node).data('AutoResizer');
  //   if (node) {
  //     $(node).unbind('paste');
  //   }
  // },

  // <div
  //   ref='textElement'
  //   contentEditable='true'
  //   className='text-new-post'
  //   value={this.props.text}
  //   placeholder = {textPlaceholder}
  //   onChange={this.handleChange}
  //   onLoad={this.handleAutofocus}>
  // </div>
  render: function() {
    var textPlaceholder = 'Если хотите, можете добавить описание';
    var textTags = '#Теги';
    /*if(this.props.typePost == PostTypes.link) textPlaceholder = 'Если хотите, можете добавить описание';
    else if(this.props.typePost == PostTypes.quotation) textPlaceholder = 'Здесь укажите источник';
    else if(this.props.typePost == PostTypes.file) textPlaceholder = 'Обязательно введите название Вашей работы, описание, кому она предназначена';
    else if(this.props.typePost == PostTypes.video) textPlaceholder = 'Если хотите, можете добавить описание видеоролика';
    else if(this.props.typePost == PostTypes.photo) textPlaceholder = 'Если хотите, можете добавить описание';*/
    if (this.props.position != 0)
      var remove_button = <img onClick={this.handleRemoveElementPost} className='remove-angle text-all-remove-angle' src = '/images/close.png' />
    return (
      <div className = 'padding-usual-post-text-create'>
        <div className = 'usual-post-text-create action-create-element-post'>
          {remove_button}
          <ContentEditableDiv
            onChange={this.handleChange}
            placeholder={textPlaceholder}
            focus={this.props.focus}
            cssClass='text-new-post'
            html={this.props.text}/>
        </div>
      </div>
    );
  }
});

var PostTextImage = React.createClass({
  //BEGIN***************************************************DECLARE
  propTypes: {
    removeTextElement: React.PropTypes.func.isRequired,
    url: React.PropTypes.string.isRequired
  },
  //END*****************************************************DECLARE
  handleRemoveElementPost: function() {
    this.props.removeTextElement(
      this.props.position
    );
  },
  render: function() {
    return (
      <div className = 'usual-post-photo action-create-element-post'>
        <img onClick={this.handleRemoveElementPost} className='remove-angle text-photo-remove-angle' src = '/images/close.png' />
        <img src = {this.props.url} />
      </div>
    );
  }
});

var PostTextDivider = React.createClass({
  //BEGIN***************************************************DECLARE
  propTypes: {
    removeTextElement: React.PropTypes.func.isRequired
  },
  //END*****************************************************DECLARE
  handleRemoveElementPost: function() {
    this.props.removeTextElement(
      this.props.position
    );
  },
  render: function() {
    return (
      <div>
        <img onClick={this.handleRemoveElementPost} className='remove-angle devider-remove-angle' src = '/images/close.png' />
        <div className = 'usual-post-devider create-usual-post-divider action-create-element-post'/>
        <div className = 'clearboth' />
      </div>
    );
  }
});