UNPKG

dropify

Version:

Override your input files with style.

262 lines (216 loc) 7.44 kB
/*! * ============================================================= * dropify v0.1.1 - Override your input files with style. * https://github.com/JeremyFagis/dropify * * (c) 2015 - Jeremy FAGIS <jeremy@fagis.fr> (http://fagis.fr) * ============================================================= */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['jquery'], factory); } else if (typeof exports === 'object') { module.exports = factory(require('jquery')); } else { root.Dropify = factory(root.$); } }(this, function($) { var pluginName = "dropify"; function Dropify(element, options) { if (!(window.File && window.FileReader && window.FileList && window.Blob)) { return; } var defaults = { defaultFile: '', maxFileSize: 0, messages: { defaultMessage: 'Drag and drop a file here or click', replaceMessage: 'Drag and drop or click to replace', removeMessage: 'Remove', errorMessage: 'Sorry, this file is too large' }, tpl: { wrap: '<div class="dropify-wrapper"></div>', message: '<div class="dropify-message"><span class="file-icon" /> <p>defaultMessage</p></div>', preview: '<div class="dropify-preview"><span class="dropify-render"></span><div class="dropify-infos"><div class="dropify-infos-inner"><p class="dropify-infos-message">replaceMessage</p></div></div></div>', filename: '<p class="dropify-filename"><span class="file-icon"></span> <span class="dropify-filename-inner"></span></p>', clearButton: '<button type="button" class="dropify-clear">removeMessage</button>', error: '<p class="dropify-error">errorMessage</p>' } }; this.element = element; this.input = $(this.element); this.wrapper = null; this.preview = null; this.filenameWrapper = null; this.settings = $.extend(true, defaults, options, this.input.data()); this.imgFileFormats = ['png', 'jpg', 'jpeg', 'gif', 'bmp']; this.file = null; this.filename = null; this.isDisabled = false; this.onChange = this.onChange.bind(this); this.translate(); this.createElements(); this.setSize(); this.input.on('change', this.onChange); } Dropify.prototype.onChange = function() { this.resetPreview(); this.setFilename(this.input.val()); this.readUrl(this.element); }; Dropify.prototype.createElements = function() { this.input.wrap($(this.settings.tpl.wrap)); this.wrapper = this.input.parent(); var messageWrapper = $(this.settings.tpl.message).insertBefore(this.input); $(this.settings.tpl.error).appendTo(messageWrapper); if (this.isTouchDevice() === true) { this.wrapper.addClass('touch-fallback'); } if (this.input.attr('disabled')) { this.isDisabled = true; this.wrapper.addClass('disabled'); } this.preview = $(this.settings.tpl.preview); this.preview.insertAfter(this.input); if (this.isDisabled === false) { this.clearButton = $(this.settings.tpl.clearButton); this.clearButton.insertAfter(this.input); this.clearButton.on('click', function(){ this.clearElement(); }.bind(this)); } this.filenameWrapper = $(this.settings.tpl.filename); this.filenameWrapper.prependTo(this.preview.find('.dropify-infos-inner')); var defaultFile = this.settings.defaultFile || ''; if (defaultFile.trim() != '') { this.setFilename(defaultFile); this.setPreview(defaultFile); } }; Dropify.prototype.readUrl = function(input) { if (input.files && input.files[0]) { var reader = new FileReader(); this.file = input.files[0]; if (this.checkFileSize()) { reader.onload = function(e) { this.setPreview(e.target.result, this.file.name); }.bind(this); reader.readAsDataURL(this.file); } else { this.wrapper.addClass('has-error'); this.resetPreview(); this.clearElement(); } } }; Dropify.prototype.setPreview = function(src) { this.wrapper.removeClass('has-error').addClass('has-preview'); var render = this.preview.children('.dropify-render'); if (this.isImage() === true) { $('<img />').attr('src', src).appendTo(render); } else { $('<i />').attr('class', 'dropify-font-file').appendTo(render); $('<span class="dropify-extension" />').html(this.getFileType()).appendTo(render); } this.preview.fadeIn(); }; Dropify.prototype.resetPreview = function() { this.wrapper.removeClass('has-preview'); var render = this.preview.children('.dropify-render'); render.find('.dropify-extension').remove(); render.find('i').remove(); render.find('img').remove(); this.preview.hide(); }; Dropify.prototype.getFilename = function(src) { var filename = src.split('\\').pop(); if (filename == src) { filename = src.split('/').pop(); } return src != "" ? filename : ''; }; Dropify.prototype.setFilename = function(filename) { var filename = this.getFilename(filename); this.filename = filename; this.filenameWrapper.children('.dropify-filename-inner').html(filename); }; Dropify.prototype.clearElement = function() { this.file = null; this.input.val(''); this.resetPreview(); }; Dropify.prototype.setSize = function() { if (this.settings.height) { this.wrapper.height(this.settings.height); } }; Dropify.prototype.isTouchDevice = function() { return (('ontouchstart' in window) || (navigator.MaxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)); }; Dropify.prototype.getFileType = function() { return this.filename.split('.').pop().toLowerCase(); }; Dropify.prototype.isImage = function() { if (this.imgFileFormats.indexOf(this.getFileType()) != "-1") { return true; } return false; }; Dropify.prototype.translate = function() { for (var name in this.settings.tpl) { for (var key in this.settings.messages) { this.settings.tpl[name] = this.settings.tpl[name].replace(key, this.settings.messages[key]); } } }; Dropify.prototype.checkFileSize = function() { if (this.maxFileSizeToByte() === 0 || this.file.size <= this.maxFileSizeToByte()) { return true; } return false; }; Dropify.prototype.maxFileSizeToByte = function() { var value = 0; if (this.settings.maxFileSize !== 0) { var unit = this.settings.maxFileSize.slice(-1).toUpperCase(), kb = 1024, mb = kb * 1024, gb = mb * 1024; if (unit === 'K') { value = parseFloat(this.settings.maxFileSize) * kb; } else if (unit === 'M') { value = parseFloat(this.settings.maxFileSize) * mb; } else if (unit === 'G') { value = parseFloat(this.settings.maxFileSize) * gb; } } return value; }; $.fn[pluginName] = function(options) { this.each(function() { if (!$.data(this, "plugin_" + pluginName)) { $.data(this, "plugin_" + pluginName, new Dropify(this, options)); } }); return this; }; return Dropify; }));