Как добавить собственное выпадающее меню в Reaction-draft-wysiwyg? - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно добавить пользовательское выпадающее меню в разделе панели инструментов.

здесь прикрепленное изображение, подобное выпадающему меню, это возможно?

<img src="https://i.imgur.com/OhYeFsL.png" alt="Dropdown menu editor">

найти подробное изображение ниже

enter image description here

Я использовал редактор содержимогоact-draft-wysiwyg.

https://github.com/jpuri/react-draft-wysiwyg

https://jpuri.github.io/react-draft-wysiwyg/#/d

добавить пользовательское выпадающее меню в разделе панели инструментов.

1 Ответ

0 голосов
/ 20 февраля 2019

Я надеюсь, что это все еще актуально, но вот мой путь.

Для пользовательского выпадающего меню я создал новый компонент и использовал метод для "добавления новой опции на панель инструментов" из документации https://jpuri.github.io/react-draft-wysiwyg/#/docs

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { EditorState, Modifier } from 'draft-js';

class Placeholders extends Component {
  static propTypes = {
    onChange: PropTypes.func,
    editorState: PropTypes.object,
  }

  state = {
    open: false
  }

  openPlaceholderDropdown = () => this.setState({open: !this.state.open})

  addPlaceholder = (placeholder) => {
    const { editorState, onChange } = this.props;
    const contentState = Modifier.replaceText(
    editorState.getCurrentContent(),
    editorState.getSelection(),
    placeholder,
    editorState.getCurrentInlineStyle(),
    );
    onChange(EditorState.push(editorState, contentState, 'insert-characters'));
  }

  placeholderOptions = [
    {key: "firstName", value: "{{firstName}}", text: "First Name"},
    {key: "lastName", value: "{{lastName}}", text: "Last name"},
    {key: "company", value: "{{company}}", text: "Company"},
    {key: "address", value: "{{address}}", text: "Address"},
    {key: "zip", value: "{{zip}}", text: "Zip"},
    {key: "city", value: "{{city}}", text: "City"}
  ]

  listItem = this.placeholderOptions.map(item => (
    <li 
      onClick={this.addPlaceholder.bind(this, item.value)} 
      key={item.key}
      className="rdw-dropdownoption-default placeholder-li"
    >{item.text}</li>
  ))

  render() {
    return (
      <div onClick={this.openPlaceholderDropdown} className="rdw-block-wrapper" aria-label="rdw-block-control">
        <div className="rdw-dropdown-wrapper rdw-block-dropdown" aria-label="rdw-dropdown">
          <div className="rdw-dropdown-selectedtext" title="Placeholders">
            <span>Placeholder</span> 
            <div className={`rdw-dropdown-caretto${this.state.open? "close": "open"}`}></div>
          </div>
          <ul className={`rdw-dropdown-optionwrapper ${this.state.open? "": "placeholder-ul"}`}>
            {this.listItem}
          </ul>
        </div>
      </div>
    );
  }
}

export default Placeholders;

Я использовал собственный выпадающий список для добавления заполнителей.Но суть остается прежней, потому что я использую пример из документации для пользовательской кнопки.

Для рендеринга самой кнопки я использовал тот же стиль, классы и структуру, что и для других выпадающих кнопок.Я просто переключил тег привязки на тег div и добавил пользовательские классы для стиля наведения и изменения моркови.Я также использовал события для переключения классов.

  .placeholder-ul{
    visibility: hidden;
  }
  .placeholder-li:hover {
    background: #F1F1F1;
  }

Наконец, не забудьте импортировать и добавить пользовательскую кнопку в редактор.

<Editor
   editorState={this.state.editorState}
   onEditorStateChange={this.onEditorStateChange}
   toolbarCustomButtons={[<Placeholders />]}
/>
...