fileuploader-rails 3.0.0 → 3.0.0.1

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.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fileuploader-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-17 00:00:00.000000000 Z
12
+ date: 2012-11-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -69,15 +69,8 @@ files:
69
69
  - lib/fileuploader-rails/version.rb
70
70
  - lib/fileuploader-rails.rb
71
71
  - vendor/assets/images/loading.gif
72
- - vendor/assets/javascripts/fineuploader/button.js
73
- - vendor/assets/javascripts/fineuploader/handler.base.js
74
- - vendor/assets/javascripts/fineuploader/handler.form.js
75
- - vendor/assets/javascripts/fineuploader/handler.xhr.js
76
- - vendor/assets/javascripts/fineuploader/header.js
77
- - vendor/assets/javascripts/fineuploader/jquery-plugin.js
78
- - vendor/assets/javascripts/fineuploader/uploader.basic.js
79
- - vendor/assets/javascripts/fineuploader/uploader.js
80
- - vendor/assets/javascripts/fineuploader/util.js
72
+ - vendor/assets/javascripts/fineuploader.jquery.js
73
+ - vendor/assets/javascripts/fineuploader.js
81
74
  - vendor/assets/stylesheets/fineuploader.css
82
75
  - MIT-LICENSE
83
76
  - Rakefile
@@ -96,7 +89,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
89
  version: '0'
97
90
  segments:
98
91
  - 0
99
- hash: 3723958291510347633
92
+ hash: -2739529321062127524
100
93
  required_rubygems_version: !ruby/object:Gem::Requirement
101
94
  none: false
102
95
  requirements:
@@ -105,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
98
  version: '0'
106
99
  segments:
107
100
  - 0
108
- hash: 3723958291510347633
101
+ hash: -2739529321062127524
109
102
  requirements: []
110
103
  rubyforge_project: fileuploader-rails
111
104
  rubygems_version: 1.8.24
@@ -1,102 +0,0 @@
1
- qq.UploadButton = function(o){
2
- this._options = {
3
- element: null,
4
- // if set to true adds multiple attribute to file input
5
- multiple: false,
6
- acceptFiles: null,
7
- // name attribute of file input
8
- name: 'file',
9
- onChange: function(input){},
10
- hoverClass: 'qq-upload-button-hover',
11
- focusClass: 'qq-upload-button-focus'
12
- };
13
-
14
- qq.extend(this._options, o);
15
- qq.extend(this, qq.DisposeSupport);
16
-
17
- this._element = this._options.element;
18
-
19
- // make button suitable container for input
20
- qq(this._element).css({
21
- position: 'relative',
22
- overflow: 'hidden',
23
- // Make sure browse button is in the right side
24
- // in Internet Explorer
25
- direction: 'ltr'
26
- });
27
-
28
- this._input = this._createInput();
29
- };
30
-
31
- qq.UploadButton.prototype = {
32
- /* returns file input element */
33
- getInput: function(){
34
- return this._input;
35
- },
36
- /* cleans/recreates the file input */
37
- reset: function(){
38
- if (this._input.parentNode){
39
- qq(this._input).remove();
40
- }
41
-
42
- qq(this._element).removeClass(this._options.focusClass);
43
- this._input = this._createInput();
44
- },
45
- _createInput: function(){
46
- var input = document.createElement("input");
47
-
48
- if (this._options.multiple){
49
- input.setAttribute("multiple", "multiple");
50
- }
51
-
52
- if (this._options.acceptFiles) input.setAttribute("accept", this._options.acceptFiles);
53
-
54
- input.setAttribute("type", "file");
55
- input.setAttribute("name", this._options.name);
56
-
57
- qq(input).css({
58
- position: 'absolute',
59
- // in Opera only 'browse' button
60
- // is clickable and it is located at
61
- // the right side of the input
62
- right: 0,
63
- top: 0,
64
- fontFamily: 'Arial',
65
- // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118
66
- fontSize: '118px',
67
- margin: 0,
68
- padding: 0,
69
- cursor: 'pointer',
70
- opacity: 0
71
- });
72
-
73
- this._element.appendChild(input);
74
-
75
- var self = this;
76
- this._attach(input, 'change', function(){
77
- self._options.onChange(input);
78
- });
79
-
80
- this._attach(input, 'mouseover', function(){
81
- qq(self._element).addClass(self._options.hoverClass);
82
- });
83
- this._attach(input, 'mouseout', function(){
84
- qq(self._element).removeClass(self._options.hoverClass);
85
- });
86
- this._attach(input, 'focus', function(){
87
- qq(self._element).addClass(self._options.focusClass);
88
- });
89
- this._attach(input, 'blur', function(){
90
- qq(self._element).removeClass(self._options.focusClass);
91
- });
92
-
93
- // IE and Opera, unfortunately have 2 tab stops on file input
94
- // which is unacceptable in our case, disable keyboard access
95
- if (window.attachEvent){
96
- // it is IE or Opera
97
- input.setAttribute('tabIndex', "-1");
98
- }
99
-
100
- return input;
101
- }
102
- };
@@ -1,120 +0,0 @@
1
- /**
2
- * Class for uploading files, uploading itself is handled by child classes
3
- */
4
- qq.UploadHandlerAbstract = function(o){
5
- // Default options, can be overridden by the user
6
- this._options = {
7
- debug: false,
8
- endpoint: '/upload.php',
9
- // maximum number of concurrent uploads
10
- maxConnections: 999,
11
- log: function(str, level) {},
12
- onProgress: function(id, fileName, loaded, total){},
13
- onComplete: function(id, fileName, response, xhr){},
14
- onCancel: function(id, fileName){},
15
- onUpload: function(id, fileName, xhr){},
16
- onAutoRetry: function(id, fileName, response, xhr){}
17
-
18
- };
19
- qq.extend(this._options, o);
20
-
21
- this._queue = [];
22
- // params for files in queue
23
- this._params = [];
24
-
25
- this.log = this._options.log;
26
- };
27
- qq.UploadHandlerAbstract.prototype = {
28
- /**
29
- * Adds file or file input to the queue
30
- * @returns id
31
- **/
32
- add: function(file){},
33
- /**
34
- * Sends the file identified by id and additional query params to the server
35
- */
36
- upload: function(id, params){
37
- var len = this._queue.push(id);
38
-
39
- var copy = {};
40
- qq.extend(copy, params);
41
- this._params[id] = copy;
42
-
43
- // if too many active uploads, wait...
44
- if (len <= this._options.maxConnections){
45
- this._upload(id, this._params[id]);
46
- }
47
- },
48
- retry: function(id) {
49
- var i = qq.indexOf(this._queue, id);
50
- if (i >= 0) {
51
- this._upload(id, this._params[id]);
52
- }
53
- else {
54
- this.upload(id, this._params[id]);
55
- }
56
- },
57
- /**
58
- * Cancels file upload by id
59
- */
60
- cancel: function(id){
61
- this.log('Cancelling ' + id);
62
- this._cancel(id);
63
- this._dequeue(id);
64
- },
65
- /**
66
- * Cancells all uploads
67
- */
68
- cancelAll: function(){
69
- for (var i=0; i<this._queue.length; i++){
70
- this._cancel(this._queue[i]);
71
- }
72
- this._queue = [];
73
- },
74
- /**
75
- * Returns name of the file identified by id
76
- */
77
- getName: function(id){},
78
- /**
79
- * Returns size of the file identified by id
80
- */
81
- getSize: function(id){},
82
- /**
83
- * Returns id of files being uploaded or
84
- * waiting for their turn
85
- */
86
- getQueue: function(){
87
- return this._queue;
88
- },
89
- reset: function() {
90
- this.log('Resetting upload handler');
91
- this._queue = [];
92
- this._params = [];
93
- },
94
- /**
95
- * Actual upload method
96
- */
97
- _upload: function(id){},
98
- /**
99
- * Actual cancel method
100
- */
101
- _cancel: function(id){},
102
- /**
103
- * Removes element from queue, starts upload of next
104
- */
105
- _dequeue: function(id){
106
- var i = qq.indexOf(this._queue, id);
107
- this._queue.splice(i, 1);
108
-
109
- var max = this._options.maxConnections;
110
-
111
- if (this._queue.length >= max && i < max){
112
- var nextId = this._queue[max-1];
113
- this._upload(nextId, this._params[nextId]);
114
- }
115
- },
116
- /**
117
- * Determine if the file exists.
118
- */
119
- isValid: function(id) {}
120
- };
@@ -1,197 +0,0 @@
1
- /**
2
- * Class for uploading files using form and iframe
3
- * @inherits qq.UploadHandlerAbstract
4
- */
5
- qq.UploadHandlerForm = function(o){
6
- qq.UploadHandlerAbstract.apply(this, arguments);
7
-
8
- this._inputs = {};
9
- this._detach_load_events = {};
10
- };
11
- // @inherits qq.UploadHandlerAbstract
12
- qq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype);
13
-
14
- qq.extend(qq.UploadHandlerForm.prototype, {
15
- add: function(fileInput){
16
- fileInput.setAttribute('name', this._options.inputName);
17
- var id = 'qq-upload-handler-iframe' + qq.getUniqueId();
18
-
19
- this._inputs[id] = fileInput;
20
-
21
- // remove file input from DOM
22
- if (fileInput.parentNode){
23
- qq(fileInput).remove();
24
- }
25
-
26
- return id;
27
- },
28
- getName: function(id){
29
- // get input value and remove path to normalize
30
- return this._inputs[id].value.replace(/.*(\/|\\)/, "");
31
- },
32
- isValid: function(id) {
33
- return this._inputs[id] !== undefined;
34
- },
35
- reset: function() {
36
- qq.UploadHandlerAbstract.prototype.reset.apply(this, arguments);
37
- this._inputs = {};
38
- this._detach_load_events = {};
39
- },
40
- _cancel: function(id){
41
- this._options.onCancel(id, this.getName(id));
42
-
43
- delete this._inputs[id];
44
- delete this._detach_load_events[id];
45
-
46
- var iframe = document.getElementById(id);
47
- if (iframe){
48
- // to cancel request set src to something else
49
- // we use src="javascript:false;" because it doesn't
50
- // trigger ie6 prompt on https
51
- iframe.setAttribute('src', 'javascript:false;');
52
-
53
- qq(iframe).remove();
54
- }
55
- },
56
- _upload: function(id, params){
57
- this._options.onUpload(id, this.getName(id), false);
58
- var input = this._inputs[id];
59
-
60
- if (!input){
61
- throw new Error('file with passed id was not added, or already uploaded or cancelled');
62
- }
63
-
64
- var fileName = this.getName(id);
65
- params[this._options.inputName] = fileName;
66
-
67
- var iframe = this._createIframe(id);
68
- var form = this._createForm(iframe, params);
69
- form.appendChild(input);
70
-
71
- var self = this;
72
- this._attachLoadEvent(iframe, function(){
73
- self.log('iframe loaded');
74
-
75
- var response = self._getIframeContentJSON(iframe);
76
-
77
- // timeout added to fix busy state in FF3.6
78
- setTimeout(function(){
79
- self._detach_load_events[id]();
80
- delete self._detach_load_events[id];
81
- qq(iframe).remove();
82
- }, 1);
83
-
84
- if (!response.success) {
85
- if (self._options.onAutoRetry(id, fileName, response)) {
86
- return;
87
- }
88
- }
89
- self._options.onComplete(id, fileName, response);
90
- self._dequeue(id);
91
- });
92
-
93
- this.log('Sending upload request for ' + id);
94
- form.submit();
95
- qq(form).remove();
96
-
97
- return id;
98
- },
99
- _attachLoadEvent: function(iframe, callback){
100
- var self = this;
101
- this._detach_load_events[iframe.id] = qq(iframe).attach('load', function(){
102
- self.log('Received response for ' + iframe.id);
103
-
104
- // when we remove iframe from dom
105
- // the request stops, but in IE load
106
- // event fires
107
- if (!iframe.parentNode){
108
- return;
109
- }
110
-
111
- try {
112
- // fixing Opera 10.53
113
- if (iframe.contentDocument &&
114
- iframe.contentDocument.body &&
115
- iframe.contentDocument.body.innerHTML == "false"){
116
- // In Opera event is fired second time
117
- // when body.innerHTML changed from false
118
- // to server response approx. after 1 sec
119
- // when we upload file with iframe
120
- return;
121
- }
122
- }
123
- catch (error) {
124
- //IE may throw an "access is denied" error when attempting to access contentDocument on the iframe in some cases
125
- self.log('Error when attempting to access iframe during handling of upload response (' + error + ")", 'error');
126
- }
127
-
128
- callback();
129
- });
130
- },
131
- /**
132
- * Returns json object received by iframe from server.
133
- */
134
- _getIframeContentJSON: function(iframe){
135
- //IE may throw an "access is denied" error when attempting to access contentDocument on the iframe in some cases
136
- try {
137
- // iframe.contentWindow.document - for IE<7
138
- var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document,
139
- response;
140
-
141
- var innerHTML = doc.body.innerHTML;
142
- this.log("converting iframe's innerHTML to JSON");
143
- this.log("innerHTML = " + innerHTML);
144
- //plain text response may be wrapped in <pre> tag
145
- if (innerHTML && innerHTML.match(/^<pre/i)) {
146
- innerHTML = doc.body.firstChild.firstChild.nodeValue;
147
- }
148
- response = eval("(" + innerHTML + ")");
149
- } catch(error){
150
- this.log('Error when attempting to parse form upload response (' + error + ")", 'error');
151
- response = {success: false};
152
- }
153
-
154
- return response;
155
- },
156
- /**
157
- * Creates iframe with unique name
158
- */
159
- _createIframe: function(id){
160
- // We can't use following code as the name attribute
161
- // won't be properly registered in IE6, and new window
162
- // on form submit will open
163
- // var iframe = document.createElement('iframe');
164
- // iframe.setAttribute('name', id);
165
-
166
- var iframe = qq.toElement('<iframe src="javascript:false;" name="' + id + '" />');
167
- // src="javascript:false;" removes ie6 prompt on https
168
-
169
- iframe.setAttribute('id', id);
170
-
171
- iframe.style.display = 'none';
172
- document.body.appendChild(iframe);
173
-
174
- return iframe;
175
- },
176
- /**
177
- * Creates form, that will be submitted to iframe
178
- */
179
- _createForm: function(iframe, params){
180
- // We can't use the following code in IE6
181
- // var form = document.createElement('form');
182
- // form.setAttribute('method', 'post');
183
- // form.setAttribute('enctype', 'multipart/form-data');
184
- // Because in this case file won't be attached to request
185
- var protocol = this._options.demoMode ? "GET" : "POST"
186
- var form = qq.toElement('<form method="' + protocol + '" enctype="multipart/form-data"></form>');
187
-
188
- var queryString = qq.obj2url(params, this._options.endpoint);
189
-
190
- form.setAttribute('action', queryString);
191
- form.setAttribute('target', iframe.name);
192
- form.style.display = 'none';
193
- document.body.appendChild(form);
194
-
195
- return form;
196
- }
197
- });