Removed jQuery dependencies from Jua.js

This commit is contained in:
djmaze 2020-09-01 16:57:14 +02:00
parent 088945b636
commit 1802dda136
6 changed files with 224 additions and 491 deletions

View file

@ -80,26 +80,27 @@ Things might work in Edge 18, Firefox 50-62 and Chrome 54-68 due to one polyfill
* Removed momentjs (localization still used) * Removed momentjs (localization still used)
* Removed opentip (use CSS) * Removed opentip (use CSS)
* Removed non-community (aka Prem/Premium/License) code * Removed non-community (aka Prem/Premium/License) code
* Modified Jua.js to be without jQuery
|js/* |1.14.0 |native | |js/* |1.14.0 |native |
|----------- |--------: |--------: | |----------- |--------: |--------: |
|admin.js |2.130.942 | 963.702 | |admin.js |2.130.942 | 963.702 |
|app.js |4.184.455 |2.626.779 | |app.js |4.184.455 |2.626.733 |
|boot.js | 671.522 | 43.824 | |boot.js | 671.522 | 43.824 |
|libs.js | 647.614 | 315.759 | |libs.js | 647.614 | 313.912 |
|polyfills.js | 325.834 | 0 | |polyfills.js | 325.834 | 0 |
|TOTAL |7.960.367 |3.950.064 | |TOTAL |7.960.367 |3.948.171 |
|js/min/* |1.14.0 |native |gzip 1.14 |gzip |brotli | |js/min/* |1.14.0 |native |gzip 1.14 |gzip |brotli |
|--------------- |--------: |--------: |--------: |--------: |--------: | |--------------- |--------: |--------: |--------: |--------: |--------: |
|admin.min.js | 252.147 | 130.802 | 73.657 | 37.916 | 32.474 | |admin.min.js | 252.147 | 130.802 | 73.657 | 37.916 | 32.474 |
|app.min.js | 511.202 | 354.515 |140.462 | 93.408 | 74.849 | |app.min.js | 511.202 | 354.471 |140.462 | 93.386 | 74.944 |
|boot.min.js | 66.007 | 5.564 | 22.567 | 2.327 | 1.989 | |boot.min.js | 66.007 | 5.564 | 22.567 | 2.327 | 1.989 |
|libs.min.js | 572.545 | 299.283 |176.720 | 92.510 | 81.659 | |libs.min.js | 572.545 | 297.403 |176.720 | 92.006 | 81.186 |
|polyfills.min.js | 32.452 | 0 | 11.312 | 0 | 0 | |polyfills.min.js | 32.452 | 0 | 11.312 | 0 | 0 |
|TOTAL |1.434.353 | 790.164 |424.718 |226.161 |190.971 | |TOTAL |1.434.353 | 788.240 |424.718 |225.635 |190.593 |
644.189 bytes (198.557 gzip) is not much, but it feels faster. 646.113 bytes (199.083 gzip) is not much, but it feels faster.
### CSS changes ### CSS changes

View file

@ -86,13 +86,12 @@ class ThemesUserSettings {
initUploader() { initUploader() {
if (this.background.uploaderButton() && this.capaUserBackground()) { if (this.background.uploaderButton() && this.capaUserBackground()) {
const oJua = new Jua({ const oJua = new Jua({
'action': uploadBackground(), action: uploadBackground(),
'name': 'uploader', name: 'uploader',
'queueSize': 1, queueSize: 1,
'multipleSizeLimit': 1, multipleSizeLimit: 1,
'disableDragAndDrop': true, disableMultiple: true,
'disableMultiple': true, clickElement: this.background.uploaderButton()
'clickElement': this.background.uploaderButton()
}); });
oJua oJua

View file

@ -1182,12 +1182,12 @@ class ComposePopupView extends AbstractViewNext {
const uploadCache = {}, const uploadCache = {},
attachmentSizeLimit = pInt(Settings.settingsGet('AttachmentLimit')), attachmentSizeLimit = pInt(Settings.settingsGet('AttachmentLimit')),
oJua = new Jua({ oJua = new Jua({
'action': upload(), action: upload(),
'name': 'uploader', name: 'uploader',
'queueSize': 2, queueSize: 2,
'multipleSizeLimit': 50, multipleSizeLimit: 50,
'clickElement': this.composeUploaderButton(), clickElement: this.composeUploaderButton(),
'dragAndDropElement': this.composeUploaderDropPlace() dragAndDropElement: this.composeUploaderDropPlace()
}); });
if (oJua) { if (oJua) {

View file

@ -416,14 +416,13 @@ class ContactsPopupView extends AbstractViewNext {
initUploader() { initUploader() {
if (this.importUploaderButton()) { if (this.importUploaderButton()) {
const j = new Jua({ const j = new Jua({
'action': uploadContacts(), action: uploadContacts(),
'name': 'uploader', name: 'uploader',
'queueSize': 1, queueSize: 1,
'multipleSizeLimit': 1, multipleSizeLimit: 1,
'disableDragAndDrop': true, disableMultiple: true,
'disableMultiple': true, disableDocumentDropPrevent: true,
'disableDocumentDropPrevent': true, clickElement: this.importUploaderButton()
'clickElement': this.importUploaderButton()
}); });
if (j) { if (j) {

658
vendors/jua/jua.js vendored
View file

@ -2,11 +2,9 @@
(()=>{ (()=>{
'use strict'; 'use strict';
var
iDefLimit = 20,
$ = jQuery;
const const
doc = document,
iDefLimit = 20,
defined = v => undefined !== v, defined = v => undefined !== v,
/** /**
* @param {*} aItems * @param {*} aItems
@ -18,16 +16,14 @@
{ {
if (aItems && aItems.length) if (aItems && aItems.length)
{ {
var iLimit = defined(iLimit) ? parseInt(iLimit || 0, 10) : iDefLimit;
iInputLimit = 0, let
iInputLimit = iLimit,
oFile = null, oFile = null,
bUseLimit = false, bUseLimit = 0 < iLimit,
bCallLimit = false bCallLimit = false
; ;
iLimit = defined(iLimit) ? parseInt(iLimit || 0, 10) : iDefLimit;
iInputLimit = iLimit;
bUseLimit = 0 < iLimit;
Array.from(aItems).forEach(oItem => { Array.from(aItems).forEach(oItem => {
if (oItem) if (oItem)
{ {
@ -45,75 +41,12 @@
}); });
} }
}, },
/**
* @param {number=} iLen
* @return {string}
*/
fakeMd5 = iLen =>
{
var
sResult = '',
sLine = '0123456789abcdefghijklmnopqrstuvwxyz'
;
iLen = defined(iLen) ? parseInt(iLen || 0, 10) : 32; addEventListeners = (element, obj) => {
Object.entries(obj).forEach(([key, value]) => element.addEventListener(key, value));
while (iLen--)
sResult += sLine.substr(Math.round(Math.random() * 36), 1);
return sResult;
};
var Utils = {
/**
* @param {*} oParent
* @param {*} oDescendant
*
* @return {boolean}
*/
contains : (oParent, oDescendant) =>
{
if (oParent && oDescendant)
{
if (oParent === oDescendant)
{
return true;
}
if (oParent.contains)
{
return oParent.contains(oDescendant);
}
/*jshint bitwise: false*/
return oDescendant.compareDocumentPosition ?
!!(oDescendant.compareDocumentPosition(oParent) & 8) : false;
/*jshint bitwise: true*/
}
return false;
},
mainClearTimeout : iTimer =>
{
if (0 < iTimer)
{
clearTimeout(iTimer);
}
iTimer = 0;
},
/**
* @param {Event} oEvent
* @return {?Event}
*/
getEvent : oEvent =>
{
oEvent = (oEvent && (oEvent.originalEvent ?
oEvent.originalEvent : oEvent)) || window.event;
return oEvent.dataTransfer ? oEvent : null;
}, },
Utils = {
/** /**
* @param {Object} oValues * @param {Object} oValues
* @param {string} sKey * @param {string} sKey
@ -122,28 +55,13 @@
*/ */
getValue : (oValues, sKey, mDefault) => (!oValues || !sKey || !defined(oValues[sKey])) ? mDefault : oValues[sKey], getValue : (oValues, sKey, mDefault) => (!oValues || !sKey || !defined(oValues[sKey])) ? mDefault : oValues[sKey],
/**
* @param {Function} fFunction
* @param {Object=} oScope
* @return {Function}
*/
scopeBind : (fFunction, oScope) => (...args) => {
return fFunction.apply(defined(oScope) ? oScope : null,
Array.prototype.slice.call(args));
},
/**
* @return {string}
*/
getNewUid : () => 'jua-uid-' + fakeMd5(16) + '-' + (new Date()).getTime().toString(),
/** /**
* @param {*} oFile * @param {*} oFile
* @return {Object} * @return {Object}
*/ */
getDataFromFile : oFile => getDataFromFile : oFile =>
{ {
var let
sFileName = defined(oFile.fileName) ? oFile.fileName : (defined(oFile.name) ? oFile.name : null), sFileName = defined(oFile.fileName) ? oFile.fileName : (defined(oFile.name) ? oFile.name : null),
iSize = defined(oFile.fileSize) ? oFile.fileSize : (defined(oFile.size) ? oFile.size : null), iSize = defined(oFile.fileSize) ? oFile.fileSize : (defined(oFile.size) ? oFile.size : null),
sType = defined(oFile.type) ? oFile.type : null sType = defined(oFile.type) ? oFile.type : null
@ -168,116 +86,18 @@
}; };
}, },
/**
* @param {*} oInput
* @param {Function} fFileCallback
* @param {number=} iLimit = 20
* @param {Function=} fLimitCallback
*/
getDataFromInput : (oInput, fFileCallback, iLimit, fLimitCallback) =>
{
var aFiles = oInput && 0 < oInput.files.length ? oInput.files : null;
if (aFiles)
{
getDataFromFiles(aFiles, fFileCallback, iLimit, fLimitCallback);
}
else
{
fFileCallback({
'FileName': oInput.value.split('\\').pop().split('/').pop(),
'Size': null,
'Type': null,
'Folder': '',
'File' : null
});
}
},
eventContainsFiles : oEvent => eventContainsFiles : oEvent =>
{ {
var bResult = false; if (oEvent.dataTransfer && oEvent.dataTransfer.types && oEvent.dataTransfer.types.length) {
if (oEvent && oEvent.dataTransfer && oEvent.dataTransfer.types && oEvent.dataTransfer.types.length) let index = oEvent.dataTransfer.types.length;
{ while (index--) {
var if (oEvent.dataTransfer.types[index].toLowerCase() === 'files') {
iIindex = 0, return true;
iLen = oEvent.dataTransfer.types.length
;
for (; iIindex < iLen; iIindex++)
{
if (oEvent.dataTransfer.types[iIindex].toLowerCase() === 'files')
{
bResult = true;
break;
} }
} }
} }
return false;
return bResult; }
},
/**
* @param {Event} oEvent
* @param {Function} fFileCallback
* @param {number=} iLimit = 20
* @param {Function=} fLimitCallback
*/
getDataFromDragEvent : (oEvent, fFileCallback, iLimit, fLimitCallback) =>
{
var aFiles = null;
oEvent = Utils.getEvent(oEvent);
if (oEvent && Utils.eventContainsFiles(oEvent))
{
aFiles = (Utils.getValue(oEvent, 'files', null) || (oEvent.dataTransfer ?
Utils.getValue(oEvent.dataTransfer, 'files', null) : null));
getDataFromFiles(aFiles, fFileCallback, iLimit, fLimitCallback);
}
},
createNextLabel : () =>
{
return $('<label style="' +
'position: absolute; background-color:#fff; right: 0px; top: 0px; left: 0px; bottom: 0px; margin: 0px; padding: 0px; cursor: pointer;' +
'"></label>').css({
'opacity': 0
});
},
createNextInput : () => $('<input type="file" tabindex="-1" hidefocus="hidefocus" style="position: absolute; left: -9999px;" />'),
/**
* @param {string=} sName
* @param {boolean=} bMultiple = true
* @return {?Object}
*/
getNewInput : (sName, bMultiple) =>
{
sName = defined(sName) ? sName.toString() : '';
var oLocal = Utils.createNextInput();
if (0 < sName.length)
{
oLocal.attr('name', sName);
}
if (defined(bMultiple) ? bMultiple : true)
{
oLocal.prop('multiple', true);
}
return oLocal;
},
/**
* @param {?} mStringOrFunction
* @param {Array=} aFunctionParams
* @return {string}
*/
getStringOrCallFunction : (mStringOrFunction, aFunctionParams) => $.isFunction(mStringOrFunction) ?
mStringOrFunction.apply(null, Array.isArray(aFunctionParams) ? aFunctionParams : []).toString() :
mStringOrFunction.toString()
}; };
@ -319,7 +139,7 @@
try try
{ {
var const
self = this, self = this,
oXhr = new XMLHttpRequest(), oXhr = new XMLHttpRequest(),
oFormData = new FormData(), oFormData = new FormData(),
@ -347,7 +167,7 @@
{ {
if (fCompleteFunction) if (fCompleteFunction)
{ {
var let
bResult = false, bResult = false,
oResult = null oResult = null
; ;
@ -389,9 +209,9 @@
oFormData.append('jua-post-type', 'ajax'); oFormData.append('jua-post-type', 'ajax');
oFormData.append(Utils.getValue(this.oOptions, 'name', 'juaFile'), oFileInfo['File']); oFormData.append(Utils.getValue(this.oOptions, 'name', 'juaFile'), oFileInfo['File']);
$.each(aHidden, function (sKey, sValue) { Object.entries(aHidden).forEach(([key, value]) =>
oFormData.append(sKey, Utils.getStringOrCallFunction(sValue, [oFileInfo])); oFormData.append(key, (typeof value === "function" ? value(oFileInfo) : value).toString())
}); );
oXhr.send(oFormData); oXhr.send(oFormData);
@ -408,40 +228,43 @@
generateNewInput(oClickElement) generateNewInput(oClickElement)
{ {
var
self = this,
oLabel = null,
oInput = null
;
if (oClickElement) if (oClickElement)
{ {
oInput = Utils.getNewInput('', !Utils.getValue(this.oOptions, 'disableMultiple', false)); const self = this,
oLabel = Utils.createNextLabel(); oLabel = doc.createElement('label'),
oLabel.append(oInput); oInput = oLabel.appendChild(doc.createElement('input'));
$(oClickElement).append(oLabel); oInput.type = 'file';
oInput.tabIndex = -1;
oInput.style.cssText = 'position:absolute;left:-9999px;';
oInput.multiple = !Utils.getValue(self.oOptions, 'disableMultiple', false);
oInput oLabel.style.cssText = 'position:absolute;background-color:#fff;right:0;top:0;left:0;bottom:0;margin:0;padding:0;cursor:pointer;opacity:0';
.on('click', function () {
var fOn = self.oJua.getEvent('onDialog');
if (fOn)
{
fOn();
}
})
.on('change', function () {
Utils.getDataFromInput(this, oFile => {
self.oJua.addNewFile(oFile);
self.generateNewInput(oClickElement);
setTimeout(() => oLabel.remove(), 10); oClickElement.append(oLabel);
},
oInput.addEventListener('input', () => {
const fFileCallback = oFile => {
self.oJua.addNewFile(oFile);
self.generateNewInput(oClickElement);
setTimeout(() => oLabel.remove(), 10);
};
if (oInput.files && oInput.files.length) {
getDataFromFiles(oInput.files, fFileCallback,
Utils.getValue(self.oOptions, 'multipleSizeLimit', iDefLimit), Utils.getValue(self.oOptions, 'multipleSizeLimit', iDefLimit),
self.oJua.getEvent('onLimitReached') self.oJua.getEvent('onLimitReached')
); );
}) } else {
; fFileCallback({
'FileName': oInput.value.split('\\').pop().split('/').pop(),
'Size': null,
'Type': null,
'Folder': '',
'File' : null
});
}
});
} }
} }
@ -490,7 +313,7 @@
function queue(a) { function queue(a) {
function l() { function l() {
if (g && d < a) { if (g && d < a) {
var b = g, let b = g,
c = b[0], c = b[0],
f = Array.prototype.slice.call(b, 1), f = Array.prototype.slice.call(b, 1),
m = b.index; m = b.index;
@ -502,7 +325,7 @@
c.apply(null, f) c.apply(null, f)
} }
} }
var c = {}, let c = {},
d = 0, d = 0,
e = 0, e = 0,
f = -1, f = -1,
@ -511,7 +334,7 @@
k = ()=>{}; k = ()=>{};
return arguments.length < 1 && (a = Infinity), c.defer = function () { return arguments.length < 1 && (a = Infinity), c.defer = function () {
if (!i) { if (!i) {
var a = arguments; let a = arguments;
a.index = ++f, h ? (h.next = a, h = h.next) : g = h = a, ++e, l() a.index = ++f, h ? (h.next = a, h = h.next) : g = h = a, ++e, l()
} }
return c return c
@ -530,251 +353,159 @@
{ {
oOptions = defined(oOptions) ? oOptions : {}; oOptions = defined(oOptions) ? oOptions : {};
var const self = this;
self = this,
$ = jQuery
;
self.bEnableDnD = true;
self.oEvents = { self.oEvents = {
'onDialog': null, onSelect: null,
'onSelect': null, onStart: null,
'onStart': null, onComplete: null,
'onComplete': null, onProgress: null,
'onCompleteAll': null, onDragEnter: null,
'onProgress': null, onDragLeave: null,
'onDragEnter': null, onBodyDragEnter: null,
'onDragLeave': null, onBodyDragLeave: null,
'onDrop': null, onLimitReached: null
'onBodyDragEnter': null,
'onBodyDragLeave': null,
'onLimitReached': null
}; };
self.oOptions = { self.oOptions = {
'action': '', action: '',
'name': '', name: '',
'hidden': {}, hidden: {},
'queueSize': 10, queueSize: 10,
'clickElement': false, clickElement: false,
'dragAndDropElement': false, dragAndDropElement: false,
'dragAndDropBodyElement': false, dragAndDropBodyElement: false,
'disableDragAndDrop': false, disableMultiple: false,
'disableMultiple': false, disableDocumentDropPrevent: false,
'disableDocumentDropPrevent': false, multipleSizeLimit: 50
'multipleSizeLimit': 50
}; };
Object.entries(oOptions).forEach(([key, value])=>self.oOptions[key]=value); Object.entries(oOptions).forEach(([key, value]) => self.oOptions[key] = value);
self.oQueue = queue(parseInt(Utils.getValue(self.oOptions, 'queueSize', 10) || 0, 10)); self.oQueue = queue(parseInt(Utils.getValue(self.oOptions, 'queueSize', 10) || 0, 10));
if (self.runEvent('onCompleteAll'))
{
self.oQueue.await(function () {
self.runEvent('onCompleteAll');
});
}
self.oDriver = new AjaxDriver(self, self.oOptions); self.oDriver = new AjaxDriver(self, self.oOptions);
self.oClickElement = Utils.getValue(self.oOptions, 'clickElement', null); const el = Utils.getValue(self.oOptions, 'clickElement', null);
if (el) {
if (self.oClickElement) el.style.position = 'relative';
{ el.style.overflow = 'hidden';
$(self.oClickElement).css({ if ('inline' === el.style.display) {
'position': 'relative', el.style.display = 'inline-block';
'overflow': 'hidden'
});
if ('inline' === $(this.oClickElement).css('display'))
{
$(this.oClickElement).css('display', 'inline-block');
} }
this.oDriver.generateNewInput(this.oClickElement); this.oDriver.generateNewInput(el);
} }
if (Utils.getValue(this.oOptions, 'dragAndDropElement', false)) if (Utils.getValue(this.oOptions, 'dragAndDropElement', false))
{ {
(function (self) { let
var oBigDropZone = Utils.getValue(self.oOptions, 'dragAndDropBodyElement', false) || doc,
$doc = $(document), oDragAndDropElement = Utils.getValue(self.oOptions, 'dragAndDropElement', false);
oBigDropZone = $(Utils.getValue(self.oOptions, 'dragAndDropBodyElement', false) || $doc),
oDragAndDropElement = Utils.getValue(self.oOptions, 'dragAndDropElement', false), if (oDragAndDropElement)
fHandleDragOver = function (oEvent) { {
if (self.bEnableDnD && oEvent) if (!Utils.getValue(self.oOptions, 'disableDocumentDropPrevent', false))
{
doc.addEventListener('dragover', oEvent => {
if (Utils.eventContainsFiles(oEvent))
{ {
oEvent = Utils.getEvent(oEvent); try
if (oEvent && oEvent.dataTransfer && Utils.eventContainsFiles(oEvent))
{ {
try oEvent.dataTransfer.dropEffect = 'none';
{ oEvent.preventDefault();
var sEffect = oEvent.dataTransfer.effectAllowed; }
catch (oExc) {}
}
});
}
Utils.mainClearTimeout(self.iDocTimer); if (oBigDropZone)
{
addEventListeners(oBigDropZone, {
dragover: () => self.docTimer.clear(),
dragenter: oEvent => {
if (Utils.eventContainsFiles(oEvent))
{
self.docTimer.clear();
oEvent.preventDefault();
oEvent.dataTransfer.dropEffect = (sEffect === 'move' || sEffect === 'linkMove') ? 'move' : 'copy'; self.runEvent('onBodyDragEnter', [oEvent]);
}
},
dragleave: oEvent =>
oEvent.dataTransfer && self.docTimer.start(() => self.runEvent('onBodyDragLeave', [oEvent])),
drop: oEvent => {
if (oEvent.dataTransfer) {
let bFiles = Utils.eventContainsFiles(oEvent);
bFiles && oEvent.preventDefault();
oEvent.stopPropagation(); self.runEvent('onBodyDragLeave', [oEvent]);
oEvent.preventDefault();
oBigDropZone.trigger('dragover', oEvent); return !bFiles;
} }
catch (oExc) {}
return false;
}
});
}
addEventListeners(oDragAndDropElement, {
dragenter: oEvent => {
if (Utils.eventContainsFiles(oEvent)) {
self.docTimer.clear();
oEvent.preventDefault();
self.runEvent('onDragEnter', [oDragAndDropElement, oEvent]);
}
},
dragover: oEvent => {
if (Utils.eventContainsFiles(oEvent)) {
try
{
let sEffect = oEvent.dataTransfer.effectAllowed;
self.docTimer.clear();
oEvent.dataTransfer.dropEffect = (sEffect === 'move' || sEffect === 'linkMove') ? 'move' : 'copy';
oEvent.stopPropagation();
oEvent.preventDefault();
oBigDropZone && oBigDropZone.dispatchEvent(oEvent);
}
catch (oExc) {}
}
},
dragleave: oEvent => {
if (oEvent.dataTransfer) {
let oRelatedTarget = doc.elementFromPoint(oEvent.clientX, oEvent.clientY);
if (!oRelatedTarget || !oDragAndDropElement.contains(oRelatedTarget)) {
self.docTimer.clear();
self.runEvent('onDragLeave', [oDragAndDropElement, oEvent]);
} }
} }
}, },
fHandleDrop = function (oEvent) { drop: oEvent => {
if (self.bEnableDnD && oEvent) if (Utils.eventContainsFiles(oEvent)) {
{ oEvent.preventDefault();
oEvent = Utils.getEvent(oEvent);
if (oEvent && Utils.eventContainsFiles(oEvent))
{
oEvent.preventDefault();
Utils.getDataFromDragEvent(oEvent, function (oFile) { getDataFromFiles(
if (oFile) Utils.getValue(oEvent, 'files', null) || Utils.getValue(oEvent.dataTransfer, 'files', null),
{ oFile => {
self.runEvent('onDrop', [oFile, oEvent]); if (oFile) {
self.addNewFile(oFile); self.addNewFile(oFile);
Utils.mainClearTimeout(self.iDocTimer); self.docTimer.clear();
} }
}, },
Utils.getValue(self.oOptions, 'multipleSizeLimit', iDefLimit), Utils.getValue(self.oOptions, 'multipleSizeLimit', iDefLimit),
self.getEvent('onLimitReached') self.getEvent('onLimitReached')
); );
}
} }
self.runEvent('onDragLeave', [oEvent]); self.runEvent('onDragLeave', [oEvent]);
},
fHandleDragEnter = function (oEvent) {
if (self.bEnableDnD && oEvent)
{
oEvent = Utils.getEvent(oEvent);
if (oEvent && Utils.eventContainsFiles(oEvent))
{
Utils.mainClearTimeout(self.iDocTimer);
oEvent.preventDefault();
self.runEvent('onDragEnter', [oDragAndDropElement, oEvent]);
}
}
},
fHandleDragLeave = function (oEvent) {
if (self.bEnableDnD && oEvent)
{
oEvent = Utils.getEvent(oEvent);
if (oEvent)
{
var oRelatedTarget = document['elementFromPoint'] ? document['elementFromPoint'](oEvent['clientX'], oEvent['clientY']) : null;
if (oRelatedTarget && Utils.contains(this, oRelatedTarget))
{
return;
}
Utils.mainClearTimeout(self.iDocTimer);
self.runEvent('onDragLeave', [oDragAndDropElement, oEvent]);
}
return;
}
} }
; });
}
if (oDragAndDropElement)
{
if (!Utils.getValue(self.oOptions, 'disableDocumentDropPrevent', false))
{
$doc.on('dragover', function (oEvent) {
if (self.bEnableDnD && oEvent)
{
oEvent = Utils.getEvent(oEvent);
if (oEvent && oEvent.dataTransfer && Utils.eventContainsFiles(oEvent))
{
try
{
oEvent.dataTransfer.dropEffect = 'none';
oEvent.preventDefault();
}
catch (oExc) {}
}
}
});
}
if (oBigDropZone && oBigDropZone[0])
{
oBigDropZone
.on('dragover', function (oEvent) {
if (self.bEnableDnD && oEvent)
{
Utils.mainClearTimeout(self.iDocTimer);
}
})
.on('dragenter', function (oEvent) {
if (self.bEnableDnD && oEvent)
{
oEvent = Utils.getEvent(oEvent);
if (oEvent && Utils.eventContainsFiles(oEvent))
{
Utils.mainClearTimeout(self.iDocTimer);
oEvent.preventDefault();
self.runEvent('onBodyDragEnter', [oEvent]);
}
}
})
.on('dragleave', function (oEvent) {
if (self.bEnableDnD && oEvent)
{
oEvent = Utils.getEvent(oEvent);
if (oEvent)
{
Utils.mainClearTimeout(self.iDocTimer);
self.iDocTimer = setTimeout(function () {
self.runEvent('onBodyDragLeave', [oEvent]);
}, 200);
}
}
})
.on('drop', function (oEvent) {
if (self.bEnableDnD && oEvent)
{
oEvent = Utils.getEvent(oEvent);
if (oEvent)
{
var bFiles = Utils.eventContainsFiles(oEvent);
if (bFiles)
{
oEvent.preventDefault();
}
self.runEvent('onBodyDragLeave', [oEvent]);
return !bFiles;
}
}
return false;
})
;
}
$(oDragAndDropElement)
.on('dragenter', fHandleDragEnter)
.on('dragover', fHandleDragOver)
.on('dragleave', fHandleDragLeave)
.on('drop', fHandleDrop)
;
}
}(self));
}
else
{
self.bEnableDnD = false;
} }
} }
@ -816,20 +547,19 @@
this.oDriver.cancel(sUid); this.oDriver.cancel(sUid);
} }
/**
* @param {boolean} bEnabled
*/
setDragAndDropEnabledStatus(bEnabled)
{
this.bEnableDnD = !!bEnabled;
}
/** /**
* @param {Object} oFileInfo * @param {Object} oFileInfo
*/ */
addNewFile(oFileInfo) addNewFile(oFileInfo)
{ {
this.addFile(Utils.getNewUid(), oFileInfo); let iLen = 16,
fakeMd5 = '',
sLine = '0123456789abcdefghijklmnopqrstuvwxyz';
while (iLen--)
fakeMd5 += sLine.substr(Math.round(Math.random() * 36), 1);
this.addFile('jua-uid-' + fakeMd5 + '-' + (new Date()).getTime().toString(), oFileInfo);
} }
/** /**
@ -838,11 +568,11 @@
*/ */
addFile(sUid, oFileInfo) addFile(sUid, oFileInfo)
{ {
var fOnSelect = this.getEvent('onSelect'); const fOnSelect = this.getEvent('onSelect');
if (oFileInfo && (!fOnSelect || (false !== fOnSelect(sUid, oFileInfo)))) if (oFileInfo && (!fOnSelect || (false !== fOnSelect(sUid, oFileInfo))))
{ {
this.oDriver.regTaskUid(sUid); this.oDriver.regTaskUid(sUid);
this.oQueue.defer(Utils.scopeBind(this.oDriver.uploadTask, this.oDriver), sUid, oFileInfo); this.oQueue.defer((...args) => this.oDriver.uploadTask(...args), sUid, oFileInfo);
} }
else else
{ {
@ -851,15 +581,19 @@
} }
} }
/**
* @type {boolean}
*/
Jua.prototype.bEnableDnD = true;
/** /**
* @type {number} * @type {number}
*/ */
Jua.prototype.iDocTimer = 0; Jua.prototype.docTimer = {
start: function(fn){
this.clear();
this.timer = setTimeout(fn, 200);
},
clear: function(){
this.timer && clearTimeout(this.timer);
this.timer = 0;
}
};
/** /**
* @type {Object} * @type {Object}

File diff suppressed because one or more lines are too long