mirror of https://github.com/lukechilds/docs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
6.3 KiB
219 lines
6.3 KiB
/*! UIkit 3.0.0-rc.17 | http://www.getuikit.com | (c) 2014 - 2018 YOOtheme | MIT License */
|
|
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('uikit-util')) :
|
|
typeof define === 'function' && define.amd ? define('uikitupload', ['uikit-util'], factory) :
|
|
(global.UIkitUpload = factory(global.UIkit.util));
|
|
}(this, (function (uikitUtil) { 'use strict';
|
|
|
|
var Component = {
|
|
|
|
props: {
|
|
allow: String,
|
|
clsDragover: String,
|
|
concurrent: Number,
|
|
maxSize: Number,
|
|
method: String,
|
|
mime: String,
|
|
msgInvalidMime: String,
|
|
msgInvalidName: String,
|
|
msgInvalidSize: String,
|
|
multiple: Boolean,
|
|
name: String,
|
|
params: Object,
|
|
type: String,
|
|
url: String,
|
|
},
|
|
|
|
data: {
|
|
allow: false,
|
|
clsDragover: 'uk-dragover',
|
|
concurrent: 1,
|
|
maxSize: 0,
|
|
method: 'POST',
|
|
mime: false,
|
|
msgInvalidMime: 'Invalid File Type: %s',
|
|
msgInvalidName: 'Invalid File Name: %s',
|
|
msgInvalidSize: 'Invalid File Size: %s Kilobytes Max',
|
|
multiple: false,
|
|
name: 'files[]',
|
|
params: {},
|
|
type: '',
|
|
url: '',
|
|
abort: uikitUtil.noop,
|
|
beforeAll: uikitUtil.noop,
|
|
beforeSend: uikitUtil.noop,
|
|
complete: uikitUtil.noop,
|
|
completeAll: uikitUtil.noop,
|
|
error: uikitUtil.noop,
|
|
fail: uikitUtil.noop,
|
|
load: uikitUtil.noop,
|
|
loadEnd: uikitUtil.noop,
|
|
loadStart: uikitUtil.noop,
|
|
progress: uikitUtil.noop
|
|
},
|
|
|
|
events: {
|
|
|
|
change: function(e) {
|
|
|
|
if (!uikitUtil.matches(e.target, 'input[type="file"]')) {
|
|
return;
|
|
}
|
|
|
|
e.preventDefault();
|
|
|
|
if (e.target.files) {
|
|
this.upload(e.target.files);
|
|
}
|
|
|
|
e.target.value = '';
|
|
},
|
|
|
|
drop: function(e) {
|
|
stop(e);
|
|
|
|
var transfer = e.dataTransfer;
|
|
|
|
if (!transfer || !transfer.files) {
|
|
return;
|
|
}
|
|
|
|
uikitUtil.removeClass(this.$el, this.clsDragover);
|
|
|
|
this.upload(transfer.files);
|
|
},
|
|
|
|
dragenter: function(e) {
|
|
stop(e);
|
|
},
|
|
|
|
dragover: function(e) {
|
|
stop(e);
|
|
uikitUtil.addClass(this.$el, this.clsDragover);
|
|
},
|
|
|
|
dragleave: function(e) {
|
|
stop(e);
|
|
uikitUtil.removeClass(this.$el, this.clsDragover);
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
upload: function(files) {
|
|
var this$1 = this;
|
|
|
|
|
|
if (!files.length) {
|
|
return;
|
|
}
|
|
|
|
uikitUtil.trigger(this.$el, 'upload', [files]);
|
|
|
|
for (var i = 0; i < files.length; i++) {
|
|
|
|
if (this$1.maxSize && this$1.maxSize * 1000 < files[i].size) {
|
|
this$1.fail(this$1.msgInvalidSize.replace('%s', this$1.maxSize));
|
|
return;
|
|
}
|
|
|
|
if (this$1.allow && !match(this$1.allow, files[i].name)) {
|
|
this$1.fail(this$1.msgInvalidName.replace('%s', this$1.allow));
|
|
return;
|
|
}
|
|
|
|
if (this$1.mime && !match(this$1.mime, files[i].type)) {
|
|
this$1.fail(this$1.msgInvalidMime.replace('%s', this$1.mime));
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
if (!this.multiple) {
|
|
files = [files[0]];
|
|
}
|
|
|
|
this.beforeAll(this, files);
|
|
|
|
var chunks = chunk(files, this.concurrent);
|
|
var upload = function (files) {
|
|
|
|
var data = new FormData();
|
|
|
|
files.forEach(function (file) { return data.append(this$1.name, file); });
|
|
|
|
for (var key in this$1.params) {
|
|
data.append(key, this$1.params[key]);
|
|
}
|
|
|
|
uikitUtil.ajax(this$1.url, {
|
|
data: data,
|
|
method: this$1.method,
|
|
responseType: this$1.type,
|
|
beforeSend: function (env) {
|
|
|
|
var xhr = env.xhr;
|
|
xhr.upload && uikitUtil.on(xhr.upload, 'progress', this$1.progress);
|
|
['loadStart', 'load', 'loadEnd', 'abort'].forEach(function (type) { return uikitUtil.on(xhr, type.toLowerCase(), this$1[type]); }
|
|
);
|
|
|
|
this$1.beforeSend(env);
|
|
|
|
}
|
|
}).then(
|
|
function (xhr) {
|
|
|
|
this$1.complete(xhr);
|
|
|
|
if (chunks.length) {
|
|
upload(chunks.shift());
|
|
} else {
|
|
this$1.completeAll(xhr);
|
|
}
|
|
|
|
},
|
|
function (e) { return this$1.error(e); }
|
|
);
|
|
|
|
};
|
|
|
|
upload(chunks.shift());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
function match(pattern, path) {
|
|
return path.match(new RegExp(("^" + (pattern.replace(/\//g, '\\/').replace(/\*\*/g, '(\\/[^\\/]+)*').replace(/\*/g, '[^\\/]+').replace(/((?!\\))\?/g, '$1.')) + "$"), 'i'));
|
|
}
|
|
|
|
function chunk(files, size) {
|
|
var chunks = [];
|
|
for (var i = 0; i < files.length; i += size) {
|
|
var chunk = [];
|
|
for (var j = 0; j < size; j++) {
|
|
chunk.push(files[i + j]);
|
|
}
|
|
chunks.push(chunk);
|
|
}
|
|
return chunks;
|
|
}
|
|
|
|
function stop(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
|
|
/* global UIkit, 'upload' */
|
|
|
|
if (typeof window !== 'undefined' && window.UIkit) {
|
|
window.UIkit.component('upload', Component);
|
|
}
|
|
|
|
return Component;
|
|
|
|
})));
|
|
|