react-draft-wysiwyg icon indicating copy to clipboard operation
react-draft-wysiwyg copied to clipboard

Unknown DraftEntity key: null.

Open dinfyru opened this issue 7 years ago • 47 comments
trafficstars

Error: image

Code to run:

        const contentBlock = htmlToDraft(sanitizeHtml(this.wysiwygHtml.value, sanitizeRules));
        const contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks);
        const newEditorState = EditorState.createWithContent(contentState);
        this.onEditorStateChange(newEditorState);

Code to paste:

<a href="https://test.com" target="_blank" data-saferedirecturl="https://www.test.com/url?hl=ru&amp;q=https://test.com&amp;source=gmail&amp;ust=1518687009434000&amp;usg=AFQjCNGJCuM_hG6wsHlvqVTpepzndFgVkQ"><img src="https://proxy/28oL4gKFefkX8wOuCE5zIS5UPzeCfGKO-3mjWWCNk_HZOIIhR9Kxyx9sKG2nNKU_SWOVY_dk_lVVJKxv-P7pRe__6VurG3wi6kOwiHXAERe7RjM=s0-d-e1-ft#https://test.com/images/signatures/new/ira.jpg" alt="" class="CToWUd"></a>

Versions:

    "react-draft-wysiwyg": "^1.12.7",
    "draft-js": "^0.10.5",
    "draftjs-to-html": "^0.8.2",
    "html-to-draftjs": "^1.1.2"

dinfyru avatar Feb 14 '18 09:02 dinfyru

Hey @Dinfyru : can you plz detail when exactly you get this error ?

jpuri avatar Feb 14 '18 16:02 jpuri

@jpuri Error, when i running this code

        const contentBlock = htmlToDraft(sanitizeHtml(this.wysiwygHtml.value, sanitizeRules));
        const contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks);
        const newEditorState = EditorState.createWithContent(contentState);
        this.onEditorStateChange(newEditorState);

dinfyru avatar Feb 15 '18 12:02 dinfyru

draftjs-to-html works for only the HTML generated by wysiwyg itself.

jpuri avatar Feb 15 '18 16:02 jpuri

@jpuri there is no func draftjs-to-html in this code

        const contentBlock = htmlToDraft(sanitizeHtml(this.wysiwygHtml.value, sanitizeRules));
        const contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks);
        const newEditorState = EditorState.createWithContent(contentState);
        this.onEditorStateChange(newEditorState);

dinfyru avatar Feb 15 '18 16:02 dinfyru

Ah sorry I mean html-to-draftjs .

jpuri avatar Feb 15 '18 16:02 jpuri

@jpuri Is there ways to use other html?

dinfyru avatar Feb 15 '18 16:02 dinfyru

This may help you: https://github.com/sstur/draft-js-utils/tree/master/packages/draft-js-import-html

jpuri avatar Feb 15 '18 16:02 jpuri

Hello. I am experiencing the same issue inserting html created with the editor. I use the same code as Finfyru:

const contentBlock = htmlToDraft(html); const contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks); const editorState = EditorState.createWithContent(contentState);

andershagebakken avatar Apr 27 '18 14:04 andershagebakken

Plz note that html-to-draftjs can take care of only html generated by editor itself.

jpuri avatar May 02 '18 17:05 jpuri

Is there a solution to this yet?

The app I'm building saves exported html to a database and allows users to then come back at a later date and import/edit the content with the editor. But does not work if images are added. Is there some workaround for this? Maybe stringify the data, save it to the database, and recreate the editorState with images? I tried with editorState... but this does not work. Any ideas?

marcaaron avatar May 15 '18 20:05 marcaaron

Strangely enough... the expected behavior actually works OK sometimes, but other times it causes this error to appear.

marcaaron avatar May 15 '18 21:05 marcaaron

@marcaaron, can you plz share exactly when you get error. You can save editor content as JSON check example 2. Uncontrolled editor component with conversion of content from and to JSON (RawDraftContentState) Here: https://jpuri.github.io/react-draft-wysiwyg/#/demo

In fact that is the recommended way to save editor content.

jpuri avatar May 16 '18 14:05 jpuri

Very nice thanks :)

marcaaron avatar May 17 '18 16:05 marcaaron

I solved this error. I do a function which one add an image into editor, it's mean I have to get the link of image then add it to img tag of HTML, problem is here. Add it into <p><img src="your_image_link" ></img></p> before parse it into editor again. The p tag is required in editor.

namnh06 avatar Aug 23 '18 04:08 namnh06

I have the same problem. When I using tag and delete it, sometimes it will be deleted in views, but actually it not be deleted in data. And then, if I ender Editor again, I get this ERROR.

Terryand avatar Sep 11 '18 07:09 Terryand

For Me, The reason for the problem is the type was "atomic" but entityRanges is empty

 {
      "key": "as6q7",
      "text": "",
      "type": "atomic",
      "depth": 0,
      "inlineStyleRanges": [],
      "entityRanges": [],
      "data": {}
    }

wanlerong avatar Dec 06 '18 09:12 wanlerong

This is a very real problem and I got a good reproduction case:

  1. Go to https://jpuri.github.io/react-draft-wysiwyg/#/demo
  2. Insert an image in the first editor
  3. Go up to place the caret above the image and press delete to remove the very first <p>
  4. You should have:
<img src="image.jpg" alt="undefined" style="float:none;height: auto;width: auto"/>
<p></p>

in the html preview.

First Problem: The image is still in the generated html but not in the editor anymore.

Second problem: If you initialize an editor with this HTML (which is generated by draftjs-to-html) you get the above crash: Invariant Violation: Unknown DraftEntity key: null.

--

Edit: Here's the broken state json dump:

> JSON.stringify(editorState.getCurrentContent().toJSON(), null, 2)

{
  "entityMap": {},
  "blockMap": {
    "c9cv2": {
      "key": "c9cv2",
      "type": "atomic",
      "text": "",
      "characterList": [],
      "depth": 0,
      "data": {}
    },
    "2gj8i": {
      "key": "2gj8i",
      "type": "unstyled",
      "text": " ",
      "characterList": [
        {
          "style": [],
          "entity": "1"
        }
      ],
      "depth": 0,
      "data": {}
    }
  },
  "selectionBefore": {
    "anchorKey": "c9cv2",
    "anchorOffset": 0,
    "focusKey": "c9cv2",
    "focusOffset": 0,
    "isBackward": false,
    "hasFocus": false
  },
  "selectionAfter": {
    "anchorKey": "c9cv2",
    "anchorOffset": 0,
    "focusKey": "c9cv2",
    "focusOffset": 0,
    "isBackward": false,
    "hasFocus": false
  }
}

The first block (c9cv2) crash because block.getEntityAt(0) is null here: https://github.com/jpuri/react-draft-wysiwyg/blob/f0da14fe8d082ee078da1c2eceac3789d400db26/src/renderer/index.js#L11

paradoxxxzero avatar Jan 04 '19 16:01 paradoxxxzero

Getting this error too - any chance we can look at fixing this?

marchaos avatar Feb 26 '19 15:02 marchaos

It may be problem of DraftJS itself? I got similar problem on Firefox since I have update DraftJS >= 0.10.1. On Chrome it works ok

machnicki avatar Feb 28 '19 10:02 machnicki

Getting this error as well, any idea when this will be fixed on a fix?

jakeleventhal avatar Mar 02 '19 19:03 jakeleventhal

This bug happened when the incoming HTML was missing a prefixed <p></p> tag. When prepending a <p></p> to the incoming html it fixed the error. This is just a temporary fix, but might provide clues to the larger problem. Sometimes when trying to delete an image, the <p></p> tags are deleted, but the editor shows that the image has been deleted.

[missing p tags here. Shows that image is gone in editor preview]
<img src="http://somerandomurl.com" alt="asdf" style="float:none;height: auto;width: auto"/>
<p></p>

If this state gets saved, then it'll error out when you reload.

momotofu avatar Mar 11 '19 15:03 momotofu

Any fix release to this?

ViniciusGularte avatar May 22 '19 20:05 ViniciusGularte

I have fixed similar issue on Firefox by updating draft js "draft-js": "0.11.0-beta2"

and set global config:

window.__DRAFT_GKX = {
     draft_killswitch_allow_nontextnodes: true,
}

machnicki avatar May 24 '19 09:05 machnicki

@machnicki thank you, it worked here

ViniciusGularte avatar May 30 '19 12:05 ViniciusGularte

Has there been any progress on this bug? I have tried all suggested solutions and nothing works. My last hope is to try prepending <p></p> to the saved html if there is an image at the beginning. It seems like a horrible hack but that is the only option I have left to try.

Hereward avatar Jul 08 '19 16:07 Hereward

This may help you: https://github.com/sstur/draft-js-utils/tree/master/packages/draft-js-import-html

the package can't show image tag !!!!@jpuri

zhayes avatar Jul 16 '19 03:07 zhayes

My final solution is replace this package for the React Quill package, much better for working with html tags

ViniciusGularte avatar Jul 16 '19 16:07 ViniciusGularte

i find the error in this: onContentStateChange

in './Editor/index.js you can see the code onContentStateChange(convertToRaw(editorState.getCurrentContent()));

i try to change it to be this code onContentStateChange(editorState);

the error never show

sanyuelanv avatar Sep 24 '19 03:09 sanyuelanv

whenever I paste an image in a blank editor, I get an error. please fix

swham-ai avatar Nov 12 '19 19:11 swham-ai

This could be because some text uses the figure tag, but draft reserves this tag. You could bypass the "handlePastedText" with your own function like so:

Just pass the parameter handlePastedText={HandlePastedText} in the Editor and import the function below as HandlePastedText.

/**
 *
 * @param text text on clipboard
 * @param html html on clipboard (no IE11 support)
 * @param editorState
 * @param onChange
 * @returns {boolean} true states to editor paste is handled, false will continue with standard paste behavior of editor
 */
const handlePastedText = (text, html, editorState, onChange) => {
	const selectedBlock = getSelectedBlock(editorState);
	if (selectedBlock && selectedBlock.type === 'code') {
		const contentState = Modifier.replaceText(
				editorState.getCurrentContent(),
				editorState.getSelection(),
				text,
				editorState.getCurrentInlineStyle()
		);
		onChange(EditorState.push(editorState, contentState, 'insert-fragment'));
		return true;
	} else if (html) {
		//Figure can be under the copied html, but is reserved in the editor. Since figure contains an img tag, simply strip figure.
		if (html.indexOf('<figure') != -1) {
			html = html.replace(/(<\/?)figure((?:\s+.*?)?>)/g, '');
		}
		const contentBlock = htmlToDraft(html);
		let contentState = editorState.getCurrentContent();
		contentBlock.entityMap.forEach((value, key) => {
			contentState = contentState.mergeEntityData(key, value);
		});
		contentState = Modifier.replaceWithFragment(
				contentState,
				editorState.getSelection(),
				new List(contentBlock.contentBlocks)
		);
		onChange(EditorState.push(editorState, contentState, 'insert-fragment'));
		return true;
	}
	return false;
};
export default handlePastedText;

ghost avatar Nov 13 '19 08:11 ghost