@syncfusion/ej2-spreadsheet
Version: 
Feature-rich JavaScript Spreadsheet (Excel) control with built-in support for selection, editing, formatting, importing and exporting to Excel
243 lines (242 loc) • 12.5 kB
JavaScript
import { getCell, getSheet, isCustomDateTime } from '../base/index';
import { workbookEditOperation, checkDateFormat, workbookFormulaOperation, refreshChart, checkUniqueRange, getFormattedCellObject, checkNumberFormat } from '../common/event';
import { getRangeIndexes, parseIntValue, setLinkModel, getCellAddress, isNumber } from '../common/index';
import { defaultCurrencyCode, getNumberDependable, getNumericObject, Internationalization, isNullOrUndefined } from '@syncfusion/ej2-base';
import { checkIsFormula } from '../../workbook/common/index';
import { getFormatFromType, getTypeFromFormat } from '../integrations/index';
/**
 * The `WorkbookEdit` module is used to handle the editing functionalities in Workbook.
 */
var WorkbookEdit = /** @class */ (function () {
    /**
     * Constructor for edit module in Workbook.
     *
     * @private
     * @param {Workbook} workbook - Specifies the workbook.
     */
    function WorkbookEdit(workbook) {
        this.parent = workbook;
        this.addEventListener();
    }
    /**
     * To destroy the edit module.
     *
     * @returns {void} - destroy the edit module
     * @hidden
     */
    WorkbookEdit.prototype.destroy = function () {
        this.removeEventListener();
        this.parent = null;
    };
    WorkbookEdit.prototype.addEventListener = function () {
        this.parent.on(workbookEditOperation, this.performEditOperation, this);
    };
    WorkbookEdit.prototype.removeEventListener = function () {
        if (!this.parent.isDestroyed) {
            this.parent.off(workbookEditOperation, this.performEditOperation);
        }
    };
    /**
     * Get the module name.
     *
     * @returns {string} - string
     * @private
     */
    WorkbookEdit.prototype.getModuleName = function () {
        return 'workbookEdit';
    };
    WorkbookEdit.prototype.performEditOperation = function (args) {
        var action = args.action;
        switch (action) {
            case 'updateCellValue':
                args.isFormulaDependent = this.updateCellValue(args.address, args.value, args.sheetIndex, args.isValueOnly, args.skipFormatCheck, args.isRandomFormula, args.skipCellFormat, args.isDelete, args.deletedRange, args.fillType, args.cellInformation, args.isRedo, args.isDependentUpdate, args.actionName, args.isPaste);
                break;
        }
    };
    WorkbookEdit.prototype.updateCellValue = function (address, value, sheetIdx, isValueOnly, skipFormatCheck, isRandomFormula, skipCellFormat, isDelete, deletedRange, fillType, cellInformation, isRedo, isDependentUpdate, actionName, isPaste) {
        if (sheetIdx === undefined) {
            sheetIdx = this.parent.activeSheetIndex;
        }
        var range;
        var isFormulaDependent;
        if (typeof address === 'string') {
            range = getRangeIndexes(address);
        }
        else {
            range = address;
        }
        var sheet = getSheet(this.parent, sheetIdx);
        var cell = getCell(range[0], range[1], sheet, true);
        if (!cell) {
            cell = sheet.rows[range[0]].cells[range[1]] = {};
        }
        if (!isValueOnly) {
            var isFormula = checkIsFormula(value);
            isFormula = value === '#SPILL!' ? true : isFormula;
            var skipFormula = false; // for unique formula
            if (cell.formula && cell.formula.indexOf('UNIQUE') > -1 && value === '') {
                skipFormula = true;
            }
            var isNotTextFormat = getTypeFromFormat(cell.format) !== 'Text' && (!isFormula ||
                !value.toLowerCase().startsWith('=text('));
            isFormula = getTypeFromFormat(cell.format) === 'Text' ? false : isFormula;
            if (!isFormula && !skipFormula) {
                if (cell.formula) {
                    cell.formula = '';
                }
                cell.value = isNotTextFormat ? parseIntValue(value, isPaste) : value;
            }
            var eventArgs = {
                action: 'refreshCalculate',
                value: value,
                rowIndex: range[0],
                colIndex: range[1],
                sheetIndex: sheetIdx,
                isFormula: isFormula,
                isRandomFormula: isRandomFormula,
                isDelete: isDelete,
                deletedRange: deletedRange,
                fillType: fillType,
                isDependentRefresh: isDependentUpdate
            };
            if (isNotTextFormat && !skipFormatCheck) {
                var dateEventArgs = {
                    value: value,
                    rowIndex: range[0],
                    colIndex: range[1],
                    sheetIndex: sheetIdx,
                    updatedVal: '',
                    skipCellFormat: skipCellFormat
                };
                if (!isFormula) {
                    var cellType = getTypeFromFormat(cell.format);
                    var valArr = value ? value.toString().split('/') : [];
                    if ((cellType !== 'Number' && cellType !== 'Percentage' && cellType !== 'Fraction' && !(cellType === 'Scientific' && valArr.length === 2)) ||
                        (cellType === 'Fraction' && valArr.length !== 2)) {
                        this.parent.notify(checkDateFormat, dateEventArgs);
                    }
                    if (!isNullOrUndefined(dateEventArgs.updatedVal) && dateEventArgs.updatedVal.length > 0) {
                        cell.value = dateEventArgs.updatedVal;
                    }
                    else if (this.parent.isEdit && value && !isNumber(value)) {
                        var curSymbol = getNumberDependable(this.parent.locale, defaultCurrencyCode);
                        if (cell.format) {
                            if ((value.includes('%') || value.includes(curSymbol)) && isCustomDateTime(cell.format)) {
                                var formatArgs = {
                                    formattedText: value, value: value, format: 'General',
                                    cell: { value: value, format: 'General' }, isEdit: true
                                };
                                this.parent.notify(getFormattedCellObject, formatArgs);
                                if (formatArgs.format !== 'General' && ['Currency', 'Percentage'].indexOf(getTypeFromFormat(formatArgs.format)) > -1) {
                                    cell.format = formatArgs.format;
                                    cell.value = formatArgs.value;
                                }
                            }
                            else {
                                var evtArgs = {
                                    value: cell.value, format: cell.format, formattedText: cell.value,
                                    type: 'General', cell: cell, rowIndex: range[0], colIndex: range[1]
                                };
                                this.parent.notify(getFormattedCellObject, evtArgs);
                            }
                        }
                        else {
                            if (value.includes(curSymbol) || value.includes('%') ||
                                value.includes(getNumericObject(this.parent.locale).group)) {
                                var intl = new Internationalization();
                                var eventArgs_1 = {
                                    intl: intl, updateValue: true, value: '', curSymbol: curSymbol,
                                    cell: cell
                                };
                                this.parent.notify(checkNumberFormat, {
                                    args: eventArgs_1, intl: intl, fResult: value,
                                    cell: cell
                                });
                            }
                        }
                    }
                }
                else if (!isNullOrUndefined(value) && value.toLowerCase().includes('unique(') && value.length > 0) {
                    cell.value = value;
                }
            }
            if (value === '#SPILL!') {
                cell.value = value;
            }
            else {
                var args = { cellIdx: range, isUnique: false };
                this.parent.notify(checkUniqueRange, args);
                if (this.parent.calculationMode === 'Manual' && isFormula && isNullOrUndefined(isDependentUpdate) &&
                    (actionName !== 'autofill' || cell.formula !== '') && !this.parent.isEdit &&
                    isNullOrUndefined(this.parent.element.querySelector('.e-text-replaceInp'))) {
                    skipFormula = true;
                    if (!isRedo && cell.value === undefined) {
                        skipFormula = false;
                    }
                }
                if (!skipFormula && !isDelete) {
                    this.parent.notify(workbookFormulaOperation, eventArgs);
                    isFormulaDependent = eventArgs.isFormulaDependent;
                }
                else {
                    value = cell.value;
                }
                if (isFormula) {
                    cell.formula = eventArgs.value;
                    if (this.parent.calculationMode === 'Manual' && skipFormula && isRedo && !this.parent.isEdit && cellInformation &&
                        cellInformation.cellDetails && cellInformation.cellDetails.length > 0 &&
                        cellInformation.cutCellDetails.length === 0 &&
                        (!isNullOrUndefined(cellInformation.cellDetails[0].autoFillText) ||
                            !isNullOrUndefined(cellInformation.cellDetails[0].copyCellValue))) {
                        for (var i = 0; i < cellInformation.cellDetails.length; i++) {
                            if (cellInformation.cellDetails[i].rowIndex === address[0] &&
                                cellInformation.cellDetails[i].colIndex === address[1]) {
                                if (cellInformation.cellDetails[i].copyCellValue) {
                                    value = cell.value = cellInformation.cellDetails[i].copyCellValue;
                                }
                                else {
                                    value = cell.value = cellInformation.cellDetails[i].autoFillText;
                                }
                                break;
                            }
                        }
                    }
                    else {
                        value = cell.value;
                        if (this.parent.calculationMode === 'Manual' && cellInformation && isRedo && cellInformation.displayText) {
                            value = cell.value = cellInformation.displayText;
                        }
                    }
                    var formula = cell.formula.toLowerCase();
                    var isNeedFormatUpdate = getTypeFromFormat(cell.format) === 'Scientific' && !skipFormatCheck && this.parent.isEdit;
                    if (formula === '=now()' && (!cell.format || cell.format === 'General' || isNeedFormatUpdate)) {
                        cell.format = getFormatFromType('ShortDate') + " h:mm";
                    }
                    else if (formula.includes('=time(') && (!cell.format || isNeedFormatUpdate)) {
                        cell.format = 'h:mm AM/PM';
                    }
                    else if (formula.includes('=date(') && isNeedFormatUpdate) {
                        cell.format = getFormatFromType('ShortDate');
                    }
                }
                else if (cell.value && typeof cell.value === 'string' && (cell.value.indexOf('www.') === 0 ||
                    cell.value.indexOf('https://') === 0 || cell.value.indexOf('http://') === 0 || cell.value.indexOf('ftp://') === 0)) {
                    this.parent.notify(setLinkModel, { hyperlink: cell.value, cell: sheet.name + "!" + getCellAddress(range[0], range[1]) });
                }
            }
        }
        else {
            cell.value = value;
            if (cell.formattedText) {
                delete cell.formattedText;
            }
        }
        this.parent.setUsedRange(range[0], range[1], sheet);
        if (this.parent.chartColl.length && !this.parent.isEdit && !isRandomFormula) {
            this.parent.notify(refreshChart, { cell: cell, rIdx: range[0], cIdx: range[1], sheetIdx: sheetIdx, isRefreshChart: true });
        }
        return isFormulaDependent;
    };
    return WorkbookEdit;
}());
export { WorkbookEdit };