all files / block-manager/actions/ drag.js

97.46% Statements 192/197
87.74% Branches 93/106
100% Functions 25/25
97.46% Lines 192/197
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 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290   1390× 1390× 1390× 1390× 1390×   1392× 1392× 1392× 1392× 1392× 1392× 1392× 1392×     1392×   1391× 1391× 1391×     1391×   12×   27× 27× 27× 27× 27× 26×         29× 29×   28× 28× 28×   39×           28× 28×     27×   27× 26× 26× 26× 26× 26× 26× 26× 26× 37× 37× 26× 26× 26×           27× 27×     28× 28× 28× 28×   27× 27× 27× 11×     16× 16× 16×     27× 27×   38×           27× 27×   26× 26× 26× 26× 26× 37× 37× 37× 37×     26× 26× 26× 26×   28× 28×   27×   26× 26× 26× 26× 25×   26× 26× 24× 24× 24×         21×     26× 37× 37×         26× 26× 26× 26× 24× 24×   26×   24× 35×       27× 27×     37×   26× 25× 25×   26× 26× 26× 26× 26× 25×   26×   25×     19×   25× 25×     25× 25×   25× 25×       25× 25×     25× 25×                 19× 19× 10×   19×     25× 11× 11× 11× 11×     14×   1385×        
define(["require", "exports", "@syncfusion/ej2-base", "../../common/utils/block", "../../common/utils/common", "../../common/utils/selection", "../../common/constant", "../../models/enums", "../../common/constant"], function (require, exports, ej2_base_1, block_1, common_1, selection_1, constants, enums_1, constant_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var DragAndDropAction = (function () {
        function DragAndDropAction(manager) {
            this.isDragCompleted = false;
            this.isDragMoveCancelled = false;
            this.draggedBlocks = [];
            this.isIndicatorAtTop = false;
            this.parent = manager;
        }
        DragAndDropAction.prototype.wireDragEvents = function () {
            ej2_base_1.EventHandler.add(this.parent.rootEditorElement, 'dragover', this.updateCurrentDroppingTarget, this);
            ej2_base_1.EventHandler.add(this.parent.rootEditorElement, 'dragenter', this.preventNoDropIcon, this);
            Eif (!ej2_base_1.isNullOrUndefined(this.parent.floatingIconAction.floatingIconContainer)) {
                var dragIcon = this.parent.floatingIconAction.floatingIconContainer.children[1];
                Eif (!ej2_base_1.isNullOrUndefined(dragIcon)) {
                    ej2_base_1.EventHandler.add(dragIcon, 'dragstart', this.handleDragStart, this);
                    ej2_base_1.EventHandler.add(dragIcon, 'drag', this.handleDragMove, this);
                    ej2_base_1.EventHandler.add(dragIcon, 'dragend', this.handleDragStop, this);
                }
            }
            this.parent.observer.on(constant_1.events.destroy, this.destroy, this);
        };
        DragAndDropAction.prototype.unwireDragEvents = function () {
            ej2_base_1.EventHandler.remove(this.parent.rootEditorElement, 'dragover', this.updateCurrentDroppingTarget);
            ej2_base_1.EventHandler.remove(this.parent.rootEditorElement, 'dragenter', this.preventNoDropIcon);
            if (!ej2_base_1.isNullOrUndefined(this.parent.floatingIconAction.floatingIconContainer)) {
                var dragIcon = this.parent.floatingIconAction.floatingIconContainer.children[1];
                Eif (!ej2_base_1.isNullOrUndefined(dragIcon)) {
                    ej2_base_1.EventHandler.remove(dragIcon, 'dragstart', this.handleDragStart);
                    ej2_base_1.EventHandler.remove(dragIcon, 'drag', this.handleDragMove);
                    ej2_base_1.EventHandler.remove(dragIcon, 'dragend', this.handleDragStop);
                }
            }
            this.parent.observer.off(constant_1.events.destroy, this.destroy);
        };
        DragAndDropAction.prototype.preventNoDropIcon = function (e) {
            e.preventDefault();
        };
        DragAndDropAction.prototype.updateCurrentDroppingTarget = function (e) {
            e.preventDefault();
            var elementsAtPoint = document.elementsFromPoint(e.clientX, e.clientY);
            var innerMostElement = elementsAtPoint[0];
            var closestBlock = innerMostElement.closest('.' + constants.BLOCK_CLS);
            if (innerMostElement && closestBlock) {
                this.currentDropTarget = closestBlock;
            }
            else {
                this.currentDropTarget = null;
            }
        };
        DragAndDropAction.prototype.handleDragMove = function (e) {
            var _this = this;
            if (ej2_base_1.isNullOrUndefined(this.parent.currentHoveredBlock)) {
                return;
            }
            this.isDragCompleted = false;
            var dropIndex = this.currentDropTarget ? block_1.getBlockIndexById(this.currentDropTarget.id, this.parent.getEditorBlocks()) : -1;
            var eventArgs = {
                blocks: this.draggedBlocks,
                fromIndex: this.draggedBlocks.map(function (block) { return block_1.getBlockIndexById(block.id, _this.parent.getEditorBlocks()); }),
                dropIndex: dropIndex,
                event: e,
                target: this.currentDropTarget,
                cancel: false
            };
            this.parent.observer.notify('blockDragging', eventArgs);
            if (eventArgs.cancel) {
                this.isDragMoveCancelled = true;
                return;
            }
            else {
                this.isDragMoveCancelled = false;
            }
            if (this.dragClone) {
                var editorRect = this.parent.rootEditorElement.getBoundingClientRect();
                ej2_base_1.updateCSSText(this.parent.floatingIconAction.floatingIconContainer, 'display: flex;');
                var dragIcon = this.parent.floatingIconAction.floatingIconContainer.querySelector('.e-block-drag-icon');
                var dragIconRect = dragIcon.getBoundingClientRect();
                ej2_base_1.updateCSSText(this.parent.floatingIconAction.floatingIconContainer, 'display: none;');
                var scrollTop = this.parent.rootEditorElement.scrollTop;
                var scrollLeft = this.parent.rootEditorElement.scrollLeft;
                var totalHeight = Array.from(this.dragClone.children)
                    .map(function (child) { return child.offsetHeight; })
                    .reduce(function (sum, height) { return sum + height; }, 0);
                var cssText = "opacity: 0.7; left: " + (e.clientX - editorRect.left + dragIconRect.width + scrollLeft) + "px; top: " + (e.clientY - editorRect.top + scrollTop) + "px; width: " + this.parent.currentHoveredBlock.offsetWidth + "px; height: " + totalHeight + "px;";
                ej2_base_1.updateCSSText(this.dragClone, cssText);
                if (e.clientY < editorRect.top ||
                    e.clientY > editorRect.bottom ||
                    e.clientX < editorRect.left ||
                    e.clientX > editorRect.right) {
                    ej2_base_1.updateCSSText(this.dragClone, 'opacity: 0;');
                }
            }
            setTimeout(function () {
                _this.updateDropIndicator();
            }, 50);
        };
        DragAndDropAction.prototype.handleDragStart = function (e) {
            this.isDragCompleted = false;
            this.isDragMoveCancelled = false;
            var editorBlocks = this.parent.getEditorBlocks();
            if (!e.target.classList.contains('e-block-drag-icon') || !this.parent.currentHoveredBlock) {
                return;
            }
            var selectedBlocks = [];
            var range = selection_1.getSelectedRange();
            if (range && range.toString().trim().length > 0) {
                selectedBlocks = this.parent.editorMethods.getSelectedBlocks();
            }
            else {
                var blockModel = block_1.getBlockModelById(this.parent.currentHoveredBlock.id, editorBlocks);
                Eif (blockModel) {
                    selectedBlocks.push(blockModel);
                }
            }
            this.draggedBlocks = selectedBlocks;
            var eventArgs = {
                blocks: this.draggedBlocks,
                fromIndex: this.draggedBlocks.map(function (block) { return block_1.getBlockIndexById(block.id, editorBlocks); }),
                dropIndex: this.currentDropTarget ? block_1.getBlockIndexById(this.currentDropTarget.id, editorBlocks) : -1,
                event: e,
                target: this.currentDropTarget,
                cancel: false
            };
            this.parent.observer.notify('blockDragStart', eventArgs);
            if (eventArgs.cancel) {
                e.preventDefault();
                return;
            }
            this.dragClone = document.createElement('div');
            var cssText = 'position: absolute; opacity: 0; pointer-events: none;';
            ej2_base_1.updateCSSText(this.dragClone, cssText);
            this.dragClone.classList.add('e-be-dragging-clone');
            for (var _i = 0, selectedBlocks_1 = selectedBlocks; _i < selectedBlocks_1.length; _i++) {
                var block = selectedBlocks_1[_i];
                var blockElement = document.getElementById(block.id);
                Eif (blockElement) {
                    this.dragClone.appendChild(blockElement.cloneNode(true));
                }
            }
            this.parent.blockContainer.appendChild(this.dragClone);
            var transparentImage = new Image();
            transparentImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
            e.dataTransfer.setDragImage(transparentImage, 0, 0);
        };
        DragAndDropAction.prototype.handleDragStop = function (e) {
            var _this = this;
            if (ej2_base_1.isNullOrUndefined(this.parent.currentHoveredBlock)) {
                return;
            }
            if (this.isDragMoveCancelled) {
                common_1.cleanupElement(this.dragClone);
                common_1.cleanupElement(this.dropIndicator);
                return;
            }
            e.preventDefault();
            this.isDragCompleted = true;
            var currentIndicatorBlock;
            if (this.dropIndicator) {
                currentIndicatorBlock = this.dropIndicator.closest('.' + constants.BLOCK_CLS);
            }
            var dropTarget;
            if (currentIndicatorBlock) {
                var hoveredBlockRect = this.parent.currentHoveredBlock.getBoundingClientRect();
                var isMovingDown = hoveredBlockRect.top < currentIndicatorBlock.getBoundingClientRect().top;
                if (!this.isIndicatorAtTop && !isMovingDown) {
                    dropTarget = block_1.getAdjacentBlock(currentIndicatorBlock, 'next');
                    Iif (ej2_base_1.isNullOrUndefined(dropTarget)) {
                        dropTarget = currentIndicatorBlock;
                    }
                }
                else {
                    dropTarget = currentIndicatorBlock;
                }
            }
            var eventArgs = {
                blocks: this.draggedBlocks.map(function (block) { return block; }),
                fromIndex: this.draggedBlocks.map(function (block) { return block_1.getBlockIndexById(block.id, _this.parent.getEditorBlocks()); }),
                dropIndex: dropTarget ? block_1.getBlockIndexById(dropTarget.id, this.parent.getEditorBlocks()) : -1,
                event: e,
                target: dropTarget
            };
            this.parent.observer.notify('blockDropped', eventArgs);
            common_1.cleanupElement(this.dragClone);
            common_1.cleanupElement(this.dropIndicator);
            if (dropTarget && dropTarget !== this.parent.currentHoveredBlock) {
                this.reorderBlocks(this.draggedBlocks, dropTarget);
                this.parent.listPlugin.recalculateMarkersForListItems();
            }
            this.draggedBlocks = [];
        };
        DragAndDropAction.prototype.reorderBlocks = function (draggedBlocks, dropTarget) {
            this.parent.execCommand({ command: 'MoveBlock', state: {
                    fromBlockIds: draggedBlocks.map(function (block) { return block.id; }),
                    toBlockId: dropTarget.id
                } });
        };
        DragAndDropAction.prototype.updateDropIndicator = function () {
            var _this = this;
            if (this.isDragCompleted ||
                !this.currentDropTarget ||
                this.currentDropTarget === this.parent.currentHoveredBlock ||
                this.draggedBlocks.some(function (block) { return block.id === _this.currentDropTarget.id; })) {
                common_1.cleanupElement(this.dropIndicator);
                return;
            }
            if (!this.dropIndicator) {
                this.dropIndicator = document.createElement('div');
                this.dropIndicator.classList.add('e-be-drop-indicator');
            }
            var hoverdBlockRect = this.parent.currentHoveredBlock.getBoundingClientRect();
            var dropTargetRect = this.currentDropTarget.getBoundingClientRect();
            var middleY = dropTargetRect.top + (dropTargetRect.height / 2);
            var draggedBlockRect;
            if (this.dragClone) {
                draggedBlockRect = this.dragClone.children[0].getBoundingClientRect();
            }
            if (ej2_base_1.isNullOrUndefined(draggedBlockRect) || ej2_base_1.isNullOrUndefined(hoverdBlockRect)) {
                return;
            }
            if (hoverdBlockRect.top > draggedBlockRect.top) {
                this.handleDraggingAbove(middleY, draggedBlockRect);
            }
            else {
                this.handleDraggingBelow(middleY, draggedBlockRect);
            }
            var currentIndicatorBlock = this.dropIndicator.closest('.' + constants.BLOCK_CLS);
            Iif (!currentIndicatorBlock) {
                return;
            }
            var indicatorBlockModel = block_1.getBlockModelById(currentIndicatorBlock.id, this.parent.getEditorBlocks());
            var specialTypes = [enums_1.BlockType.Divider, enums_1.BlockType.CollapsibleParagraph, enums_1.BlockType.CollapsibleHeading,
                enums_1.BlockType.Callout, enums_1.BlockType.Table, enums_1.BlockType.Image, enums_1.BlockType.Code];
            var isSpecialType = (specialTypes.indexOf(indicatorBlockModel.blockType) > -1);
            Iif (isSpecialType) {
                ej2_base_1.updateCSSText(this.dropIndicator, 'left: 46px;');
                return;
            }
            var blockContent = block_1.getBlockContentElement(currentIndicatorBlock);
            Iif (!blockContent) {
                return;
            }
            var leftOffset = blockContent.getBoundingClientRect().left - currentIndicatorBlock.getBoundingClientRect().left;
            ej2_base_1.updateCSSText(this.dropIndicator, "left: " + leftOffset + "px;");
        };
        DragAndDropAction.prototype.handleDraggingAbove = function (middleY, draggedBlockRect) {
            Eif (draggedBlockRect && draggedBlockRect.top < middleY) {
                var adjecentBLockEle = this.currentDropTarget.previousElementSibling;
                if (adjecentBLockEle) {
                    if (!this.checkAndInsertIndicatorInListBlock(adjecentBLockEle, true)) {
                        adjecentBLockEle.appendChild(this.dropIndicator);
                    }
                    this.isIndicatorAtTop = false;
                }
                else {
                    if (!this.checkAndInsertIndicatorInListBlock(this.currentDropTarget, false)) {
                        this.currentDropTarget.prepend(this.dropIndicator);
                    }
                    this.isIndicatorAtTop = true;
                }
            }
        };
        DragAndDropAction.prototype.handleDraggingBelow = function (middleY, draggedBlockRect) {
            Eif (draggedBlockRect && draggedBlockRect.top > middleY) {
                if (!this.checkAndInsertIndicatorInListBlock(this.currentDropTarget, true)) {
                    this.currentDropTarget.appendChild(this.dropIndicator);
                }
                this.isIndicatorAtTop = false;
            }
        };
        DragAndDropAction.prototype.checkAndInsertIndicatorInListBlock = function (element, isAfter) {
            if (block_1.isListTypeBlock(element.getAttribute('data-block-type'))) {
                var listItem = element.querySelector('li');
                Eif (listItem) {
                    listItem.insertAdjacentElement(isAfter ? 'afterend' : 'beforebegin', this.dropIndicator);
                    return true;
                }
            }
            return false;
        };
        DragAndDropAction.prototype.destroy = function () {
            this.unwireDragEvents();
        };
        return DragAndDropAction;
    }());
    exports.DragAndDropAction = DragAndDropAction;
});