card-mod-script 0.11.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.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/lib/javascript/decko/autosave.js.coffee +30 -0
  3. data/lib/javascript/decko/bridge.js.coffee +31 -0
  4. data/lib/javascript/decko/card_menu.js.coffee +26 -0
  5. data/lib/javascript/decko/components.js.coffee +51 -0
  6. data/lib/javascript/decko/decko.js.coffee +100 -0
  7. data/lib/javascript/decko/doubleclick.js.coffee +30 -0
  8. data/lib/javascript/decko/editor.js.coffee +55 -0
  9. data/lib/javascript/decko/filter.js.coffee +176 -0
  10. data/lib/javascript/decko/filter_items.js.coffee +128 -0
  11. data/lib/javascript/decko/filter_links.js.coffee +81 -0
  12. data/lib/javascript/decko/follow.js.coffee +22 -0
  13. data/lib/javascript/decko/layout.js.coffee +76 -0
  14. data/lib/javascript/decko/link_editor.js.coffee +61 -0
  15. data/lib/javascript/decko/mod.js.coffee +85 -0
  16. data/lib/javascript/decko/modal.js.coffee +110 -0
  17. data/lib/javascript/decko/name_editor.js.coffee +51 -0
  18. data/lib/javascript/decko/navbox.js.coffee +74 -0
  19. data/lib/javascript/decko/nest_editor.js.coffee +166 -0
  20. data/lib/javascript/decko/nest_editor_name.js.coffee +102 -0
  21. data/lib/javascript/decko/nest_editor_options.js.coffee +93 -0
  22. data/lib/javascript/decko/nest_editor_rules.js.coffee +3 -0
  23. data/lib/javascript/decko/overlay.js.coffee +57 -0
  24. data/lib/javascript/decko/recaptcha.js.coffee +19 -0
  25. data/lib/javascript/decko/selectable_filtered_content.js.coffee +12 -0
  26. data/lib/javascript/decko/slot.js.coffee +172 -0
  27. data/lib/javascript/decko/slot_ready.js.coffee +11 -0
  28. data/lib/javascript/decko/slotter.js.coffee +269 -0
  29. data/lib/javascript/decko/upload.js.coffee +57 -0
  30. data/lib/javascript/jquery-ui.js +10 -0
  31. data/lib/javascript/jquery.autosize.js +274 -0
  32. data/lib/javascript/jquery.iframe-transport.js +185 -0
  33. data/lib/javascript/script_html5shiv_printshiv.js +1 -0
  34. data/lib/javascript/script_pointer_config.js.coffee +80 -0
  35. data/lib/javascript/script_pointer_list_editor.js.coffee +67 -0
  36. data/lib/javascript/theme-textmate.js +130 -0
  37. data/set/abstract/script.rb +85 -0
  38. data/set/right/script.rb +19 -0
  39. data/set/self/01_script_libraries.rb +1 -0
  40. data/set/self/script.rb +1 -0
  41. data/set/self/script_decko.rb +12 -0
  42. data/set/self/script_editors.rb +1 -0
  43. data/set/self/script_html5shiv_printshiv.rb +11 -0
  44. data/set/self/script_jquery.rb +10 -0
  45. data/set/self/script_jquery_helper.rb +14 -0
  46. data/set/self/script_mods.rb +1 -0
  47. data/set/self/script_pointer_config.rb +9 -0
  48. data/set/type/coffee_script.rb +25 -0
  49. data/set/type/java_script.rb +9 -0
  50. data/vendor/jquery_file_upload/CONTRIBUTING.md +15 -0
  51. data/vendor/jquery_file_upload/LICENSE.txt +21 -0
  52. data/vendor/jquery_file_upload/README.md +107 -0
  53. data/vendor/jquery_file_upload/angularjs.html +211 -0
  54. data/vendor/jquery_file_upload/basic-plus.html +226 -0
  55. data/vendor/jquery_file_upload/basic.html +136 -0
  56. data/vendor/jquery_file_upload/bower-version-update.js +16 -0
  57. data/vendor/jquery_file_upload/bower.json +64 -0
  58. data/vendor/jquery_file_upload/cors/postmessage.html +75 -0
  59. data/vendor/jquery_file_upload/cors/result.html +24 -0
  60. data/vendor/jquery_file_upload/css/jquery-ui-demo-ie8.css +21 -0
  61. data/vendor/jquery_file_upload/css/jquery-ui-demo.css +67 -0
  62. data/vendor/jquery_file_upload/css/jquery.fileupload-noscript.css +22 -0
  63. data/vendor/jquery_file_upload/css/jquery.fileupload-ui-noscript.css +17 -0
  64. data/vendor/jquery_file_upload/css/jquery.fileupload-ui.css +57 -0
  65. data/vendor/jquery_file_upload/css/jquery.fileupload.css +37 -0
  66. data/vendor/jquery_file_upload/css/style.css +15 -0
  67. data/vendor/jquery_file_upload/img/loading.gif +0 -0
  68. data/vendor/jquery_file_upload/img/progressbar.gif +0 -0
  69. data/vendor/jquery_file_upload/index.html +255 -0
  70. data/vendor/jquery_file_upload/jquery-ui.html +252 -0
  71. data/vendor/jquery_file_upload/js/app.js +101 -0
  72. data/vendor/jquery_file_upload/js/cors/jquery.postmessage-transport.js +126 -0
  73. data/vendor/jquery_file_upload/js/cors/jquery.xdr-transport.js +89 -0
  74. data/vendor/jquery_file_upload/js/jquery.fileupload-angular.js +437 -0
  75. data/vendor/jquery_file_upload/js/jquery.fileupload-audio.js +113 -0
  76. data/vendor/jquery_file_upload/js/jquery.fileupload-image.js +326 -0
  77. data/vendor/jquery_file_upload/js/jquery.fileupload-jquery-ui.js +161 -0
  78. data/vendor/jquery_file_upload/js/jquery.fileupload-process.js +178 -0
  79. data/vendor/jquery_file_upload/js/jquery.fileupload-ui.js +714 -0
  80. data/vendor/jquery_file_upload/js/jquery.fileupload-validate.js +125 -0
  81. data/vendor/jquery_file_upload/js/jquery.fileupload-video.js +113 -0
  82. data/vendor/jquery_file_upload/js/jquery.fileupload.js +1486 -0
  83. data/vendor/jquery_file_upload/js/jquery.iframe-transport.js +224 -0
  84. data/vendor/jquery_file_upload/js/main.js +75 -0
  85. data/vendor/jquery_file_upload/js/vendor/jquery.ui.widget.js +748 -0
  86. data/vendor/jquery_file_upload/package.json +55 -0
  87. data/vendor/jquery_file_upload/server/gae-go/app.yaml +12 -0
  88. data/vendor/jquery_file_upload/server/gae-go/app/main.go +361 -0
  89. data/vendor/jquery_file_upload/server/gae-go/static/favicon.ico +0 -0
  90. data/vendor/jquery_file_upload/server/gae-go/static/robots.txt +2 -0
  91. data/vendor/jquery_file_upload/server/gae-python/app.yaml +17 -0
  92. data/vendor/jquery_file_upload/server/gae-python/main.py +204 -0
  93. data/vendor/jquery_file_upload/server/gae-python/static/favicon.ico +0 -0
  94. data/vendor/jquery_file_upload/server/gae-python/static/robots.txt +2 -0
  95. data/vendor/jquery_file_upload/server/php/Dockerfile +38 -0
  96. data/vendor/jquery_file_upload/server/php/UploadHandler.php +1411 -0
  97. data/vendor/jquery_file_upload/server/php/docker-compose.yml +9 -0
  98. data/vendor/jquery_file_upload/server/php/index.php +15 -0
  99. data/vendor/jquery_file_upload/test/index.html +172 -0
  100. data/vendor/jquery_file_upload/test/test.js +1292 -0
  101. data/vendor/jquery_rails/CHANGELOG.md +359 -0
  102. data/vendor/jquery_rails/CONTRIBUTING.md +132 -0
  103. data/vendor/jquery_rails/Gemfile +22 -0
  104. data/vendor/jquery_rails/MIT-LICENSE +21 -0
  105. data/vendor/jquery_rails/README.md +75 -0
  106. data/vendor/jquery_rails/Rakefile +59 -0
  107. data/vendor/jquery_rails/VERSIONS.md +62 -0
  108. data/vendor/jquery_rails/jquery-rails.gemspec +26 -0
  109. data/vendor/jquery_rails/lib/jquery-rails.rb +1 -0
  110. data/vendor/jquery_rails/lib/jquery/assert_select.rb +149 -0
  111. data/vendor/jquery_rails/lib/jquery/rails.rb +8 -0
  112. data/vendor/jquery_rails/lib/jquery/rails/engine.rb +6 -0
  113. data/vendor/jquery_rails/lib/jquery/rails/version.rb +9 -0
  114. data/vendor/jquery_rails/test/assert_select_jquery_test.rb +85 -0
  115. data/vendor/jquery_rails/test/test_helper.rb +6 -0
  116. data/vendor/jquery_rails/vendor/assets/javascripts/jquery.js +11008 -0
  117. data/vendor/jquery_rails/vendor/assets/javascripts/jquery.min.js +5 -0
  118. data/vendor/jquery_rails/vendor/assets/javascripts/jquery.min.map +1 -0
  119. data/vendor/jquery_rails/vendor/assets/javascripts/jquery2.js +9814 -0
  120. data/vendor/jquery_rails/vendor/assets/javascripts/jquery2.min.js +4 -0
  121. data/vendor/jquery_rails/vendor/assets/javascripts/jquery2.min.map +1 -0
  122. data/vendor/jquery_rails/vendor/assets/javascripts/jquery3.js +10364 -0
  123. data/vendor/jquery_rails/vendor/assets/javascripts/jquery3.min.js +2 -0
  124. data/vendor/jquery_rails/vendor/assets/javascripts/jquery3.min.map +1 -0
  125. data/vendor/jquery_rails/vendor/assets/javascripts/jquery_ujs.js +555 -0
  126. metadata +212 -0
@@ -0,0 +1,9 @@
1
+ version: '2.3'
2
+ services:
3
+ apache:
4
+ build: ./
5
+ network_mode: bridge
6
+ ports:
7
+ - "80:80"
8
+ volumes:
9
+ - "../../:/var/www/html"
@@ -0,0 +1,15 @@
1
+ <?php
2
+ /*
3
+ * jQuery File Upload Plugin PHP Example
4
+ * https://github.com/blueimp/jQuery-File-Upload
5
+ *
6
+ * Copyright 2010, Sebastian Tschan
7
+ * https://blueimp.net
8
+ *
9
+ * Licensed under the MIT license:
10
+ * https://opensource.org/licenses/MIT
11
+ */
12
+
13
+ error_reporting(E_ALL | E_STRICT);
14
+ require('UploadHandler.php');
15
+ $upload_handler = new UploadHandler();
@@ -0,0 +1,172 @@
1
+ <!DOCTYPE HTML>
2
+ <!--
3
+ /*
4
+ * jQuery File Upload Plugin Test
5
+ * https://github.com/blueimp/jQuery-File-Upload
6
+ *
7
+ * Copyright 2010, Sebastian Tschan
8
+ * https://blueimp.net
9
+ *
10
+ * Licensed under the MIT license:
11
+ * https://opensource.org/licenses/MIT
12
+ */
13
+ -->
14
+ <html lang="en">
15
+ <head>
16
+ <!-- Force latest IE rendering engine or ChromeFrame if installed -->
17
+ <!--[if IE]>
18
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
19
+ <![endif]-->
20
+ <meta charset="utf-8">
21
+ <title>jQuery File Upload Plugin Test</title>
22
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
23
+ <link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-1.23.1.css">
24
+ </head>
25
+ <body>
26
+ <h1 id="qunit-header">jQuery File Upload Plugin Test</h1>
27
+ <h2 id="qunit-banner"></h2>
28
+ <div id="qunit-testrunner-toolbar"></div>
29
+ <h2 id="qunit-userAgent"></h2>
30
+ <ol id="qunit-tests"></ol>
31
+ <div id="qunit-fixture">
32
+ <!-- The file upload form used as target for the file upload widget -->
33
+ <form id="fileupload" action="../server/php/" method="POST" enctype="multipart/form-data">
34
+ <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
35
+ <div class="row fileupload-buttonbar">
36
+ <div class="col-lg-7">
37
+ <!-- The fileinput-button span is used to style the file input field as button -->
38
+ <span class="btn btn-success fileinput-button">
39
+ <i class="icon-plus icon-white"></i>
40
+ <span>Add files...</span>
41
+ <input type="file" name="files[]" multiple>
42
+ </span>
43
+ <button type="submit" class="btn btn-primary start">
44
+ <i class="icon-upload icon-white"></i>
45
+ <span>Start upload</span>
46
+ </button>
47
+ <button type="reset" class="btn btn-warning cancel">
48
+ <i class="icon-ban-circle icon-white"></i>
49
+ <span>Cancel upload</span>
50
+ </button>
51
+ <button type="button" class="btn btn-danger delete">
52
+ <i class="icon-trash icon-white"></i>
53
+ <span>Delete</span>
54
+ </button>
55
+ <input type="checkbox" class="toggle">
56
+ <!-- The global file processing state -->
57
+ <span class="fileupload-process"></span>
58
+ </div>
59
+ <!-- The global progress state -->
60
+ <div class="col-lg-5 fileupload-progress">
61
+ <!-- The global progress bar -->
62
+ <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
63
+ <div class="progress-bar progress-bar-success" style="width:0%;"></div>
64
+ </div>
65
+ <!-- The extended global progress state -->
66
+ <div class="progress-extended">&nbsp;</div>
67
+ </div>
68
+ </div>
69
+ <!-- The table listing the files available for upload/download -->
70
+ <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
71
+ </form>
72
+ </div>
73
+ <!-- The template to display files available for upload -->
74
+ <script id="template-upload" type="text/x-tmpl">
75
+ {% for (var i=0, file; file=o.files[i]; i++) { %}
76
+ <tr class="template-upload">
77
+ <td>
78
+ <span class="preview"></span>
79
+ </td>
80
+ <td>
81
+ <p class="name">{%=file.name%}</p>
82
+ <strong class="error text-danger"></strong>
83
+ </td>
84
+ <td>
85
+ <p class="size">Processing...</p>
86
+ <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="progress-bar progress-bar-success" style="width:0%;"></div></div>
87
+ </td>
88
+ <td>
89
+ {% if (!i && !o.options.autoUpload) { %}
90
+ <button class="btn btn-primary start" disabled>
91
+ <i class="glyphicon glyphicon-upload"></i>
92
+ <span>Start</span>
93
+ </button>
94
+ {% } %}
95
+ {% if (!i) { %}
96
+ <button class="btn btn-warning cancel">
97
+ <i class="glyphicon glyphicon-ban-circle"></i>
98
+ <span>Cancel</span>
99
+ </button>
100
+ {% } %}
101
+ </td>
102
+ </tr>
103
+ {% } %}
104
+ </script>
105
+ <!-- The template to display files available for download -->
106
+ <script id="template-download" type="text/x-tmpl">
107
+ {% for (var i=0, file; file=o.files[i]; i++) { %}
108
+ <tr class="template-download">
109
+ <td>
110
+ <span class="preview">
111
+ {% if (file.thumbnailUrl) { %}
112
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
113
+ {% } %}
114
+ </span>
115
+ </td>
116
+ <td>
117
+ <p class="name">
118
+ {% if (file.url) { %}
119
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
120
+ {% } else { %}
121
+ <span>{%=file.name%}</span>
122
+ {% } %}
123
+ </p>
124
+ {% if (file.error) { %}
125
+ <div><span class="label label-danger">Error</span> {%=file.error%}</div>
126
+ {% } %}
127
+ </td>
128
+ <td>
129
+ <span class="size">{%=o.formatFileSize(file.size)%}</span>
130
+ </td>
131
+ <td>
132
+ {% if (file.deleteUrl) { %}
133
+ <button class="btn btn-danger delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>
134
+ <i class="glyphicon glyphicon-trash"></i>
135
+ <span>Delete</span>
136
+ </button>
137
+ <input type="checkbox" name="delete" value="1" class="toggle">
138
+ {% } else { %}
139
+ <button class="btn btn-warning cancel">
140
+ <i class="glyphicon glyphicon-ban-circle"></i>
141
+ <span>Cancel</span>
142
+ </button>
143
+ {% } %}
144
+ </td>
145
+ </tr>
146
+ {% } %}
147
+ </script>
148
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
149
+ <script src="../js/vendor/jquery.ui.widget.js"></script>
150
+ <script src="https://blueimp.github.io/JavaScript-Templates/js/tmpl.min.js"></script>
151
+ <script src="https://blueimp.github.io/JavaScript-Load-Image/js/load-image.all.min.js"></script>
152
+ <script src="https://blueimp.github.io/JavaScript-Canvas-to-Blob/js/canvas-to-blob.min.js"></script>
153
+ <script src="../js/jquery.iframe-transport.js"></script>
154
+ <script src="../js/jquery.fileupload.js"></script>
155
+ <script>
156
+ /* global window, $ */
157
+ window.testBasicWidget = $.blueimp.fileupload;
158
+ </script>
159
+ <script src="../js/jquery.fileupload-process.js"></script>
160
+ <script src="../js/jquery.fileupload-image.js"></script>
161
+ <script src="../js/jquery.fileupload-audio.js"></script>
162
+ <script src="../js/jquery.fileupload-video.js"></script>
163
+ <script src="../js/jquery.fileupload-validate.js"></script>
164
+ <script src="../js/jquery.fileupload-ui.js"></script>
165
+ <script>
166
+ /* global window, $ */
167
+ window.testUIWidget = $.blueimp.fileupload;
168
+ </script>
169
+ <script src="https://code.jquery.com/qunit/qunit-1.23.1.js"></script>
170
+ <script src="test.js"></script>
171
+ </body>
172
+ </html>
@@ -0,0 +1,1292 @@
1
+ /*
2
+ * jQuery File Upload Plugin Test
3
+ * https://github.com/blueimp/jQuery-File-Upload
4
+ *
5
+ * Copyright 2010, Sebastian Tschan
6
+ * https://blueimp.net
7
+ *
8
+ * Licensed under the MIT license:
9
+ * https://opensource.org/licenses/MIT
10
+ */
11
+
12
+ /* global $, QUnit, window, document, expect, module, test, asyncTest, start, ok, strictEqual, notStrictEqual */
13
+
14
+ $(function () {
15
+ // jshint nomen:false
16
+ 'use strict';
17
+
18
+ QUnit.done = function () {
19
+ // Delete all uploaded files:
20
+ var url = $('#fileupload').prop('action');
21
+ $.getJSON(url, function (result) {
22
+ $.each(result.files, function (index, file) {
23
+ $.ajax({
24
+ url: url + '?file=' + encodeURIComponent(file.name),
25
+ type: 'DELETE'
26
+ });
27
+ });
28
+ });
29
+ };
30
+
31
+ var lifecycle = {
32
+ setup: function () {
33
+ // Set the .fileupload method to the basic widget method:
34
+ $.widget('blueimp.fileupload', window.testBasicWidget, {});
35
+ },
36
+ teardown: function () {
37
+ // Remove all remaining event listeners:
38
+ $(document).unbind();
39
+ }
40
+ },
41
+ lifecycleUI = {
42
+ setup: function () {
43
+ // Set the .fileupload method to the UI widget method:
44
+ $.widget('blueimp.fileupload', window.testUIWidget, {});
45
+ },
46
+ teardown: function () {
47
+ // Remove all remaining event listeners:
48
+ $(document).unbind();
49
+ }
50
+ };
51
+
52
+ module('Initialization', lifecycle);
53
+
54
+ test('Widget initialization', function () {
55
+ var fu = $('#fileupload').fileupload();
56
+ ok(fu.data('blueimp-fileupload') || fu.data('fileupload'));
57
+ });
58
+
59
+ test('Data attribute options', function () {
60
+ $('#fileupload').attr('data-url', 'http://example.org');
61
+ $('#fileupload').fileupload();
62
+ strictEqual(
63
+ $('#fileupload').fileupload('option', 'url'),
64
+ 'http://example.org'
65
+ );
66
+ });
67
+
68
+ test('File input initialization', function () {
69
+ var fu = $('#fileupload').fileupload();
70
+ ok(
71
+ fu.fileupload('option', 'fileInput').length,
72
+ 'File input field inside of the widget'
73
+ );
74
+ ok(
75
+ fu.fileupload('option', 'fileInput').length,
76
+ 'Widget element as file input field'
77
+ );
78
+ });
79
+
80
+ test('Drop zone initialization', function () {
81
+ ok($('#fileupload').fileupload()
82
+ .fileupload('option', 'dropZone').length);
83
+ });
84
+
85
+ test('Paste zone initialization', function () {
86
+ ok($('#fileupload').fileupload({pasteZone: document})
87
+ .fileupload('option', 'pasteZone').length);
88
+ });
89
+
90
+ test('Event listeners initialization', function () {
91
+ expect(
92
+ $.support.xhrFormDataFileUpload ? 4 : 1
93
+ );
94
+ var eo = {
95
+ originalEvent: {
96
+ dataTransfer: {files: [{}], types: ['Files']},
97
+ clipboardData: {items: [{}]}
98
+ }
99
+ },
100
+ fu = $('#fileupload').fileupload({
101
+ pasteZone: document,
102
+ dragover: function () {
103
+ ok(true, 'Triggers dragover callback');
104
+ return false;
105
+ },
106
+ drop: function () {
107
+ ok(true, 'Triggers drop callback');
108
+ return false;
109
+ },
110
+ paste: function () {
111
+ ok(true, 'Triggers paste callback');
112
+ return false;
113
+ },
114
+ change: function () {
115
+ ok(true, 'Triggers change callback');
116
+ return false;
117
+ }
118
+ }),
119
+ fileInput = fu.fileupload('option', 'fileInput'),
120
+ dropZone = fu.fileupload('option', 'dropZone'),
121
+ pasteZone = fu.fileupload('option', 'pasteZone');
122
+ fileInput.trigger($.Event('change', eo));
123
+ dropZone.trigger($.Event('dragover', eo));
124
+ dropZone.trigger($.Event('drop', eo));
125
+ pasteZone.trigger($.Event('paste', eo));
126
+ });
127
+
128
+ module('API', lifecycle);
129
+
130
+ test('destroy', function () {
131
+ expect(4);
132
+ var eo = {
133
+ originalEvent: {
134
+ dataTransfer: {files: [{}], types: ['Files']},
135
+ clipboardData: {items: [{}]}
136
+ }
137
+ },
138
+ options = {
139
+ pasteZone: document,
140
+ dragover: function () {
141
+ ok(true, 'Triggers dragover callback');
142
+ return false;
143
+ },
144
+ drop: function () {
145
+ ok(true, 'Triggers drop callback');
146
+ return false;
147
+ },
148
+ paste: function () {
149
+ ok(true, 'Triggers paste callback');
150
+ return false;
151
+ },
152
+ change: function () {
153
+ ok(true, 'Triggers change callback');
154
+ return false;
155
+ }
156
+ },
157
+ fu = $('#fileupload').fileupload(options),
158
+ fileInput = fu.fileupload('option', 'fileInput'),
159
+ dropZone = fu.fileupload('option', 'dropZone'),
160
+ pasteZone = fu.fileupload('option', 'pasteZone');
161
+ dropZone.bind('dragover', options.dragover);
162
+ dropZone.bind('drop', options.drop);
163
+ pasteZone.bind('paste', options.paste);
164
+ fileInput.bind('change', options.change);
165
+ fu.fileupload('destroy');
166
+ fileInput.trigger($.Event('change', eo));
167
+ dropZone.trigger($.Event('dragover', eo));
168
+ dropZone.trigger($.Event('drop', eo));
169
+ pasteZone.trigger($.Event('paste', eo));
170
+ });
171
+
172
+ test('disable/enable', function () {
173
+ expect(
174
+ $.support.xhrFormDataFileUpload ? 4 : 1
175
+ );
176
+ var eo = {
177
+ originalEvent: {
178
+ dataTransfer: {files: [{}], types: ['Files']},
179
+ clipboardData: {items: [{}]}
180
+ }
181
+ },
182
+ fu = $('#fileupload').fileupload({
183
+ pasteZone: document,
184
+ dragover: function () {
185
+ ok(true, 'Triggers dragover callback');
186
+ return false;
187
+ },
188
+ drop: function () {
189
+ ok(true, 'Triggers drop callback');
190
+ return false;
191
+ },
192
+ paste: function () {
193
+ ok(true, 'Triggers paste callback');
194
+ return false;
195
+ },
196
+ change: function () {
197
+ ok(true, 'Triggers change callback');
198
+ return false;
199
+ }
200
+ }),
201
+ fileInput = fu.fileupload('option', 'fileInput'),
202
+ dropZone = fu.fileupload('option', 'dropZone'),
203
+ pasteZone = fu.fileupload('option', 'pasteZone');
204
+ fu.fileupload('disable');
205
+ fileInput.trigger($.Event('change', eo));
206
+ dropZone.trigger($.Event('dragover', eo));
207
+ dropZone.trigger($.Event('drop', eo));
208
+ pasteZone.trigger($.Event('paste', eo));
209
+ fu.fileupload('enable');
210
+ fileInput.trigger($.Event('change', eo));
211
+ dropZone.trigger($.Event('dragover', eo));
212
+ dropZone.trigger($.Event('drop', eo));
213
+ pasteZone.trigger($.Event('paste', eo));
214
+ });
215
+
216
+ test('option', function () {
217
+ expect(
218
+ $.support.xhrFormDataFileUpload ? 10 : 7
219
+ );
220
+ var eo = {
221
+ originalEvent: {
222
+ dataTransfer: {files: [{}], types: ['Files']},
223
+ clipboardData: {items: [{}]}
224
+ }
225
+ },
226
+ fu = $('#fileupload').fileupload({
227
+ pasteZone: document,
228
+ dragover: function () {
229
+ ok(true, 'Triggers dragover callback');
230
+ return false;
231
+ },
232
+ drop: function () {
233
+ ok(true, 'Triggers drop callback');
234
+ return false;
235
+ },
236
+ paste: function () {
237
+ ok(true, 'Triggers paste callback');
238
+ return false;
239
+ },
240
+ change: function () {
241
+ ok(true, 'Triggers change callback');
242
+ return false;
243
+ }
244
+ }),
245
+ fileInput = fu.fileupload('option', 'fileInput'),
246
+ dropZone = fu.fileupload('option', 'dropZone'),
247
+ pasteZone = fu.fileupload('option', 'pasteZone');
248
+ fu.fileupload('option', 'fileInput', null);
249
+ fu.fileupload('option', 'dropZone', null);
250
+ fu.fileupload('option', 'pasteZone', null);
251
+ fileInput.trigger($.Event('change', eo));
252
+ dropZone.trigger($.Event('dragover', eo));
253
+ dropZone.trigger($.Event('drop', eo));
254
+ pasteZone.trigger($.Event('paste', eo));
255
+ fu.fileupload('option', 'dropZone', 'body');
256
+ strictEqual(
257
+ fu.fileupload('option', 'dropZone')[0],
258
+ document.body,
259
+ 'Allow a query string as parameter for the dropZone option'
260
+ );
261
+ fu.fileupload('option', 'dropZone', document);
262
+ strictEqual(
263
+ fu.fileupload('option', 'dropZone')[0],
264
+ document,
265
+ 'Allow a document element as parameter for the dropZone option'
266
+ );
267
+ fu.fileupload('option', 'pasteZone', 'body');
268
+ strictEqual(
269
+ fu.fileupload('option', 'pasteZone')[0],
270
+ document.body,
271
+ 'Allow a query string as parameter for the pasteZone option'
272
+ );
273
+ fu.fileupload('option', 'pasteZone', document);
274
+ strictEqual(
275
+ fu.fileupload('option', 'pasteZone')[0],
276
+ document,
277
+ 'Allow a document element as parameter for the pasteZone option'
278
+ );
279
+ fu.fileupload('option', 'fileInput', ':file');
280
+ strictEqual(
281
+ fu.fileupload('option', 'fileInput')[0],
282
+ $(':file')[0],
283
+ 'Allow a query string as parameter for the fileInput option'
284
+ );
285
+ fu.fileupload('option', 'fileInput', $(':file')[0]);
286
+ strictEqual(
287
+ fu.fileupload('option', 'fileInput')[0],
288
+ $(':file')[0],
289
+ 'Allow a document element as parameter for the fileInput option'
290
+ );
291
+ fu.fileupload('option', 'fileInput', fileInput);
292
+ fu.fileupload('option', 'dropZone', dropZone);
293
+ fu.fileupload('option', 'pasteZone', pasteZone);
294
+ fileInput.trigger($.Event('change', eo));
295
+ dropZone.trigger($.Event('dragover', eo));
296
+ dropZone.trigger($.Event('drop', eo));
297
+ pasteZone.trigger($.Event('paste', eo));
298
+ });
299
+
300
+ asyncTest('add', function () {
301
+ expect(2);
302
+ var param = {files: [{name: 'test'}]};
303
+ $('#fileupload').fileupload({
304
+ add: function (e, data) {
305
+ strictEqual(
306
+ data.files[0].name,
307
+ param.files[0].name,
308
+ 'Triggers add callback'
309
+ );
310
+ }
311
+ }).fileupload('add', param).fileupload(
312
+ 'option',
313
+ 'add',
314
+ function (e, data) {
315
+ data.submit().complete(function () {
316
+ ok(true, 'data.submit() Returns a jqXHR object');
317
+ start();
318
+ });
319
+ }
320
+ ).fileupload('add', param);
321
+ });
322
+
323
+ asyncTest('send', function () {
324
+ expect(3);
325
+ var param = {files: [{name: 'test'}]};
326
+ $('#fileupload').fileupload({
327
+ send: function (e, data) {
328
+ strictEqual(
329
+ data.files[0].name,
330
+ 'test',
331
+ 'Triggers send callback'
332
+ );
333
+ }
334
+ }).fileupload('send', param).fail(function () {
335
+ ok(true, 'Allows to abort the request');
336
+ }).complete(function () {
337
+ ok(true, 'Returns a jqXHR object');
338
+ start();
339
+ }).abort();
340
+ });
341
+
342
+ module('Callbacks', lifecycle);
343
+
344
+ asyncTest('add', function () {
345
+ expect(1);
346
+ var param = {files: [{name: 'test'}]};
347
+ $('#fileupload').fileupload({
348
+ add: function () {
349
+ ok(true, 'Triggers add callback');
350
+ start();
351
+ }
352
+ }).fileupload('add', param);
353
+ });
354
+
355
+ asyncTest('submit', function () {
356
+ expect(1);
357
+ var param = {files: [{name: 'test'}]};
358
+ $('#fileupload').fileupload({
359
+ submit: function () {
360
+ ok(true, 'Triggers submit callback');
361
+ start();
362
+ return false;
363
+ }
364
+ }).fileupload('add', param);
365
+ });
366
+
367
+ asyncTest('send', function () {
368
+ expect(1);
369
+ var param = {files: [{name: 'test'}]};
370
+ $('#fileupload').fileupload({
371
+ send: function () {
372
+ ok(true, 'Triggers send callback');
373
+ start();
374
+ return false;
375
+ }
376
+ }).fileupload('send', param);
377
+ });
378
+
379
+ asyncTest('done', function () {
380
+ expect(1);
381
+ var param = {files: [{name: 'test'}]};
382
+ $('#fileupload').fileupload({
383
+ done: function () {
384
+ ok(true, 'Triggers done callback');
385
+ start();
386
+ }
387
+ }).fileupload('send', param);
388
+ });
389
+
390
+ asyncTest('fail', function () {
391
+ expect(1);
392
+ var param = {files: [{name: 'test'}]},
393
+ fu = $('#fileupload').fileupload({
394
+ url: '404',
395
+ fail: function () {
396
+ ok(true, 'Triggers fail callback');
397
+ start();
398
+ }
399
+ });
400
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
401
+ ._isXHRUpload = function () {
402
+ return true;
403
+ };
404
+ fu.fileupload('send', param);
405
+ });
406
+
407
+ asyncTest('always', function () {
408
+ expect(2);
409
+ var param = {files: [{name: 'test'}]},
410
+ counter = 0,
411
+ fu = $('#fileupload').fileupload({
412
+ always: function () {
413
+ ok(true, 'Triggers always callback');
414
+ if (counter === 1) {
415
+ start();
416
+ } else {
417
+ counter += 1;
418
+ }
419
+ }
420
+ });
421
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
422
+ ._isXHRUpload = function () {
423
+ return true;
424
+ };
425
+ fu.fileupload('add', param).fileupload(
426
+ 'option',
427
+ 'url',
428
+ '404'
429
+ ).fileupload('add', param);
430
+ });
431
+
432
+ asyncTest('progress', function () {
433
+ expect(1);
434
+ var param = {files: [{name: 'test'}]},
435
+ counter = 0;
436
+ $('#fileupload').fileupload({
437
+ forceIframeTransport: true,
438
+ progress: function () {
439
+ ok(true, 'Triggers progress callback');
440
+ if (counter === 0) {
441
+ start();
442
+ } else {
443
+ counter += 1;
444
+ }
445
+ }
446
+ }).fileupload('send', param);
447
+ });
448
+
449
+ asyncTest('progressall', function () {
450
+ expect(1);
451
+ var param = {files: [{name: 'test'}]},
452
+ counter = 0;
453
+ $('#fileupload').fileupload({
454
+ forceIframeTransport: true,
455
+ progressall: function () {
456
+ ok(true, 'Triggers progressall callback');
457
+ if (counter === 0) {
458
+ start();
459
+ } else {
460
+ counter += 1;
461
+ }
462
+ }
463
+ }).fileupload('send', param);
464
+ });
465
+
466
+ asyncTest('start', function () {
467
+ expect(1);
468
+ var param = {files: [{name: '1'}, {name: '2'}]},
469
+ active = 0;
470
+ $('#fileupload').fileupload({
471
+ send: function () {
472
+ active += 1;
473
+ },
474
+ start: function () {
475
+ ok(!active, 'Triggers start callback before uploads');
476
+ start();
477
+ }
478
+ }).fileupload('send', param);
479
+ });
480
+
481
+ asyncTest('stop', function () {
482
+ expect(1);
483
+ var param = {files: [{name: '1'}, {name: '2'}]},
484
+ active = 0;
485
+ $('#fileupload').fileupload({
486
+ send: function () {
487
+ active += 1;
488
+ },
489
+ always: function () {
490
+ active -= 1;
491
+ },
492
+ stop: function () {
493
+ ok(!active, 'Triggers stop callback after uploads');
494
+ start();
495
+ }
496
+ }).fileupload('send', param);
497
+ });
498
+
499
+ test('change', function () {
500
+ var fu = $('#fileupload').fileupload(),
501
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'),
502
+ fileInput = fu.fileupload('option', 'fileInput');
503
+ expect(2);
504
+ fu.fileupload({
505
+ change: function (e, data) {
506
+ ok(true, 'Triggers change callback');
507
+ strictEqual(
508
+ data.files.length,
509
+ 0,
510
+ 'Returns empty files list'
511
+ );
512
+ },
513
+ add: $.noop
514
+ });
515
+ fuo._onChange({
516
+ data: {fileupload: fuo},
517
+ target: fileInput[0]
518
+ });
519
+ });
520
+
521
+ test('paste', function () {
522
+ var fu = $('#fileupload').fileupload(),
523
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
524
+ expect(1);
525
+ fu.fileupload({
526
+ paste: function () {
527
+ ok(true, 'Triggers paste callback');
528
+ },
529
+ add: $.noop
530
+ });
531
+ fuo._onPaste({
532
+ data: {fileupload: fuo},
533
+ originalEvent: {
534
+ dataTransfer: {files: [{}]},
535
+ clipboardData: {items: [{}]}
536
+ },
537
+ preventDefault: $.noop
538
+ });
539
+ });
540
+
541
+ test('drop', function () {
542
+ var fu = $('#fileupload').fileupload(),
543
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
544
+ expect(1);
545
+ fu.fileupload({
546
+ drop: function () {
547
+ ok(true, 'Triggers drop callback');
548
+ },
549
+ add: $.noop
550
+ });
551
+ fuo._onDrop({
552
+ data: {fileupload: fuo},
553
+ originalEvent: {
554
+ dataTransfer: {files: [{}]},
555
+ clipboardData: {items: [{}]}
556
+ },
557
+ preventDefault: $.noop
558
+ });
559
+ });
560
+
561
+ test('dragover', function () {
562
+ var fu = $('#fileupload').fileupload(),
563
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
564
+ expect(1);
565
+ fu.fileupload({
566
+ dragover: function () {
567
+ ok(true, 'Triggers dragover callback');
568
+ },
569
+ add: $.noop
570
+ });
571
+ fuo._onDragOver({
572
+ data: {fileupload: fuo},
573
+ originalEvent: {dataTransfer: {types: ['Files']}},
574
+ preventDefault: $.noop
575
+ });
576
+ });
577
+
578
+ module('Options', lifecycle);
579
+
580
+ test('paramName', function () {
581
+ expect(1);
582
+ var param = {files: [{name: 'test'}]};
583
+ $('#fileupload').fileupload({
584
+ paramName: null,
585
+ send: function (e, data) {
586
+ strictEqual(
587
+ data.paramName[0],
588
+ data.fileInput.prop('name'),
589
+ 'Takes paramName from file input field if not set'
590
+ );
591
+ return false;
592
+ }
593
+ }).fileupload('send', param);
594
+ });
595
+
596
+ test('url', function () {
597
+ expect(1);
598
+ var param = {files: [{name: 'test'}]};
599
+ $('#fileupload').fileupload({
600
+ url: null,
601
+ send: function (e, data) {
602
+ strictEqual(
603
+ data.url,
604
+ $(data.fileInput.prop('form')).prop('action'),
605
+ 'Takes url from form action if not set'
606
+ );
607
+ return false;
608
+ }
609
+ }).fileupload('send', param);
610
+ });
611
+
612
+ test('type', function () {
613
+ expect(2);
614
+ var param = {files: [{name: 'test'}]};
615
+ $('#fileupload').fileupload({
616
+ type: null,
617
+ send: function (e, data) {
618
+ strictEqual(
619
+ data.type,
620
+ 'POST',
621
+ 'Request type is "POST" if not set to "PUT"'
622
+ );
623
+ return false;
624
+ }
625
+ }).fileupload('send', param);
626
+ $('#fileupload').fileupload({
627
+ type: 'PUT',
628
+ send: function (e, data) {
629
+ strictEqual(
630
+ data.type,
631
+ 'PUT',
632
+ 'Request type is "PUT" if set to "PUT"'
633
+ );
634
+ return false;
635
+ }
636
+ }).fileupload('send', param);
637
+ });
638
+
639
+ test('replaceFileInput', function () {
640
+ var fu = $('#fileupload').fileupload(),
641
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'),
642
+ fileInput = fu.fileupload('option', 'fileInput'),
643
+ fileInputElement = fileInput[0];
644
+ expect(2);
645
+ fu.fileupload({
646
+ replaceFileInput: false,
647
+ change: function () {
648
+ strictEqual(
649
+ fu.fileupload('option', 'fileInput')[0],
650
+ fileInputElement,
651
+ 'Keeps file input with replaceFileInput: false'
652
+ );
653
+ },
654
+ add: $.noop
655
+ });
656
+ fuo._onChange({
657
+ data: {fileupload: fuo},
658
+ target: fileInput[0]
659
+ });
660
+ fu.fileupload({
661
+ replaceFileInput: true,
662
+ change: function () {
663
+ notStrictEqual(
664
+ fu.fileupload('option', 'fileInput')[0],
665
+ fileInputElement,
666
+ 'Replaces file input with replaceFileInput: true'
667
+ );
668
+ },
669
+ add: $.noop
670
+ });
671
+ fuo._onChange({
672
+ data: {fileupload: fuo},
673
+ target: fileInput[0]
674
+ });
675
+ });
676
+
677
+ asyncTest('forceIframeTransport', function () {
678
+ expect(1);
679
+ var param = {files: [{name: 'test'}]};
680
+ $('#fileupload').fileupload({
681
+ forceIframeTransport: true,
682
+ done: function (e, data) {
683
+ strictEqual(
684
+ data.dataType.substr(0, 6),
685
+ 'iframe',
686
+ 'Iframe Transport is used'
687
+ );
688
+ start();
689
+ }
690
+ }).fileupload('send', param);
691
+ });
692
+
693
+ test('singleFileUploads', function () {
694
+ expect(3);
695
+ var fu = $('#fileupload').fileupload(),
696
+ param = {files: [{name: '1'}, {name: '2'}]},
697
+ index = 1;
698
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
699
+ ._isXHRUpload = function () {
700
+ return true;
701
+ };
702
+ $('#fileupload').fileupload({
703
+ singleFileUploads: true,
704
+ add: function () {
705
+ ok(true, 'Triggers callback number ' + index.toString());
706
+ index += 1;
707
+ }
708
+ }).fileupload('add', param).fileupload(
709
+ 'option',
710
+ 'singleFileUploads',
711
+ false
712
+ ).fileupload('add', param);
713
+ });
714
+
715
+ test('limitMultiFileUploads', function () {
716
+ expect(3);
717
+ var fu = $('#fileupload').fileupload(),
718
+ param = {files: [
719
+ {name: '1'},
720
+ {name: '2'},
721
+ {name: '3'},
722
+ {name: '4'},
723
+ {name: '5'}
724
+ ]},
725
+ index = 1;
726
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
727
+ ._isXHRUpload = function () {
728
+ return true;
729
+ };
730
+ $('#fileupload').fileupload({
731
+ singleFileUploads: false,
732
+ limitMultiFileUploads: 2,
733
+ add: function () {
734
+ ok(true, 'Triggers callback number ' + index.toString());
735
+ index += 1;
736
+ }
737
+ }).fileupload('add', param);
738
+ });
739
+
740
+ test('limitMultiFileUploadSize', function () {
741
+ expect(7);
742
+ var fu = $('#fileupload').fileupload(),
743
+ param = {files: [
744
+ {name: '1-1', size: 100000},
745
+ {name: '1-2', size: 40000},
746
+ {name: '2-1', size: 100000},
747
+ {name: '3-1', size: 50000},
748
+ {name: '3-2', size: 40000},
749
+ {name: '4-1', size: 45000} // New request due to limitMultiFileUploads
750
+ ]},
751
+ param2 = {files: [
752
+ {name: '5-1'},
753
+ {name: '5-2'},
754
+ {name: '6-1'},
755
+ {name: '6-2'},
756
+ {name: '7-1'}
757
+ ]},
758
+ index = 1;
759
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
760
+ ._isXHRUpload = function () {
761
+ return true;
762
+ };
763
+ $('#fileupload').fileupload({
764
+ singleFileUploads: false,
765
+ limitMultiFileUploads: 2,
766
+ limitMultiFileUploadSize: 150000,
767
+ limitMultiFileUploadSizeOverhead: 5000,
768
+ add: function () {
769
+ ok(true, 'Triggers callback number ' + index.toString());
770
+ index += 1;
771
+ }
772
+ }).fileupload('add', param).fileupload('add', param2);
773
+ });
774
+
775
+ asyncTest('sequentialUploads', function () {
776
+ expect(6);
777
+ var param = {files: [
778
+ {name: '1'},
779
+ {name: '2'},
780
+ {name: '3'},
781
+ {name: '4'},
782
+ {name: '5'},
783
+ {name: '6'}
784
+ ]},
785
+ addIndex = 0,
786
+ sendIndex = 0,
787
+ loadIndex = 0,
788
+ fu = $('#fileupload').fileupload({
789
+ sequentialUploads: true,
790
+ add: function (e, data) {
791
+ addIndex += 1;
792
+ if (addIndex === 4) {
793
+ data.submit().abort();
794
+ } else {
795
+ data.submit();
796
+ }
797
+ },
798
+ send: function () {
799
+ sendIndex += 1;
800
+ },
801
+ done: function () {
802
+ loadIndex += 1;
803
+ strictEqual(sendIndex, loadIndex, 'upload in order');
804
+ },
805
+ fail: function (e, data) {
806
+ strictEqual(data.errorThrown, 'abort', 'upload aborted');
807
+ },
808
+ stop: function () {
809
+ start();
810
+ }
811
+ });
812
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
813
+ ._isXHRUpload = function () {
814
+ return true;
815
+ };
816
+ fu.fileupload('add', param);
817
+ });
818
+
819
+ asyncTest('limitConcurrentUploads', function () {
820
+ expect(12);
821
+ var param = {files: [
822
+ {name: '1'},
823
+ {name: '2'},
824
+ {name: '3'},
825
+ {name: '4'},
826
+ {name: '5'},
827
+ {name: '6'},
828
+ {name: '7'},
829
+ {name: '8'},
830
+ {name: '9'},
831
+ {name: '10'},
832
+ {name: '11'},
833
+ {name: '12'}
834
+ ]},
835
+ addIndex = 0,
836
+ sendIndex = 0,
837
+ loadIndex = 0,
838
+ fu = $('#fileupload').fileupload({
839
+ limitConcurrentUploads: 3,
840
+ add: function (e, data) {
841
+ addIndex += 1;
842
+ if (addIndex === 4) {
843
+ data.submit().abort();
844
+ } else {
845
+ data.submit();
846
+ }
847
+ },
848
+ send: function () {
849
+ sendIndex += 1;
850
+ },
851
+ done: function () {
852
+ loadIndex += 1;
853
+ ok(sendIndex - loadIndex < 3);
854
+ },
855
+ fail: function (e, data) {
856
+ strictEqual(data.errorThrown, 'abort', 'upload aborted');
857
+ },
858
+ stop: function () {
859
+ start();
860
+ }
861
+ });
862
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
863
+ ._isXHRUpload = function () {
864
+ return true;
865
+ };
866
+ fu.fileupload('add', param);
867
+ });
868
+
869
+ if ($.support.xhrFileUpload) {
870
+ asyncTest('multipart', function () {
871
+ expect(2);
872
+ var param = {files: [{
873
+ name: 'test.png',
874
+ size: 123,
875
+ type: 'image/png'
876
+ }]},
877
+ fu = $('#fileupload').fileupload({
878
+ multipart: false,
879
+ always: function (e, data) {
880
+ strictEqual(
881
+ data.contentType,
882
+ param.files[0].type,
883
+ 'non-multipart upload sets file type as contentType'
884
+ );
885
+ strictEqual(
886
+ data.headers['Content-Disposition'],
887
+ 'attachment; filename="' + param.files[0].name + '"',
888
+ 'non-multipart upload sets Content-Disposition header'
889
+ );
890
+ start();
891
+ }
892
+ });
893
+ fu.fileupload('send', param);
894
+ });
895
+ }
896
+
897
+ module('UI Initialization', lifecycleUI);
898
+
899
+ test('Widget initialization', function () {
900
+ var fu = $('#fileupload').fileupload();
901
+ ok(fu.data('blueimp-fileupload') || fu.data('fileupload'));
902
+ ok(
903
+ $('#fileupload').fileupload('option', 'uploadTemplate').length,
904
+ 'Initialized upload template'
905
+ );
906
+ ok(
907
+ $('#fileupload').fileupload('option', 'downloadTemplate').length,
908
+ 'Initialized download template'
909
+ );
910
+ });
911
+
912
+ test('Buttonbar event listeners', function () {
913
+ var buttonbar = $('#fileupload .fileupload-buttonbar'),
914
+ files = [{name: 'test'}];
915
+ expect(4);
916
+ $('#fileupload').fileupload({
917
+ send: function () {
918
+ ok(true, 'Started file upload via global start button');
919
+ },
920
+ fail: function (e, data) {
921
+ ok(true, 'Canceled file upload via global cancel button');
922
+ data.context.remove();
923
+ },
924
+ destroy: function () {
925
+ ok(true, 'Delete action called via global delete button');
926
+ }
927
+ });
928
+ $('#fileupload').fileupload('add', {files: files});
929
+ buttonbar.find('.cancel').click();
930
+ $('#fileupload').fileupload('add', {files: files});
931
+ buttonbar.find('.start').click();
932
+ buttonbar.find('.cancel').click();
933
+ files[0].deleteUrl = 'http://example.org/banana.jpg';
934
+ ($('#fileupload').data('blueimp-fileupload') ||
935
+ $('#fileupload').data('fileupload'))
936
+ ._renderDownload(files)
937
+ .appendTo($('#fileupload .files')).show()
938
+ .find('.toggle').click();
939
+ buttonbar.find('.delete').click();
940
+ });
941
+
942
+ module('UI API', lifecycleUI);
943
+
944
+ test('destroy', function () {
945
+ var buttonbar = $('#fileupload .fileupload-buttonbar'),
946
+ files = [{name: 'test'}];
947
+ expect(1);
948
+ $('#fileupload').fileupload({
949
+ send: function () {
950
+ ok(true, 'This test should not run');
951
+ return false;
952
+ }
953
+ })
954
+ .fileupload('add', {files: files})
955
+ .fileupload('destroy');
956
+ buttonbar.find('.start').click(function () {
957
+ ok(true, 'Clicked global start button');
958
+ return false;
959
+ }).click();
960
+ });
961
+
962
+ test('disable/enable', function () {
963
+ var buttonbar = $('#fileupload .fileupload-buttonbar');
964
+ $('#fileupload').fileupload();
965
+ $('#fileupload').fileupload('disable');
966
+ strictEqual(
967
+ buttonbar.find('input[type=file], button').not(':disabled').length,
968
+ 0,
969
+ 'Disables the buttonbar buttons'
970
+ );
971
+ $('#fileupload').fileupload('enable');
972
+ strictEqual(
973
+ buttonbar.find('input[type=file], button').not(':disabled').length,
974
+ 4,
975
+ 'Enables the buttonbar buttons'
976
+ );
977
+ });
978
+
979
+ module('UI Callbacks', lifecycleUI);
980
+
981
+ test('destroy', function () {
982
+ expect(3);
983
+ $('#fileupload').fileupload({
984
+ destroy: function (e, data) {
985
+ ok(true, 'Triggers destroy callback');
986
+ strictEqual(
987
+ data.url,
988
+ 'test',
989
+ 'Passes over deletion url parameter'
990
+ );
991
+ strictEqual(
992
+ data.type,
993
+ 'DELETE',
994
+ 'Passes over deletion request type parameter'
995
+ );
996
+ }
997
+ });
998
+ ($('#fileupload').data('blueimp-fileupload') ||
999
+ $('#fileupload').data('fileupload'))
1000
+ ._renderDownload([{
1001
+ name: 'test',
1002
+ deleteUrl: 'test',
1003
+ deleteType: 'DELETE'
1004
+ }])
1005
+ .appendTo($('#fileupload .files'))
1006
+ .show()
1007
+ .find('.toggle').click();
1008
+ $('#fileupload .fileupload-buttonbar .delete').click();
1009
+ });
1010
+
1011
+ asyncTest('added', function () {
1012
+ expect(1);
1013
+ var param = {files: [{name: 'test'}]};
1014
+ $('#fileupload').fileupload({
1015
+ added: function (e, data) {
1016
+ start();
1017
+ strictEqual(
1018
+ data.files[0].name,
1019
+ param.files[0].name,
1020
+ 'Triggers added callback'
1021
+ );
1022
+ },
1023
+ send: function () {
1024
+ return false;
1025
+ }
1026
+ }).fileupload('add', param);
1027
+ });
1028
+
1029
+ asyncTest('started', function () {
1030
+ expect(1);
1031
+ var param = {files: [{name: 'test'}]};
1032
+ $('#fileupload').fileupload({
1033
+ started: function () {
1034
+ start();
1035
+ ok('Triggers started callback');
1036
+ return false;
1037
+ },
1038
+ sent: function () {
1039
+ return false;
1040
+ }
1041
+ }).fileupload('send', param);
1042
+ });
1043
+
1044
+ asyncTest('sent', function () {
1045
+ expect(1);
1046
+ var param = {files: [{name: 'test'}]};
1047
+ $('#fileupload').fileupload({
1048
+ sent: function (e, data) {
1049
+ start();
1050
+ strictEqual(
1051
+ data.files[0].name,
1052
+ param.files[0].name,
1053
+ 'Triggers sent callback'
1054
+ );
1055
+ return false;
1056
+ }
1057
+ }).fileupload('send', param);
1058
+ });
1059
+
1060
+ asyncTest('completed', function () {
1061
+ expect(1);
1062
+ var param = {files: [{name: 'test'}]};
1063
+ $('#fileupload').fileupload({
1064
+ completed: function () {
1065
+ start();
1066
+ ok('Triggers completed callback');
1067
+ return false;
1068
+ }
1069
+ }).fileupload('send', param);
1070
+ });
1071
+
1072
+ asyncTest('failed', function () {
1073
+ expect(1);
1074
+ var param = {files: [{name: 'test'}]};
1075
+ $('#fileupload').fileupload({
1076
+ failed: function () {
1077
+ start();
1078
+ ok('Triggers failed callback');
1079
+ return false;
1080
+ }
1081
+ }).fileupload('send', param).abort();
1082
+ });
1083
+
1084
+ asyncTest('stopped', function () {
1085
+ expect(1);
1086
+ var param = {files: [{name: 'test'}]};
1087
+ $('#fileupload').fileupload({
1088
+ stopped: function () {
1089
+ start();
1090
+ ok('Triggers stopped callback');
1091
+ return false;
1092
+ }
1093
+ }).fileupload('send', param);
1094
+ });
1095
+
1096
+ asyncTest('destroyed', function () {
1097
+ expect(1);
1098
+ $('#fileupload').fileupload({
1099
+ dataType: 'html',
1100
+ destroyed: function () {
1101
+ start();
1102
+ ok(true, 'Triggers destroyed callback');
1103
+ }
1104
+ });
1105
+ ($('#fileupload').data('blueimp-fileupload') ||
1106
+ $('#fileupload').data('fileupload'))
1107
+ ._renderDownload([{
1108
+ name: 'test',
1109
+ deleteUrl: '.',
1110
+ deleteType: 'GET'
1111
+ }])
1112
+ .appendTo($('#fileupload .files'))
1113
+ .show()
1114
+ .find('.toggle').click();
1115
+ $('#fileupload .fileupload-buttonbar .delete').click();
1116
+ });
1117
+
1118
+ module('UI Options', lifecycleUI);
1119
+
1120
+ test('autoUpload', function () {
1121
+ expect(1);
1122
+ $('#fileupload')
1123
+ .fileupload({
1124
+ autoUpload: true,
1125
+ send: function () {
1126
+ ok(true, 'Started file upload automatically');
1127
+ return false;
1128
+ }
1129
+ })
1130
+ .fileupload('add', {files: [{name: 'test'}]})
1131
+ .fileupload('option', 'autoUpload', false)
1132
+ .fileupload('add', {files: [{name: 'test'}]});
1133
+ });
1134
+
1135
+ test('maxNumberOfFiles', function () {
1136
+ expect(3);
1137
+ var addIndex = 0,
1138
+ sendIndex = 0;
1139
+ $('#fileupload')
1140
+ .fileupload({
1141
+ autoUpload: true,
1142
+ maxNumberOfFiles: 3,
1143
+ singleFileUploads: false,
1144
+ send: function () {
1145
+ strictEqual(
1146
+ sendIndex += 1,
1147
+ addIndex
1148
+ );
1149
+ },
1150
+ progress: $.noop,
1151
+ progressall: $.noop,
1152
+ done: $.noop,
1153
+ stop: $.noop
1154
+ })
1155
+ .fileupload('add', {files: [{name: (addIndex += 1)}]})
1156
+ .fileupload('add', {files: [{name: (addIndex += 1)}]})
1157
+ .fileupload('add', {files: [{name: (addIndex += 1)}]})
1158
+ .fileupload('add', {files: [{name: 'test'}]});
1159
+ });
1160
+
1161
+ test('maxFileSize', function () {
1162
+ expect(2);
1163
+ var addIndex = 0,
1164
+ sendIndex = 0;
1165
+ $('#fileupload')
1166
+ .fileupload({
1167
+ autoUpload: true,
1168
+ maxFileSize: 1000,
1169
+ send: function () {
1170
+ strictEqual(
1171
+ sendIndex += 1,
1172
+ addIndex
1173
+ );
1174
+ return false;
1175
+ }
1176
+ })
1177
+ .fileupload('add', {files: [{
1178
+ name: (addIndex += 1)
1179
+ }]})
1180
+ .fileupload('add', {files: [{
1181
+ name: (addIndex += 1),
1182
+ size: 999
1183
+ }]})
1184
+ .fileupload('add', {files: [{
1185
+ name: 'test',
1186
+ size: 1001
1187
+ }]})
1188
+ .fileupload({
1189
+ send: function (e, data) {
1190
+ ok(
1191
+ !$.blueimp.fileupload.prototype.options
1192
+ .send.call(this, e, data)
1193
+ );
1194
+ return false;
1195
+ }
1196
+ });
1197
+ });
1198
+
1199
+ test('minFileSize', function () {
1200
+ expect(2);
1201
+ var addIndex = 0,
1202
+ sendIndex = 0;
1203
+ $('#fileupload')
1204
+ .fileupload({
1205
+ autoUpload: true,
1206
+ minFileSize: 1000,
1207
+ send: function () {
1208
+ strictEqual(
1209
+ sendIndex += 1,
1210
+ addIndex
1211
+ );
1212
+ return false;
1213
+ }
1214
+ })
1215
+ .fileupload('add', {files: [{
1216
+ name: (addIndex += 1)
1217
+ }]})
1218
+ .fileupload('add', {files: [{
1219
+ name: (addIndex += 1),
1220
+ size: 1001
1221
+ }]})
1222
+ .fileupload('add', {files: [{
1223
+ name: 'test',
1224
+ size: 999
1225
+ }]})
1226
+ .fileupload({
1227
+ send: function (e, data) {
1228
+ ok(
1229
+ !$.blueimp.fileupload.prototype.options
1230
+ .send.call(this, e, data)
1231
+ );
1232
+ return false;
1233
+ }
1234
+ });
1235
+ });
1236
+
1237
+ test('acceptFileTypes', function () {
1238
+ expect(2);
1239
+ var addIndex = 0,
1240
+ sendIndex = 0;
1241
+ $('#fileupload')
1242
+ .fileupload({
1243
+ autoUpload: true,
1244
+ acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
1245
+ disableImageMetaDataLoad: true,
1246
+ send: function () {
1247
+ strictEqual(
1248
+ sendIndex += 1,
1249
+ addIndex
1250
+ );
1251
+ return false;
1252
+ }
1253
+ })
1254
+ .fileupload('add', {files: [{
1255
+ name: (addIndex += 1) + '.jpg'
1256
+ }]})
1257
+ .fileupload('add', {files: [{
1258
+ name: (addIndex += 1),
1259
+ type: 'image/jpeg'
1260
+ }]})
1261
+ .fileupload('add', {files: [{
1262
+ name: 'test.txt',
1263
+ type: 'text/plain'
1264
+ }]})
1265
+ .fileupload({
1266
+ send: function (e, data) {
1267
+ ok(
1268
+ !$.blueimp.fileupload.prototype.options
1269
+ .send.call(this, e, data)
1270
+ );
1271
+ return false;
1272
+ }
1273
+ });
1274
+ });
1275
+
1276
+ test('acceptFileTypes as HTML5 data attribute', function () {
1277
+ expect(2);
1278
+ var regExp = /(\.|\/)(gif|jpe?g|png)$/i;
1279
+ $('#fileupload')
1280
+ .attr('data-accept-file-types', regExp.toString())
1281
+ .fileupload();
1282
+ strictEqual(
1283
+ $.type($('#fileupload').fileupload('option', 'acceptFileTypes')),
1284
+ $.type(regExp)
1285
+ );
1286
+ strictEqual(
1287
+ $('#fileupload').fileupload('option', 'acceptFileTypes').toString(),
1288
+ regExp.toString()
1289
+ );
1290
+ });
1291
+
1292
+ });