@dragon/utils
Version:
Vanilla implementtation of utils functions used in dragon lib
744 lines (589 loc) • 18.2 kB
JavaScript
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 6);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var g;
// This works in non-strict mode
g = function () {
return this;
}();
try {
// This works if eval is allowed (see CSP)
g = g || Function("return this")() || (1, eval)("this");
} catch (e) {
// This works if the window reference is available
if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var cache = {};
var start = '(?:^|\\s)';
var end = '(?:\\s|$)';
function lookup(className) {
var cached = cache[className];
if (cached) {
cached.lastIndex = 0;
} else {
cache[className] = cached = new RegExp(start + className + end, 'g');
}
return cached;
}
function add(el, className) {
var current = el.className;
if (!current.length) {
el.className = className;
} else if (!lookup(className).test(current)) {
el.className += ' ' + className;
}
}
function rm(el, className) {
el.className = el.className.replace(lookup(className), ' ').trim();
}
exports.default = {
add: add,
rm: rm
};
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
;
/* WEBPACK VAR INJECTION */(function(global) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = touchy;
var _crossvent = __webpack_require__(3);
var _crossvent2 = _interopRequireDefault(_crossvent);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function touchy(el, op, type, fn) {
var touch = {
mouseup: 'touchend',
mousedown: 'touchstart',
mousemove: 'touchmove'
};
var pointers = {
mouseup: 'pointerup',
mousedown: 'pointerdown',
mousemove: 'pointermove'
};
var microsoft = {
mouseup: 'MSPointerUp',
mousedown: 'MSPointerDown',
mousemove: 'MSPointerMove'
/** @namespace global.navigator.pointerEnabled -- resolving webstorm unresolved variables */
/** @namespace global.navigator.msPointerEnabled -- resolving webstorm unresolved variables */
};if (global.navigator.pointerEnabled) {
_crossvent2.default[op](el, pointers[type], fn, { passive: false });
} else if (global.navigator.msPointerEnabled) {
_crossvent2.default[op](el, microsoft[type], fn, { passive: false });
} else {
_crossvent2.default[op](el, touch[type], fn, { passive: false });
_crossvent2.default[op](el, type, fn, { passive: false });
}
}
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
;
/* WEBPACK VAR INJECTION */(function(global) {
var customEvent = __webpack_require__(5);
var eventmap = __webpack_require__(4);
var doc = global.document;
var addEvent = addEventEasy;
var removeEvent = removeEventEasy;
var hardCache = [];
if (!global.addEventListener) {
addEvent = addEventHard;
removeEvent = removeEventHard;
}
module.exports = {
add: addEvent,
remove: removeEvent,
fabricate: fabricateEvent
};
function addEventEasy(el, type, fn, capturing) {
return el.addEventListener(type, fn, capturing);
}
function addEventHard(el, type, fn) {
return el.attachEvent('on' + type, wrap(el, type, fn));
}
function removeEventEasy(el, type, fn, capturing) {
return el.removeEventListener(type, fn, capturing);
}
function removeEventHard(el, type, fn) {
var listener = unwrap(el, type, fn);
if (listener) {
return el.detachEvent('on' + type, listener);
}
}
function fabricateEvent(el, type, model) {
var e = eventmap.indexOf(type) === -1 ? makeCustomEvent() : makeClassicEvent();
if (el.dispatchEvent) {
el.dispatchEvent(e);
} else {
el.fireEvent('on' + type, e);
}
function makeClassicEvent() {
var e;
if (doc.createEvent) {
e = doc.createEvent('Event');
e.initEvent(type, true, true);
} else if (doc.createEventObject) {
e = doc.createEventObject();
}
return e;
}
function makeCustomEvent() {
return new customEvent(type, { detail: model });
}
}
function wrapperFactory(el, type, fn) {
return function wrapper(originalEvent) {
var e = originalEvent || global.event;
e.target = e.target || e.srcElement;
e.preventDefault = e.preventDefault || function preventDefault() {
e.returnValue = false;
};
e.stopPropagation = e.stopPropagation || function stopPropagation() {
e.cancelBubble = true;
};
e.which = e.which || e.keyCode;
fn.call(el, e);
};
}
function wrap(el, type, fn) {
var wrapper = unwrap(el, type, fn) || wrapperFactory(el, type, fn);
hardCache.push({
wrapper: wrapper,
element: el,
type: type,
fn: fn
});
return wrapper;
}
function unwrap(el, type, fn) {
var i = find(el, type, fn);
if (i) {
var wrapper = hardCache[i].wrapper;
hardCache.splice(i, 1); // free up a tad of memory
return wrapper;
}
}
function find(el, type, fn) {
var i, item;
for (i = 0; i < hardCache.length; i++) {
item = hardCache[i];
if (item.element === el && item.type === type && item.fn === fn) {
return i;
}
}
}
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
;
/* WEBPACK VAR INJECTION */(function(global) {
var eventmap = [];
var eventname = '';
var ron = /^on/;
for (eventname in global) {
if (ron.test(eventname)) {
eventmap.push(eventname.slice(2));
}
}
module.exports = eventmap;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
;
/* WEBPACK VAR INJECTION */(function(global) {
var NativeCustomEvent = global.CustomEvent;
function useNative() {
try {
var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } });
return 'cat' === p.type && 'bar' === p.detail.foo;
} catch (e) {}
return false;
}
/**
* Cross-browser `CustomEvent` constructor.
*
* https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent
*
* @public
*/
module.exports = useNative() ? NativeCustomEvent :
// IE >= 9
'undefined' !== typeof document && 'function' === typeof document.createEvent ? function CustomEvent(type, params) {
var e = document.createEvent('CustomEvent');
if (params) {
e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);
} else {
e.initCustomEvent(type, false, false, void 0);
}
return e;
} :
// IE <= 8
function CustomEvent(type, params) {
var e = document.createEventObject();
e.type = type;
if (params) {
e.bubbles = Boolean(params.bubbles);
e.cancelable = Boolean(params.cancelable);
e.detail = params.detail;
} else {
e.bubbles = false;
e.cancelable = false;
e.detail = void 0;
}
return e;
};
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
;
/* WEBPACK VAR INJECTION */(function(global) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.domClassManager = exports.domEventManager = undefined;
exports.setConfig = setConfig;
exports.getConfig = getConfig;
exports.getImmediateChild = getImmediateChild;
exports.getReference = getReference;
exports.getCoord = getCoord;
exports.getEventHost = getEventHost;
exports.whichMouseButton = whichMouseButton;
exports.getOffset = getOffset;
exports.getScroll = getScroll;
exports.getElementBehindPoint = getElementBehindPoint;
exports.getRectWidth = getRectWidth;
exports.getRectHeight = getRectHeight;
exports.getParent = getParent;
exports.nextEl = nextEl;
exports.toArray = toArray;
exports.ensureArray = ensureArray;
exports.bind = bind;
exports.domIndexOf = domIndexOf;
exports.isInput = isInput;
exports.isEditable = isEditable;
exports.getIndexByElm = getIndexByElm;
exports.hierarchySafe = hierarchySafe;
var _touchy = __webpack_require__(2);
var _touchy2 = _interopRequireDefault(_touchy);
var _domClasses = __webpack_require__(1);
var _domClasses2 = _interopRequireDefault(_domClasses);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* global global */
var doc = document; // cross dom event management
var docElm = doc.documentElement;
exports.default = {
// domEventManager: touchy,
// domClassManager: classes,
// getConfig: getConfig,
// getImmediateChild: getImmediateChild,
// getReference: getReference,
// getCoord: getCoord,
// getEventHost: getEventHost,
// getOffset: getOffset,
// getScroll: getScroll,
// getElementBehindPoint: getElementBehindPoint,
// getRectWidth: getRectWidth,
// getRectHeight: getRectHeight,
// getParent: getParent,
// nextEl: nextEl,
// toArray: toArray,
// bind: bind,
// domIndexOf: domIndexOf,
// isInput: isInput,
// isEditable: isEditable,
// getIndexByElm: getIndexByElm,
// ensureArray: ensureArray,
};
exports.domEventManager = _touchy2.default;
exports.domClassManager = _domClasses2.default;
function setConfig(parent, config) {
this.config = Object.assign(Object.create(parent.config), config);
}
function getConfig(prop) {
prop = this.config[prop];
return typeof prop == 'function' ? prop(this) : prop;
}
function getImmediateChild(dropTarget, target) {
var immediate = target;
while (immediate !== dropTarget && getParent(immediate) !== dropTarget) {
immediate = getParent(immediate);
}
if (immediate === docElm) {
return null;
}
return immediate;
}
function getReference(dropTarget, target, x, y, direction, abs) {
var horizontal = direction === 'horizontal';
if (abs) {
x = x - getScroll('scrollLeft', 'pageXOffset');
y = y - getScroll('scrollTop', 'pageYOffset');
}
return target !== dropTarget ? inside() : outside(); // reference
function outside() {
// slower, but able to figure out any position
var len = dropTarget.children.length,
i = void 0,
el = void 0,
rect = void 0;
for (i = 0; i < len; i++) {
el = dropTarget.children[i];
rect = el.getBoundingClientRect();
if (horizontal && rect.left + rect.width / 2 > x) {
return el;
}
if (!horizontal && rect.top + rect.height / 2 > y) {
return el;
}
}
return null;
}
function inside() {
// faster, but only available if dropped inside a child element
var rect = target.getBoundingClientRect();
if (horizontal) {
return resolve(x > rect.left + getRectWidth(rect) / 2);
}
return resolve(y > rect.top + getRectHeight(rect) / 2);
}
function resolve(after) {
return after ? nextEl(target) : target;
}
}
function getCoord(coord, e) {
var host = getEventHost(e);
var missMap = {
pageX: 'clientX', // IE8
pageY: 'clientY' // IE8
};
if (coord in missMap && !(coord in host) && missMap[coord] in host) {
coord = missMap[coord];
}
return host[coord];
}
function getEventHost(e) {
// on touchend event, we have to use `e.changedTouches`
// see http://stackoverflow.com/questions/7192563/touchend-event-properties
// see github.com/bevacqua/dragula/issues/34
if (e.targetTouches && e.targetTouches.length) {
return e.targetTouches[0];
}
if (e.changedTouches && e.changedTouches.length) {
return e.changedTouches[0];
}
return e;
}
function whichMouseButton(e) {
// if (e.touches !== void 0) { return e.touches.length }
if (e.touches !== void 0) {
return 1;
} // accept all touches
if (e.which !== void 0 && e.which !== 0) {
return e.which;
} // see github.com/bevacqua/dragula/issues/261
if (e.buttons !== void 0) {
return e.buttons;
}
var button = e.button;
if (button !== void 0) {
// see github.com/jquery/jquery/blob/99e8ff1baa7ae341e94bb89c3e84570c7c3ad9ea/src/event.js#L573-L575
return button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
}
}
// get offset of element from top left corner of document
function getOffset(el, size) {
var rect = el.getBoundingClientRect();
var result = {
left: rect.left + getScroll('scrollLeft', 'pageXOffset'),
top: rect.top + getScroll('scrollTop', 'pageYOffset')
};
if (size) {
result.width = getRectWidth(rect);
result.height = getRectHeight(rect);
}
return result;
}
function getScroll(scrollProp, offsetProp) {
if (typeof global[offsetProp] !== 'undefined') {
return global[offsetProp];
}
if (docElm.clientHeight) {
return docElm[scrollProp];
}
return doc.body[scrollProp];
}
function getElementBehindPoint(elmToHide, x, y, abs) {
var state = elmToHide.className;
var el = void 0;
// hide elmToHide
elmToHide.className += ' dragon-hide';
// look at the position
el = doc.elementFromPoint(abs ? x - getScroll('scrollLeft', 'pageXOffset') : x, abs ? y - getScroll('scrollTop', 'pageYOffset') : y);
// show elmToHide back
elmToHide.className = state;
return el;
}
function getRectWidth(rect) {
return rect.width || rect.right - rect.left;
}
function getRectHeight(rect) {
return rect.height || rect.bottom - rect.top;
}
function getParent(el) {
return el.parentNode === doc ? null : el.parentNode;
}
function nextEl(el) {
return el.nextElementSibling || manually();
function manually() {
var sibling = el;
do {
sibling = sibling.nextSibling;
} while (sibling && sibling.nodeType !== 1);
return sibling;
}
}
function toArray(obj) {
return [].slice.call(obj);
}
function ensureArray(it) {
if (Array.isArray(it)) return it;else if (it.length && it.length != 0) return toArray(it);else return [it];
}
function bind(obj, methodName) {
var bindedName = '_binded_' + methodName;
if (!obj[bindedName]) obj[bindedName] = function () {
return obj[methodName].apply(obj, arguments);
};
return obj[bindedName];
}
function domIndexOf(parent, child) {
// Possible problems with IE8- ? https://developer.mozilla.org/en-US/docs/Web/API/ParentNode/children#Browser_compatibility
return Array.prototype.indexOf.call(parent.children, child);
}
function isInput(el) {
return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || isEditable(el);
}
function isEditable(el) {
if (!el) {
return false;
}
// no parents were editable
if (el.contentEditable === 'false') {
return false;
}
// stop the lookup
if (el.contentEditable === 'true') {
return true;
}
// found a contentEditable element in the chain
return isEditable(getParent(el)); // contentEditable is set to 'inherit'
}
function getIndexByElm(sourceArray, elm) {
var len = sourceArray.length;
for (var i = 0; i < len; i++) {
if (sourceArray[i].elm == elm) return i;
}
return -1;
}
function hierarchySafe(fn, success, fail) {
try {
// dom edit fn to protect
fn();
if (success) success();
} catch (e) {
// console.dir(e)
if (e.name !== 'HierarchyRequestError') // fixing: Uncaught DOMException: Failed to execute 'insertBefore' on 'Node': The new child element contains the parent.
console.error(e); // eslint-disable-line no-console
if (fail) fail();
}
}
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
/***/ })
/******/ ]);