Switch to FileSaver lib for downloading Blob files, add Blob polyfill

This commit is contained in:
Tautvidas Sipavičius
2015-11-05 17:17:54 +02:00
parent 983df216f3
commit dcfe6357cf
4 changed files with 40 additions and 29 deletions

View File

@ -3,8 +3,10 @@ define([
'mailpoet', 'mailpoet',
'backbone', 'backbone',
'backbone.marionette', 'backbone.marionette',
'jquery' 'jquery',
], function(App, MailPoet, Backbone, Marionette, jQuery) { 'blob',
'filesaver'
], function(App, MailPoet, Backbone, Marionette, jQuery, Blob, FileSaver) {
"use strict"; "use strict";
@ -54,31 +56,15 @@ define([
}; };
Module.exportTemplate = function(options) { Module.exportTemplate = function(options) {
if (!window.Blob || !window.URL) {
// TODO: Gracefully exit on incompatible browsers
console.log('Template export requires a browser with Blob and URL support.');
return;
}
var data = _.extend(options || {}, { var data = _.extend(options || {}, {
body: App.getBody(), body: App.getBody(),
}); });
var blob = new Blob(
[JSON.stringify(data)],
{ type: 'application/json;charset=utf-8' }
);
// Create a template file and force download it FileSaver.saveAs(blob, 'template.json');
var blob = new window.Blob([JSON.stringify(data)], { type: 'application/json' }),
url = window.URL.createObjectURL(blob),
anchor = document.createElement('a');
anchor.href = url;
anchor.download = 'template.json';
anchor.style.display = 'none';
document.body.appendChild(anchor);
anchor.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(anchor);
}; };
Module.SaveView = Marionette.LayoutView.extend({ Module.SaveView = Marionette.LayoutView.extend({

View File

@ -1,6 +1,7 @@
define( define(
[ [
'react', 'react',
'underscore',
'mailpoet', 'mailpoet',
'react-router', 'react-router',
'classnames', 'classnames',
@ -8,6 +9,7 @@ define(
], ],
function( function(
React, React,
_,
MailPoet, MailPoet,
Router, Router,
classNames, classNames,
@ -33,12 +35,21 @@ define(
handleSubmit: function(e) { handleSubmit: function(e) {
e.preventDefault(); e.preventDefault();
var reader = new FileReader(), if (_.size(this.refs.templateFile.files) <= 0) return false;
var file = _.first(this.refs.templateFile.files),
reader = new FileReader(),
saveTemplate = this.saveTemplate; saveTemplate = this.saveTemplate;
reader.onload = function(e) { reader.onload = function(e) {
saveTemplate(JSON.parse(e.target.result)); try {
saveTemplate(JSON.parse(e.target.result));
} catch (err) {
MailPoet.Notice.error('This template file appears to be malformed. Please try another one.');
}
}.bind(this); }.bind(this);
reader.readAsText(this.refs.templateFile.files[0]);
reader.readAsText(file);
}, },
render: function() { render: function() {
return ( return (

View File

@ -4,6 +4,8 @@
"install": "napa" "install": "napa"
}, },
"napa": { "napa": {
"blob": "eligrey/Blob.js.git",
"filesaver": "eligrey/FileSaver.js.git",
"sticky-kit": "leafo/sticky-kit.git" "sticky-kit": "leafo/sticky-kit.git"
}, },
"dependencies": { "dependencies": {
@ -23,9 +25,9 @@
"moment": "^2.10.3", "moment": "^2.10.3",
"napa": "^1.2.0", "napa": "^1.2.0",
"papaparse": "4.1.1", "papaparse": "4.1.1",
"react": "0.14.0", "react": "^0.14.1",
"react-checkbox-group": "0.2.2", "react-checkbox-group": "0.2.2",
"react-dom": "^0.14.0", "react-dom": "^0.14.1",
"react-infinity": "1.2.2", "react-infinity": "1.2.2",
"react-prefixr": "0.1.0", "react-prefixr": "0.1.0",
"react-router": "^1.0.0-rc3", "react-router": "^1.0.0-rc3",

View File

@ -21,7 +21,9 @@ baseConfig = {
'backbone.supermodel$': 'backbone.supermodel/build/backbone.supermodel.js', 'backbone.supermodel$': 'backbone.supermodel/build/backbone.supermodel.js',
'sticky-kit': 'sticky-kit/jquery.sticky-kit', 'sticky-kit': 'sticky-kit/jquery.sticky-kit',
'interact$': 'interact.js/interact.js', 'interact$': 'interact.js/interact.js',
'spectrum$': 'spectrum-colorpicker/spectrum.js' 'spectrum$': 'spectrum-colorpicker/spectrum.js',
'blob$': 'blob/Blob.js',
'filesaver$': 'filesaver/FileSaver.js'
}, },
}, },
node: { node: {
@ -41,6 +43,10 @@ baseConfig = {
include: require.resolve('underscore'), include: require.resolve('underscore'),
loader: 'expose-loader?_', loader: 'expose-loader?_',
}, },
{
include: /Blob.js$/,
loader: 'exports-loader?window.Blob',
},
{ {
test: /backbone.supermodel/, test: /backbone.supermodel/,
loader: 'exports-loader?Backbone.SuperModel', loader: 'exports-loader?Backbone.SuperModel',
@ -82,6 +88,8 @@ config.push(_.extend({}, baseConfig, {
'select2', 'select2',
'spectrum', 'spectrum',
'sticky-kit', 'sticky-kit',
'blob',
'filesaver',
'newsletter_editor/communicationsFix.js', 'newsletter_editor/communicationsFix.js',
'newsletter_editor/App', 'newsletter_editor/App',
@ -145,6 +153,8 @@ config.push(_.extend({}, baseConfig, {
'backbone.supermodel', 'backbone.supermodel',
'backbone.radio', 'backbone.radio',
'select2', 'select2',
'blob',
'filesaver',
'newsletter_editor/communicationsFix.js', 'newsletter_editor/communicationsFix.js',
'newsletter_editor/App', 'newsletter_editor/App',
@ -209,6 +219,8 @@ config.push(_.extend({}, baseConfig, {
'sticky-kit': 'sticky-kit/jquery.sticky-kit', 'sticky-kit': 'sticky-kit/jquery.sticky-kit',
'backbone.marionette': 'backbone.marionette/lib/backbone.marionette', 'backbone.marionette': 'backbone.marionette/lib/backbone.marionette',
'backbone.supermodel$': 'backbone.supermodel/build/backbone.supermodel.js', 'backbone.supermodel$': 'backbone.supermodel/build/backbone.supermodel.js',
'blob$': 'blob/Blob.js',
'filesaver$': 'filesaver/FileSaver.js'
}, },
}, },
externals: { externals: {