/// /// /// import * as React from "react"; import { Editor, EditorState, Entity, CharacterMetadata, ContentBlock, Modifier, SelectionState, genKey } from "draft-js"; export class Tag extends React.Component { constructor(props: any) { super(props); } remove = (): void => { this.props.blockProps.removeBlock(this.props.block.getKey()); } render () { const {block} = this.props; if (block.getEntityAt(0)) { const data = Entity.get(block.getEntityAt(0)).getData(); return (
{data.content.name} clear
); } } } export class Hint extends React.Component { constructor(props: any) { super(props); } render () { const {block} = this.props; if (block.getEntityAt(0)) { const data = Entity.get(block.getEntityAt(0)).getData(); return (
{this.props.blockProps.autocomplete} {data.content.text}
); } } } export function removeBlock(editorState: EditorState, blockKey: string) { const content = editorState.getCurrentContent(); const targetRange = new SelectionState({ anchorKey: blockKey, anchorOffset: 0, focusKey: blockKey, focusOffset: 1 }); const withoutTag = Modifier.removeRange(content, targetRange, "backward"); const resetBlock = Modifier.setBlockType( withoutTag, withoutTag.getSelectionAfter(), "unstyled" ); const newState = EditorState.push(editorState, resetBlock, "remove-range"); return EditorState.forceSelection(newState, resetBlock.getSelectionAfter()); } export function applyEntity(editorState: EditorState, blockKey: string, entityKey: string) { const content = editorState.getCurrentContent(); const targetRange = new SelectionState({ anchorKey: blockKey, anchorOffset: 0, focusKey: blockKey, focusOffset: 1 }); const withNewEntity = Modifier.applyEntity( content, targetRange, entityKey ) const newState = EditorState.push(editorState, withNewEntity, "change-entity"); return EditorState.forceSelection(newState, withNewEntity.getSelectionAfter()); } export function addTagBlock(content: any, editorState: EditorState): any { const contentState = editorState.getCurrentContent(); const entityKey = Entity.create( "TOKEN", "IMMUTABLE", {content} ); const charData = CharacterMetadata.create({entity: entityKey}); const tag = new ContentBlock({ key: genKey(), type: "tag", text: "", characterList: [], }); const withTag = contentState.set("blockMap", contentState.getBlockMap().set(tag.key, tag)); const withRemovedPreviousBlock = withTag.set("blockMap", withTag.getBlockMap().delete(contentState.getSelectionBefore().getAnchorKey())) const withTagBlock = EditorState.push(editorState, withRemovedPreviousBlock, "insert-fragment"); return withTagBlock; } export function addHintBlock(content: any, editorState: EditorState): any { const contentState = editorState.getCurrentContent(); const selectionState = editorState.getSelection(); const entityKey = Entity.create( "TOKEN", "IMMUTABLE", {content} ); const charData = CharacterMetadata.create({entity: entityKey}); const hint = new ContentBlock({ key: genKey(), type: "hint", text: "", characterList: [], }); const empty = new ContentBlock({ key: genKey(), type: "unstyled", text: "", characterList: [], }); const withEmpty = contentState.set("blockMap", contentState.getBlockMap().set(empty.key, empty)); const withHint = withEmpty.set("blockMap", withEmpty.getBlockMap().set(hint.key, hint)); return { editorState: EditorState.forceSelection(EditorState.push(editorState, withHint, "insert-fragment"), selectionState), blockKey: hint.key } } export class SearchField extends React.Component { public onChange: any; constructor(props: any) { super(props); this.onChange = (editorState: EditorState) => { this.setState({editorState}) }; } render() { const {editorState} = this.state; return ( ) } }