@syncfusion/ej2-spreadsheet
Version:
Feature-rich JavaScript Spreadsheet (Excel) control with built-in support for selection, editing, formatting, importing and exporting to Excel
851 lines (850 loc) • 92.6 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
import { detach, EventHandler, Browser, isNullOrUndefined, extend, isUndefined } from '@syncfusion/ej2-base';
import { getRangeIndexes, getCell, getSheet, getSwapRange, inRange, isReadOnlyCells, setCell, checkColumnValidation, getRowHeight, getColumnWidth } from '../../workbook/index';
import { getRangeAddress, getSheetIndexFromId, getSheetName } from '../../workbook/index';
import { getFormattedCellObject, workbookFormulaOperation, checkIsFormula, mergedRange } from '../../workbook/index';
import { setMerge, getCellIndexes } from '../../workbook/index';
import { ribbonClick, copy, paste, initiateFilterUI, setPosition, isLockedCells, focus, readonlyAlert, isValidUrl } from '../common/index';
import { hasTemplate, getTextHeightWithBorder, getLines, getExcludedColumnWidth, editAlert } from '../common/index';
import { enableToolbarItems, rowHeightChanged, completeAction, insertImage } from '../common/index';
import { clearCopy, selectRange, dialog, contentLoaded, tabSwitch, cMenuBeforeOpen, createImageElement, setMaxHgt } from '../common/index';
import { getMaxHgt, setRowEleHeight, locale, deleteImage, getRowIdxFromClientY, getColIdxFromClientX, cut } from '../common/index';
import { colWidthChanged, getFilterRange } from '../common/index';
import { Deferred } from '@syncfusion/ej2-data';
import { refreshRibbonIcons, refreshClipboard, getColumn, isLocked as isCellLocked } from '../../workbook/index';
import { setFilteredCollection, setChart, parseIntValue, isSingleCell, activeCellMergedRange, getRowsHeight } from '../../workbook/index';
import { getUpdatedFormula, clearCFRule, checkUniqueRange, clearFormulaDependentCells } from '../../workbook/index';
import { updateCell, beginAction, isFilterHidden, applyCF, checkRange } from '../../workbook/index';
import { cellValidation, removeUniquecol, wrapEvent } from '../../workbook/common/event';
/**
* Represents clipboard support for Spreadsheet.
*/
var Clipboard = /** @class */ (function () {
function Clipboard(parent) {
this.parent = parent;
this.init();
this.addEventListener();
}
Clipboard.prototype.init = function () {
this.parent.element.appendChild(this.parent.createElement('input', { className: 'e-clipboard', attrs: { 'contenteditable': 'true', 'tabindex': '-1', 'aria-hidden': 'true' } }));
};
Clipboard.prototype.addEventListener = function () {
var ele = this.getClipboardEle();
this.parent.on(cut, this.cut, this);
this.parent.on(copy, this.copy, this);
this.parent.on(paste, this.paste, this);
this.parent.on(clearCopy, this.clearCopiedInfo, this);
this.parent.on(tabSwitch, this.tabSwitchHandler, this);
this.parent.on(cMenuBeforeOpen, this.cMenuBeforeOpenHandler, this);
this.parent.on(ribbonClick, this.ribbonClickHandler, this);
this.parent.on(contentLoaded, this.initCopyIndicator, this);
this.parent.on(rowHeightChanged, this.rowHeightChanged, this);
this.parent.on(colWidthChanged, this.colWidthChanged, this);
this.parent.on(refreshClipboard, this.refreshOnInsertDelete, this);
EventHandler.add(ele, 'cut', this.cut, this);
EventHandler.add(ele, 'copy', this.copy, this);
EventHandler.add(ele, 'paste', this.paste, this);
};
Clipboard.prototype.removeEventListener = function () {
var ele = this.getClipboardEle();
if (!this.parent.isDestroyed) {
this.parent.off(cut, this.cut);
this.parent.off(copy, this.copy);
this.parent.off(paste, this.paste);
this.parent.off(clearCopy, this.clearCopiedInfo);
this.parent.off(tabSwitch, this.tabSwitchHandler);
this.parent.off(cMenuBeforeOpen, this.cMenuBeforeOpenHandler);
this.parent.off(ribbonClick, this.ribbonClickHandler);
this.parent.off(contentLoaded, this.initCopyIndicator);
this.parent.off(rowHeightChanged, this.rowHeightChanged);
this.parent.off(colWidthChanged, this.colWidthChanged);
this.parent.off(refreshClipboard, this.refreshOnInsertDelete);
}
EventHandler.remove(ele, 'cut', this.cut);
EventHandler.remove(ele, 'copy', this.copy);
EventHandler.remove(ele, 'paste', this.paste);
};
Clipboard.prototype.ribbonClickHandler = function (args) {
var parentId = this.parent.element.id;
switch (args.item.id) {
case parentId + '_cut':
this.cut({ invokeCopy: true });
break;
case parentId + '_copy':
this.copy({ invokeCopy: true });
break;
}
};
Clipboard.prototype.tabSwitchHandler = function (args) {
if (args.activeTab === 0 && !this.copiedInfo && !this.copiedShapeInfo) {
this.hidePaste();
}
};
Clipboard.prototype.cMenuBeforeOpenHandler = function (e) {
var sheet = this.parent.getActiveSheet();
var l10n = this.parent.serviceLocator.getService(locale);
var delRowItems = [];
var hideRowItems = [];
var delColItems = [];
var hideColItems = [];
var actCell = sheet.activeCell;
var actCellIndex = getCellIndexes(actCell);
var cellObj = getCell(actCellIndex[0], actCellIndex[1], sheet);
var isLocked = sheet.isProtected && isCellLocked(cellObj, getColumn(sheet, actCellIndex[1]));
if (e.target === 'Content' || e.target === 'RowHeader' || e.target === 'ColumnHeader' || e.target === 'SelectAll') {
this.parent.enableContextMenuItems([l10n.getConstant('Paste'), l10n.getConstant('PasteSpecial')], (this.copiedInfo ||
this.copiedShapeInfo && !isLocked) ? true : false);
this.parent.enableContextMenuItems([l10n.getConstant('Cut')], !isLocked);
}
if (e.target === 'Content') {
if (sheet.isProtected) {
this.parent.enableContextMenuItems([l10n.getConstant('Filter'), l10n.getConstant('Sort'),
l10n.getConstant('AddNote')], false);
}
if (isLocked) {
this.parent.enableContextMenuItems([l10n.getConstant('Cut'), l10n.getConstant('Hyperlink'),
l10n.getConstant('EditNote'), l10n.getConstant('DeleteNote')], false);
}
else if (isReadOnlyCells(this.parent, getSwapRange(getRangeIndexes(sheet.selectedRange)))) {
this.parent.enableContextMenuItems([l10n.getConstant('Cut'), l10n.getConstant('Paste'), l10n.getConstant('PasteSpecial'),
l10n.getConstant('Filter'), l10n.getConstant('Sort'), l10n.getConstant('Hyperlink'), l10n.getConstant('EditHyperlink'),
l10n.getConstant('OpenHyperlink'), l10n.getConstant('RemoveHyperlink'), l10n.getConstant('AddNote')], false);
}
else if (sheet.isProtected && !sheet.protectSettings.insertLink) {
this.parent.enableContextMenuItems([l10n.getConstant('Hyperlink')], false);
}
}
if (sheet.isProtected) {
if (e.target === 'ColumnHeader') {
delColItems = [l10n.getConstant('DeleteColumn'), l10n.getConstant('DeleteColumns'),
l10n.getConstant('InsertColumn'), l10n.getConstant('InsertColumns')];
hideColItems = [l10n.getConstant('HideColumn'), l10n.getConstant('HideColumns'), l10n.getConstant('UnhideColumns')];
this.parent.enableContextMenuItems(delColItems, false);
this.parent.enableContextMenuItems(hideColItems, sheet.protectSettings.formatColumns);
}
if (e.target === 'RowHeader') {
delRowItems = [l10n.getConstant('DeleteRow'), l10n.getConstant('DeleteRows'),
l10n.getConstant('InsertRow'), l10n.getConstant('InsertRows')];
hideRowItems = [l10n.getConstant('HideRow'), l10n.getConstant('HideRows'), l10n.getConstant('UnhideRows')];
this.parent.enableContextMenuItems(delRowItems, false);
this.parent.enableContextMenuItems(hideRowItems, sheet.protectSettings.formatRows);
}
}
};
Clipboard.prototype.rowHeightChanged = function (args) {
if (this.copiedInfo) {
var ele = this.getCopyIndicator();
if (ele) {
if (this.copiedInfo.range[0] > args.rowIdx) {
ele.style.top = parseFloat(ele.style.top) + args.threshold + "px";
}
else if (inRange(this.copiedInfo.range, args.rowIdx, this.copiedInfo.range[1])) {
ele.style.height = parseFloat(ele.style.height) + args.threshold + "px";
}
}
}
};
Clipboard.prototype.colWidthChanged = function (args) {
if (this.copiedInfo) {
var ele = this.getCopyIndicator();
if (ele) {
if (this.copiedInfo.range[1] > args.colIdx) {
ele.style.left = parseFloat(ele.style.left) + args.threshold + "px";
}
else if (inRange(this.copiedInfo.range, this.copiedInfo.range[0], args.colIdx)) {
ele.style.width = parseFloat(ele.style.width) + args.threshold + "px";
}
}
}
};
Clipboard.prototype.cut = function (args) {
this.setCopiedInfo(args, true);
};
Clipboard.prototype.copy = function (args) {
this.setCopiedInfo(args, false);
};
Clipboard.prototype.paste = function (args) {
var _this = this;
if (this.parent.isEdit || this.parent.element.getElementsByClassName('e-dlg-overlay').length > 0) {
var editEle = this.parent.element.getElementsByClassName('e-spreadsheet-edit')[0];
editEle.style.height = 'auto';
return;
}
var rfshRange;
var isExternal = ((args && args.clipboardData) || window['clipboardData']);
if (isExternal && args.clipboardData && args.clipboardData.getData('isInternalCut').length && !this.copiedInfo) {
return; // to prevent multiple cut paste action
}
if (isExternal || this.copiedShapeInfo || (args.isInternal && this.copiedInfo)) {
args.isInternal = !isExternal;
var isCut = void 0;
var copiedIdx = this.getCopiedIdx();
args.isAction = !!isExternal || args.isAction;
var cSIdx = args && args.sIdx > -1 ? args.sIdx : this.parent.activeSheetIndex;
var curSheet_1 = getSheet(this.parent, cSIdx);
var selIdx = getSwapRange(args && args.range || getRangeIndexes(curSheet_1.selectedRange));
var pasteModelArgs = void 0;
var rows = void 0;
if (isExternal) {
pasteModelArgs = this.getExternalCells(args);
rows = pasteModelArgs.model;
if (!args.isInternal && pasteModelArgs.internal) {
isExternal = false;
if (!this.copiedInfo) {
return;
}
}
if (!rows || !rows.length) { // If image pasted
if (pasteModelArgs.file) {
this.parent.notify(insertImage, { file: pasteModelArgs.file });
return;
}
else if (this.copiedInfo) {
isExternal = false;
}
else {
return;
}
}
}
pasteModelArgs = pasteModelArgs;
var copyInfo = Object.assign({ isExternal: isExternal }, this.copiedInfo);
var cIdx_1;
var pSheetIdx_1;
var column = void 0;
var notRemoveMerge = void 0;
var isRepeative = void 0;
var cSheetSel = void 0;
var prevSheet_1;
var isRowSelected = void 0;
var isColSelected = void 0;
if (isExternal) {
pSheetIdx_1 = cSIdx;
prevSheet_1 = getSheet(this.parent, pSheetIdx_1);
column = {};
cSheetSel = pasteModelArgs.selection;
isRepeative = cSheetSel !== 'Sheet' && (selIdx[2] - selIdx[0] + 1) % pasteModelArgs.rowCount === 0 &&
(selIdx[3] - selIdx[1] + 1) % pasteModelArgs.colCount === 0;
cIdx_1 = [0, 0, pasteModelArgs.usedRowIndex, pasteModelArgs.usedColIndex];
}
else {
cIdx_1 = getSwapRange(this.copiedShapeInfo ? getRangeIndexes(curSheet_1.selectedRange) : this.copiedInfo.range);
pSheetIdx_1 = copiedIdx;
column = getColumn(curSheet_1, cIdx_1[1]);
notRemoveMerge = isSingleCell(cIdx_1) && this.isRangeMerged(selIdx, curSheet_1);
prevSheet_1 = getSheet(this.parent, pSheetIdx_1);
isRepeative = !notRemoveMerge && (selIdx[2] - selIdx[0] + 1) % (cIdx_1[2] - cIdx_1[0] + 1) === 0 &&
(selIdx[3] - selIdx[1] + 1) % (cIdx_1[3] - cIdx_1[1] + 1) === 0;
if (prevSheet_1) {
isRowSelected = cIdx_1[1] === 0 && cIdx_1[3] === prevSheet_1.colCount - 1;
isColSelected = cIdx_1[0] === 0 && cIdx_1[2] === prevSheet_1.rowCount - 1;
if (isRowSelected) {
if (isColSelected) {
cSheetSel = 'Sheet';
cIdx_1[2] = prevSheet_1.usedRange.rowIndex;
cIdx_1[3] = prevSheet_1.usedRange.colIndex;
}
else {
cSheetSel = 'Row';
cIdx_1[3] = prevSheet_1.usedRange.colIndex;
}
}
else if (isColSelected) {
cSheetSel = 'Column';
cIdx_1[2] = prevSheet_1.usedRange.rowIndex;
}
}
}
rfshRange = isRepeative ? selIdx : [selIdx[0], selIdx[1]]
.concat([selIdx[0] + cIdx_1[2] - cIdx_1[0], selIdx[1] + cIdx_1[3] - cIdx_1[1] || selIdx[1]]);
if (cSheetSel) {
if ((cSheetSel === 'Sheet' || cSheetSel === 'Column') && rfshRange[2] < curSheet_1.usedRange.rowIndex) {
rfshRange[2] = curSheet_1.usedRange.rowIndex;
}
if ((cSheetSel === 'Sheet' || cSheetSel === 'Row') && rfshRange[3] < curSheet_1.usedRange.colIndex) {
rfshRange[3] = curSheet_1.usedRange.colIndex;
}
}
var pasteType = (args && args.type) || 'All';
if (isReadOnlyCells(this.parent, rfshRange)) {
this.parent.notify(readonlyAlert, null);
return;
}
else if (curSheet_1.isProtected && isLockedCells(this.parent, rfshRange)) {
this.parent.notify(editAlert, null);
return;
}
if (args.isAction && !this.copiedShapeInfo) {
var beginEventArgs = { requestType: 'paste', copiedInfo: this.copiedInfo,
copiedRange: getRangeAddress(cIdx_1), pastedRange: getRangeAddress(rfshRange), type: pasteType, cancel: false };
this.parent.notify(beginAction, { eventArgs: beginEventArgs, action: 'clipboard' });
if (beginEventArgs.cancel) {
return;
}
selIdx = getRangeIndexes(beginEventArgs.pastedRange);
if (isExternal) {
isRepeative = pasteModelArgs.selection !== 'Sheet' && (selIdx[2] - selIdx[0] + 1) % pasteModelArgs.rowCount === 0 &&
(selIdx[3] - selIdx[1] + 1) % pasteModelArgs.colCount === 0;
}
else {
isRepeative = !notRemoveMerge && !isRowSelected && (selIdx[2] - selIdx[0] + 1) % (cIdx_1[2] - cIdx_1[0] + 1) === 0
&& !isColSelected && (selIdx[3] - selIdx[1] + 1) % (cIdx_1[3] - cIdx_1[1] + 1) === 0;
}
rfshRange = isRepeative ? selIdx : [selIdx[0], selIdx[1]].concat([selIdx[0] + cIdx_1[2] - cIdx_1[0], selIdx[1] + cIdx_1[3] - cIdx_1[1] || selIdx[1]]);
pasteType = beginEventArgs.type;
}
var selectionRange = void 0;
if (cSheetSel) {
selectionRange = [].concat(rfshRange);
if (cSheetSel === 'Sheet' || cSheetSel === 'Column') {
if (rfshRange[2] < curSheet_1.usedRange.rowIndex) {
rfshRange[2] = curSheet_1.usedRange.rowIndex;
}
if (cIdx_1[2] < curSheet_1.usedRange.rowIndex) {
cIdx_1[2] += curSheet_1.usedRange.rowIndex - cIdx_1[2];
}
if (selectionRange[2] < curSheet_1.rowCount) {
selectionRange[2] = curSheet_1.rowCount - 1;
}
}
if (cSheetSel === 'Sheet' || cSheetSel === 'Row') {
if (rfshRange[3] < curSheet_1.usedRange.colIndex) {
cIdx_1[3] += curSheet_1.usedRange.colIndex - rfshRange[3];
rfshRange[3] = curSheet_1.usedRange.colIndex;
}
if (cIdx_1[3] < curSheet_1.usedRange.colIndex) {
cIdx_1[3] += curSheet_1.usedRange.colIndex - cIdx_1[3];
}
if (selectionRange[3] < curSheet_1.colCount) {
selectionRange[3] = curSheet_1.colCount - 1;
}
}
}
else {
selectionRange = rfshRange;
}
var cell = void 0;
var isExtend = void 0;
var prevCell = void 0;
var rowIdx = selIdx[0];
var mergeCollection = [];
if (curSheet_1.isProtected && isLockedCells(this.parent, rfshRange)) {
this.parent.notify(editAlert, null);
return;
}
if (this.copiedShapeInfo && !this.copiedInfo) {
var pictureElem = this.copiedShapeInfo.pictureElem;
if (pictureElem.classList.contains('e-datavisualization-chart')) {
this.copiedShapeInfo.chartInfo.top = null;
this.copiedShapeInfo.chartInfo.left = null;
this.parent.notify(setChart, {
chart: [this.copiedShapeInfo.chartInfo], isInitCell: true, isUndoRedo: true, isPaste: true,
dataSheetIdx: this.copiedShapeInfo.sheetIdx, isCut: this.copiedShapeInfo.isCut, sheetId: curSheet_1.id,
range: args.range || curSheet_1.name + "!" + curSheet_1.selectedRange
});
}
else {
this.parent.notify(createImageElement, {
options: {
src: pictureElem.style.backgroundImage.replace(/url\((['"])?(.*?)\1\)/gi, '$2'),
height: this.copiedShapeInfo.height, width: this.copiedShapeInfo.width,
id: this.copiedShapeInfo.isCut ? pictureElem.id : ''
},
range: getRangeAddress([rowIdx, selIdx[1], rowIdx, selIdx[1]]), isPublic: false, isUndoRedo: true
});
}
var pastedCell = getCell(rowIdx, selIdx[1], curSheet_1);
if (pastedCell && !isNullOrUndefined(pastedCell.image) && pastedCell.image.length > 0) {
var eventArgs = {
requestType: 'imagePaste',
copiedShapeInfo: this.copiedShapeInfo,
pasteSheetIndex: this.parent.activeSheetIndex,
pastedRange: getSheetName(this.parent) + '!' + getRangeAddress([rowIdx, selIdx[1], rowIdx, selIdx[1]]),
pastedPictureElement: document.getElementById(pastedCell.image[pastedCell.image.length - 1].id)
};
this.parent.notify(completeAction, { eventArgs: eventArgs, action: 'clipboard' });
}
}
else {
var cRows = [];
var isInRange = this.isInRange(cIdx_1, selIdx, copiedIdx);
var isFullRowMerge = false;
var isFullColMerge = false;
var hiddenCount = 0;
var cf = [];
var cfRule = void 0;
var cancel = void 0;
if (!isRepeative && pasteType !== 'Values') {
cfRule = this.setCF(cIdx_1, rfshRange, prevSheet_1, curSheet_1, cf, cfRule);
}
var isUniqueCell = false;
var uniqueCellColl = [];
var copyCellArgs = {
sheet: curSheet_1, isExternal: !!isExternal
};
var pasteSetCell = this.setCell(copyCellArgs);
var cutSetCell_1 = !isExternal && this.copiedInfo.isCut && this.setCell({ sheet: prevSheet_1 });
var prevSheetMergeCollection = [];
var colValidationCollection = [];
var pasteMergeCollection = [];
for (var i = cIdx_1[0], l = 0; i <= cIdx_1[2]; i++, l++) {
if (!isExternal && !copyInfo.isCut && isFilterHidden(prevSheet_1, i)) {
l--;
hiddenCount++;
continue;
}
if (isInRange) {
cRows[selIdx[0] + l] = { cells: [] };
}
for (var j = cIdx_1[1], k = 0; j <= cIdx_1[3]; j++, k++) {
if (isInRange) {
cRows[selIdx[0] + l].cells[selIdx[1] + k] = getCell(selIdx[0] + l, selIdx[1] + k, prevSheet_1, false, true);
}
cell = isExternal ? (rows[i] && rows[i].cells[j]) || {} :
extend({}, (isInRange && cRows[i] && cRows[i].cells[j]) ?
cRows[i].cells[j] : getCell(i, j, prevSheet_1), null, true);
column = getColumn(prevSheet_1, j);
if (!cell.validation && checkColumnValidation(column, i, j)) {
var validation = Object.assign({}, column.validation);
var prevIdx = [0, cIdx_1[1], 0, cIdx_1[3]];
var value1 = validation.value1;
var value2 = validation.value2;
if (checkIsFormula(value1)) {
validation.value1 = getUpdatedFormula([i, j], prevIdx, prevSheet_1, this.parent, { formula: value1 });
}
if (checkIsFormula(value2)) {
validation.value2 = getUpdatedFormula([i, j], prevIdx, prevSheet_1, this.parent, { formula: value2 });
}
cell.validation = validation;
}
if (cell && cell.isReadOnly) {
delete cell.isReadOnly;
}
if (isRowSelected || isColSelected) {
if (cell && cell.rowSpan) {
if (cell.rowSpan > 0) {
if ((cell.rowSpan + i) - 1 <= cIdx_1[2]) {
isFullRowMerge = true;
}
else {
cell = {};
}
}
else if (!isFullRowMerge) {
cell = {};
}
else if (cell.rowSpan < 0) {
var rowSpan = cell.rowSpan;
var colSpan = cell.colSpan ? cell.colSpan : 0;
var spanCell = getCell(rowIdx + rowSpan, (selIdx[1] + k) + colSpan, curSheet_1);
if (spanCell && !spanCell.rowSpan) {
cell = {};
}
}
}
if (cell && cell.colSpan) {
if (cell.colSpan > 0) {
if ((cell.colSpan + j) - 1 <= cIdx_1[3]) {
isFullColMerge = true;
}
else {
cell = {};
}
}
else if (!isFullColMerge) {
cell = {};
}
}
}
if (cell && pasteType) {
var model = void 0;
switch (pasteType) {
case 'Formats':
model = { format: cell.format, style: cell.style };
if (this.copiedInfo && !this.copiedInfo.isCut) {
if (cell.rowSpan) {
model.rowSpan = cell.rowSpan;
}
if (cell.colSpan) {
model.colSpan = cell.colSpan;
}
}
cell = model;
break;
case 'Values':
cell = { value: cell.value };
if (cell.value && cell.value.toString().indexOf('\n') > -1) {
var ele = this.parent.getCell(selIdx[0], selIdx[1]);
ele.classList.add('e-alt-unwrap');
}
break;
}
isExtend = ['Formats', 'Values'].indexOf(pasteType) > -1;
}
if ((!this.parent.scrollSettings.isFinite && (cIdx_1[2] - cIdx_1[0] > (1048575 - selIdx[0])
|| cIdx_1[3] - cIdx_1[1] > (16383 - selIdx[1])))
|| (this.parent.scrollSettings.isFinite && (cIdx_1[2] - cIdx_1[0] > (curSheet_1.rowCount - 1 - selIdx[0])
|| cIdx_1[3] - cIdx_1[1] > (curSheet_1.colCount - 1 - selIdx[1])))) {
this.showDialog();
return;
}
if (isRepeative) {
for (var x = selIdx[0]; x <= selIdx[2]; x += (cIdx_1[2] - cIdx_1[0]) + 1) {
if (!copyInfo.isCut && !hiddenCount && isFilterHidden(curSheet_1, x + l)) {
continue;
}
for (var y = selIdx[1]; y <= selIdx[3]; y += (cIdx_1[3] - cIdx_1[1] + 1)) {
if (i === cIdx_1[0] && j === cIdx_1[1] && (cfRule === undefined || cfRule.length) &&
pasteType !== 'Values') {
cfRule = this.setCF(cIdx_1, [x, y, x + (cIdx_1[2] - cIdx_1[0]), y + (cIdx_1[3] - cIdx_1[1])], prevSheet_1, curSheet_1, cf, cfRule);
}
prevCell = getCell(x + l, y + k, curSheet_1, false, true);
if (!isExternal && (!isNullOrUndefined(prevCell.colSpan) || !isNullOrUndefined(prevCell.rowSpan))) {
if (isRowSelected || isColSelected) {
continue;
}
var merge = { range: [x + l, y + k, x + l, y + k], merge: false, isAction: false, type: 'All',
sheetIndex: cSIdx, preventRefresh: cSIdx !== this.parent.activeSheetIndex };
mergeCollection.push(merge);
this.parent.notify(setMerge, merge);
}
var colInd = y + k;
if (cell && cell.rowSpan > 1 || cell.colSpan > 1) {
var pasteRange = [x + l, colInd, x + l + (cell.rowSpan || 1) - 1,
colInd + (cell.colSpan || 1) - 1];
var hasOverlap = !(pasteRange[2] < cIdx_1[0] || pasteRange[0] > cIdx_1[2] ||
pasteRange[3] < cIdx_1[1] || pasteRange[1] > cIdx_1[3]);
if (hasOverlap) {
pasteMergeCollection.push(pasteRange);
}
}
cell = extend({}, cell ? cell : {}, null, true);
if (!isExtend && this.copiedInfo && !this.copiedInfo.isCut && cell.formula) {
var newFormula = getUpdatedFormula([x + l, colInd], [i, j], prevSheet_1, this.parent, isInRange ? cell : null);
if (!isNullOrUndefined(newFormula)) {
cell.formula = newFormula;
}
}
if (this.copiedInfo && !this.copiedInfo.isCut && cell.validation) {
var currIdx = selIdx;
var prevIdx = cIdx_1;
var updatedVal = getUpdatedFormula(currIdx, prevIdx, prevSheet_1, this.parent, { formula: cell.validation.value1 });
cell.validation.value1 = updatedVal;
if (cell.validation.value2 !== '') {
updatedVal = getUpdatedFormula(currIdx, prevIdx, prevSheet_1, this.parent, { formula: cell.validation.value2 });
cell.validation.value2 = updatedVal;
}
}
if (curSheet_1.isProtected && cell && cell.isLocked !== false) {
cell.isLocked = prevCell.isLocked;
}
if (prevCell && prevCell.formula && prevCell.formula.indexOf('=UNIQUE(') > -1) {
this.parent.notify(removeUniquecol, null);
}
var uniqueFormulaArgs = {
cellIdx: [i, j], isUnique: false, uniqueRange: '', sheetName: prevSheet_1.name
};
this.parent.notify(checkUniqueRange, uniqueFormulaArgs);
if (uniqueFormulaArgs.isUnique) {
cell.value = null;
}
isUniqueCell = false;
if (cell && cell.formula && cell.formula.indexOf('=UNIQUE(') > -1) {
isUniqueCell = true;
uniqueCellColl.push([x, colInd]);
cell.value = null;
}
cancel = pasteSetCell(x + l, colInd, cell, colInd === selIdx[3], isExtend, isUniqueCell, args.beforeActionData, args.isUndo);
if (cancel) {
continue;
}
if (cell.formula && this.copiedInfo && this.copiedInfo.isCut) {
this.parent.notify(clearFormulaDependentCells, { cellRef: getRangeAddress([i, j, i, j]) });
}
}
}
}
else {
if (isExternal || !hasTemplate(this.parent, i, j, copiedIdx)) {
if (notRemoveMerge) {
pasteSetCell(rowIdx, selIdx[1] + k, { value: cell.value }, j === cIdx_1[3], true);
}
else {
pasteSetCell(rowIdx, selIdx[1] + k, cell, j === cIdx_1[3], isExtend);
}
}
}
if (!isExternal && this.copiedInfo.isCut && !(inRange(selIdx, i, j) &&
copiedIdx === this.parent.activeSheetIndex)) {
var cell_1 = getCell(i, j, prevSheet_1);
var isWrapApplied = void 0;
if (cell_1) {
if (cell_1.isReadOnly) {
continue;
}
if (cell_1.isLocked || isNullOrUndefined(cell_1.isLocked)) {
if ((isRowSelected || isColSelected) && (cell_1.rowSpan !== undefined || cell_1.colSpan !== undefined)) {
if (cell_1.rowSpan > 1 || cell_1.colSpan > 1) {
prevSheetMergeCollection.push({ range: [i, j, i, j], rowSpan: cell_1.rowSpan, colSpan: cell_1.colSpan });
cell_1 = null;
}
else {
continue;
}
}
else {
if (!cell_1.validation && prevSheet_1.columns[j] && prevSheet_1.columns[j].validation
&& colValidationCollection.indexOf(j) === -1) {
colValidationCollection.push(j);
}
isWrapApplied = cell_1.wrap;
cell_1 = null;
}
}
else if (cell_1.isLocked === false) {
isWrapApplied = cell_1.wrap;
if (prevSheet_1.isProtected) {
cell_1 = { isLocked: false };
}
else {
cell_1 = null;
}
}
}
cutSetCell_1(i, j, cell_1, j === cIdx_1[3]);
if (isWrapApplied && !getCell(i, j, prevSheet_1, false, true).wrap) {
this.parent.notify(wrapEvent, { range: [i, j, i, j], wrap: false, sheet: prevSheet_1 });
}
}
}
rowIdx++;
}
if (pasteMergeCollection.length) {
pasteMergeCollection.forEach(function (pasteRange) {
for (var row = pasteRange[0]; row <= pasteRange[2]; row++) {
for (var col = pasteRange[1]; col <= pasteRange[3]; col++) {
if (row === pasteRange[0] && col === pasteRange[1]) {
continue;
}
else {
var cell_2 = getCell(row, col, curSheet_1, false, true);
if (cell_2 && cell_2.rowSpan === undefined && cell_2.colSpan === undefined) {
if (row !== pasteRange[0]) {
cell_2.rowSpan = pasteRange[0] - row;
}
if (col !== pasteRange[1]) {
cell_2.colSpan = pasteRange[1] - col;
}
var cellElement = _this.parent.getCell(row, col);
if (cellElement) {
_this.parent.serviceLocator.getService('cell').refresh(row, col, false, cellElement);
}
}
}
}
}
});
}
if (prevSheetMergeCollection.length) {
prevSheetMergeCollection.forEach(function (mergeInfo) {
setCell(mergeInfo.range[0], mergeInfo.range[1], prevSheet_1, {
rowSpan: mergeInfo.rowSpan, colSpan: mergeInfo.colSpan
});
var mergeArgs = { range: mergeInfo.range };
_this.parent.notify(mergedRange, mergeArgs);
_this.parent.notify(setMerge, {
merge: false, range: mergeArgs.range, type: 'All',
sheetIndex: pSheetIdx_1, preventRefresh: pSheetIdx_1 !== _this.parent.activeSheetIndex
});
mergeArgs.range = mergeArgs.range;
for (var sRowIdx = mergeArgs.range[0]; sRowIdx <= mergeArgs.range[2]; sRowIdx++) {
for (var sColIdx = mergeArgs.range[1]; sColIdx <= mergeArgs.range[3]; sColIdx++) {
cutSetCell_1(sRowIdx, sColIdx, null);
}
}
});
}
if (colValidationCollection.length) {
colValidationCollection.forEach(function (colIdx) {
_this.parent.notify(cellValidation, { range: prevSheet_1.name + '!' + getRangeAddress([cIdx_1[0], colIdx, cIdx_1[2], colIdx]), isRemoveValidation: true });
});
}
if (uniqueCellColl.length) {
for (var i = 0; i < uniqueCellColl.length; i++) {
this.parent.serviceLocator.getService('cell').refresh(uniqueCellColl[i][0], uniqueCellColl[i][1]);
}
}
if (copyCellArgs.isRandFormula && this.parent.calculationMode === 'Automatic') {
this.parent.notify(workbookFormulaOperation, { action: 'refreshRandomFormula' });
}
this.parent.notify(refreshRibbonIcons, null);
var hiddenDiff = rfshRange[2] - hiddenCount;
var selHiddenDiff = selectionRange[2] - hiddenCount;
rfshRange[2] = hiddenDiff;
selectionRange[2] = selHiddenDiff;
this.parent.setUsedRange(rfshRange[2], rfshRange[3]);
var selRange = getRangeAddress(selectionRange);
if (cSIdx === this.parent.activeSheetIndex && !args.isFromUpdateAction) {
this.parent.notify(selectRange, { address: selRange });
}
if (!isExternal && this.copiedInfo.isCut) {
isCut = this.copiedInfo.isCut;
if (copiedIdx === this.parent.activeSheetIndex) {
this.parent.serviceLocator.getService('cell').refreshRange(cIdx_1);
}
this.clearCopiedInfo();
}
if ((isExternal || isInRange) && this.copiedInfo) {
this.clearCopiedInfo();
}
var clearCFArgs = void 0;
if (isCut) {
if (cfRule && cfRule.length && pasteType !== 'Values') {
clearCFArgs = { range: cIdx_1, sheetIdx: pSheetIdx_1, isClear: true };
this.parent.notify(clearCFRule, clearCFArgs);
}
//this.updateFilter(copyInfo, rfshRange);
var isActSheet = this.parent.activeSheetIndex === pSheetIdx_1;
var rowHeight = isActSheet ?
(this.parent.getRow(cIdx_1[0], null, this.parent.frozenColCount(prevSheet_1)) || { offsetHeight: 20 }).offsetHeight :
getRowHeight(prevSheet_1, cIdx_1[0], false, true);
setMaxHgt(prevSheet_1, cIdx_1[0], cIdx_1[1], rowHeight);
var hgt = getMaxHgt(prevSheet_1, cIdx_1[0]);
setRowEleHeight(this.parent, prevSheet_1, hgt, cIdx_1[0], undefined, undefined, isActSheet, !isActSheet);
}
if (cf.length && cSIdx === this.parent.activeSheetIndex) {
this.parent.notify(applyCF, { cfModel: cf, isAction: true });
}
var copySheet = getSheet(this.parent, copiedIdx);
if (!isExternal && cIdx_1[0] === cIdx_1[2] && cSheetSel === 'Row') {
var hgt = copySheet.rows[cIdx_1[0]].height;
for (var i = selIdx[0]; i <= selIdx[2]; i++) {
setRowEleHeight(this.parent, this.parent.getActiveSheet(), hgt, i);
}
if (isCut) {
var defaultHeight = copySheet && copySheet.standardHeight ? copySheet.standardHeight : 20;
setRowEleHeight(this.parent, copySheet, defaultHeight, cIdx_1[0]);
}
}
if (args.isAction) {
var eventArgs = {
requestType: 'paste',
copiedInfo: copyInfo,
mergeCollection: mergeCollection,
pasteSheetIndex: this.parent.activeSheetIndex,
copiedRange: prevSheet_1.name + '!' + (copyInfo.range ? getRangeAddress(copyInfo.range) : prevSheet_1.selectedRange),
pastedRange: curSheet_1.name + '!' + getRangeAddress(rfshRange),
type: pasteType || 'All',
selectedRange: selRange
};
if (hiddenCount) {
eventArgs['skipFilterCheck'] = true;
}
if (clearCFArgs && clearCFArgs.cfClearActionArgs) {
eventArgs['cfClearActionArgs'] = clearCFArgs.cfClearActionArgs;
}
if (cf.length) {
eventArgs['cfActionArgs'] = { cfModel: cf, sheetIdx: cSIdx };
}
this.parent.notify(completeAction, { eventArgs: eventArgs, action: 'clipboard' });
}
if (args.focus) {
focus(this.parent.element);
}
}
}
else {
this.getClipboardEle().select();
}
};
Clipboard.prototype.setCF = function (cRange, pRange, cSheet, pSheet, cf, conditionalFormats) {
var _this = this;
var cfRange;
var indexes;
var assignCF = function (conditionalFormat) {
cfRange = [pRange[0] + (indexes[0] <= cRange[0] ? 0 : indexes[0] - cRange[0]),
pRange[1] + (indexes[1] <= cRange[1] ? 0 : indexes[1] - cRange[1]),
pRange[2] - (indexes[2] >= cRange[2] ? 0 : cRange[2] - indexes[2]),
pRange[3] - (indexes[3] >= cRange[3] ? 0 : cRange[3] - indexes[3])];
if (!pSheet.conditionalFormats) {
_this.parent.setSheetPropertyOnMute(pSheet, 'conditionalFormats', []);
}
var cfRule = {
range: getRangeAddress(cfRange), type: conditionalFormat.type,
cFColor: conditionalFormat.cFColor, value: conditionalFormat.value, format: conditionalFormat.format
};
pSheet.conditionalFormats.push(cfRule);
cf.push(cfRule);
};
if (conditionalFormats) {
for (var i = 0, len = conditionalFormats.length; i < len; i++) {
indexes = getRangeIndexes(conditionalFormats[i].range);
assignCF(conditionalFormats[i]);
}
}
else {
conditionalFormats = [];
if (cSheet.conditionalFormats) {
for (var i = 0, len = cSheet.conditionalFormats.length; i < len; i++) {
indexes = getRangeIndexes(cSheet.conditionalFormats[i].range);
if (checkRange([cRange], cSheet.conditionalFormats[i].range)) {
conditionalFormats.push(cSheet.conditionalFormats[i]);
assignCF(cSheet.conditionalFormats[i]);
}
}
}
}
return conditionalFormats;
};
Clipboard.prototype.isRangeMerged = function (range, sheet) {
var cell = getCell(range[0], range[1], sheet);
if (cell && (cell.colSpan > 1 || cell.rowSpan > 1)) {
var args = { range: range.slice(2, 4).concat(range.slice(2, 4)) };
this.parent.notify(activeCellMergedRange, args);
return args.range[0] === range[0] && args.range[1] === range[1] && args.range[2] === range[2] && args.range[3] === range[3];
}
return false;
};
Clipboard.prototype.updateFilter = function (copyInfo, pastedRange) {
var isFilterCut;
var diff;
this.parent.notify(setFilteredCollection, null);
for (var i = 0; i < this.parent.sheets.length; i++) {
if (this.parent.filterCollection && this.parent.filterCollection[i] &&
this.parent.filterCollection[i].sheetIndex === getSheetIndexFromId(this.parent, copyInfo.sId)) {
var range = copyInfo.range;
var fRange = getRangeIndexes(this.parent.filterCollection[i].filterRange);