UNPKG

@syncfusion/ej2-spreadsheet

Version:

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

381 lines (380 loc) 16.8 kB
/** * Open properties. */ import { isNullOrUndefined, isUndefined } from '@syncfusion/ej2-base'; import { workbookOpen, openSuccess, openFailure, sheetsDestroyed, workbookFormulaOperation, getRangeIndexes } from '../common/index'; import { sheetCreated, getRangeAddress, beginAction, importModelUpdate } from '../common/index'; import { initSheet, getSheet } from '../base/index'; import { clearUndoRedoCollection } from '../../spreadsheet/common/event'; var WorkbookOpen = /** @class */ (function () { function WorkbookOpen(parent) { this.loopIndex = 0; this.processedLoopIndex = 0; this.retryCount = 0; this.currentDocumentId = null; this.parent = parent; this.addEventListener(); } /** * To open the excel file stream or excel url into the spreadsheet. * * @param {OpenArgs} options - Options to open a excel file. * @returns {void} - To open the excel file stream or excel url into the spreadsheet. */ WorkbookOpen.prototype.open = function (options) { this.load(options); }; WorkbookOpen.prototype.load = function (options, isRetryRequest) { var _this = this; if (!this.parent.allowOpen) { return; } if (options.jsonObject) { this.fetchSuccess(options.jsonObject, options, null, true, true); return; } var formData = new FormData(); if (options.file) { formData.append('file', options.file); } else if (options.sheetIndex >= 0) { formData.append('sheetPassword', options.sheetPassword); formData.append('sheetIndex', options.sheetIndex.toString()); } else { this.parent.isOpen = false; return; } var args = { passWord: '' }; if (options.password && options.password.length) { args.passWord = options.password; } if (args.passWord && args.passWord.length) { options.password = args.passWord; } if (options.password) { formData.append('password', options.password); } formData.append('IsManualCalculationEnabled', (this.parent.calculationMode === 'Manual').toString()); var eventArgs = { file: options.file || null, cancel: false, requestData: { method: 'POST', body: formData }, password: args.passWord }; /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ var guid = options.guid; if (isNullOrUndefined(options.sheetPassword) && !guid && isNullOrUndefined(isRetryRequest)) { this.parent.trigger('beforeOpen', eventArgs); this.parent.notify(beginAction, { eventArgs: eventArgs, action: 'beforeOpen' }); } else if (guid) { formData.append('guid', guid); } if (eventArgs.cancel) { this.parent.isOpen = false; return; } var header = { chunkSize: null, documentId: null }; if (this.parent.openSettings.chunkSize > 0 && isNullOrUndefined(options.sheetPassword)) { this.setToDefaults(isRetryRequest); if (!isNullOrUndefined(this.parent.openSettings.chunkSize) && this.parent.openSettings.chunkSize !== 0) { header.chunkSize = this.parent.openSettings.chunkSize.toString(); } if (!isNullOrUndefined(this.currentDocumentId)) { header.documentId = this.currentDocumentId; } if (!isNullOrUndefined(header)) { formData.append('chunkPayload', JSON.stringify(header)); } } if (eventArgs.parseOptions) { formData.append('parseOptions', JSON.stringify(eventArgs.parseOptions)); } fetch(this.parent.openUrl, eventArgs.requestData) .then(function (response) { if (response.ok) { return response.json(); } else { return Promise.reject({ status: response.status, statusText: response.statusText, url: response.url }); } }) .then(function (data) { return _this.fetchSuccess(data, eventArgs, options.orginalFile, undefined, true); }) .catch(function (error) { if (error.toString().indexOf('Unexpected end of JSON input') === -1 && _this.parent.openSettings.chunkSize > 0 && _this.retryCount < _this.parent.openSettings.retryCount) { setTimeout(function () { _this.retryCount++; _this.load(options, true); }, _this.parent.openSettings.retryAfterDelay); } else { if (_this.retryCount >= _this.parent.openSettings.retryCount) { _this.retryCount = 0; } _this.fetchFailure(error); } }); }; WorkbookOpen.prototype.fetchFailure = function (error) { if (isUndefined(error.status) && isUndefined(error.statusText)) { error.statusText = 'Improper response'; } this.parent.notify(openFailure, error); this.parent.isOpen = false; }; WorkbookOpen.prototype.fetchSuccess = function (data, eventArgs, file, isOpenFromJson, isImport) { var openError = ['UnsupportedFile', 'InvalidUrl', 'NeedPassword', 'InCorrectPassword', 'InCorrectSheetPassword', 'CorrectSheetPassword', 'DataLimitExceeded', 'FileSizeLimitExceeded', 'ExternalWorkbook']; /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ var workbookData = typeof data === 'string' ? JSON.parse(data) : data; var impData = workbookData.Workbook; if (!isNullOrUndefined(impData)) { if (openError.indexOf(impData) > -1) { if (file) { eventArgs.file = file; } this.parent.notify(openSuccess, { context: this, data: impData, guid: workbookData.Guid, eventArgs: eventArgs, isOpenFromJson: isOpenFromJson }); if (impData === openError[0]) { this.parent.isOpen = false; } return; } this.updateModel(impData, isOpenFromJson, isImport); this.parent.notify(openSuccess, { context: this, data: impData, isOpenFromJson: isOpenFromJson, eventArgs: eventArgs }); this.parent.isOpen = false; if (eventArgs && eventArgs.password && eventArgs.password.length > 0) { if (this.parent.showSheetTabs) { this.parent.element.querySelector('.e-add-sheet-tab').removeAttribute('disabled'); this.parent.element.querySelector('.e-add-sheet-tab').classList.remove('e-disabled'); } this.parent.password = ''; } } else { var totalChunk = workbookData.chunkTotalCount; this.currentDocumentId = workbookData.documentId; this.chunkList = new Array(totalChunk); var processedChunkIndex = 0; var chunkLimit = totalChunk > this.parent.openSettings.chunkSize ? this.parent.openSettings.chunkSize : totalChunk; var processedLoopIndex = 0; this.processedLoopIndex = 0; var binaryString = ''; /* eslint-disable-next-line @typescript-eslint/no-this-alias */ var instance = this; if (!isNullOrUndefined(totalChunk)) { while (processedChunkIndex < totalChunk) { instance.processChunk(processedChunkIndex, chunkLimit, processedLoopIndex, binaryString, eventArgs, file, isOpenFromJson, isImport); processedChunkIndex += instance.parent.openSettings.chunkSize; chunkLimit = processedChunkIndex + instance.parent.openSettings.chunkSize < totalChunk ? instance.parent.openSettings.chunkSize : totalChunk - processedChunkIndex; processedLoopIndex++; instance.processedLoopIndex++; } } } }; WorkbookOpen.prototype.processChunk = function (processedChunkIndex, chunkLimit, processedLoopIndex, binaryString, eventArgs, file, isOpenFromJson, isImport) { /* eslint-disable-next-line @typescript-eslint/no-this-alias */ var instance = this; var header = { currentChunk: processedChunkIndex.toString(), chunkSize: chunkLimit.toString(), loopIndex: processedLoopIndex.toString(), documentId: this.currentDocumentId }; var formData = new FormData(); formData.append('chunkPayload', JSON.stringify(header)); var requestEventArgs = { file: file || null, cancel: false, requestData: { method: 'POST', body: formData }, password: eventArgs.password }; fetch(this.parent.openUrl, requestEventArgs.requestData) /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ .then(function (response) { if (response.ok) { return response.json(); } else { return Promise.reject({ status: response.status, statusText: response.statusText, url: response.url }); } }) /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ .then(function (data) { if (data !== '') { var chunks = atob(data['chunk']); var bytes = new Uint8Array(chunks.length); for (var i = 0; i < chunks.length; i++) { bytes[i] = chunks.charCodeAt(i); } chunks = new TextDecoder('utf-8').decode(bytes); instance.chunkList[data['loopIndex']] = chunks; instance.loopIndex++; if (instance.loopIndex === instance.processedLoopIndex) { var splicedArray = instance.chunkList.splice(0, instance.loopIndex); for (var k = 0; k < splicedArray.length; k++) { binaryString += splicedArray.slice(k, k + 1).join(''); } data = JSON.parse(binaryString); instance.setToDefaults(); instance.fetchSuccess(data, eventArgs, file, isOpenFromJson, isImport); } } }) .catch(function (error) { if (isNullOrUndefined(instance.currentFailedChunkIndex) || instance.currentFailedChunkIndex === processedChunkIndex) { instance.currentFailedChunkIndex = processedChunkIndex; if (instance.retryCount < instance.parent.openSettings.retryCount) { setTimeout(function () { instance.processedLoopIndex = processedLoopIndex; instance.processChunk(processedChunkIndex, chunkLimit, processedLoopIndex, binaryString, eventArgs, file, isOpenFromJson, isImport); instance.retryCount++; }, instance.parent.openSettings.retryAfterDelay); } else { instance.retryCount = 0; return instance.fetchFailure(error); } } }); }; WorkbookOpen.prototype.setToDefaults = function (isRetryRequest) { this.currentFailedChunkIndex = null; if (!isRetryRequest) { this.retryCount = 0; } this.loopIndex = 0; this.processedLoopIndex = 0; this.chunkList = []; }; WorkbookOpen.prototype.updateModel = function (workbookModel, isOpenFromJson, isImport) { this.parent.notify(workbookFormulaOperation, { action: 'unRegisterSheet' }); this.setSelectAllRange(workbookModel.sheets, isOpenFromJson); this.parent.sheetNameCount = 1; this.parent.sheets = []; this.parent.notify(sheetsDestroyed, {}); this.parent.notify(clearUndoRedoCollection, null); workbookModel.activeSheetIndex = workbookModel.activeSheetIndex || workbookModel.sheets.findIndex(function (sheet) { return sheet.state !== 'Hidden'; }); this.parent.setProperties({ 'isProtected': workbookModel.isProtected || false, 'password': workbookModel.password || '', 'sheets': workbookModel.sheets, 'activeSheetIndex': workbookModel.activeSheetIndex, 'definedNames': workbookModel.definedNames || [], 'filterCollection': workbookModel.filterCollection || [], 'sortCollection': workbookModel.sortCollection || [], 'listSeparator': workbookModel.listSeparator || this.parent.listSeparator }, true); if (!isNullOrUndefined(workbookModel.showSheetTabs)) { this.parent.showSheetTabs = workbookModel.showSheetTabs; } initSheet(this.parent, undefined, isImport); this.parent.notify(sheetCreated, null); this.parent.notify(importModelUpdate, null); }; WorkbookOpen.prototype.setSelectAllRange = function (sheets, isOpenFromJson) { var _this = this; var curSheet; var curRange; sheets.forEach(function (sheet) { if (sheet.selectedRange) { var selectedIndex = getRangeIndexes(sheet.selectedRange); var rowCount = (isUndefined(sheet.rowCount) ? 100 : sheet.rowCount) - 1; var colCount = (isUndefined(sheet.colCount) ? 100 : sheet.colCount) - 1; if (selectedIndex[2] === 65535) { selectedIndex[2] = rowCount; } if (selectedIndex[3] === 255) { selectedIndex[3] = colCount; } if (selectedIndex[0] === 65535) { selectedIndex[0] = rowCount; } if (selectedIndex[1] === 255) { selectedIndex[1] = colCount; } sheet.selectedRange = getRangeAddress(selectedIndex); } if (isOpenFromJson && _this.parent.isAngular) { for (var i = 0; i < _this.parent.sheets.length; i++) { curSheet = getSheet(_this.parent, i); if (sheet.name === curSheet.name) { if (sheet.ranges) { sheet.ranges.forEach(function (range, index) { curRange = curSheet.ranges[index]; if (curRange && curRange.template) { range.template = curRange.template; } }); } break; } } } }); }; WorkbookOpen.prototype.sheetsDestroyHandler = function (args) { if (isNullOrUndefined(args.sheetIndex)) { this.preventFormatCheck = null; } }; /** * Adding event listener for workbook open. * * @returns {void} - Adding event listener for workbook open. */ WorkbookOpen.prototype.addEventListener = function () { this.parent.on(workbookOpen, this.open.bind(this)); this.parent.on(sheetsDestroyed, this.sheetsDestroyHandler, this); }; /** * Removing event listener workbook open. * * @returns {void} - removing event listener workbook open. */ WorkbookOpen.prototype.removeEventListener = function () { if (!this.parent.isDestroyed) { this.parent.off(workbookOpen, this.open.bind(this)); this.parent.off(sheetsDestroyed, this.sheetsDestroyHandler); } }; /** * To Remove the event listeners * * @returns {void} - To Remove the event listeners */ WorkbookOpen.prototype.destroy = function () { this.removeEventListener(); if (!this.parent.refreshing) { this.preventFormatCheck = null; } this.parent = null; }; /** * Get the workbook open module name. * * @returns {string} - Get the module name. */ WorkbookOpen.prototype.getModuleName = function () { return 'workbookOpen'; }; return WorkbookOpen; }()); export { WorkbookOpen };