123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- (function( $ ) {
- jQuery.fn.attachmentUpload = function(options) {
- var options = $.extend({
- 'url':"",
- 'sortable': false,
- "multiple":false,
- "maxNumberOfFiles": 0,
- "maxFileSize":null, // 5 MB
- "acceptFileTypes": null,
- "files":[]
- }, options);
- var $input = this;
- var $container = $input.parent('div');
- var $files = $('<ul>', {"class":"files"}).insertAfter($input);
- var methods = {
- init: function(){
- if (options.multiple == true) {
- $input.attr('multiple', true);
- $input.attr('name', $input.attr('name') + '[]');
- }
- if (options.sortable == true) {
- $files.sortable({
- placeholder: "upload-kit-item sortable-placeholder",
- tolerance: "pointer",
- forcePlaceholderSize: true,
- update: function () {
- methods.updateOrder()
- }
- })
- }
- $input.wrapAll($('<div class="upload-kit-input"></div>'))
- .after($('<span class="glyphicon glyphicon-plus-sign add"></span>'))
- .after($('<span class="glyphicon glyphicon-circle-arrow-down drag"></span>'))
- .after($('<span/>', {"data-toggle":"popover", "class":"glyphicon glyphicon-exclamation-sign error-popover"}))
- .after(
- '<div class="progress">'+
- '<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>'+
- '</div>'
- );
- $files.on('click', '.upload-kit-item .remove', methods.removeItem);
- methods.checkInputVisibility();
- methods.fileuploadInit();
- methods.dragInit();
- },
- fileuploadInit: function(){
- var $fileupload = $input.fileupload({
- url: options.url,
- dropZone: $input.parents('.upload-kit-input'),
- dataType: 'json',
- singleFileUploads: false,
- multiple: options.multiple,
- maxNumberOfFiles: options.maxNumberOfFiles,
- maxFileSize: options.maxFileSize, // 5 MB
- acceptFileTypes: options.acceptFileTypes
- ? new RegExp(options.acceptFileTypes)
- : null,
- process: true,
- getNumberOfFiles: methods.getNumberOfFiles,
- start: function (e, data) {
- $container.find('.upload-kit-input')
- .removeClass('error')
- .addClass('in-progress')
- },
- processfail: function(e, data) {
- if (data.files.error) {
- methods.showError(data.files[0].error);
- }
- },
- progressall: function (e, data) {
- var progress = parseInt(data.loaded / data.total * 100, 10);
- $container.find('.progress-bar').attr('aria-valuenow', progress).css(
- 'width',
- progress + '%'
- ).text(progress + '%');
- },
- done: function (e, data) {
- $.each(data.result.files, function (index, file) {
- if (!file.error) {
- var item = methods.createItem(file);
- item.appendTo($files);
- } else {
- methods.showError(file.errors)
- }
- });
- methods.checkInputVisibility();
- if (options.sortable) {
- methods.updateOrder();
- }
- },
- fail: function (e, data) {
- methods.showError(data.errorThrown)
- },
- always: function (e, data) {
- $container.find('.upload-kit-input').removeClass('in-progress')
- }
- });
- if (options.files) {
- options.files.sort(function(a, b){
- return parseInt(a.order) - parseInt(b.order);
- });
- $fileupload.fileupload('option', 'done').call($fileupload, $.Event('done'), {result: {files: options.files}});
- methods.checkInputVisibility();
- }
- },
- dragInit: function(){
- $(document).on('dragover', function ()
- {
- $('.upload-kit-input').addClass('drag-highlight');
- });
- $(document).on('dragleave drop', function ()
- {
- $('.upload-kit-input').removeClass('drag-highlight');
- });
- },
- showError: function(error){
- if ($.fn.popover) {
- $container.find('.error-popover').attr('data-content', error).popover({html:true,trigger:"hover"});
- }
- $container.find('.upload-kit-input').addClass('error');
- },
- removeItem: function(e){ //删除图片项目
- var $this = $(this);
- var url = $this.data('url');
- if (url) {
- $.ajax({
- url: url,
- type: 'DELETE'
- })
- }
- $this.parents('.upload-kit-item').remove();
- methods.checkInputVisibility();
- },
- createItem: function(file){ //新建图片项目
- var name = options.name;
- var index = methods.getNumberOfFiles();
- if (options.multiple) {
- name += '[' + index + ']';
- }
- var item;
- if (options.onlyUrl) {
- item = $('<li>', {"class": "upload-kit-item done"})
- .append($('<input/>', {"name": name,"value": file.url, "type":"hidden"}))
- .append($('<span/>', {"class": "fa fa-trash remove", "data-url": file.deleteUrl}));
- } else {
- item = $('<li>', {"class": "upload-kit-item done"})
- .append($('<input/>', {"name": name + '[path]',"value": file.path, "type":"hidden"}))
- .append($('<input/>', {"name": name + '[id]', "value": file.id, "type":"hidden"}))
- .append($('<input/>', {"name": name + '[name]',"value": file.name, "type":"hidden"}))
- .append($('<input/>', {"name": name + '[hash]',"value": file.hash, "type":"hidden"}))
- .append($('<input/>', {"name": name + '[type]',"value": file.type, "type":"hidden"}))
- .append($('<input/>', {"name": name + '[size]',"value": file.size, "type":"hidden"}))
- .append($('<input/>', {"name": name + '[extension]',"value": file.extension, "type":"hidden"}))
- .append($('<input/>', {"name": name + '[order]',"data-role":"order", "value": file.order, "type":"hidden"}))
- .append($('<span/>', {"class": "fa fa-trash remove", "data-url": file.deleteUrl}));
- }
- if (!file.type || file.type.search(/image\/.*/g) !== -1) {
- item.removeClass('not-image').addClass('image');
- item.prepend($('<img/>', {src: file.url, width: 150, height: 150}));
- item.find('span.type').text('');
- } else {
- item.removeClass('image').addClass('not-image');
- item.css('backgroundImage', '');
- item.append($('<span/>', {"class": "name"}).text(file.filename));
- }
- return item;
- },
- checkInputVisibility: function(){
- var inputContainer = $container.find('.upload-kit-input');
- if (options.maxNumberOfFiles && (methods.getNumberOfFiles() >= options.maxNumberOfFiles)) {
- inputContainer.hide();
- } else {
- inputContainer.show();
- }
- },
- getNumberOfFiles: function() {
- return $container.find('.files .upload-kit-item').length;
- },
- updateOrder: function () {
- $files.find('.upload-kit-item').each(function(index, item){
- $(item).find('input[data-role=order]').val(index);
- })
- }
- };
- methods.init.apply(this);
- return this;
- };
- })(jQuery);
|