UNPKG

@syncfusion/ej2-spreadsheet

Version:

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

937 lines 95.2 kB
import { EventHandler, Browser, closest, isUndefined, isNullOrUndefined, select, detach, getComponent } from '@syncfusion/ej2-base'; import { getRangeIndexes, getRangeFromAddress, getIndexesFromAddress, getRangeAddress, isSingleCell, getCellAddress } from '../../workbook/common/address'; import { keyDown, editOperation, clearCopy, enableToolbarItems, completeAction } from '../common/index'; import { formulaBarOperation, formulaOperation, setActionData, keyUp, getCellPosition, deleteImage, focus, isLockedCells, isNavigationKey } from '../common/index'; import { workbookEditOperation, getFormattedBarText, getFormattedCellObject, wrapEvent, isValidation, activeCellMergedRange, activeCellChanged, getUniqueRange, removeUniquecol, checkUniqueRange, reApplyFormula, refreshChart, mergedRange } from '../../workbook/common/event'; import { getSheetName, getSheetIndex, getCell, getColumn, getRowsHeight, getColumnsWidth, checkColumnValidation, setCell } from '../../workbook/base/index'; import { getSheetNameFromAddress, getSheet, selectionComplete, isHiddenRow, isHiddenCol, applyCF, setVisibleMergeIndex, isReadOnlyCells, getTypeFromFormat } from '../../workbook/index'; import { beginAction, updateCell, isReadOnly, getViewportIndexes, getRow } from '../../workbook/index'; import { hasTemplate, editAlert, getTextWidth, readonlyAlert, finiteAlert } from '../common/index'; import { getSwapRange, getCellIndexes, wrap as wrapText, checkIsFormula, isNumber, isLocked, isCellReference, workbookFormulaOperation } from '../../workbook/index'; import { initiateFormulaReference, initiateCur, clearCellRef, addressHandle, clearRange, dialog, locale } from '../common/index'; import { editValue, initiateEdit, forRefSelRender, isFormulaBarEdit, deleteChart, activeSheetChanged, mouseDown } from '../common/index'; import { checkFormulaRef, getData, clearFormulaDependentCells } from '../../workbook/index'; /** * The `Protect-Sheet` module is used to handle the Protecting functionalities in Spreadsheet. */ var Edit = /** @class */ (function () { /** * Constructor for edit module in Spreadsheet. * * @param {Spreadsheet} parent - Constructor for edit module in Spreadsheet. * @private */ function Edit(parent) { this.editorElem = null; this.editCellData = {}; this.isEdit = false; this.isCellEdit = true; this.isNewValueEdit = true; this.isAltEnter = false; this.curEndPos = null; this.curStartPos = null; this.uniqueColl = ''; this.uniqueActCell = ''; this.isSpill = false; this.keyCodes = { BACKSPACE: 8, SPACE: 32, TAB: 9, DELETE: 46, ESC: 27, ENTER: 13, FIRSTALPHABET: 65, LASTALPHABET: 90, FIRSTNUMBER: 48, LASTNUMBER: 59, FIRSTNUMPAD: 96, LASTNUMPAD: 111, SYMBOLSETONESTART: 186, SYMBOLSETONEEND: 192, SYMBOLSETTWOSTART: 219, SYMBOLSETTWOEND: 222, FIREFOXEQUALPLUS: 61, FIREFOXMINUS: 173, F2: 113 }; this.formulaErrorStrings = [ 'mismatched parentheses', 'requires 3 arguments', 'improper formula', 'empty expression', 'mismatched string quotes', 'wrong number of arguments', 'invalid arguments' ]; this.parent = parent; this.addEventListener(); //Spreadsheet.Inject(WorkbookEdit); } /** * To destroy the edit module. * * @returns {void} - To destroy the edit module. * @hidden */ Edit.prototype.destroy = function () { if (this.isEdit) { this.cancelEdit(true, false); } this.removeEventListener(); this.editorElem = null; if (this.formulaErrorStrings) { this.formulaErrorStrings = []; } if (this.editCellData) { this.editCellData = {}; } if (this.keyCodes) { this.keyCodes = {}; } this.parent = null; }; Edit.prototype.addEventListener = function () { if (Browser.isDevice && Browser.info.name === 'safari' && (Browser.isIos || Browser.isIos7)) { EventHandler.add(this.parent.element, 'touchend', this.tapHandler, this); } else { EventHandler.add(this.parent.element, 'dblclick', this.dblClickHandler, this); } this.parent.on(mouseDown, this.mouseDownHandler, this); this.parent.on(keyUp, this.keyUpHandler, this); this.parent.on(keyDown, this.keyDownHandler, this); this.parent.on(editOperation, this.performEditOperation, this); this.parent.on(initiateCur, this.initiateCurPosition, this); this.parent.on(editValue, this.updateFormulaBarValue, this); this.parent.on(addressHandle, this.addressHandler, this); this.parent.on(initiateEdit, this.initiateRefSelection, this); this.parent.on(forRefSelRender, this.refSelectionRender, this); this.parent.on(checkUniqueRange, this.checkUniqueRange, this); this.parent.on(reApplyFormula, this.reApplyFormula, this); this.parent.on(activeSheetChanged, this.sheetChangeHandler, this); this.parent.on(readonlyAlert, this.readOnlyAlertHandler, this); this.parent.on(finiteAlert, this.finiteAlertHandler, this); }; Edit.prototype.removeEventListener = function () { if (Browser.isDevice && Browser.info.name === 'safari' && (Browser.isIos || Browser.isIos7)) { EventHandler.remove(this.parent.element, 'touchend', this.tapHandler); } else { EventHandler.remove(this.parent.element, 'dblclick', this.dblClickHandler); } if (!this.parent.isDestroyed) { this.parent.off(mouseDown, this.mouseDownHandler); this.parent.off(keyUp, this.keyUpHandler); this.parent.off(keyDown, this.keyDownHandler); this.parent.off(editOperation, this.performEditOperation); this.parent.off(initiateCur, this.initiateCurPosition); this.parent.off(editValue, this.updateFormulaBarValue); this.parent.off(addressHandle, this.addressHandler); this.parent.off(initiateEdit, this.initiateRefSelection); this.parent.off(forRefSelRender, this.refSelectionRender); this.parent.off(checkUniqueRange, this.checkUniqueRange); this.parent.off(reApplyFormula, this.reApplyFormula); this.parent.off(activeSheetChanged, this.sheetChangeHandler); this.parent.off(readonlyAlert, this.readOnlyAlertHandler); this.parent.off(finiteAlert, this.finiteAlertHandler); } }; /** * Get the module name. * * @returns {string} - Get the module name. * @private */ Edit.prototype.getModuleName = function () { return 'edit'; }; Edit.prototype.performEditOperation = function (args) { var action = args.action; switch (action) { case 'renderEditor': this.renderEditor(); if (args.initLoad && Browser.isDevice && Browser.info.name === 'safari' && (Browser.isIos || Browser.isIos7)) { var focusEditEle_1 = this.parent.createElement('div', { className: 'e-ss-focus-edit', attrs: { 'contentEditable': 'true', 'inputmode': 'none', 'tabindex': '-1' } }); var sheetPanel = this.parent.element.querySelector('.e-sheet-panel'); if (sheetPanel) { sheetPanel.style.position = 'relative'; sheetPanel.appendChild(focusEditEle_1); } this.parent.element.onfocus = function () { focus(focusEditEle_1); }; } break; case 'refreshEditor': this.refreshEditor(args.value, args.refreshFormulaBar, args.refreshEditorElem, args.isAppend, args.trigEvent); if (args.refreshCurPos) { this.setCursorPosition(); } break; case 'startEdit': if (!this.isEdit) { this.isNewValueEdit = args.isNewValueEdit; this.startEdit(args.address, args.value, args.refreshCurPos); } else { var isEdit = false; var arg = { isEdit: isEdit }; this.parent.notify(isFormulaBarEdit, arg); if (arg.isEdit) { this.isNewValueEdit = args.isNewValueEdit; this.startEdit(args.address, args.value, args.refreshCurPos); } } break; case 'endEdit': if (this.isEdit) { this.endEdit(args.refreshFormulaBar, null, args.isPublic); } break; case 'cancelEdit': if (this.isEdit) { this.cancelEdit(args.refreshFormulaBar); } break; case 'getCurrentEditValue': args.editedValue = this.editCellData.value; if (args.endFormulaRef !== undefined) { args.endFormulaRef = this.endFormulaRef; } break; case 'refreshDependentCellValue': this.refreshDependentCellValue(args.rowIdx, args.colIdx); break; case 'getElement': args.element = this.getEditElement(this.parent.getActiveSheet()); break; case 'focusEditorElem': this.editorElem.focus(); break; case 'getCurrentEditSheetIdx': args.sheetIndex = this.editCellData.sheetIndex; break; } }; Edit.prototype.keyUpHandler = function (e) { if (this.isEdit) { var editElement = this.getEditElement(this.parent.getActiveSheet()); if (e.altKey && e.keyCode === 13) { editElement.focus(); this.altEnter(); this.isAltEnter = true; } else if (this.isCellEdit && this.editCellData.value !== editElement.textContent && e.keyCode !== 16 && (!e.shiftKey || (e.shiftKey && !isNavigationKey(e.keyCode)))) { this.refreshEditor(editElement.textContent, this.isCellEdit); } var isFormulaEdit = checkIsFormula(this.editCellData.value, true); if (isFormulaEdit && (!e || (e.keyCode !== 16 && e.keyCode !== 17 && (!e.shiftKey || !isNavigationKey(e.keyCode))))) { this.updateFormulaReference(editElement); if (this.endFormulaRef) { var curOffset = this.getCurPosition(); var validCharacters = ['+', '-', '*', '/', this.parent.listSeparator, '(', '=', '&', ':']; if (curOffset.end && validCharacters.indexOf(this.editCellData.value[curOffset.end - 1]) > -1) { this.endFormulaRef = false; } } } } }; Edit.prototype.updateFormulaReference = function (editElement) { this.removeRefIndicator(); if (this.editCellData.value !== editElement.textContent) { this.refreshEditor(editElement.textContent, true); } var sheetIdx = this.editCellData.sheetIndex; var editValue = this.editCellData.value; this.parent.notify(initiateFormulaReference, { range: editValue, formulaSheetIdx: sheetIdx }); }; Edit.prototype.keyDownHandler = function (e) { var trgtElem = e.target; var keyCode = e.keyCode; var sheet = this.parent.getActiveSheet(); var actCell = getCellIndexes(sheet.activeCell); var cell = getCell(actCell[0], actCell[1], sheet, false, true); var isKeyboardShortcut = this.parent.enableKeyboardShortcut; if (!closest(trgtElem, '.e-spreadsheet .e-dialog')) { if (!sheet.isProtected || trgtElem.classList.contains('e-sheet-rename') || !isLocked(cell, getColumn(sheet, actCell[1])) || ((trgtElem.classList.contains('e-formula-bar') || trgtElem.classList.contains('e-combobox')) && !trgtElem.disabled)) { if (this.isEdit) { var editorElem = this.getEditElement(sheet); var isFormulaEdit = checkIsFormula(this.editCellData.value, true); if (this.isCellEdit || (isFormulaEdit && this.editCellData.value !== editorElem.textContent && e.keyCode !== 16 && e.keyCode !== 17)) { if (editorElem && editorElem.style.height !== 'auto') { if (actCell[1] < this.parent.frozenColCount(sheet) && (!sheet.frozenRows || actCell[0] >= this.parent.frozenRowCount(sheet))) { if (getTextWidth(editorElem.textContent, cell.style, this.parent.cellStyle) > parseInt(editorElem.style.maxWidth, 10)) { editorElem.style.height = 'auto'; } } if (getTextWidth(editorElem.textContent, cell.style, this.parent.cellStyle) > parseInt(editorElem.style.maxWidth, 10) - 5) { // 5 decreased for padding. editorElem.style.height = 'auto'; } } if (actCell[0] < this.parent.frozenRowCount(sheet) && editorElem && !editorElem.style.overflow && getTextWidth(editorElem.textContent, cell.style, this.parent.cellStyle) > parseInt(editorElem.style.maxWidth, 10)) { editorElem.style.overflow = 'auto'; } if (!e.shiftKey || (e.shiftKey && !isNavigationKey(e.keyCode))) { this.refreshEditor(editorElem.textContent, this.isCellEdit, false, false, false); } } if (!e.altKey) { switch (keyCode) { case this.keyCodes.ENTER: if (Browser.isWindows) { e.preventDefault(); } if (!isFormulaEdit) { this.endEdit(false, e); } else { this.removeRefIndicator(); if (getSheet(this.parent, this.editCellData.sheetIndex).id === sheet.id) { this.endEdit(false, e); } else { this.parent.goTo(this.editCellData.fullAddr); if (this.isEdit) { this.endEdit(false, e); } } } break; case this.keyCodes.TAB: if (!this.hasFormulaSuggSelected()) { this.endEdit(false, e); } break; case this.keyCodes.ESC: this.cancelEdit(true, true, e); this.removeRefIndicator(); break; } } } else if (trgtElem.classList.contains('e-spreadsheet') || closest(trgtElem, '.e-sheet-panel')) { if (keyCode === 13 && trgtElem.contentEditable === 'true') { e.preventDefault(); } var key = String.fromCharCode(keyCode); var isAlphabet = (keyCode >= this.keyCodes.FIRSTALPHABET && keyCode <= this.keyCodes.LASTALPHABET) || (key.toLowerCase() !== key.toUpperCase() && !(keyCode >= 112 && keyCode <= 123)); var isNumeric = (keyCode >= this.keyCodes.FIRSTNUMBER && keyCode <= this.keyCodes.LASTNUMBER); var isNumpadKeys = (keyCode >= this.keyCodes.FIRSTNUMPAD && keyCode <= this.keyCodes.LASTNUMPAD); var isSymbolkeys = (keyCode >= this.keyCodes.SYMBOLSETONESTART && keyCode <= this.keyCodes.SYMBOLSETONEEND); if (!isSymbolkeys) { isSymbolkeys = (keyCode >= this.keyCodes.SYMBOLSETTWOSTART && keyCode <= this.keyCodes.SYMBOLSETTWOEND); } var isFirefoxExceptionkeys = (keyCode === this.keyCodes.FIREFOXEQUALPLUS) || (keyCode === this.keyCodes.FIREFOXMINUS); var isF2Edit = (!e.shiftKey && !e.ctrlKey && !e.metaKey && keyCode === this.keyCodes.F2) && isKeyboardShortcut; var isBackSpace = keyCode === this.keyCodes.BACKSPACE && isKeyboardShortcut; var isMacDelete = /(Macintosh|MacIntel|MacPPC|Mac68K|Mac|Mac OS|iPod|iPad)/i.test(navigator.userAgent) && isBackSpace; var readonlyDialog = this.parent.element.querySelector('.e-readonly-alert-dlg'); var overlayElements = this.parent.element.getElementsByClassName('e-ss-overlay-active'); if ((!e.ctrlKey && !e.metaKey && !e.altKey && ((!e.shiftKey && keyCode === this.keyCodes.SPACE) || isAlphabet || isNumeric || isNumpadKeys || isSymbolkeys || (Browser.info.name === 'mozilla' && isFirefoxExceptionkeys))) || isF2Edit || isBackSpace) { if (isF2Edit) { this.isNewValueEdit = false; } if (!readonlyDialog) { if (isReadOnlyCells(this.parent) && overlayElements.length === 0) { this.parent.notify(readonlyAlert, null); } else if (overlayElements.length) { if (isBackSpace && !isMacDelete) { this.editingHandler('delete'); } } else { this.startEdit(null, null, true, true); focus(this.getEditElement(sheet)); } } } if ((keyCode === this.keyCodes.DELETE || isMacDelete) && isKeyboardShortcut) { var islockcell = sheet.isProtected && isLockedCells(this.parent); if (!readonlyDialog) { if (islockcell) { this.parent.notify(editAlert, null); } else if (isReadOnlyCells(this.parent) && overlayElements.length === 0) { this.parent.notify(readonlyAlert, null); } else { this.editingHandler('delete'); this.parent.notify(activeCellChanged, null); } } } } } else if (((keyCode >= this.keyCodes.FIRSTALPHABET && keyCode <= this.keyCodes.LASTALPHABET) || (keyCode >= this.keyCodes.FIRSTNUMBER && keyCode <= this.keyCodes.LASTNUMBER) || (keyCode === this.keyCodes.DELETE) || (keyCode === this.keyCodes.BACKSPACE) || (keyCode === this.keyCodes.SPACE) || (keyCode >= this.keyCodes.FIRSTNUMPAD && keyCode <= this.keyCodes.LASTNUMPAD) || (keyCode >= this.keyCodes.SYMBOLSETONESTART && keyCode <= this.keyCodes.SYMBOLSETONEEND) || (keyCode >= 219 && keyCode <= 222) || (!e.shiftKey && !e.ctrlKey && !e.metaKey && keyCode === this.keyCodes.F2)) && (keyCode !== 67) && (keyCode !== 89) && (keyCode !== 90)) { if (sheet.protectSettings.insertLink && keyCode === 75) { return; } if (e.altKey && (keyCode === 65 || keyCode === 70 || keyCode === 72 || keyCode === 77 || keyCode === 78 || keyCode === 87)) { return; } if (!e.ctrlKey && e.keyCode !== 70 && !this.parent.element.querySelector('.e-editAlert-dlg') && !trgtElem.parentElement.classList.contains('e-unprotectpwd-content') && !trgtElem.parentElement.classList.contains('e-password-content') && !trgtElem.parentElement.classList.contains('e-sheet-password-content') && !trgtElem.parentElement.classList.contains('e-unprotectsheetpwd-content') && !trgtElem.parentElement.classList.contains('e-reenterpwd-content')) { this.parent.notify(editAlert, null); } } } }; Edit.prototype.renderEditor = function () { if (!this.editorElem || !select('#' + this.parent.element.id + '_edit', this.parent.element)) { var editor = this.parent.createElement('div', { id: this.parent.element.id + '_edit', className: 'e-spreadsheet-edit', attrs: { 'contentEditable': 'true', 'role': 'textbox', 'spellcheck': 'false', 'aria-multiline': 'true' } }); if (this.parent.element.getElementsByClassName('e-spreadsheet-edit')[0]) { this.parent.element.getElementsByClassName('e-spreadsheet-edit')[0].remove(); } var sheetContentElem = this.parent.element.querySelector('.e-sheet-content'); if (!sheetContentElem) { return; } sheetContentElem.appendChild(editor); this.editorElem = editor; } this.parent.notify(formulaOperation, { action: 'renderAutoComplete' }); }; Edit.prototype.refreshEditor = function (value, refreshFormulaBar, refreshEditorElem, isAppend, trigEvent, prevCellValue) { if (trigEvent === void 0) { trigEvent = true; } if (isAppend) { value = this.editCellData.value = this.editCellData.value + value; } else { this.editCellData.value = prevCellValue ? prevCellValue : value; } var editorElem = this.getEditElement(this.parent.getActiveSheet()); if (refreshEditorElem && editorElem) { editorElem.textContent = value; } if (refreshFormulaBar) { this.parent.notify(formulaBarOperation, { action: 'refreshFormulabar', value: value }); } if (this.parent.isEdit && editorElem && trigEvent && this.editCellData.value === editorElem.textContent) { if (this.triggerEvent('cellEditing').cancel) { this.cancelEdit(false, false, null, true); } } // if (this.editorElem.scrollHeight + 2 <= this.editCellData.element.offsetHeight) { // this.editorElem.style.height = (this.editCellData.element.offsetHeight + 1) + 'px'; // } else { // this.editorElem.style.removeProperty('height'); // } }; Edit.prototype.startEdit = function (address, value, refreshCurPos, preventFormulaReference) { if (refreshCurPos === void 0) { refreshCurPos = true; } if (this.parent.showSheetTabs) { this.parent.element.querySelector('.e-add-sheet-tab').setAttribute('disabled', 'true'); } var sheet = this.parent.getActiveSheet(); var range = getCellIndexes(sheet.activeCell); var cell = getCell(range[0], range[1], sheet, false, true); if (this.parent.calculationMode === 'Manual' && checkIsFormula(cell.formula)) { this.editCellData.prevFormulaValue = cell.value; } if (hasTemplate(this.parent, range[0], range[1], this.parent.activeSheetIndex)) { var cellEle = this.parent.getCell(range[0], range[1]); var isDelTemplate = false; var value_1 = cellEle.innerHTML; if (cellEle) { if (value_1.indexOf('<') > -1 && value_1.indexOf('>') > -1 && value_1.indexOf('input') > -1) { isDelTemplate = true; } } if (isDelTemplate) { return; } } var isMergedHiddenCell = this.updateEditCellDetail(address, value); this.initiateEditor(refreshCurPos, isMergedHiddenCell); this.positionEditor(); this.parent.isEdit = this.isEdit = true; this.parent.notify(clearCopy, null); this.parent.notify(enableToolbarItems, [{ enable: false }]); if (cell.formula && !preventFormulaReference) { this.parent.notify(initiateFormulaReference, { range: cell.formula, formulaSheetIdx: this.editCellData.sheetIndex }); } }; Edit.prototype.setCursorPosition = function () { var elem = this.getEditElement(this.parent.getActiveSheet()); var textLen = elem.textContent.length; if (textLen) { var selection = document.getSelection(); var range = document.createRange(); range.setStart(elem.firstChild, textLen); range.collapse(true); selection.removeAllRanges(); selection.addRange(range); } elem.focus(); }; Edit.prototype.hasFormulaSuggSelected = function () { var suggDdlElem = document.getElementById(this.parent.element.id + '_ac_popup'); return suggDdlElem && suggDdlElem.style.visibility === 'visible' && suggDdlElem.querySelectorAll('.e-item-focus').length > 0; }; Edit.prototype.editingHandler = function (action) { var pictureElements = document.getElementsByClassName('e-ss-overlay-active'); var pictureLen = pictureElements.length; var isSpill; switch (action) { case 'delete': if (pictureLen > 0) { if (pictureElements[0].classList.contains('e-datavisualization-chart')) { this.parent.notify(deleteChart, { id: pictureElements[0].id, sheetIdx: this.parent.activeSheetIndex + 1 }); } else { this.parent.notify(deleteImage, { id: pictureElements[0].id, sheetIdx: this.parent.activeSheetIndex + 1 }); } } else { var sheet = this.parent.getActiveSheet(); var address = sheet.selectedRange; var range = getIndexesFromAddress(address); range = range[0] > range[2] || range[1] > range[3] ? getSwapRange(range) : range; address = getRangeAddress(range); var cellDeleteArgs = { address: sheet.name + '!' + address, cancel: false }; this.parent.notify(beginAction, { action: 'cellDelete', eventArgs: cellDeleteArgs }); if (cellDeleteArgs.cancel) { return; } address = getRangeFromAddress(cellDeleteArgs.address); range = getRangeIndexes(address); clearRange(this.parent, range, this.parent.activeSheetIndex); this.parent.notify(selectionComplete, {}); if (range[0] === 0 && range[1] === 0 && range[2] >= sheet.usedRange.rowIndex && range[3] >= sheet.usedRange.colIndex) { this.parent.setUsedRange(0, 0, sheet, false, true); } var args = { cellIdx: range, isUnique: false }; this.checkUniqueRange(args); if (args.isUnique) { var indexes = getRangeIndexes(this.uniqueColl); var cell = getCell(indexes[0], indexes[1], this.parent.getActiveSheet()); if (cell && cell.value) { isSpill = cell.value.toString().indexOf('#SPILL!') > -1; } } if (args.isUnique && this.uniqueColl.split(':')[0] === address.split(':')[0]) { var index = getRangeIndexes(this.uniqueColl); for (var i = index[0]; i <= index[2]; i++) { for (var j = index[1]; j <= index[3]; j++) { this.parent.updateCellInfo({ value: '', formula: '' }, getRangeAddress([i, j]), true); } } this.parent.notify(removeUniquecol, null); this.uniqueColl = ''; } else if (args.isUnique) { var uniqueRange = getRangeIndexes(this.uniqueColl); if (getCell(uniqueRange[0], uniqueRange[1], sheet).value === '#SPILL!') { var skip = false; for (var j = uniqueRange[0]; j <= uniqueRange[2]; j++) { for (var k = uniqueRange[1]; k <= uniqueRange[3]; k++) { var cell = getCell(j, k, sheet); if (j === uniqueRange[0] && k === uniqueRange[1]) { skip = false; } else if (cell && !isNullOrUndefined(cell.value) && cell.value !== '') { skip = true; } } } if (!skip) { this.reApplyFormula(); } } } if (args.isUnique) { this.parent.notify(completeAction, { action: 'cellDelete', eventArgs: { address: sheet.name + '!' + address, isSpill: isSpill } }); } else { this.parent.notify(completeAction, { action: 'cellDelete', eventArgs: { address: sheet.name + '!' + address } }); } } break; } }; Edit.prototype.getCurPosition = function () { var cursorOffset = {}; var selection = window.getSelection(); if (selection && selection.focusNode && selection.focusNode.classList && selection.focusNode.classList.contains('e-formula-bar-panel')) { var formulaBar = selection.focusNode.getElementsByClassName('e-formula-bar e-css')[0]; if (formulaBar.value === this.editCellData.value) { cursorOffset.start = formulaBar.selectionStart; cursorOffset.end = formulaBar.selectionEnd; } } else if (this.getEditElement(this.parent.getActiveSheet()).textContent === this.editCellData.value) { cursorOffset.start = selection.anchorOffset; cursorOffset.end = selection.focusOffset; if (cursorOffset.start > cursorOffset.end) { var x = cursorOffset.start; cursorOffset.start = cursorOffset.end; cursorOffset.end = x; } } return cursorOffset; }; Edit.prototype.mouseDownHandler = function (e) { if (!closest(e.target, '.e-findtool-dlg') && !closest(e.target, '.e-validation-error-dlg')) { if (this.isEdit) { var curOffset = this.getCurPosition(); var selectionStart = void 0; var selectionEnd = void 0; if (curOffset.start) { this.curStartPos = selectionStart = curOffset.start; } if (curOffset.end) { this.curEndPos = selectionEnd = curOffset.end; } var trgtElem = e.target; var sheet = this.parent.getActiveSheet(); var formulaRefIndicator = this.parent.element.querySelector('.e-formularef-indicator'); this.isCellEdit = trgtElem.classList.contains('e-spreadsheet-edit'); var isFormula = checkIsFormula(this.editCellData.value, true); var editorElem = this.getEditElement(sheet); var validCharacters = ['+', '-', '*', '/', this.parent.listSeparator, '(', '=', '&', ':']; if (trgtElem.classList.contains('e-cell') || trgtElem.classList.contains('e-header-cell') || trgtElem.classList.contains('e-selectall') || closest(trgtElem, '.e-toolbar-item.e-active') || closest(trgtElem, '.e-table')) { if (!isFormula || this.endFormulaRef) { this.endFormulaRef = false; this.endEdit(false, e); } else { var actCellIdx = getCellIndexes(sheet.activeCell); var cell = getCell(actCellIdx[0], actCellIdx[1], sheet); var editorValue = document.activeElement.classList.contains('e-formula-bar') ? document.activeElement.value : editorElem.textContent; if (this.editCellData.value === editorValue) { if (selectionStart === selectionEnd) { if (this.editCellData.sheetIndex !== getSheetIndex(this.parent, sheet.name)) { if (validCharacters.indexOf(editorValue.substring(selectionStart - 1, selectionStart)) === -1) { if (formulaRefIndicator) { formulaRefIndicator.parentElement.removeChild(formulaRefIndicator); } this.parent.goTo(this.editCellData.fullAddr); this.endEdit(false, e); return; } } else if (validCharacters.indexOf(editorElem.textContent.substring(selectionStart - 1, selectionStart)) === -1) { if (formulaRefIndicator) { formulaRefIndicator.parentElement.removeChild(formulaRefIndicator); } this.endEdit(false, e); return; } } else if (validCharacters.indexOf(editorValue.substring(selectionStart - 1, selectionStart)) !== -1 && isCellReference(editorValue.substring(selectionStart, selectionEnd)) && editorValue.indexOf(':') !== selectionEnd) { this.editCellData.value = editorValue.substring(0, selectionStart) + editorValue.substring(selectionEnd, editorValue.length); } } if (!cell) { return; } isFormula = cell.formula && (checkIsFormula(cell.formula) || (this.editCellData.value && this.editCellData.value.toString().indexOf('=') === 0)); if (isFormula && this.parent.isEdit) { var curPos = selectionEnd; if (this.editCellData.value.length === curPos) { if (this.editCellData.value.substring(this.editCellData.value.length - 1) === ')' || isNumber(this.editCellData.value.substring(this.editCellData.value.length - 1))) { if (formulaRefIndicator) { formulaRefIndicator.parentElement.removeChild(formulaRefIndicator); } this.endEdit(false, e); } } else if (this.editCellData.value === editorValue && validCharacters.indexOf(editorValue.substring(curPos - 1, curPos)) === -1) { if (formulaRefIndicator) { formulaRefIndicator.parentElement.removeChild(formulaRefIndicator); } this.endEdit(false, e); } } } } else { if (isFormula && this.editCellData.value === editorElem.textContent && editorElem.textContent.indexOf('(') !== editorElem.textContent.length - 1 && !this.isCellEdit && !trgtElem.classList.contains('e-formula-bar') && validCharacters.indexOf(this.editCellData.value.substring(selectionStart - 1, selectionStart)) === -1) { if (getSheet(this.parent, this.editCellData.sheetIndex).id === sheet.id) { var curPos = window.getSelection().focusOffset; if (validCharacters.indexOf(editorElem.textContent.substring(curPos - 1, curPos)) === -1) { if (formulaRefIndicator) { formulaRefIndicator.parentElement.removeChild(formulaRefIndicator); } this.parent.goTo(this.editCellData.fullAddr); if (this.isEdit) { this.endEdit(false, e); } return; } } } } } } }; Edit.prototype.tapHandler = function (e) { var _this = this; if (!this.tapedTwice) { this.tapedTwice = true; setTimeout(function () { _this.tapedTwice = false; if (!_this.parent.isEdit && e.target.classList.contains('e-cell')) { var focusEditEle = _this.parent.element.querySelector('.e-ss-focus-edit'); if (focusEditEle) { focus(focusEditEle); } } }, 300); return; } e.preventDefault(); this.dblClickHandler(e); }; Edit.prototype.dblClickHandler = function (e) { var trgt = e.target; if (!closest(trgt, '.e-datavisualization-chart') && !trgt.classList.contains('e-ss-overlay') && (trgt.classList.contains('e-active-cell') || trgt.classList.contains('e-cell') || trgt.classList.contains('e-wrap-content') || closest(trgt, '.e-sheet-content') || trgt.classList.contains('e-table'))) { var sheet = this.parent.getActiveSheet(); var actCell = getCellIndexes(sheet.activeCell); var cell = getCell(actCell[0], actCell[1], sheet, false, true); if (isReadOnly(cell, getColumn(sheet, actCell[1]), getRow(sheet, actCell[0]))) { this.parent.notify(readonlyAlert, null); } else if (!sheet.isProtected || !isLocked(cell, getColumn(sheet, actCell[1]))) { if (this.isEdit) { if (!trgt.classList.contains('e-spreadsheet-edit')) { if (checkIsFormula(this.editCellData.value)) { var sheetName = this.editCellData.fullAddr.substring(0, this.editCellData.fullAddr.lastIndexOf('!')); if (this.parent.getActiveSheet().name === sheetName) { this.endEdit(); this.removeRefIndicator(); } } else { this.endEdit(); this.removeRefIndicator(); } } } else { this.isNewValueEdit = false; this.startEdit(); focus(this.getEditElement(sheet)); } } else { this.parent.notify(editAlert, null); } } }; Edit.prototype.updateEditCellDetail = function (addr, value) { var sheetIdx; var sheet; var isMergedHiddenCell; if (isNullOrUndefined(this.editCellData.sheetIndex)) { if (addr && addr.lastIndexOf('!') > -1) { sheetIdx = getSheetIndex(this.parent, getSheetNameFromAddress(addr)); } else { sheetIdx = this.parent.activeSheetIndex; } } else { sheetIdx = this.editCellData.sheetIndex; } if (!this.editCellData.addr) { sheet = getSheet(this.parent, sheetIdx); if (addr) { addr = getRangeFromAddress(addr); } else { addr = sheet.activeCell; } } else if (checkIsFormula(this.editCellData.value, true)) { sheet = getSheet(this.parent, sheetIdx); this.isNewValueEdit = false; } if (addr) { var range = getRangeIndexes(addr); var rowIdx = range[0]; var colIdx = range[1]; var model = getCell(rowIdx, colIdx, sheet, false, true); if (model.colSpan > 1 || model.rowSpan > 1) { var mergeArgs = { sheet: sheet, cell: model, rowIdx: rowIdx, colIdx: colIdx }; setVisibleMergeIndex(mergeArgs); rowIdx = mergeArgs.rowIdx; colIdx = mergeArgs.colIdx; isMergedHiddenCell = mergeArgs.isMergedHiddenCell; } var cellElem = this.parent.getCell(rowIdx, colIdx); var cellPosition = getCellPosition(sheet, range, this.parent.frozenRowCount(sheet), this.parent.frozenColCount(sheet), this.parent.viewport.beforeFreezeHeight, this.parent.viewport.beforeFreezeWidth, this.parent.sheetModule.colGroupWidth); this.editCellData = { addr: addr, fullAddr: getSheetName(this.parent, sheetIdx) + '!' + addr, rowIndex: rowIdx, colIndex: colIdx, sheetIndex: sheetIdx, element: cellElem, value: value || '', position: cellPosition, prevFormulaValue: this.editCellData.prevFormulaValue }; } return isMergedHiddenCell; }; Edit.prototype.initiateEditor = function (refreshCurPos, isMergedHiddenCell) { var _this = this; getData(this.parent, this.editCellData.fullAddr, false, isMergedHiddenCell).then(function (values) { if (!_this.parent) { return; } values.forEach(function (cell) { var value; var updateEditValue = function () { var args = { cell: cell, value: cell ? cell.value : '', showFormattedText: _this.editCellData.showFormattedText }; _this.parent.notify(getFormattedBarText, args); value = cell ? (cell.formula || args.value) : ''; _this.editCellData.oldValue = value; }; updateEditValue(); var evtArgs = _this.triggerEvent('cellEdit', null, value); if (evtArgs.cancel) { _this.cancelEdit(true, false, null, true); return; } if (evtArgs.showFormattedText) { // For SF-354174 ticket we have provided 'dd/MM/yyyy' support and diplayed the formatted value in the editor which is // not a default behavior. To handle this, we have added this property and it applies only for the 'dd/MM/yyyy' format. _this.editCellData.showFormattedText = true; updateEditValue(); } if (_this.editCellData.value) { value = _this.editCellData.value; } else { _this.editCellData.value = value; } var prevCellValue; if (_this.isNewValueEdit) { prevCellValue = value; value = ''; } else { _this.isNewValueEdit = true; } if (isUndefined(value)) { value = ''; } _this.refreshEditor(value, false, true, false, false, prevCellValue); if (refreshCurPos) { _this.setCursorPosition(); } }); }); }; Edit.prototype.positionEditor = function (isWrap) { var tdElem = this.editCellData.element; var isEdit = false; var cellEle; var arg = { isEdit: isEdit }; this.parent.notify(isFormulaBarEdit, arg); if (arg.isEdit && isNullOrUndefined(tdElem)) { cellEle = this.parent.getCell(this.editCellData.rowIndex, this.editCellData.colIndex); tdElem = cellEle; this.editCellData.element = cellEle; } if (tdElem) { tdElem.classList.add('e-ss-edited'); var sheet = this.parent.getActiveSheet(); var cell = getCell(this.editCellData.rowIndex, this.editCellData.colIndex, sheet, false, true); var left = this.editCellData.position.left + 1; var top_1 = this.editCellData.position.top + 1; var args = { range: [this.editCellData.rowIndex, this.editCellData.colIndex, this.editCellData.rowIndex, this.editCellData.colIndex] }; this.parent.notify(activeCellMergedRange, args); var minHeight = getRowsHeight(sheet, args.range[0], args.range[2]) - 3; var minWidth = getColumnsWidth(sheet, args.range[1], args.range[3]) - 3; var cont = this.parent.getMainContent(); var mainContElement = cont.parentElement; var editWidth = void 0; var frozenCol = this.parent.frozenColCount(sheet); var zIndex = void 0; var preventWrap = void 0; var frozenRow = this.parent.frozenRowCount(sheet); var addWrap = void 0; if (this.editCellData.colIndex < frozenCol) { editWidth = Math.abs(this.parent.getRowHeaderContent().getBoundingClientRect()[this.parent.enableRtl ? 'left' : 'right'] - tdElem.getBoundingClientRect()[this.parent.enableRtl ? 'right' : 'left']) - 1; if (this.editCellData.rowIndex < frozenRow) { if (this.parent.getRowHeaderContent().style.zIndex === '2') { zIndex = '3'; } } else { if (getTextWidth(cell.value, cell.style, this.parent.cellStyle) > editWidth) { addWrap = true; } } } else { editWidth = (mainContElement.offsetWidth - (left - cont.scrollLeft) - 28) - this.parent.sheetModule.getRowHeaderWidth(sheet); var tdEleInf = tdElem.getBoundingClientRect(); var mainContEleInf = mainContElement.getBoundingClientRect(); var getCellRight = this.parent.enableRtl ? tdEleInf.left : tdEleInf.right; var getMainConEleRight = this.parent.enableRtl ? mainContEleInf.left : mainContEleInf.right; var horizontalScrollBar = this.parent.getScrollElement(); var verticalScrollBarWidth = this.parent.sheetModule.getScrollSize(); if (this.parent.enableRtl) { if ((getMainConEleRight + verticalScrollBarWidth) > getCellRight) { horizontalScrollBar.scrollLeft -= tdEleInf.width; } } else { if ((getMainConEleRight - verticalScrollBarWidth) < getCellRight) { horizontalScrollBar.scrollLeft += tdEleInf.width; } } } if (this.editCellData.rowIndex < frozenRow) { preventWrap = true; } var height = !preventWrap && ((cell && cell.w