From 63e93d79caf55f26d0274d58d3aea43d0c54ee4f Mon Sep 17 00:00:00 2001 From: Shawn Erquhart Date: Wed, 12 Jul 2017 19:22:17 -0400 Subject: [PATCH] improve rte list handling --- package.json | 1 + .../MarkdownControl/VisualEditor/index.js | 27 +++++++------------ 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 1f86e5ee..4a51414d 100644 --- a/package.json +++ b/package.json @@ -160,6 +160,7 @@ "semaphore": "^1.0.5", "slate": "^0.20.3", "slate-drop-or-paste-images": "^0.2.0", + "slate-edit-list": "^0.7.1", "slug": "^0.9.1", "textarea-caret-position": "^0.1.1", "unified": "^6.1.4", diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js index 2e615fb5..af58117a 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js +++ b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js @@ -1,6 +1,7 @@ import React, { Component, PropTypes } from 'react'; import { Map, List } from 'immutable'; import { Editor as SlateEditor, Html as SlateHtml, Raw as SlateRaw} from 'slate'; +import EditList from 'slate-edit-list'; import { markdownToHtml, htmlToMarkdown } from '../../unified'; import registry from '../../../../../lib/registry'; import { createAssetProxy } from '../../../../../valueObjects/AssetProxy'; @@ -284,36 +285,28 @@ const SoftBreak = (options = {}) => ({ const BackspaceCloseBlock = (options = {}) => ({ onKeyDown(e, data, state) { - if (data.key != 'backspace' || state.startBlock.type === 'paragraph') return; + if (data.key != 'backspace') return; - const { defaultBlock = 'paragraph', wrapped = {} } = options; + const { defaultBlock = 'paragraph', ignoreIn, onlyIn } = options; const { startBlock } = state; const { type } = startBlock; + if (onlyIn && !onlyIn.includes(type)) return; + if (ignoreIn && ignoreIn.includes(type)) return; + const characters = startBlock.getFirstText().characters; const isEmpty = !characters || characters.isEmpty(); if (isEmpty) { - const transform = state.transform(); - - if (wrapped[type] && state.document.getPreviousSibling(startBlock.key)) { - return; - } - - if (wrapped[type]) { - wrapped[type].forEach(wrapper => transform.unwrapBlock(wrapper)); - } - - return transform.insertBlock(defaultBlock).focus().apply(); + return state.transform().insertBlock(defaultBlock).focus().apply(); } } }); const slatePlugins = [ - SoftBreak({ ignoreIn: ['paragraph', 'list-item'], closeAfter: 2 }), - SoftBreak({ onlyIn: ['list-item'], shift: true}), - SoftBreak({ onlyIn: ['paragraph'], closeAfter: 1 }), - BackspaceCloseBlock({ wrapped: { 'list-item': ['bulleted-list', 'numbered-list'] } }), + SoftBreak({ ignoreIn: ['paragraph', 'list-item', 'numbered-list', 'bulleted-list'], closeAfter: 1 }), + BackspaceCloseBlock({ ignoreIn: ['paragraph', 'list-item', 'bulleted-list', 'numbered-list'] }), + EditList({ types: ['bulleted-list', 'numbered-list'], typeItem: 'list-item' }), ]; export default class Editor extends Component {