devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
140 lines (139 loc) • 5.87 kB
JavaScript
/**
* DevExtreme (client_exporter/file_saver.js)
* Version: 18.1.3
* Build date: Tue May 15 2018
*
* Copyright (c) 2012 - 2018 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
var $ = require("../core/renderer"),
domAdapter = require("../core/dom_adapter"),
windowUtils = require("../core/utils/window"),
window = windowUtils.getWindow(),
navigator = windowUtils.getNavigator(),
eventsEngine = require("../events/core/events_engine"),
errors = require("../ui/widget/ui.errors"),
browser = require("../core/utils/browser"),
typeUtils = require("../core/utils/type"),
FILE_EXTESIONS = {
EXCEL: "xlsx",
CSS: "css",
PNG: "png",
JPEG: "jpeg",
GIF: "gif",
SVG: "svg",
PDF: "pdf"
};
var MIME_TYPES = exports.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"
};
exports.fileSaver = {
_getDataUri: function(format, data) {
return "data:" + MIME_TYPES[format] + ";base64," + data
},
_linkDownloader: function(fileName, href, clickHandler) {
var exportLinkElement = domAdapter.createElement("a"),
attributes = {
download: fileName,
href: href
};
eventsEngine.on($(exportLinkElement), "click", function() {
$(exportLinkElement).remove();
clickHandler && clickHandler.apply(this, arguments)
});
domAdapter.getBody().appendChild(exportLinkElement);
$(exportLinkElement).css({
display: "none"
}).text("load").attr(attributes)[0].click();
return exportLinkElement
},
_formDownloader: function(proxyUrl, fileName, contentType, data) {
var formAttributes = {
method: "post",
action: proxyUrl,
enctype: "multipart/form-data"
},
exportForm = $("<form>").css({
display: "none"
}).attr(formAttributes);
exportForm.append('<input type="hidden" name="fileName" value="' + fileName + '" />');
exportForm.append('<input type="hidden" name="contentType" value="' + contentType + '" />');
exportForm.append('<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) {
return this._formDownloader(proxyUrl, fileName, MIME_TYPES[format], data)
},
_winJSBlobSave: function(blob, fileName, format) {
var savePicker = new Windows.Storage.Pickers.FileSavePicker;
savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary;
savePicker.fileTypeChoices.insert(MIME_TYPES[format], ["." + FILE_EXTESIONS[format]]);
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()
})
})
})
}
})
},
_saveBlobAs: function(fileName, format, data, linkClick) {
var that = this;
that._blobSaved = false;
if (typeUtils.isDefined(navigator.msSaveOrOpenBlob)) {
navigator.msSaveOrOpenBlob(data, fileName);
that._blobSaved = true
} else {
if (typeUtils.isDefined(window.WinJS)) {
that._winJSBlobSave(data, fileName, format);
that._blobSaved = true
} else {
var URL = window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL;
if (typeUtils.isDefined(URL)) {
var objectURL = URL.createObjectURL(data),
clickHandler = function(e) {
setTimeout(function() {
URL.revokeObjectURL(objectURL)
})
};
return that._linkDownloader(fileName, objectURL, clickHandler)
}
}
}
},
saveAs: function(fileName, format, data, proxyURL, linkClick) {
fileName += "." + FILE_EXTESIONS[format];
if (typeUtils.isFunction(window.Blob)) {
this._saveBlobAs(fileName, format, data)
} else {
if (typeUtils.isDefined(proxyURL) && !typeUtils.isDefined(navigator.userAgent.match(/iPad/i))) {
this._saveByProxy(proxyURL, fileName, format, data)
} else {
if (!typeUtils.isDefined(navigator.userAgent.match(/iPad/i))) {
errors.log("E1034")
}
if (browser.msie && parseInt(browser.version) < 10) {
return
}
this._linkDownloader(fileName, this._getDataUri(format, data), linkClick)
}
}
}
};