1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | 'use strict';
|
12 |
|
13 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
|
14 |
|
15 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
16 |
|
17 | var BlockMapBuilder = require("./BlockMapBuilder");
|
18 |
|
19 | var CharacterMetadata = require("./CharacterMetadata");
|
20 |
|
21 | var ContentBlock = require("./ContentBlock");
|
22 |
|
23 | var ContentBlockNode = require("./ContentBlockNode");
|
24 |
|
25 | var DraftModifier = require("./DraftModifier");
|
26 |
|
27 | var EditorState = require("./EditorState");
|
28 |
|
29 | var generateRandomKey = require("./generateRandomKey");
|
30 |
|
31 | var gkx = require("./gkx");
|
32 |
|
33 | var Immutable = require("immutable");
|
34 |
|
35 | var moveBlockInContentState = require("./moveBlockInContentState");
|
36 |
|
37 | var experimentalTreeDataSupport = gkx('draft_tree_data_support');
|
38 | var ContentBlockRecord = experimentalTreeDataSupport ? ContentBlockNode : ContentBlock;
|
39 | var List = Immutable.List,
|
40 | Repeat = Immutable.Repeat;
|
41 | var AtomicBlockUtils = {
|
42 | insertAtomicBlock: function insertAtomicBlock(editorState, entityKey, character) {
|
43 | var contentState = editorState.getCurrentContent();
|
44 | var selectionState = editorState.getSelection();
|
45 | var afterRemoval = DraftModifier.removeRange(contentState, selectionState, 'backward');
|
46 | var targetSelection = afterRemoval.getSelectionAfter();
|
47 | var afterSplit = DraftModifier.splitBlock(afterRemoval, targetSelection);
|
48 | var insertionTarget = afterSplit.getSelectionAfter();
|
49 | var asAtomicBlock = DraftModifier.setBlockType(afterSplit, insertionTarget, 'atomic');
|
50 | var charData = CharacterMetadata.create({
|
51 | entity: entityKey
|
52 | });
|
53 | var atomicBlockConfig = {
|
54 | key: generateRandomKey(),
|
55 | type: 'atomic',
|
56 | text: character,
|
57 | characterList: List(Repeat(charData, character.length))
|
58 | };
|
59 | var atomicDividerBlockConfig = {
|
60 | key: generateRandomKey(),
|
61 | type: 'unstyled'
|
62 | };
|
63 |
|
64 | if (experimentalTreeDataSupport) {
|
65 | atomicBlockConfig = _objectSpread({}, atomicBlockConfig, {
|
66 | nextSibling: atomicDividerBlockConfig.key
|
67 | });
|
68 | atomicDividerBlockConfig = _objectSpread({}, atomicDividerBlockConfig, {
|
69 | prevSibling: atomicBlockConfig.key
|
70 | });
|
71 | }
|
72 |
|
73 | var fragmentArray = [new ContentBlockRecord(atomicBlockConfig), new ContentBlockRecord(atomicDividerBlockConfig)];
|
74 | var fragment = BlockMapBuilder.createFromArray(fragmentArray);
|
75 | var withAtomicBlock = DraftModifier.replaceWithFragment(asAtomicBlock, insertionTarget, fragment);
|
76 | var newContent = withAtomicBlock.merge({
|
77 | selectionBefore: selectionState,
|
78 | selectionAfter: withAtomicBlock.getSelectionAfter().set('hasFocus', true)
|
79 | });
|
80 | return EditorState.push(editorState, newContent, 'insert-fragment');
|
81 | },
|
82 | moveAtomicBlock: function moveAtomicBlock(editorState, atomicBlock, targetRange, insertionMode) {
|
83 | var contentState = editorState.getCurrentContent();
|
84 | var selectionState = editorState.getSelection();
|
85 | var withMovedAtomicBlock;
|
86 |
|
87 | if (insertionMode === 'before' || insertionMode === 'after') {
|
88 | var targetBlock = contentState.getBlockForKey(insertionMode === 'before' ? targetRange.getStartKey() : targetRange.getEndKey());
|
89 | withMovedAtomicBlock = moveBlockInContentState(contentState, atomicBlock, targetBlock, insertionMode);
|
90 | } else {
|
91 | var afterRemoval = DraftModifier.removeRange(contentState, targetRange, 'backward');
|
92 | var selectionAfterRemoval = afterRemoval.getSelectionAfter();
|
93 |
|
94 | var _targetBlock = afterRemoval.getBlockForKey(selectionAfterRemoval.getFocusKey());
|
95 |
|
96 | if (selectionAfterRemoval.getStartOffset() === 0) {
|
97 | withMovedAtomicBlock = moveBlockInContentState(afterRemoval, atomicBlock, _targetBlock, 'before');
|
98 | } else if (selectionAfterRemoval.getEndOffset() === _targetBlock.getLength()) {
|
99 | withMovedAtomicBlock = moveBlockInContentState(afterRemoval, atomicBlock, _targetBlock, 'after');
|
100 | } else {
|
101 | var afterSplit = DraftModifier.splitBlock(afterRemoval, selectionAfterRemoval);
|
102 | var selectionAfterSplit = afterSplit.getSelectionAfter();
|
103 |
|
104 | var _targetBlock2 = afterSplit.getBlockForKey(selectionAfterSplit.getFocusKey());
|
105 |
|
106 | withMovedAtomicBlock = moveBlockInContentState(afterSplit, atomicBlock, _targetBlock2, 'before');
|
107 | }
|
108 | }
|
109 |
|
110 | var newContent = withMovedAtomicBlock.merge({
|
111 | selectionBefore: selectionState,
|
112 | selectionAfter: withMovedAtomicBlock.getSelectionAfter().set('hasFocus', true)
|
113 | });
|
114 | return EditorState.push(editorState, newContent, 'move-block');
|
115 | }
|
116 | };
|
117 | module.exports = AtomicBlockUtils; |
\ | No newline at end of file |