123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- ;
- (function($, window, document, undefined) {
- window.addEventListener("dragover", function(e) {
- e = e || event;
- e.preventDefault();
- }, false);
- window.addEventListener("drop", function(e) {
- e = e || event;
- e.preventDefault();
- }, false);
- const compareMimeType = (mimeTypes, fileType, formatFile) => {
- if (mimeTypes.length < 2 && mimeTypes[0] === "*") {
- return true;
- }
- for (let index = 1; index < mimeTypes.length; index += 3) {
- if (mimeTypes[index + 1] === "*" && fileType.search(new RegExp(mimeTypes[index])) != -1) {
- return true;
- } else if (mimeTypes[index + 1] && mimeTypes[index + 1] != "*" && fileType.search(new RegExp("\\*" + mimeTypes[index + 1] + "\\*")) != -1) {
- return true;
- } else if (mimeTypes[index + 1] && mimeTypes[index + 1] != "*" && fileType.search(new RegExp(mimeTypes[index + 1])) != -1) {
- return true;
- } else if (mimeTypes[index + 1] === "" && (fileType.search(new RegExp(mimeTypes[index])) != -1 || formatFile.search(new RegExp(mimeTypes[index])) != -1)) {
- return true;
- }
- }
- return false;
- }
- $.fn.imageuploadify = function(opts) {
- const settings = $.extend({}, $.fn.imageuploadify.defaults, opts);
- this.each(function() {
- const self = this;
- if (!$(self).attr("multiple")) {
- return;
- }
- let accept = $(self).attr("accept") ? $(self).attr("accept").replace(/\s/g, "").split(",") : null;
- let result = [];
- accept.forEach((item) => {
- let regexp;
- if (item.search(/\//) != -1) {
- regexp = new RegExp("([A-Za-z-.]*)\/([A-Za-z-*.]*)", "g");
- } else {
- regexp = new RegExp("\.([A-Za-z-]*)()", "g");
- }
- const r = regexp.exec(item);
- result = result.concat(r);
- });
- let totalFiles = [];
- let counter = 0;
- let dragbox = $(`<div class="imageuploadify well"><div class="imageuploadify-overlay"><i class="fa fa-picture-o"></i></div><div class="imageuploadify-images-list text-center"><i class="bx bxs-cloud-upload"></i><span class='imageuploadify-message'>Drag&Drop Your File(s)Here To Upload</span><button type="button"class="btn btn-default">or select file to upload</button></div></div>`);
- let overlay = dragbox.find(".imageuploadify-overlay");
- let uploadIcon = dragbox.find(".imageuploadify-overlay i");
- let imagesList = dragbox.find(".imageuploadify-images-list");
- let addIcon = dragbox.find(".imageuploadify-images-list i");
- let addMsg = dragbox.find(".imageuploadify-images-list span");
- let button = dragbox.find(".imageuploadify-images-list button");
- const retrieveFiles = (files) => {
- for (let index = 0; index < files.length; ++index) {
- if (!accept || compareMimeType(result, files[index].type, /(?:\.([^.]+))?$/.exec(files[index].name)[1])) {
- const id = Math.random().toString(36).substr(2, 9);
- readingFile(id, files[index]);
- totalFiles.push({
- id: id,
- file: files[index]
- });
- }
- }
- }
- const readingFile = (id, file) => {
- const fReader = new FileReader();
- const width = dragbox.width();
- const boxesNb = Math.floor(width / 100);
- const marginSize = Math.floor((width - (boxesNb * 100)) / (boxesNb + 1));
- let container = $(`<div class='imageuploadify-container'><button type='button'class='btn btn-danger bx bx-x'></button><div class='imageuploadify-details'><span>${file.name}</span><span>${file.type}</span><span>${file.size}</span></div></div>`);
- let details = container.find(".imageuploadify-details");
- let deleteBtn = container.find("button");
- container.css("margin-left", marginSize + "px");
- details.hover(function() {
- $(this).css("opacity", "1");
- }).mouseleave(function() {
- $(this).css("opacity", "0");
- });
- if (file.type && file.type.search(/image/) != -1) {
- fReader.onloadend = function(e) {
- let image = $("<img>");
- image.attr("src", e.target.result);
- container.append(image);
- imagesList.append(container);
- imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+4)").css("margin-left", marginSize + "px");
- imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+3)").css("margin-right", marginSize + "px");
- };
- } else if (file.type) {
- let type = "<i class='fa fa-file'></i>";
- if (file.type.search(/audio/) != -1) {
- type = "<i class='fa fa-file-audio-o'></i>";
- } else if (file.type.search(/video/) != -1) {
- type = "<i class='fa fa-file-video-o'></i>";
- }
- fReader.onloadend = function(e) {
- let span = $("<span>" + type + "</span>");
- span.css("font-size", "5em");
- container.append(span);
- imagesList.append(container);
- imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+4)").css("margin-left", marginSize + "px");
- imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+3)").css("margin-right", marginSize + "px");
- };
- }
- deleteBtn.on("click", function() {
- $(this.parentElement).remove();
- for (let index = 0; totalFiles.length > index; ++index) {
- if (totalFiles[index].id === id) {
- totalFiles.splice(index, 1);
- break;
- }
- }
- });
- fReader.readAsDataURL(file);
- };
- const disableMouseEvents = () => {
- overlay.css("display", "flex");
- dragbox.css("border-color", "#3AA0FF");
- button.css("pointer-events", "none");
- addMsg.css("pointer-events", "none");
- addIcon.css("pointer-events", "none");
- imagesList.css("pointer-events", "none");
- }
- const enableMouseEvents = () => {
- overlay.css("display", "none");
- dragbox.css("border-color", "rgb(210, 210, 210)");
- button.css("pointer-events", "initial");
- addMsg.css("pointer-events", "initial");
- addIcon.css("pointer-events", "initial");
- imagesList.css("pointer-events", "initial");
- }
- button.mouseenter(function onMouseEnter(event) {
- button.css("background", "#3AA0FF").css("color", "white");
- }).mouseleave(function onMouseLeave() {
- button.css("background", "white").css("color", "#3AA0FF");
- });
- button.on("click", function onClick(event) {
- event.stopPropagation();
- event.preventDefault();
- $(self).click();
- });
- dragbox.on("dragenter", function onDragenter(event) {
- event.stopPropagation();
- event.preventDefault();
- counter++;
- disableMouseEvents();
- });
- dragbox.on("dragleave", function onDragLeave(event) {
- event.stopPropagation();
- event.preventDefault();
- counter--;
- if (counter === 0) {
- enableMouseEvents();
- }
- });
- dragbox.on("drop", function onDrop(event) {
- event.stopPropagation();
- event.preventDefault();
- enableMouseEvents();
- const files = event.originalEvent.dataTransfer.files;
- retrieveFiles(files);
- });
- $(window).bind("resize", function(e) {
- window.resizeEvt;
- $(window).resize(function() {
- clearTimeout(window.resizeEvt);
- window.resizeEvt = setTimeout(function() {
- const width = dragbox.width();
- const boxesNb = Math.floor(width / 100);
- const marginSize = Math.floor((width - (boxesNb * 100)) / (boxesNb + 1));
- let containers = imagesList.find(".imageuploadify-container");
- for (let index = 0; index < containers.length; ++index) {
- $(containers[index]).css("margin-right", "0px");
- $(containers[index]).css("margin-left", marginSize + "px");
- }
- imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+4)").css("margin-left", marginSize + "px");
- imagesList.find(".imageuploadify-container:nth-child(" + boxesNb + "n+3)").css("margin-right", marginSize + "px");
- }, 500);
- });
- })
- $(self).on("change", function onChange() {
- const files = this.files;
- retrieveFiles(files);
- });
- $(self).closest("form").on("submit", function(event) {
- event.stopPropagation();
- event.preventDefault(event);
- const inputs = this.querySelectorAll("input, textarea, select, button");
- const formData = new FormData();
- for (let index = 0; index < inputs.length; ++index) {
- if (inputs[index].tagName === "SELECT" && inputs[index].hasAttribute("multiple")) {
- const options = inputs[index].options;
- for (let i = 0; options.length > i; ++i) {
- if (options[i].selected) {
- formData.append(inputs[index].getAttribute("name"), options[i].value);
- }
- }
- } else if (!inputs[index].getAttribute("type") || ((inputs[index].getAttribute("type").toLowerCase()) !== "checkbox" && (inputs[index].getAttribute("type").toLowerCase()) !== "radio") || inputs[index].checked) {
- formData.append(inputs[index].name, inputs[index].value);
- } else if ($(inputs[index]).getAttribute("type") != "file") {
- formData.append(inputs[index].name, inputs[index].value);
- }
- }
- for (var i = 0; i < totalFiles.length; i++) {
- formData.append(self.name, totalFiles[i].file);
- }
- var xhr = new XMLHttpRequest();
- xhr.onreadystatechange = function(e) {
- if (xhr.status == 200 && xhr.readyState === XMLHttpRequest.DONE) {
- window.location.replace(xhr.responseURL);
- }
- }
- xhr.open("POST", $(this).attr("action"), true);
- xhr.send(formData);
- return false;
- });
- $(self).hide();
- dragbox.insertAfter(this);
- });
- return this;
- };
- $.fn.imageuploadify.defaults = {};
- }(jQuery, window, document));
|