UNPKG

@syncfusion/ej2-spreadsheet

Version:

Feature-rich JavaScript Spreadsheet (Excel) control with built-in support for selection, editing, formatting, importing and exporting to Excel

958 lines 64 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import { locale, deleteImage, createImageElement, positionAutoFillElement, showAggregate, paste, undoRedoForChartDesign, cut, copy } from '../../spreadsheet/index'; import { performUndoRedo, updateUndoRedoCollection, enableToolbarItems, completeAction, isColumnRange } from '../common/index'; import { setActionData, getBeforeActionData, updateAction } from '../common/index'; import { setUndoRedo, getUpdateUsingRaf } from '../common/index'; import { selectRange, clearUndoRedoCollection, setMaxHgt, getMaxHgt, setRowEleHeight } from '../common/index'; import { getRangeFromAddress, getRangeIndexes, workbookEditOperation, clearCFRule, isHeightCheckNeeded, getRow, getColumn, checkColumnValidation } from '../../workbook/index'; import { getSheet, checkUniqueRange, reApplyFormula, getCellAddress, getSwapRange, setColumn } from '../../workbook/index'; import { getIndexesFromAddress, getSheetNameFromAddress, updateSortedDataOnCell, getSheetIndexFromAddress } from '../../workbook/index'; import { sortComplete, isImported, cellValidation } from '../../workbook/index'; import { getCell, setCell, getSheetIndex, wrapEvent, getSheetIndexFromId } from '../../workbook/index'; import { setMerge, getRangeAddress, replaceAll, applyCellFormat } from '../../workbook/index'; import { addClass, extend, isNullOrUndefined, isObject, isUndefined, select } from '@syncfusion/ej2-base'; import { setCellFormat, refreshRibbonIcons, isFilterHidden, getRowHeight } from '../../workbook/index'; import { getColIndex, beginAction, updateCFModel, applyCF } from '../../workbook/index'; import { sheetRenameUpdate } from '../../workbook/common/index'; /** * UndoRedo module allows to perform undo redo functionalities. */ var UndoRedo = /** @class */ (function () { function UndoRedo(parent) { this.undoCollection = []; this.redoCollection = []; this.isUndo = false; this.undoRedoStep = 100; this.parent = parent; this.addEventListener(); } UndoRedo.prototype.setActionData = function (options) { var sheet = this.parent.getActiveSheet(); var address; var cells = []; var cutCellDetails = []; var args = options.args; var eventArgs = args.eventArgs; var copiedInfo = {}; switch (args.action) { case 'format': address = getRangeIndexes(args.eventArgs.range); break; case 'clipboard': copiedInfo = eventArgs.copiedInfo; address = getRangeIndexes(getRangeFromAddress(eventArgs.pastedRange)); if (copiedInfo && copiedInfo.isCut) { cutCellDetails = this.getCellDetails(copiedInfo.range, getSheet(this.parent, getSheetIndexFromId(this.parent, copiedInfo.sId)), 'clipboard'); } break; case 'beforeSort': address = getRangeIndexes(args.eventArgs.range); if (address[0] === address[2] && (address[2] - address[0]) === 0) { //if selected range is a single cell address[0] = 0; address[1] = 0; address[2] = sheet.usedRange.rowIndex; address[3] = sheet.usedRange.colIndex; } break; case 'beforeCellSave': case 'cellDelete': case 'cellSave': case 'addNote': case 'editNote': case 'deleteNote': address = getRangeIndexes(eventArgs.address); break; case 'beforeWrap': case 'beforeReplace': case 'chartDesign': address = this.parent.getAddressInfo(eventArgs.address).indices; break; case 'beforeClear': address = getRangeIndexes(eventArgs.range); break; case 'beforeInsertImage': address = getRangeIndexes(eventArgs.range); break; case 'deleteImage': address = getRangeIndexes(eventArgs.address); break; case 'beforeInsertChart': address = getRangeIndexes(eventArgs.range); break; case 'filter': address = getRangeIndexes(eventArgs.range); break; case 'autofill': address = getRangeIndexes(eventArgs.fillRange); break; case 'validation': if (isColumnRange(eventArgs.range.substring(eventArgs.range.lastIndexOf('!') + 1))) { address = getRangeIndexes(eventArgs.range); address[2] = sheet.usedRange.rowIndex; } else { address = getRangeIndexes(eventArgs.range); } break; case 'removeValidation': if (eventArgs.isColSelected) { this.beforeActionData = { cellDetails: [] }; var rangeArr = eventArgs.range.substring(eventArgs.range.lastIndexOf('!') + 1).split(':'); for (var start = getColIndex(rangeArr[0]), end = getColIndex(rangeArr[1]); start <= end; start++) { if (sheet.columns[start] && sheet.columns[start].validation) { this.beforeActionData.cellDetails.push({ colIndex: start, validation: sheet.columns[start].validation }); } } } else { address = getRangeIndexes(eventArgs.range); } break; case 'hyperlink': case 'removeHyperlink': address = getRangeIndexes(eventArgs.address); break; } if (args.action === 'beforeSort') { this.beforeActionData = { cellDetails: eventArgs.cellDetails }; this.beforeActionData.sortedCellDetails = eventArgs.sortedCellDetails; } else if (address) { if (args.isClearAction && this.beforeActionData.cellDetails.length > 0) { cells = this.beforeActionData.cellDetails; } else { cells = this.getCellDetails(address, sheet, args.action); } this.beforeActionData = { cellDetails: cells, cutCellDetails: cutCellDetails }; } }; UndoRedo.prototype.getBeforeActionData = function (args) { args.beforeDetails = this.beforeActionData; }; UndoRedo.prototype.performUndoRedo = function (args) { var undoRedoArgs; if (args.isFromUpdateAction) { undoRedoArgs = args; } else { undoRedoArgs = args.isUndo ? this.undoCollection.pop() : this.redoCollection.pop(); if (args.setCollection) { args.undoArgs = undoRedoArgs; } } this.isUndo = args.isUndo; var preventEvt; if (undoRedoArgs) { var actionArgs = void 0; var undoRedoAction = undoRedoArgs.action; var replaceArgs = {}; var address = []; var sheet_1; if (undoRedoArgs.action === 'autofill' || undoRedoArgs.action === 'autofillWithCF') { address = undoRedoArgs.eventArgs.fillRange.split('!'); } else if (undoRedoArgs.action === 'cellSave' || undoRedoArgs.action === 'cellDelete') { address = undoRedoArgs.eventArgs.address.split('!'); } else if (undoRedoArgs.action === 'clipboard') { address = undoRedoArgs.eventArgs.pastedRange.split('!'); } if (address.length > 0) { sheet_1 = getSheet(this.parent, getSheetIndex(this.parent, address[0])); } else if (undoRedoArgs.action === 'clear') { sheet_1 = getSheet(this.parent, undoRedoArgs.eventArgs.sheetIndex); } if (undoRedoArgs.action === 'autofillWithCF') { undoRedoArgs.action = 'autofill'; var conditionalFormat = sheet_1.conditionalFormats; if (conditionalFormat.length && conditionalFormat[conditionalFormat.length - 1].action === 'autofillWithCF' && args.isUndo) { if (!conditionalFormat[conditionalFormat.length - 1].value) { this.parent.notify(clearCFRule, { range: conditionalFormat[conditionalFormat.length - 1].range, isAction: true }); } else { conditionalFormat.pop(); } } } if (!args.isPublic) { var actionData = undoRedoArgs.eventArgs.beforeActionData; delete undoRedoArgs.eventArgs.beforeActionData; actionArgs = { action: undoRedoArgs.action, eventArgs: {} }; extend(actionArgs.eventArgs, undoRedoArgs.eventArgs, null, true); if (this.parent.calculationMode === 'Manual' && (undoRedoArgs.action === 'clipboard' || undoRedoArgs.action === 'cellDelete' || undoRedoArgs.action === 'autofill' || undoRedoArgs.action === 'clear')) { if (!args.isUndo) { if (sheet_1.isSheetCalculated) { (actionData.cutCellDetails.length ? actionData.cutCellDetails : actionData.cellDetails).forEach(function (prevCell) { var cellVal = getCell(prevCell.rowIndex, prevCell.colIndex, sheet_1, false, true).value; if ((cellVal || cellVal === 0) && prevCell.value !== cellVal) { prevCell.value = cellVal; } }); } } else if ((undoRedoArgs.eventArgs.requestType === 'paste' && undoRedoArgs.action === 'clipboard') || undoRedoArgs.eventArgs.fillType) { var undoActionName = void 0; if (!actionData.cutCellDetails.length) { undoActionName = undoRedoArgs.eventArgs.fillType ? 'autofill' : 'Copy'; } else if (sheet_1.isSheetCalculated) { undoActionName = 'Cut'; } if (undoActionName) { for (var i = 0, cellCol = actionData.cellDetails, cutCellCol = actionData.cutCellDetails; i < cellCol.length; i++) { var cellValue = getCell(cellCol[i].rowIndex, cellCol[i].colIndex, sheet_1, false, true); cellValue = cellValue ? cellValue.value : ''; if (undoActionName === 'Copy') { cellCol[i].copyCellValue = cellValue; } else if (undoActionName === 'autofill') { if (cellCol[i].value !== cellValue && cellCol[i].autoFillText !== cellValue) { cellCol[i].autoFillText = cellValue; } } else if (undoActionName === 'Cut') { if (cutCellCol[i].value !== cellValue) { cutCellCol[i].value = cellValue; } } } } } } undoRedoArgs.eventArgs.beforeActionData = actionData; actionArgs.eventArgs.cancel = false; undoRedoArgs.preventAction = actionArgs.preventAction = true; if (args.isUndo) { actionArgs.isUndo = true; if (undoRedoArgs.action === 'cellSave' && this.parent.calculationMode === 'Manual' && sheet_1.isSheetCalculated && actionData.cellDetails.length === 1) { var cell = getCell(actionData.cellDetails[0].rowIndex, actionData.cellDetails[0].colIndex, sheet_1); if (cell && undoRedoArgs.eventArgs.displayText !== cell.value) { undoRedoArgs.eventArgs.displayText = cell.value; } } } else { actionArgs.isRedo = true; } if (!args.isFromUpdateAction) { this.parent.notify(beginAction, actionArgs); } if (actionArgs.eventArgs.cancel) { this.updateUndoRedoIcons(); return; } delete actionArgs.eventArgs.cancel; } switch (undoRedoArgs.action) { case 'cellSave': case 'format': case 'wrap': case 'cellDelete': case 'autofill': case 'removeValidation': case 'hyperlink': case 'addNote': case 'editNote': case 'deleteNote': case 'removeHyperlink': undoRedoArgs = this.performOperation(undoRedoArgs, args.preventEvt, args.preventReSelect, args.isFromAutoFillOption); undoRedoArgs.action = undoRedoAction; break; case 'sorting': this.undoForSorting(undoRedoArgs, args.isUndo); break; case 'clipboard': undoRedoArgs = this.undoForClipboard(undoRedoArgs, args.isUndo, actionArgs); preventEvt = true; break; case 'resize': case 'resizeToFit': undoRedoArgs = this.undoForResize(undoRedoArgs); if (args.isUndo) { var eventArgs = undoRedoArgs.eventArgs; if (!eventArgs.isPrevCustomHeight) { var sheet_2 = this.parent.sheets[eventArgs.sheetIndex]; var row = sheet_2 && getRow(sheet_2, eventArgs.index); if (row && row.customHeight) { delete row.customHeight; } } } break; case 'hideShow': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'replace': undoRedoArgs = this.performOperation(undoRedoArgs); break; case 'replaceAll': undoRedoArgs.eventArgs.isAction = false; if (args.isUndo) { replaceArgs.value = undoRedoArgs.eventArgs.replaceValue; replaceArgs.replaceValue = undoRedoArgs.eventArgs.value; replaceArgs.skipFormatCheck = isImported(this.parent); } this.parent.notify(replaceAll, __assign({}, undoRedoArgs.eventArgs, replaceArgs)); break; case 'insert': case 'filter': updateAction(undoRedoArgs, this.parent, !args.isUndo, null, actionArgs); preventEvt = undoRedoArgs.action === 'filter'; break; case 'delete': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'validation': updateAction(undoRedoArgs, this.parent, !args.isUndo); undoRedoArgs = this.performOperation(undoRedoArgs); break; case 'addHighlight': case 'removeHighlight': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'merge': undoRedoArgs.eventArgs.merge = undoRedoArgs.isFromUpdateAction ? undoRedoArgs.eventArgs.merge : !undoRedoArgs.eventArgs.merge; updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'clear': undoRedoArgs = this.performOperation(undoRedoArgs); if (args.isUndo && undoRedoArgs.eventArgs.cfClearActionArgs) { updateAction({ action: 'clearCF', eventArgs: undoRedoArgs.eventArgs.cfClearActionArgs }, this.parent, !args.isUndo); } for (var i = this.undoCollection.length; i > 0; i--) { if (this.undoCollection[i - 1].isClearAction) { this.performUndoRedo(args); } else { break; } } break; case 'conditionalFormat': updateAction(undoRedoArgs, this.parent, !args.isUndo, this.undoCollection); break; case 'clearCF': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'insertImage': case 'deleteImage': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'imageRefresh': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'insertChart': case 'deleteChart': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'chartRefresh': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; case 'chartDesign': undoRedoArgs.eventArgs.isUndo = args.isUndo; this.parent.notify(undoRedoForChartDesign, undoRedoArgs.eventArgs); break; case 'addDefinedName': updateAction(undoRedoArgs, this.parent, !args.isUndo); break; } if (!args.isFromUpdateAction) { if (args.isUndo) { this.redoCollection.push(undoRedoArgs); } else { this.undoCollection.push(undoRedoArgs); } if (this.undoCollection.length > this.undoRedoStep) { this.undoCollection.splice(0, 1); } if (this.redoCollection.length > this.undoRedoStep) { this.redoCollection.splice(0, 1); } this.updateUndoRedoIcons(); if (!args.isPublic && !preventEvt) { this.parent.notify(completeAction, extend({ isUndoRedo: true, isUndo: args.isUndo }, undoRedoArgs)); } } this.parent.notify(refreshRibbonIcons, null); } }; UndoRedo.prototype.undoForSorting = function (args, isUndo) { var _this = this; var sheetIndex = getSheetIndexFromAddress(this.parent, args.eventArgs.range); var range = getRangeIndexes(args.eventArgs.range); var updateSortIcon = function (idx, add) { if (sheetIndex === _this.parent.activeSheetIndex) { var td = _this.parent.getCell(range[0] - 1, _this.parent.sortCollection[idx].columnIndex); if (td) { td = select('.e-filter-icon', td); if (td) { // Determine the class to add or remove var sortClass = "e-sort" + (_this.parent.sortCollection[idx].order === 'Ascending' ? 'asc' : 'desc') + "-filter"; if (add) { td.classList.add(sortClass); } else { td.classList.remove(sortClass); } } } } }; if (isUndo) { this.parent.notify(updateSortedDataOnCell, { result: args.eventArgs.beforeActionData.cellDetails, range: range, sheet: getSheet(this.parent, sheetIndex), jsonData: args.eventArgs.beforeActionData.sortedCellDetails, isUndo: true }); this.parent.notify(sortComplete, { range: args.eventArgs.range }); if (this.parent.sortCollection && args.eventArgs.previousSort) { for (var i = this.parent.sortCollection.length - 1; i >= 0; i--) { if (this.parent.sortCollection[i].sheetIndex === sheetIndex) { updateSortIcon(i, false); this.parent.sortCollection.splice(i, 1); var prevSort = args.eventArgs.previousSort; if (Array.isArray(prevSort)) { for (var j = 0; j < prevSort.length; j++) { this.parent.sortCollection.splice(j, 0, prevSort[j]); updateSortIcon(j, true); } } if (!this.parent.sortCollection.length) { this.parent.sortCollection = undefined; } break; } } } } else { updateAction(args, this.parent, true); if (args.eventArgs.previousSort) { var idx = 0; if (this.parent.sortCollection) { for (var i = this.parent.sortCollection.length - 1; i >= 0; i--) { if (this.parent.sortCollection[i].sheetIndex === sheetIndex) { updateSortIcon(i, false); idx = i; this.parent.sortCollection.splice(i, 1); } } } else { this.parent.sortCollection = []; } this.parent.sortCollection.splice(idx, 0, { sortRange: args.eventArgs.range.substring(args.eventArgs.range.lastIndexOf('!') + 1), sheetIndex: sheetIndex, columnIndex: getColIndex(args.eventArgs.sortOptions.sortDescriptors.field), order: args.eventArgs.sortOptions.sortDescriptors.order }); updateSortIcon(idx, true); } } }; UndoRedo.prototype.updateUndoRedoCollection = function (options) { var actionList = ['clipboard', 'format', 'sorting', 'cellSave', 'resize', 'resizeToFit', 'wrap', 'hideShow', 'replace', 'validation', 'merge', 'clear', 'conditionalFormat', 'clearCF', 'insertImage', 'imageRefresh', 'insertChart', 'deleteChart', 'chartRefresh', 'filter', 'cellDelete', 'autofill', 'autofillWithCF', 'addDefinedName', 'removeValidation', 'removeHighlight', 'addHighlight', 'hyperlink', 'removeHyperlink', 'deleteImage', 'chartDesign', 'replaceAll', 'addNote', 'editNote', 'deleteNote']; if ((options.args.action === 'insert' || options.args.action === 'delete') && options.args.eventArgs.modelType !== 'Sheet') { actionList.push(options.args.action); } var action = options.args.action; if (actionList.indexOf(action) === -1 && !options.isPublic) { return; } var eventArgs = options.args.eventArgs; if (action === 'clipboard' || action === 'sorting' || action === 'format' || action === 'cellSave' || action === 'wrap' || action === 'replace' || action === 'validation' || action === 'clear' || action === 'conditionalFormat' || action === 'clearCF' || action === 'insertImage' || action === 'imageRefresh' || action === 'insertChart' || action === 'chartRefresh' || action === 'filter' || action === 'cellDelete' || action === 'autofill' || action === 'autofillWithCF' || action === 'removeValidation' || action === 'addDefinedName' || action === 'hyperlink' || action === 'removeHyperlink' || action === 'deleteImage' || action === 'chartDesign' || action === 'addNote' || action === 'editNote' || action === 'deleteNote') { var beforeActionDetails = { beforeDetails: { cellDetails: [] } }; this.parent.notify(getBeforeActionData, beforeActionDetails); eventArgs.beforeActionData = beforeActionDetails.beforeDetails; } if (action === 'clipboard' && eventArgs.copiedInfo && eventArgs.copiedInfo.isExternal) { var addressInfo = this.parent.getAddressInfo(eventArgs.pastedRange); eventArgs.copiedInfo.cellDetails = this.getCellDetails(addressInfo.indices, getSheet(this.parent, addressInfo.sheetIndex), action); } if (this.redoCollection.length > 0 && this.redoCollection[this.redoCollection.length - 1].action === 'autofillWithCF' && options.args.action === 'autofill') { options.args.action = 'autofillWithCF'; } this.undoCollection.push(options.args); this.redoCollection = []; if (this.undoCollection.length > this.undoRedoStep) { this.undoCollection.splice(0, 1); } this.updateUndoRedoIcons(); }; UndoRedo.prototype.clearUndoRedoCollection = function () { this.undoCollection = []; this.redoCollection = []; this.updateUndoRedoIcons(); }; UndoRedo.prototype.updateUndoRedoIcons = function () { var l10n = this.parent.serviceLocator.getService(locale); this.parent.notify(enableToolbarItems, [{ tab: l10n.getConstant('Home'), items: [this.parent.element.id + '_undo'], enable: this.undoCollection.length > 0 }]); this.parent.notify(enableToolbarItems, [{ tab: l10n.getConstant('Home'), items: [this.parent.element.id + '_redo'], enable: this.redoCollection.length > 0 }]); }; UndoRedo.prototype.updateUndoRedoSheetReferences = function (args) { var updateReference = function (collection) { collection.forEach(function (editArgs) { var eventArgs = editArgs.eventArgs; if (eventArgs) { ['address', 'dataRange', 'fillRange'].forEach(function (property) { if (eventArgs[property] && eventArgs[property].includes(args.pName)) { eventArgs[property] = eventArgs[property].replace(args.pName, args.value); } }); } }); }; updateReference(this.undoCollection); updateReference(this.redoCollection); }; UndoRedo.prototype.undoForClipboard = function (args, isUndo, actionArgs) { var _this = this; var eventArgs = args.eventArgs; var address = []; address[0] = eventArgs.pastedRange.substring(0, eventArgs.pastedRange.lastIndexOf('!')); address[1] = eventArgs.pastedRange.substring(eventArgs.pastedRange.lastIndexOf('!') + 1); var range = getRangeIndexes(address[1]); var sheetIndex = getSheetIndex(this.parent, address[0]); var sheet = getSheet(this.parent, sheetIndex); var copiedInfo = eventArgs.copiedInfo; var actionData = eventArgs.beforeActionData; var isFromUpdateAction = args.isFromUpdateAction; var isRefresh = sheetIndex === this.parent.activeSheetIndex; var pictureElem; if (actionArgs) { actionArgs.isUndoRedo = true; actionArgs.eventArgs.beforeActionData = actionData; } if (args.eventArgs.requestType === 'imagePaste') { var copiedShapeInfo = eventArgs.copiedShapeInfo; if (isUndo) { pictureElem = copiedShapeInfo.pictureElem; if (copiedShapeInfo.isCut) { this.parent.notify(deleteImage, { id: pictureElem.id, sheetIdx: eventArgs.pasteSheetIndex + 1, isUndoRedo: true }); this.parent.notify(createImageElement, { options: { src: pictureElem.style.backgroundImage.replace(/url\((['"])?(.*?)\1\)/gi, '$2'), height: copiedShapeInfo.height, width: copiedShapeInfo.width, id: pictureElem.id }, range: copiedShapeInfo.copiedRange, isPublic: false, isUndoRedo: true }); } else { this.parent.notify(deleteImage, { id: eventArgs.pastedPictureElement.id, sheetIdx: eventArgs.pasteSheetIndex + 1, range: eventArgs.pastedRange, isUndoRedo: true }); } } else { if (copiedShapeInfo.isCut) { pictureElem = copiedShapeInfo.pictureElem; this.parent.notify(deleteImage, { id: pictureElem.id, sheetIdx: copiedShapeInfo.sId, isUndoRedo: true }); this.parent.notify(createImageElement, { options: { src: pictureElem.style.backgroundImage.replace(/url\((['"])?(.*?)\1\)/gi, '$2'), height: copiedShapeInfo.height, width: copiedShapeInfo.width, id: pictureElem.id }, range: copiedShapeInfo.pastedRange, isPublic: false, isUndoRedo: true }); } else { pictureElem = eventArgs.pastedPictureElement; this.parent.notify(createImageElement, { options: { src: pictureElem.style.backgroundImage.replace(/url\((['"])?(.*?)\1\)/gi, '$2'), height: copiedShapeInfo.height, width: copiedShapeInfo.width, id: pictureElem.id }, range: eventArgs.pastedRange, isPublic: false, isUndoRedo: true }); } } } else { if (isUndo) { if (copiedInfo.isCut) { var cells = actionData.cutCellDetails; this.updateCellDetails(cells, getSheet(this.parent, getSheetIndexFromId(this.parent, copiedInfo.sId)), getSwapRange(copiedInfo.range), isRefresh, args); if (eventArgs.cfClearActionArgs) { updateAction({ action: 'clearCF', eventArgs: eventArgs.cfClearActionArgs }, this.parent, false); } } if (actionData) { this.updateCellDetails(actionData.cellDetails, sheet, range, isRefresh, args, null, null, actionArgs ? actionArgs.isUndoRedo : null); } if (eventArgs.cfActionArgs) { eventArgs.cfActionArgs.cfModel.forEach(function (cf) { updateAction({ eventArgs: { range: cf.range, type: cf.type, cFColor: cf.cFColor, value: cf.value, sheetIdx: eventArgs.cfActionArgs.sheetIdx, cancel: true }, action: 'conditionalFormat' }, _this.parent, false); }); } setMaxHgt(sheet, range[0], range[1], getRowHeight(sheet, range[0])); var hgt = getMaxHgt(sheet, range[0]); setRowEleHeight(this.parent, sheet, hgt, range[0]); eventArgs.mergeCollection.forEach(function (mergeArgs) { mergeArgs.merge = !mergeArgs.merge; _this.parent.notify(setMerge, mergeArgs); mergeArgs.merge = !mergeArgs.merge; }); if (actionArgs && !isFromUpdateAction) { this.parent.notify(completeAction, actionArgs); } } else { if (copiedInfo.isExternal) { var addressInfo = this.parent.getAddressInfo(eventArgs.pastedRange); this.updateCellDetails(copiedInfo.cellDetails, getSheet(this.parent, addressInfo.sheetIndex), addressInfo.indices, true, args, null, null, actionArgs ? actionArgs.isUndoRedo : null); if (actionArgs && !isFromUpdateAction) { this.parent.notify(completeAction, actionArgs); } } else { var clipboardPromise = new Promise(function (resolve) { resolve((function () { })()); }); var addressInfo = this.parent.getAddressInfo(eventArgs.copiedRange); this.parent.notify(eventArgs.copiedInfo.isCut ? cut : copy, { range: addressInfo.indices, sId: getSheet(this.parent, addressInfo.sheetIndex).id, promise: clipboardPromise, invokeCopy: true, isPublic: true, isFromUpdateAction: isFromUpdateAction }); clipboardPromise.then(function () { _this.parent.notify(paste, { range: address ? getIndexesFromAddress(eventArgs.pastedRange) : address, sIdx: address ? getSheetIndex(_this.parent, getSheetNameFromAddress(eventArgs.pastedRange)) : address, type: eventArgs.type, isAction: false, isInternal: true, isFromUpdateAction: isFromUpdateAction, beforeActionData: eventArgs.beforeActionData, isUndo: isUndo }); if (actionArgs && !isFromUpdateAction) { _this.parent.notify(completeAction, actionArgs); } }); } } if (isRefresh && !isFromUpdateAction) { this.parent.notify(selectRange, { address: eventArgs.selectedRange }); this.parent.notify(positionAutoFillElement, {}); } else { this.checkRefreshNeeded(sheetIndex, isFromUpdateAction); } } return args; }; UndoRedo.prototype.undoForResize = function (args) { var eventArgs = args.eventArgs; if (eventArgs.hide === undefined) { if (eventArgs.isCol) { var temp = eventArgs.oldWidth; eventArgs.oldWidth = eventArgs.width; eventArgs.width = temp; } else { var temp = eventArgs.oldHeight; eventArgs.oldHeight = eventArgs.height; eventArgs.height = temp; } } else { eventArgs.hide = !eventArgs.hide; } updateAction(args, this.parent, false); var sheet = this.parent.getActiveSheet(); var activeCell = getRangeIndexes(sheet.activeCell); var CellElem = getCell(activeCell[0], activeCell[1], sheet); if (CellElem && CellElem.rowSpan) { var td = this.parent.getCell(activeCell[0], activeCell[1]); this.parent.element.querySelector('.e-active-cell').style.height = td.offsetHeight + 'px'; } else if (CellElem && CellElem.colSpan) { var td = this.parent.getCell(activeCell[0], activeCell[1]); this.parent.element.querySelector('.e-active-cell').style.width = td.offsetWidth + 'px'; } return args; }; UndoRedo.prototype.performOperation = function (args, preventEvt, preventReSelect, isFromAutoFillOption) { var eventArgs = args.eventArgs; var address = []; var undoRange = (args.action === 'cellSave' || args.action === 'wrap' || args.action === 'replace' || args.action === 'cellDelete' || args.action === 'hyperlink' || args.action === 'addNote' || args.action === 'editNote' || args.action === 'deleteNote' || args.action === 'removeHyperlink') ? eventArgs.address : eventArgs.range; if (args.action === 'autofill') { address[0] = eventArgs.fillRange.substring(0, eventArgs.fillRange.lastIndexOf('!')); address[1] = eventArgs.fillRange.substring(eventArgs.fillRange.lastIndexOf('!') + 1); } else { address[0] = undoRange.substring(0, undoRange.lastIndexOf('!')); address[1] = undoRange.substring(undoRange.lastIndexOf('!') + 1); } var sheetIndex = getSheetIndex(this.parent, address[0]); var sheet = getSheet(this.parent, sheetIndex); var range; if (eventArgs.isColSelected) { var rangeArr = address[1].split(':'); range = [0, getColIndex(rangeArr[0]), sheet.rowCount - 1, getColIndex(rangeArr[1])]; } else { range = getSwapRange(getRangeIndexes(address[1])); } var indexes = range; var actionData = eventArgs.beforeActionData; var isFromUpdateAction = args.isFromUpdateAction; var isRefresh = this.checkRefreshNeeded(sheetIndex, isFromUpdateAction); var uniqueArgs = { cellIdx: [range[0], range[1]], isUnique: false, uniqueRange: '' }; if (!eventArgs.isColSelected) { this.parent.notify(checkUniqueRange, uniqueArgs); } if (this.isUndo) { if (uniqueArgs.isUnique && eventArgs.formula && eventArgs.formula.indexOf('UNIQUE') > -1) { var rangeIdx = getRangeIndexes(uniqueArgs.uniqueRange); if (getCell(rangeIdx[0], rangeIdx[1], this.parent.getActiveSheet()).value !== '#SPILL!') { for (var j = rangeIdx[0]; j <= rangeIdx[2]; j++) { for (var k = rangeIdx[1]; k <= rangeIdx[3]; k++) { if (j === rangeIdx[0] && k === rangeIdx[1]) { k = k + 1; } this.parent.updateCellInfo({ value: '' }, getRangeAddress([j, k]), true); } } } } this.updateCellDetails(actionData.cellDetails, sheet, range, isRefresh, args, preventEvt, eventArgs.isColSelected, true, isFromAutoFillOption); if (uniqueArgs.isUnique && args.action === 'cellDelete' && eventArgs.isSpill) { var rangeIdx = getRangeIndexes(uniqueArgs.uniqueRange); var cell = getCell(rangeIdx[0], rangeIdx[1], this.parent.getActiveSheet()); for (var i = rangeIdx[0]; i <= rangeIdx[2]; i++) { for (var j = rangeIdx[1]; j <= rangeIdx[3]; j++) { for (var k = range[0]; k <= range[2]; k++) { for (var l = range[1]; l <= range[3]; l++) { if (i !== k || j !== l) { this.parent.updateCellInfo({ value: '' }, getCellAddress(i, j), true); } } } } } cell.value = '#SPILL!'; this.parent.updateCellInfo(cell, getCellAddress(rangeIdx[0], rangeIdx[1]), true); } if (!eventArgs.isSpill && uniqueArgs.uniqueRange !== '') { var indexes_1 = getRangeIndexes(uniqueArgs.uniqueRange); for (var j = indexes_1[0]; j <= indexes_1[2]; j++) { for (var k = indexes_1[1]; k <= indexes_1[3]; k++) { if (j === indexes_1[0] && k === indexes_1[1]) { k = k + 1; } this.parent.updateCellInfo({ value: '' }, getRangeAddress([j, k]), true); } } this.parent.notify(reApplyFormula, null); } } else { /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ var argsEventArgs = args.eventArgs; var activeCellIndexes = getRangeIndexes(sheet.activeCell); var startRange = address[1] ? address[1].split(':') : []; if (indexes[0] !== activeCellIndexes[0] && indexes[1] !== activeCellIndexes[1] && args.action === 'hyperlink' && startRange.length > 0) { sheet.activeCell = startRange[0]; activeCellIndexes = getRangeIndexes(sheet.activeCell); } var cellValue = this.parent.getCellStyleValue(['textDecoration'], activeCellIndexes).textDecoration; if (argsEventArgs && argsEventArgs.style && argsEventArgs.style.textDecoration) { var value = argsEventArgs.style.textDecoration; var changedValue = value; var changedStyle = void 0; var removeProp = false; if (cellValue === 'underline') { changedValue = value === 'underline' ? 'none' : 'underline line-through'; } else if (cellValue === 'line-through') { changedValue = value === 'line-through' ? 'none' : 'underline line-through'; } else if (cellValue === 'underline line-through') { changedValue = value === 'underline' ? 'line-through' : 'underline'; removeProp = true; } if (changedValue === 'none') { removeProp = true; } argsEventArgs.style.textDecoration = changedValue; args.eventArgs = argsEventArgs; for (var i = indexes[0]; i <= indexes[2]; i++) { for (var j = indexes[1]; j <= indexes[3]; j++) { changedStyle = {}; cellValue = this.parent.getCellStyleValue(['textDecoration'], [i, j]).textDecoration; if (cellValue === 'none') { if (removeProp) { continue; } changedStyle.textDecoration = value; } else if (cellValue === 'underline' || cellValue === 'line-through') { if (removeProp) { if (value === cellValue) { changedStyle.textDecoration = 'none'; } else { continue; } } else { changedStyle.textDecoration = value !== cellValue ? 'underline line-through' : value; } } else if (cellValue === 'underline line-through') { if (removeProp) { changedStyle.textDecoration = value === 'underline' ? 'line-through' : 'underline'; } else { continue; } } this.parent.notify(setCellFormat, { style: { textDecoration: changedStyle.textDecoration }, range: [i, j, i, j], refreshRibbon: true, onActionUpdate: true }); } } argsEventArgs.style.textDecoration = value; args.eventArgs = argsEventArgs; } else { if (!isNullOrUndefined(eventArgs.oldValue) && eventArgs.oldValue !== eventArgs.value && uniqueArgs.isUnique) { var indexes_2 = getRangeIndexes(uniqueArgs.uniqueRange); if (getCell(indexes_2[0], indexes_2[1], this.parent.getActiveSheet()).value !== '#SPILL!') { for (var j = indexes_2[0]; j <= indexes_2[2]; j++) { for (var k = indexes_2[1]; k <= indexes_2[3]; k++) { if (j === indexes_2[0] && k === indexes_2[1]) { this.parent.updateCellInfo({ value: '#SPILL!' }, getRangeAddress([indexes_2[0], indexes_2[1]]), true); k = k + 1; } this.parent.updateCellInfo({ value: '' }, getRangeAddress([j, k]), true); } } } } updateAction(args, this.parent, true); if (uniqueArgs.isUnique && args.action === 'cellDelete' && eventArgs.isSpill) { var indexes_3 = getRangeIndexes(uniqueArgs.uniqueRange); var Skip = false; for (var i = indexes_3[0]; i <= indexes_3[1]; i++) { for (var j = indexes_3[1]; j <= indexes_3[3]; j++) { if (i === indexes_3[0] && j === indexes_3[1]) { j++; } if (getCell(i, j, sheet) && !isNullOrUndefined(getCell(i, j, sheet).value) && getCell(i, j, sheet).value !== '') { Skip = true; } } } if (!Skip) { var cell = getCell(indexes_3[0], indexes_3[1], this.parent.getActiveSheet()); cell.value = ''; this.parent.updateCellInfo(cell, getCellAddress(indexes_3[0], indexes_3[1]), true); this.parent.notify(reApplyFormula, null); } } } } if (args.action === 'autofill') { address[1] = this.isUndo ? args.eventArgs.dataRange : args.eventArgs.selectedRange; } if (isRefresh && !preventReSelect && !isFromUpdateAction) { if (eventArgs.isColSelected) { address[1] = sheet.selectedRange; } this.parent.notify(selectRange, { address: address[1] }); } if (this.parent.showAggregate) { this.parent.notify(showAggregate, {}); } return args; }; UndoRedo.prototype.getCellDetails = function (address, sheet, action) { var _this = this; var cells = []; var cell; var filterCheck = action === 'cellDelete'; var processedColumns = {}; address = getSwapRange(address); var updateCellProps = function (rowIdx, colIdx) { var currentCell = { rowIndex: rowIdx, colIndex: colIdx, value: cell ? cell.value : '', formula: cell ? cell.formula : '' }; var rowHeight = getRowHeight(sheet, rowIdx); if (cell) { if (cell.format) { currentCell.format = cell.format; } if (!isNullOrUndefined(cell.isLocked)) { currentCell.isLocked = cell.isLocked; } if (cell.style) { currentCell.style = Object.assign({}, cell.style); } if (cell.wrap) { currentCell.wrap = cell.wrap; } if (cell.rowSpan) { currentCell.rowSpan = cell.rowSpan; } if (cell.colSpan) { currentCell.colSpan = cell.colSpan; } if (cell.image) { currentCell.image = cell.image; } if (cell.chart) { currentCell.chart = JSON.parse(JSON.stringify(cell.chart)); } if (cell.validation) { currentCell.validation = Object.assign({}, cell.validation); } if (cell.notes) { currentCell.notes = cell.notes; } if (cell.isReadOnly) { currentCell.isReadOnly = cell.isReadOnly; } if (cell.formattedText) { currentCell.formattedText = cell.formattedText; } if (cell.hyperlink) { currentCell.hyperlink = (isObject(cell.hyperlink) ? extend({}, cell.hyperlink) : cell.hyperlink); } if (sheet.standardHeight ? rowHeight !== sheet.standardHeight : rowHeight !== 20) { cell.rowHeight = currentCell.rowHeight = rowHeight; } var editModule = _this.parent.editModule; currentCell.value =