all files / block-manager/services/ state-manager.js

99.19% Statements 122/123
88.76% Branches 79/89
100% Functions 16/16
99.17% Lines 119/120
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186   1390×   96× 96× 94× 94× 94× 93×                             185× 185×   184× 184× 10×   174× 174× 174×   173× 20×   173× 173× 173× 196× 123× 123×     120×     119× 119× 119×         73× 73× 73× 10×   63× 133× 63× 62× 62× 62×             173× 173×   173× 173× 173×             173× 173×   174× 174×   173×     173×   173× 173× 173× 196× 196× 74× 222× 222× 222× 84×       122× 122× 122×       213× 173× 11×     1762× 1762× 3475×   3475× 398×   3475× 3475× 4660× 10×       3475× 3475× 271×       9984× 9984×        
define(["require", "exports", "../../models/enums", "../../common/utils/transform", "../../common/utils/selection", "../../common/utils/block", "../../common/utils/common", "../../common/utils/common", "../../common/utils/dom", "../../common/constant", "./index"], function (require, exports, enums_1, transform_1, selection_1, block_1, common_1, common_2, dom_1, constants, index_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var StateManager = (function () {
        function StateManager(parent) {
            this.parent = parent;
        }
        StateManager.prototype.updateContentModelBasedOnDOM = function (contentElement, blockModel) {
            var childLen = contentElement ? contentElement.childNodes.length : 0;
            if ((childLen === 0) || (childLen === 1 && contentElement.childNodes[0].nodeType === Node.TEXT_NODE)) {
                var textNode = contentElement ? contentElement.firstChild : null;
                var nodeValue = (textNode && textNode.nodeValue) ? textNode.nodeValue : '';
                if (blockModel.content.length === 0) {
                    blockModel.content = [index_1.BlockFactory.createTextContent({ content: nodeValue })];
                }
                else {
                    blockModel.content[0].content = nodeValue;
                }
            }
            else {
                Iif (!contentElement) {
                    return;
                }
                var content_1 = [];
                contentElement.childNodes.forEach(function (childNode) {
                    Eif (childNode.nodeType === Node.ELEMENT_NODE) {
                        var element_1 = childNode;
                        var contentModel = blockModel.content.find(function (item) { return item.id === element_1.id; });
                        if (contentModel) {
                            contentModel.content = element_1.textContent;
                            content_1.push(contentModel);
                        }
                        else {
                            content_1.push(index_1.BlockFactory.createTextContent({ id: element_1.id, content: element_1.textContent }));
                        }
                    }
                });
                this.parent.blockService.updateContent(blockModel.id, content_1);
            }
        };
        StateManager.prototype.updateContentOnUserTyping = function (blockElement, updateEvent) {
            var _this = this;
            if (!blockElement) {
                return;
            }
            var block = block_1.getBlockModelById(blockElement.id, this.parent.getEditorBlocks());
            if (!block || (block && (block.blockType === 'Code' || block.blockType === 'Table'))) {
                return;
            }
            var oldBlockModel = common_1.decoupleReference(transform_1.sanitizeBlock(block));
            var contentElement = this.getContentElementForUpdate(selection_1.getSelectedRange(), blockElement);
            if (!contentElement) {
                return;
            }
            if (!block.content || contentElement.childNodes.length === 0) {
                this.parent.blockService.updateContent(block.id, []);
            }
            var previousContent;
            var newContentId = '';
            contentElement.childNodes.forEach(function (node) {
                if (node.nodeType === Node.TEXT_NODE) {
                    Eif (node.textContent) {
                        if (block.content.length === 0) {
                            _this.parent.blockService.updateContent(block.id, [index_1.BlockFactory.createTextContent({ id: node.parentElement.id || common_1.generateUniqueId(constants.CONTENT_ID_PREFIX), content: node.textContent })]);
                            contentElement.id = newContentId = block.content[0].id;
                        }
                        else {
                            if (common_2.isNodeAroundSpecialElements(node)) {
                                var index = Array.from(contentElement.childNodes).indexOf(node);
                                block.content.splice(index, 0, index_1.BlockFactory.createTextContent({ content: node.textContent }));
                                var span = dom_1.wrapNodeWithTag(node.cloneNode(true), 'span');
                                span.id = newContentId = block.content[parseInt(index.toString(), 10)].id;
                                contentElement.insertBefore(span, node);
                                contentElement.removeChild(node);
                            }
                            else {
                                previousContent = common_1.decoupleReference(transform_1.sanitizeContent(block.content[0]));
                                block.content[0].content = node.textContent;
                                newContentId = block.content[0].id;
                            }
                        }
                    }
                }
                else Eif (node.nodeType === Node.ELEMENT_NODE) {
                    var element_2 = node;
                    if (element_2.classList.contains('e-label-chip') || element_2.classList.contains('e-user-chip')) {
                        return;
                    }
                    Eif (element_2.innerText || element_2.childNodes.length > 0) {
                        var existingContent = block.content.find(function (c) { return c.id === element_2.id; });
                        if (existingContent) {
                            previousContent = common_1.decoupleReference(transform_1.sanitizeContent(existingContent));
                            existingContent.content = element_2.innerText;
                            newContentId = existingContent.id;
                        }
                        else {
                            var newId = newContentId = element_2.id || common_1.generateUniqueId(constants.CONTENT_ID_PREFIX);
                            block.content.push(index_1.BlockFactory.createTextContent({ id: newId, content: element_2.innerText }));
                        }
                    }
                }
            });
            Eif (block.blockType !== enums_1.BlockType.Code) {
                this.cleanUpStaleContents(block, contentElement);
            }
            var clonedBlock = common_1.decoupleReference(transform_1.sanitizeBlock(block));
            this.parent.undoRedoAction.trackContentChangedForUndoRedo(oldBlockModel, clonedBlock);
            this.parent.eventService.addChange({
                action: 'Update',
                data: {
                    block: clonedBlock,
                    prevBlock: oldBlockModel
                }
            });
            this.parent.observer.notify('triggerBlockChange', this.parent.eventService.getChanges());
            this.updateManagerBlocks();
        };
        StateManager.prototype.getContentElementForUpdate = function (range, blockElement) {
            var contentElement = block_1.getBlockContentElement(blockElement);
            if (!contentElement) {
                return null;
            }
            if (blockElement.closest('.' + constants.TOGGLE_BLOCK_CLS)) {
                var toggleHeader = dom_1.findClosestParent(range.startContainer, '.e-toggle-header');
                if (toggleHeader) {
                    contentElement = toggleHeader.querySelector('.' + constants.CONTENT_CLS);
                }
            }
            return contentElement;
        };
        StateManager.prototype.cleanUpStaleContents = function (block, contentElement) {
            var idAttributes = ['id', 'data-label-id', 'data-user-id'];
            var domContentIds = new Set();
            for (var _i = 0, _a = Array.from(contentElement.childNodes); _i < _a.length; _i++) {
                var node = _a[_i];
                if (node.nodeType === Node.ELEMENT_NODE) {
                    for (var _b = 0, idAttributes_1 = idAttributes; _b < idAttributes_1.length; _b++) {
                        var attr = idAttributes_1[_b];
                        var value = node.getAttribute(attr);
                        if (value) {
                            domContentIds.add(value);
                        }
                    }
                }
                else Eif (node.nodeType === Node.TEXT_NODE) {
                    Eif (node.parentElement) {
                        domContentIds.add(node.parentElement.id);
                    }
                }
            }
            var currentContent = block.content.filter(function (c) { return domContentIds.has(c.id); });
            if (currentContent.length !== block.content.length) {
                this.parent.blockService.updateContent(block.id, currentContent);
            }
        };
        StateManager.prototype.populateUniqueIds = function (blocks, parentBlockId) {
            var _this = this;
            blocks.forEach(function (block) {
                if (!block.id) {
                    block.id = common_1.generateUniqueId(constants.BLOCK_ID_PREFIX);
                }
                if (parentBlockId) {
                    block.parentId = parentBlockId;
                }
                Eif (block.content) {
                    block.content.forEach(function (content) {
                        if (!content.id) {
                            content.id = common_1.generateUniqueId(constants.CONTENT_ID_PREFIX);
                        }
                    });
                }
                var props = block.properties;
                if ((block_1.isChildrenProp(block)) && props.children.length > 0) {
                    _this.populateUniqueIds(props.children, block.id);
                }
            });
        };
        StateManager.prototype.updateManagerBlocks = function () {
            this.parent.blocks = this.parent.getEditorBlocks();
            this.parent.observer.notify('updateEditorBlocks', { blocks: this.parent.blocks });
        };
        return StateManager;
    }());
    exports.StateManager = StateManager;
});