UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

181 lines (179 loc) • 6.92 kB
/** * DevExtreme (esm/exporter/file_saver.js) * Version: 21.1.4 * Build date: Mon Jun 21 2021 * * Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import $ from "../core/renderer"; import domAdapter from "../core/dom_adapter"; import { getWindow, getNavigator } from "../core/utils/window"; import eventsEngine from "../events/core/events_engine"; import errors from "../ui/widget/ui.errors"; import { isDefined, isFunction } from "../core/utils/type"; import { logger } from "../core/utils/console"; var window = getWindow(); var navigator = getNavigator(); var FILE_EXTESIONS = { EXCEL: "xlsx", CSS: "css", PNG: "png", JPEG: "jpeg", GIF: "gif", SVG: "svg", PDF: "pdf" }; export var 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 var fileSaver = { _revokeObjectURLTimeout: 3e4, _getDataUri: function(format, data) { var mimeType = this._getMimeType(format); return "data:".concat(mimeType, ";base64,").concat(data) }, _getMimeType: function(format) { return MIME_TYPES[format] || "application/octet-stream" }, _linkDownloader: function(fileName, href) { var exportLinkElement = domAdapter.createElement("a"); exportLinkElement.download = fileName; exportLinkElement.href = href; exportLinkElement.target = "_blank"; return exportLinkElement }, _formDownloader: function(proxyUrl, fileName, contentType, data) { var formAttributes = { method: "post", action: proxyUrl, enctype: "multipart/form-data" }; var exportForm = $("<form>").css({ display: "none" }).attr(formAttributes); function setAttributes(element, attributes) { for (var key in attributes) { element.setAttribute(key, attributes[key]) } return element } exportForm.append(setAttributes(domAdapter.createElement("input"), { type: "hidden", name: "fileName", value: fileName })); exportForm.append(setAttributes(domAdapter.createElement("input"), { type: "hidden", name: "contentType", value: contentType })); exportForm.append(setAttributes(domAdapter.createElement("input"), { type: "hidden", name: "data", value: data })); exportForm.appendTo("body"); eventsEngine.trigger(exportForm, "submit"); if (eventsEngine.trigger(exportForm, "submit")) { exportForm.remove() } }, _saveByProxy: function(proxyUrl, fileName, format, data) { var contentType = this._getMimeType(format); return this._formDownloader(proxyUrl, fileName, contentType, data) }, _winJSBlobSave: function(blob, fileName, format) { var savePicker = new Windows.Storage.Pickers.FileSavePicker; savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary; var fileExtension = FILE_EXTESIONS[format]; if (fileExtension) { var mimeType = this._getMimeType(format); savePicker.fileTypeChoices.insert(mimeType, ["." + fileExtension]) } savePicker.suggestedFileName = fileName; savePicker.pickSaveFileAsync().then((function(file) { if (file) { file.openAsync(Windows.Storage.FileAccessMode.readWrite).then((function(outputStream) { var inputStream = blob.msDetachStream(); Windows.Storage.Streams.RandomAccessStream.copyAsync(inputStream, outputStream).then((function() { outputStream.flushAsync().done((function() { inputStream.close(); outputStream.close() })) })) })) } })) }, _click: function(link) { try { link.dispatchEvent(new MouseEvent("click", { cancelable: true })) } catch (e) { var 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: function(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 { var URL = window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL; if (isDefined(URL)) { var objectURL = URL.createObjectURL(data); var 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: function(fileName, format, data, proxyURL, forceProxy) { var fileExtension = FILE_EXTESIONS[format]; if (fileExtension) { fileName += "." + fileExtension } if (isDefined(proxyURL)) { errors.log("W0001", "Export", "proxyURL", "19.2", "This option is no longer required") } if (forceProxy) { this._saveByProxy(proxyURL, fileName, format, data) } else if (isFunction(window.Blob)) { this._saveBlobAs(fileName, format, data) } else if (isDefined(proxyURL) && !isDefined(navigator.userAgent.match(/iPad/i))) { this._saveByProxy(proxyURL, fileName, format, data) } else { if (!isDefined(navigator.userAgent.match(/iPad/i))) { errors.log("E1034") } var downloadLink = this._linkDownloader(fileName, this._getDataUri(format, data)); this._click(downloadLink) } } };