jquery_file_download-rails 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 00aa6e47ccc29d1bd11a5e3344a1d275ad661905
4
+ data.tar.gz: efc6433dd747ddfe26b540000b68b97d384a192e
5
+ SHA512:
6
+ metadata.gz: cf9fb67015e007e52c450d1c6cf4ef11436d717ab110763e8b1d7b15cf8cddcdfcf2773653579ca5fd582da4a78c1131522457ea7b995fc2a694c5676194a85c
7
+ data.tar.gz: 968b3e422f9275e8b6d25da07f44ea175a2d832ba9dc878515ef6b486c7443672a377917e6541799cd26c13311213d7aa78a156347cc58432930c614f440aad6
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Change log
2
+
3
+ ## 0.0.0: Initial release
4
+
5
+ * Initial experimental release
6
+ * Adds `$.fileDownload` plugin via Rails 3.1+ asset pipeline
7
+
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Richard Cook
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # `jquery_file_download-rails`
2
+
3
+ [![Install gem](https://badge.fury.io/rb/jquery_file_download-rails.png)](https://rubygems.org/gems/jquery_file_download-rails)
4
+ [![Build status](https://travis-ci.org/rcook/jquery_file_download-rails.png)](https://travis-ci.org/rcook/jquery_file_download-rails)
5
+
6
+ [`jquery.fileDownload.js`](https://github.com/johnculviner/jquery.fileDownload)
7
+ package for Rails 3.1+ asset pipeline.
8
+
9
+ # Installation
10
+
11
+ * Add `jquery_file_download-rails` to your application's `Gemfile`:
12
+
13
+ ```ruby
14
+ gem 'jquery_file_download-rails'
15
+ ```
16
+
17
+ * Run Bundler to lock the gem:
18
+
19
+ ```bash
20
+ bundle install
21
+ ```
22
+
23
+ * Add a reference to the gem's assets to your application's JavaScript asset
24
+ manifest (usually `app/assets/javascripts/application.js`):
25
+
26
+ ```javascript
27
+ //= require jquery.fileDownload
28
+ ```
29
+
30
+ * Actions sending files in response to download requests must set the `fileDownload`
31
+ cookie which can be done via the `cookies` collection as in this sample controller:
32
+
33
+ ```ruby
34
+ class DownloadController < ApplicationController
35
+ def some_file
36
+ cookies['fileDownload'] = 'true'
37
+
38
+ send_file 'path-to-file-on-server',
39
+ :filename => 'browser-download-file-name',
40
+ :type => 'content-type',
41
+ :x_sendfile => true
42
+ end
43
+ end
44
+ ```
45
+
46
+ # Usage
47
+
48
+ With the gem installed, the `$.fileDownload` jQuery plugin is available in the browser.
49
+
50
+ # More details
51
+
52
+ * [`jquery.fileDownload.js` at GitHub](https://github.com/johnculviner/jquery.fileDownload)
53
+ * [John Culviner's original blog post](http://johnculviner.com/post/2012/03/22/Ajax-like-feature-rich-file-downloads-with-jQuery-File-Download.aspx)
54
+
55
+ # Licence
56
+
57
+ `jquery_file_download-rails` is released under the MIT licence.
58
+
data/Rakefile ADDED
@@ -0,0 +1,70 @@
1
+ require 'json'
2
+ require 'bundler/gem_tasks'
3
+
4
+ module Util
5
+ extend self
6
+
7
+ JQUERY_FILE_DOWNLOAD_README_PATH = 'jquery.fileDownload/README.md'
8
+ JQUERY_FILE_DOWNLOAD_SCRIPT_PATH = 'jquery.fileDownload/src/Scripts/jquery.fileDownload.js'
9
+ TARGET_VERSION_PATH = 'lib/jquery_file_download/rails/version.rb'
10
+
11
+ def read_jquery_file_download_version(file_name)
12
+ File.readlines(file_name).each do |line|
13
+ return $1 if line =~ /jQuery File Download Plugin v(\d+\.\d+\.\d+)/
14
+ end
15
+ raise 'Could not determine jquery.fileDownload version'
16
+ end
17
+
18
+ # See https://github.com/joliss/jquery-ui-rails/blob/master/Rakefile
19
+ def protect_copyright_notice(content)
20
+ content.gsub!(/\A\s*\/\*\r?\n/, "/*!\n")
21
+ end
22
+ end
23
+
24
+ desc 'Update the jquery.fileDownload submodule'
25
+ task :submodule do
26
+ Rake.rake_output_message 'Updating jquery.fileDownload submodule'
27
+ sh 'git submodule update --init' unless File.exist?(Util::JQUERY_FILE_DOWNLOAD_README_PATH)
28
+ end
29
+
30
+ desc 'Clean the app directory'
31
+ task :clean do
32
+ rm_rf 'app'
33
+ end
34
+
35
+ desc 'Update jquery.fileDownload.js version number'
36
+ task :version => :submodule do
37
+ version = Util.read_jquery_file_download_version(Util::JQUERY_FILE_DOWNLOAD_SCRIPT_PATH)
38
+
39
+ Rake.rake_output_message "jquery.fileDownload version is #{version}"
40
+
41
+ content = File.read(Util::TARGET_VERSION_PATH)
42
+ pattern = /JQUERY_FILE_DOWNLOAD_VERSION = '[^']*'/
43
+ replacement = "JQUERY_FILE_DOWNLOAD_VERSION = '#{version}'"
44
+ content.sub! pattern, replacement or raise "Could not update version in #{Util::TARGET_VERSION_PATH}"
45
+ File.write(Util::TARGET_VERSION_PATH, content)
46
+ end
47
+
48
+ desc 'Generate JavaScript assets'
49
+ task :javascripts => :submodule do
50
+ target_dir = "app/assets/javascripts"
51
+ mkdir_p target_dir
52
+
53
+ Dir.glob('jquery.fileDownload/src/Scripts/*.js').each do |path|
54
+ base_name = File.basename(path)
55
+ file_name = "#{target_dir}/#{base_name}"
56
+ Rake.rake_output_message "Updating #{file_name}"
57
+ File.open(file_name, 'w') do |f|
58
+ content = File.read(path)
59
+ Util.protect_copyright_notice(content)
60
+ f.write(content)
61
+ end
62
+ end
63
+ end
64
+
65
+ task :default => [
66
+ :clean,
67
+ :version,
68
+ :javascripts
69
+ ]
70
+
@@ -0,0 +1,432 @@
1
+ /*!
2
+ * jQuery File Download Plugin v1.4.2
3
+ *
4
+ * http://www.johnculviner.com
5
+ *
6
+ * Copyright (c) 2013 - John Culviner
7
+ *
8
+ * Licensed under the MIT license:
9
+ * http://www.opensource.org/licenses/mit-license.php
10
+ *
11
+ * !!!!NOTE!!!!
12
+ * You must also write a cookie in conjunction with using this plugin as mentioned in the orignal post:
13
+ * http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
14
+ * !!!!NOTE!!!!
15
+ */
16
+
17
+ (function($, window){
18
+ // i'll just put them here to get evaluated on script load
19
+ var htmlSpecialCharsRegEx = /[<>&\r\n"']/gm;
20
+ var htmlSpecialCharsPlaceHolders = {
21
+ '<': 'lt;',
22
+ '>': 'gt;',
23
+ '&': 'amp;',
24
+ '\r': "#13;",
25
+ '\n': "#10;",
26
+ '"': 'quot;',
27
+ "'": 'apos;' /*single quotes just to be safe*/
28
+ };
29
+
30
+ $.extend({
31
+ //
32
+ //$.fileDownload('/path/to/url/', options)
33
+ // see directly below for possible 'options'
34
+ fileDownload: function (fileUrl, options) {
35
+
36
+ //provide some reasonable defaults to any unspecified options below
37
+ var settings = $.extend({
38
+
39
+ //
40
+ //Requires jQuery UI: provide a message to display to the user when the file download is being prepared before the browser's dialog appears
41
+ //
42
+ preparingMessageHtml: null,
43
+
44
+ //
45
+ //Requires jQuery UI: provide a message to display to the user when a file download fails
46
+ //
47
+ failMessageHtml: null,
48
+
49
+ //
50
+ //the stock android browser straight up doesn't support file downloads initiated by a non GET: http://code.google.com/p/android/issues/detail?id=1780
51
+ //specify a message here to display if a user tries with an android browser
52
+ //if jQuery UI is installed this will be a dialog, otherwise it will be an alert
53
+ //
54
+ androidPostUnsupportedMessageHtml: "Unfortunately your Android browser doesn't support this type of file download. Please try again with a different browser.",
55
+
56
+ //
57
+ //Requires jQuery UI: options to pass into jQuery UI Dialog
58
+ //
59
+ dialogOptions: { modal: true },
60
+
61
+ //
62
+ //a function to call while the dowload is being prepared before the browser's dialog appears
63
+ //Args:
64
+ // url - the original url attempted
65
+ //
66
+ prepareCallback: function (url) { },
67
+
68
+ //
69
+ //a function to call after a file download dialog/ribbon has appeared
70
+ //Args:
71
+ // url - the original url attempted
72
+ //
73
+ successCallback: function (url) { },
74
+
75
+ //
76
+ //a function to call after a file download dialog/ribbon has appeared
77
+ //Args:
78
+ // responseHtml - the html that came back in response to the file download. this won't necessarily come back depending on the browser.
79
+ // in less than IE9 a cross domain error occurs because 500+ errors cause a cross domain issue due to IE subbing out the
80
+ // server's error message with a "helpful" IE built in message
81
+ // url - the original url attempted
82
+ //
83
+ failCallback: function (responseHtml, url) { },
84
+
85
+ //
86
+ // the HTTP method to use. Defaults to "GET".
87
+ //
88
+ httpMethod: "GET",
89
+
90
+ //
91
+ // if specified will perform a "httpMethod" request to the specified 'fileUrl' using the specified data.
92
+ // data must be an object (which will be $.param serialized) or already a key=value param string
93
+ //
94
+ data: null,
95
+
96
+ //
97
+ //a period in milliseconds to poll to determine if a successful file download has occured or not
98
+ //
99
+ checkInterval: 100,
100
+
101
+ //
102
+ //the cookie name to indicate if a file download has occured
103
+ //
104
+ cookieName: "fileDownload",
105
+
106
+ //
107
+ //the cookie value for the above name to indicate that a file download has occured
108
+ //
109
+ cookieValue: "true",
110
+
111
+ //
112
+ //the cookie path for above name value pair
113
+ //
114
+ cookiePath: "/",
115
+
116
+ //
117
+ //the title for the popup second window as a download is processing in the case of a mobile browser
118
+ //
119
+ popupWindowTitle: "Initiating file download...",
120
+
121
+ //
122
+ //Functionality to encode HTML entities for a POST, need this if data is an object with properties whose values contains strings with quotation marks.
123
+ //HTML entity encoding is done by replacing all &,<,>,',",\r,\n characters.
124
+ //Note that some browsers will POST the string htmlentity-encoded whilst others will decode it before POSTing.
125
+ //It is recommended that on the server, htmlentity decoding is done irrespective.
126
+ //
127
+ encodeHTMLEntities: true
128
+
129
+ }, options);
130
+
131
+ var deferred = new $.Deferred();
132
+
133
+ //Setup mobile browser detection: Partial credit: http://detectmobilebrowser.com/
134
+ var userAgent = (navigator.userAgent || navigator.vendor || window.opera).toLowerCase();
135
+
136
+ var isIos; //has full support of features in iOS 4.0+, uses a new window to accomplish this.
137
+ var isAndroid; //has full support of GET features in 4.0+ by using a new window. Non-GET is completely unsupported by the browser. See above for specifying a message.
138
+ var isOtherMobileBrowser; //there is no way to reliably guess here so all other mobile devices will GET and POST to the current window.
139
+
140
+ if (/ip(ad|hone|od)/.test(userAgent)) {
141
+
142
+ isIos = true;
143
+
144
+ } else if (userAgent.indexOf('android') !== -1) {
145
+
146
+ isAndroid = true;
147
+
148
+ } else {
149
+
150
+ isOtherMobileBrowser = /avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|playbook|silk|iemobile|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4));
151
+
152
+ }
153
+
154
+ var httpMethodUpper = settings.httpMethod.toUpperCase();
155
+
156
+ if (isAndroid && httpMethodUpper !== "GET") {
157
+ //the stock android browser straight up doesn't support file downloads initiated by non GET requests: http://code.google.com/p/android/issues/detail?id=1780
158
+
159
+ if ($().dialog) {
160
+ $("<div>").html(settings.androidPostUnsupportedMessageHtml).dialog(settings.dialogOptions);
161
+ } else {
162
+ alert(settings.androidPostUnsupportedMessageHtml);
163
+ }
164
+
165
+ return deferred.reject();
166
+ }
167
+
168
+ var $preparingDialog = null;
169
+
170
+ var internalCallbacks = {
171
+
172
+ onPrepare: function (url) {
173
+
174
+ //wire up a jquery dialog to display the preparing message if specified
175
+ if (settings.preparingMessageHtml) {
176
+
177
+ $preparingDialog = $("<div>").html(settings.preparingMessageHtml).dialog(settings.dialogOptions);
178
+
179
+ } else if (settings.prepareCallback) {
180
+
181
+ settings.prepareCallback(url);
182
+
183
+ }
184
+
185
+ },
186
+
187
+ onSuccess: function (url) {
188
+
189
+ //remove the perparing message if it was specified
190
+ if ($preparingDialog) {
191
+ $preparingDialog.dialog('close');
192
+ };
193
+
194
+ settings.successCallback(url);
195
+
196
+ deferred.resolve(url);
197
+ },
198
+
199
+ onFail: function (responseHtml, url) {
200
+
201
+ //remove the perparing message if it was specified
202
+ if ($preparingDialog) {
203
+ $preparingDialog.dialog('close');
204
+ };
205
+
206
+ //wire up a jquery dialog to display the fail message if specified
207
+ if (settings.failMessageHtml) {
208
+ $("<div>").html(settings.failMessageHtml).dialog(settings.dialogOptions);
209
+ }
210
+
211
+ settings.failCallback(responseHtml, url);
212
+
213
+ deferred.reject(responseHtml, url);
214
+ }
215
+ };
216
+
217
+ internalCallbacks.onPrepare(fileUrl);
218
+
219
+ //make settings.data a param string if it exists and isn't already
220
+ if (settings.data !== null && typeof settings.data !== "string") {
221
+ settings.data = $.param(settings.data);
222
+ }
223
+
224
+
225
+ var $iframe,
226
+ downloadWindow,
227
+ formDoc,
228
+ $form;
229
+
230
+ if (httpMethodUpper === "GET") {
231
+
232
+ if (settings.data !== null) {
233
+ //need to merge any fileUrl params with the data object
234
+
235
+ var qsStart = fileUrl.indexOf('?');
236
+
237
+ if (qsStart !== -1) {
238
+ //we have a querystring in the url
239
+
240
+ if (fileUrl.substring(fileUrl.length - 1) !== "&") {
241
+ fileUrl = fileUrl + "&";
242
+ }
243
+ } else {
244
+
245
+ fileUrl = fileUrl + "?";
246
+ }
247
+
248
+ fileUrl = fileUrl + settings.data;
249
+ }
250
+
251
+ if (isIos || isAndroid) {
252
+
253
+ downloadWindow = window.open(fileUrl);
254
+ downloadWindow.document.title = settings.popupWindowTitle;
255
+ window.focus();
256
+
257
+ } else if (isOtherMobileBrowser) {
258
+
259
+ window.location(fileUrl);
260
+
261
+ } else {
262
+
263
+ //create a temporary iframe that is used to request the fileUrl as a GET request
264
+ $iframe = $("<iframe>")
265
+ .hide()
266
+ .prop("src", fileUrl)
267
+ .appendTo("body");
268
+ }
269
+
270
+ } else {
271
+
272
+ var formInnerHtml = "";
273
+
274
+ if (settings.data !== null) {
275
+
276
+ $.each(settings.data.replace(/\+/g, ' ').split("&"), function () {
277
+
278
+ var kvp = this.split("=");
279
+
280
+ var key = settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[0])) : decodeURIComponent(kvp[0]);
281
+ if (key) {
282
+ var value = settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[1])) : decodeURIComponent(kvp[1]);
283
+ formInnerHtml += '<input type="hidden" name="' + key + '" value="' + value + '" />';
284
+ }
285
+ });
286
+ }
287
+
288
+ if (isOtherMobileBrowser) {
289
+
290
+ $form = $("<form>").appendTo("body");
291
+ $form.hide()
292
+ .prop('method', settings.httpMethod)
293
+ .prop('action', fileUrl)
294
+ .html(formInnerHtml);
295
+
296
+ } else {
297
+
298
+ if (isIos) {
299
+
300
+ downloadWindow = window.open("about:blank");
301
+ downloadWindow.document.title = settings.popupWindowTitle;
302
+ formDoc = downloadWindow.document;
303
+ window.focus();
304
+
305
+ } else {
306
+
307
+ $iframe = $("<iframe style='display: none' src='about:blank'></iframe>").appendTo("body");
308
+ formDoc = getiframeDocument($iframe);
309
+ }
310
+
311
+ formDoc.write("<html><head></head><body><form method='" + settings.httpMethod + "' action='" + fileUrl + "'>" + formInnerHtml + "</form>" + settings.popupWindowTitle + "</body></html>");
312
+ $form = $(formDoc).find('form');
313
+ }
314
+
315
+ $form.submit();
316
+ }
317
+
318
+
319
+ //check if the file download has completed every checkInterval ms
320
+ setTimeout(checkFileDownloadComplete, settings.checkInterval);
321
+
322
+
323
+ function checkFileDownloadComplete() {
324
+
325
+ //has the cookie been written due to a file download occuring?
326
+ if (document.cookie.indexOf(settings.cookieName + "=" + settings.cookieValue) != -1) {
327
+
328
+ //execute specified callback
329
+ internalCallbacks.onSuccess(fileUrl);
330
+
331
+ //remove the cookie and iframe
332
+ document.cookie = settings.cookieName + "=; expires=" + new Date(1000).toUTCString() + "; path=" + settings.cookiePath;
333
+
334
+ cleanUp(false);
335
+
336
+ return;
337
+ }
338
+
339
+ //has an error occured?
340
+ //if neither containers exist below then the file download is occuring on the current window
341
+ if (downloadWindow || $iframe) {
342
+
343
+ //has an error occured?
344
+ try {
345
+
346
+ var formDoc = downloadWindow ? downloadWindow.document : getiframeDocument($iframe);
347
+
348
+ if (formDoc && formDoc.body != null && formDoc.body.innerHTML.length) {
349
+
350
+ var isFailure = true;
351
+
352
+ if ($form && $form.length) {
353
+ var $contents = $(formDoc.body).contents().first();
354
+
355
+ if ($contents.length && $contents[0] === $form[0]) {
356
+ isFailure = false;
357
+ }
358
+ }
359
+
360
+ if (isFailure) {
361
+ internalCallbacks.onFail(formDoc.body.innerHTML, fileUrl);
362
+
363
+ cleanUp(true);
364
+
365
+ return;
366
+ }
367
+ }
368
+ }
369
+ catch (err) {
370
+
371
+ //500 error less than IE9
372
+ internalCallbacks.onFail('', fileUrl);
373
+
374
+ cleanUp(true);
375
+
376
+ return;
377
+ }
378
+ }
379
+
380
+
381
+ //keep checking...
382
+ setTimeout(checkFileDownloadComplete, settings.checkInterval);
383
+ }
384
+
385
+ //gets an iframes document in a cross browser compatible manner
386
+ function getiframeDocument($iframe) {
387
+ var iframeDoc = $iframe[0].contentWindow || $iframe[0].contentDocument;
388
+ if (iframeDoc.document) {
389
+ iframeDoc = iframeDoc.document;
390
+ }
391
+ return iframeDoc;
392
+ }
393
+
394
+ function cleanUp(isFailure) {
395
+
396
+ setTimeout(function() {
397
+
398
+ if (downloadWindow) {
399
+
400
+ if (isAndroid) {
401
+ downloadWindow.close();
402
+ }
403
+
404
+ if (isIos) {
405
+ downloadWindow.focus(); //ios safari bug doesn't allow a window to be closed unless it is focused
406
+ if (isFailure) {
407
+ downloadWindow.close();
408
+ }
409
+ }
410
+ }
411
+
412
+ //iframe cleanup appears to randomly cause the download to fail
413
+ //not doing it seems better than failure...
414
+ //if ($iframe) {
415
+ // $iframe.remove();
416
+ //}
417
+
418
+ }, 0);
419
+ }
420
+
421
+
422
+ function htmlSpecialCharsEntityEncode(str) {
423
+ return str.replace(htmlSpecialCharsRegEx, function(match) {
424
+ return '&' + htmlSpecialCharsPlaceHolders[match];
425
+ });
426
+ }
427
+
428
+ return deferred.promise();
429
+ }
430
+ });
431
+
432
+ })(jQuery, this);
@@ -0,0 +1,2 @@
1
+ require 'jquery_file_download/rails'
2
+
@@ -0,0 +1,3 @@
1
+ require 'jquery_file_download/rails/engine'
2
+ require 'jquery_file_download/rails/version'
3
+
@@ -0,0 +1,7 @@
1
+ module JqueryFileDownload
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
7
+
@@ -0,0 +1,7 @@
1
+ module JqueryFileDownload
2
+ module Rails
3
+ VERSION = '0.0.0'
4
+ JQUERY_FILE_DOWNLOAD_VERSION = '1.4.2'
5
+ end
6
+ end
7
+
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jquery_file_download-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Richard Cook
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.0
27
+ description: jquery.fileDownload.js package for Rails 3.1+ asset pipeline
28
+ email: rcook@rcook.org
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - app/assets/javascripts/jquery.fileDownload.js
34
+ - lib/jquery_file_download.rb
35
+ - lib/jquery_file_download/rails.rb
36
+ - lib/jquery_file_download/rails/version.rb
37
+ - lib/jquery_file_download/rails/engine.rb
38
+ - LICENSE
39
+ - Rakefile
40
+ - README.md
41
+ - CHANGELOG.md
42
+ homepage: https://github.com/rcook/jquery-filedownload-rails/
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.0.14
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: jquery_file_download-rails
66
+ test_files: []