attachment-upload.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. (function( $ ) {
  2. jQuery.fn.attachmentUpload = function(options) {
  3. var options = $.extend({
  4. 'url':"",
  5. 'sortable': false,
  6. "multiple":false,
  7. "maxNumberOfFiles": 0,
  8. "maxFileSize":null, // 5 MB
  9. "acceptFileTypes": null,
  10. "files":[]
  11. }, options);
  12. var $input = this;
  13. var $container = $input.parent('div');
  14. var $files = $('<ul>', {"class":"files"}).insertAfter($input);
  15. var methods = {
  16. init: function(){
  17. if (options.multiple == true) {
  18. $input.attr('multiple', true);
  19. $input.attr('name', $input.attr('name') + '[]');
  20. }
  21. if (options.sortable == true) {
  22. $files.sortable({
  23. placeholder: "upload-kit-item sortable-placeholder",
  24. tolerance: "pointer",
  25. forcePlaceholderSize: true,
  26. update: function () {
  27. methods.updateOrder()
  28. }
  29. })
  30. }
  31. $input.wrapAll($('<div class="upload-kit-input"></div>'))
  32. .after($('<span class="glyphicon glyphicon-plus-sign add"></span>'))
  33. .after($('<span class="glyphicon glyphicon-circle-arrow-down drag"></span>'))
  34. .after($('<span/>', {"data-toggle":"popover", "class":"glyphicon glyphicon-exclamation-sign error-popover"}))
  35. .after(
  36. '<div class="progress">'+
  37. '<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>'+
  38. '</div>'
  39. );
  40. $files.on('click', '.upload-kit-item .remove', methods.removeItem);
  41. methods.checkInputVisibility();
  42. methods.fileuploadInit();
  43. methods.dragInit();
  44. },
  45. fileuploadInit: function(){
  46. var $fileupload = $input.fileupload({
  47. url: options.url,
  48. dropZone: $input.parents('.upload-kit-input'),
  49. dataType: 'json',
  50. singleFileUploads: false,
  51. multiple: options.multiple,
  52. maxNumberOfFiles: options.maxNumberOfFiles,
  53. maxFileSize: options.maxFileSize, // 5 MB
  54. acceptFileTypes: options.acceptFileTypes
  55. ? new RegExp(options.acceptFileTypes)
  56. : null,
  57. process: true,
  58. getNumberOfFiles: methods.getNumberOfFiles,
  59. start: function (e, data) {
  60. $container.find('.upload-kit-input')
  61. .removeClass('error')
  62. .addClass('in-progress')
  63. },
  64. processfail: function(e, data) {
  65. if (data.files.error) {
  66. methods.showError(data.files[0].error);
  67. }
  68. },
  69. progressall: function (e, data) {
  70. var progress = parseInt(data.loaded / data.total * 100, 10);
  71. $container.find('.progress-bar').attr('aria-valuenow', progress).css(
  72. 'width',
  73. progress + '%'
  74. ).text(progress + '%');
  75. },
  76. done: function (e, data) {
  77. $.each(data.result.files, function (index, file) {
  78. if (!file.error) {
  79. var item = methods.createItem(file);
  80. item.appendTo($files);
  81. } else {
  82. methods.showError(file.errors)
  83. }
  84. });
  85. methods.checkInputVisibility();
  86. if (options.sortable) {
  87. methods.updateOrder();
  88. }
  89. },
  90. fail: function (e, data) {
  91. methods.showError(data.errorThrown)
  92. },
  93. always: function (e, data) {
  94. $container.find('.upload-kit-input').removeClass('in-progress')
  95. }
  96. });
  97. if (options.files) {
  98. options.files.sort(function(a, b){
  99. return parseInt(a.order) - parseInt(b.order);
  100. });
  101. $fileupload.fileupload('option', 'done').call($fileupload, $.Event('done'), {result: {files: options.files}});
  102. methods.checkInputVisibility();
  103. }
  104. },
  105. dragInit: function(){
  106. $(document).on('dragover', function ()
  107. {
  108. $('.upload-kit-input').addClass('drag-highlight');
  109. });
  110. $(document).on('dragleave drop', function ()
  111. {
  112. $('.upload-kit-input').removeClass('drag-highlight');
  113. });
  114. },
  115. showError: function(error){
  116. if ($.fn.popover) {
  117. $container.find('.error-popover').attr('data-content', error).popover({html:true,trigger:"hover"});
  118. }
  119. $container.find('.upload-kit-input').addClass('error');
  120. },
  121. removeItem: function(e){ //删除图片项目
  122. var $this = $(this);
  123. var url = $this.data('url');
  124. if (url) {
  125. $.ajax({
  126. url: url,
  127. type: 'DELETE'
  128. })
  129. }
  130. $this.parents('.upload-kit-item').remove();
  131. methods.checkInputVisibility();
  132. },
  133. createItem: function(file){ //新建图片项目
  134. var name = options.name;
  135. var index = methods.getNumberOfFiles();
  136. if (options.multiple) {
  137. name += '[' + index + ']';
  138. }
  139. var item;
  140. if (options.onlyUrl) {
  141. item = $('<li>', {"class": "upload-kit-item done"})
  142. .append($('<input/>', {"name": name,"value": file.url, "type":"hidden"}))
  143. .append($('<span/>', {"class": "fa fa-trash remove", "data-url": file.deleteUrl}));
  144. } else {
  145. item = $('<li>', {"class": "upload-kit-item done"})
  146. .append($('<input/>', {"name": name + '[path]',"value": file.path, "type":"hidden"}))
  147. .append($('<input/>', {"name": name + '[id]', "value": file.id, "type":"hidden"}))
  148. .append($('<input/>', {"name": name + '[name]',"value": file.name, "type":"hidden"}))
  149. .append($('<input/>', {"name": name + '[hash]',"value": file.hash, "type":"hidden"}))
  150. .append($('<input/>', {"name": name + '[type]',"value": file.type, "type":"hidden"}))
  151. .append($('<input/>', {"name": name + '[size]',"value": file.size, "type":"hidden"}))
  152. .append($('<input/>', {"name": name + '[extension]',"value": file.extension, "type":"hidden"}))
  153. .append($('<input/>', {"name": name + '[order]',"data-role":"order", "value": file.order, "type":"hidden"}))
  154. .append($('<span/>', {"class": "fa fa-trash remove", "data-url": file.deleteUrl}));
  155. }
  156. if (!file.type || file.type.search(/image\/.*/g) !== -1) {
  157. item.removeClass('not-image').addClass('image');
  158. item.prepend($('<img/>', {src: file.url, width: 150, height: 150}));
  159. item.find('span.type').text('');
  160. } else {
  161. item.removeClass('image').addClass('not-image');
  162. item.css('backgroundImage', '');
  163. item.append($('<span/>', {"class": "name"}).text(file.filename));
  164. }
  165. return item;
  166. },
  167. checkInputVisibility: function(){
  168. var inputContainer = $container.find('.upload-kit-input');
  169. if (options.maxNumberOfFiles && (methods.getNumberOfFiles() >= options.maxNumberOfFiles)) {
  170. inputContainer.hide();
  171. } else {
  172. inputContainer.show();
  173. }
  174. },
  175. getNumberOfFiles: function() {
  176. return $container.find('.files .upload-kit-item').length;
  177. },
  178. updateOrder: function () {
  179. $files.find('.upload-kit-item').each(function(index, item){
  180. $(item).find('input[data-role=order]').val(index);
  181. })
  182. }
  183. };
  184. methods.init.apply(this);
  185. return this;
  186. };
  187. })(jQuery);