UNPKG

devextreme

Version:

JavaScript/TypeScript Component Suite for Responsive Web Development

129 lines (128 loc) 4.83 kB
/** * DevExtreme (esm/__internal/exporter/file_saver.js) * Version: 25.2.7 * Build date: Tue May 05 2026 * * Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import domAdapter from "../../core/dom_adapter"; import { logger } from "../../core/utils/console"; import { isDefined, isFunction } from "../../core/utils/type"; import { getNavigator, getWindow } from "../../core/utils/window"; import errors from "../../ui/widget/ui.errors"; const window = getWindow(); const navigator = getNavigator(); const FILE_EXTESIONS = { EXCEL: "xlsx", CSS: "css", PNG: "png", JPEG: "jpeg", GIF: "gif", SVG: "svg", PDF: "pdf" }; export const MIME_TYPES = { CSS: "text/css", EXCEL: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", PNG: "image/png", JPEG: "image/jpeg", GIF: "image/gif", SVG: "image/svg+xml", PDF: "application/pdf" }; export const fileSaver = { _revokeObjectURLTimeout: 3e4, _getDataUri(format, data) { const mimeType = this._getMimeType(format); return `data:${mimeType};base64,${data}` }, _getMimeType: format => MIME_TYPES[format] || "application/octet-stream", _linkDownloader(fileName, href) { const exportLinkElement = domAdapter.createElement("a"); exportLinkElement.download = fileName; exportLinkElement.href = href; exportLinkElement.target = "_blank"; return exportLinkElement }, _winJSBlobSave(blob, fileName, format) { const savePicker = new Windows.Storage.Pickers.FileSavePicker; savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary; const fileExtension = FILE_EXTESIONS[format]; if (fileExtension) { const mimeType = this._getMimeType(format); savePicker.fileTypeChoices.insert(mimeType, [`.${fileExtension}`]) } savePicker.suggestedFileName = fileName; savePicker.pickSaveFileAsync().then(file => { if (file) { file.openAsync(Windows.Storage.FileAccessMode.readWrite).then(outputStream => { const inputStream = blob.msDetachStream(); Windows.Storage.Streams.RandomAccessStream.copyAsync(inputStream, outputStream).then(() => { outputStream.flushAsync().done(() => { inputStream.close(); outputStream.close() }) }) }) } }) }, _click(link) { try { link.dispatchEvent(new MouseEvent("click", { cancelable: true })) } catch (e) { const event = domAdapter.getDocument().createEvent("MouseEvents"); event.initMouseEvent("click", true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); link.dispatchEvent(event) } }, _saveBlobAs(fileName, format, data) { this._blobSaved = false; if (isDefined(navigator.msSaveOrOpenBlob)) { navigator.msSaveOrOpenBlob(data, fileName); this._blobSaved = true } else if (isDefined(window.WinJS)) { this._winJSBlobSave(data, fileName, format); this._blobSaved = true } else { const URL = window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL; if (isDefined(URL)) { const objectURL = URL.createObjectURL(data); const downloadLink = this._linkDownloader(fileName, objectURL); setTimeout(() => { URL.revokeObjectURL(objectURL); this._objectUrlRevoked = true }, this._revokeObjectURLTimeout); this._click(downloadLink) } else { logger.warn("window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL is not defined") } } }, saveAs(fileName, format, data) { const fileExtension = FILE_EXTESIONS[format]; if (fileExtension) { fileName += `.${fileExtension}` } if (isFunction(window.Blob)) { this._saveBlobAs(fileName, format, data) } else { if (!isDefined(/iPad/i.exec(navigator.userAgent))) { errors.log("E1034") } const downloadLink = this._linkDownloader(fileName, this._getDataUri(format, data)); this._click(downloadLink) } } };