144 lines
4.8 KiB
JavaScript
144 lines
4.8 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
import $ from 'jquery';
|
||
|
|
||
|
// Core Foundation Utilities, utilized in a number of places.
|
||
|
|
||
|
/**
|
||
|
* Returns a boolean for RTL support
|
||
|
*/
|
||
|
function rtl() {
|
||
|
return $('html').attr('dir') === 'rtl';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* returns a random base-36 uid with namespacing
|
||
|
* @function
|
||
|
* @param {Number} length - number of random base-36 digits desired. Increase for more random strings.
|
||
|
* @param {String} namespace - name of plugin to be incorporated in uid, optional.
|
||
|
* @default {String} '' - if no plugin name is provided, nothing is appended to the uid.
|
||
|
* @returns {String} - unique id
|
||
|
*/
|
||
|
function GetYoDigits(length, namespace){
|
||
|
length = length || 6;
|
||
|
return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1) + (namespace ? `-${namespace}` : '');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Escape a string so it can be used as a regexp pattern
|
||
|
* @function
|
||
|
* @see https://stackoverflow.com/a/9310752/4317384
|
||
|
*
|
||
|
* @param {String} str - string to escape.
|
||
|
* @returns {String} - escaped string
|
||
|
*/
|
||
|
function RegExpEscape(str){
|
||
|
return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
|
||
|
}
|
||
|
|
||
|
function transitionend($elem){
|
||
|
var transitions = {
|
||
|
'transition': 'transitionend',
|
||
|
'WebkitTransition': 'webkitTransitionEnd',
|
||
|
'MozTransition': 'transitionend',
|
||
|
'OTransition': 'otransitionend'
|
||
|
};
|
||
|
var elem = document.createElement('div'),
|
||
|
end;
|
||
|
|
||
|
for (var t in transitions){
|
||
|
if (typeof elem.style[t] !== 'undefined'){
|
||
|
end = transitions[t];
|
||
|
}
|
||
|
}
|
||
|
if(end){
|
||
|
return end;
|
||
|
}else{
|
||
|
end = setTimeout(function(){
|
||
|
$elem.triggerHandler('transitionend', [$elem]);
|
||
|
}, 1);
|
||
|
return 'transitionend';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return an event type to listen for window load.
|
||
|
*
|
||
|
* If `$elem` is passed, an event will be triggered on `$elem`. If window is already loaded, the event will still be triggered.
|
||
|
* If `handler` is passed, attach it to the event on `$elem`.
|
||
|
* Calling `onLoad` without handler allows you to get the event type that will be triggered before attaching the handler by yourself.
|
||
|
* @function
|
||
|
*
|
||
|
* @param {Object} [] $elem - jQuery element on which the event will be triggered if passed.
|
||
|
* @param {Function} [] handler - function to attach to the event.
|
||
|
* @returns {String} - event type that should or will be triggered.
|
||
|
*/
|
||
|
function onLoad($elem, handler) {
|
||
|
const didLoad = document.readyState === 'complete';
|
||
|
const eventType = (didLoad ? '_didLoad' : 'load') + '.zf.util.onLoad';
|
||
|
const cb = () => $elem.triggerHandler(eventType);
|
||
|
|
||
|
if ($elem) {
|
||
|
if (handler) $elem.one(eventType, handler);
|
||
|
|
||
|
if (didLoad)
|
||
|
setTimeout(cb);
|
||
|
else
|
||
|
$(window).one('load', cb);
|
||
|
}
|
||
|
|
||
|
return eventType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retuns an handler for the `mouseleave` that ignore disappeared mouses.
|
||
|
*
|
||
|
* If the mouse "disappeared" from the document (like when going on a browser UI element, See https://git.io/zf-11410),
|
||
|
* the event is ignored.
|
||
|
* - If the `ignoreLeaveWindow` is `true`, the event is ignored when the user actually left the window
|
||
|
* (like by switching to an other window with [Alt]+[Tab]).
|
||
|
* - If the `ignoreReappear` is `true`, the event will be ignored when the mouse will reappear later on the document
|
||
|
* outside of the element it left.
|
||
|
*
|
||
|
* @function
|
||
|
*
|
||
|
* @param {Function} [] handler - handler for the filtered `mouseleave` event to watch.
|
||
|
* @param {Object} [] options - object of options:
|
||
|
* - {Boolean} [false] ignoreLeaveWindow - also ignore when the user switched windows.
|
||
|
* - {Boolean} [false] ignoreReappear - also ignore when the mouse reappeared outside of the element it left.
|
||
|
* @returns {Function} - filtered handler to use to listen on the `mouseleave` event.
|
||
|
*/
|
||
|
function ignoreMousedisappear(handler, { ignoreLeaveWindow = false, ignoreReappear = false } = {}) {
|
||
|
return function leaveEventHandler(eLeave, ...rest) {
|
||
|
const callback = handler.bind(this, eLeave, ...rest);
|
||
|
|
||
|
// The mouse left: call the given callback if the mouse entered elsewhere
|
||
|
if (eLeave.relatedTarget !== null) {
|
||
|
return callback();
|
||
|
}
|
||
|
|
||
|
// Otherwise, check if the mouse actually left the window.
|
||
|
// In firefox if the user switched between windows, the window sill have the focus by the time
|
||
|
// the event is triggered. We have to debounce the event to test this case.
|
||
|
setTimeout(function leaveEventDebouncer() {
|
||
|
if (!ignoreLeaveWindow && document.hasFocus && !document.hasFocus()) {
|
||
|
return callback();
|
||
|
}
|
||
|
|
||
|
// Otherwise, wait for the mouse to reeapear outside of the element,
|
||
|
if (!ignoreReappear) {
|
||
|
$(document).one('mouseenter', function reenterEventHandler(eReenter) {
|
||
|
if (!$(eLeave.currentTarget).has(eReenter.target).length) {
|
||
|
// Fill where the mouse finally entered.
|
||
|
eLeave.relatedTarget = eReenter.target;
|
||
|
callback();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
}, 0);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export { rtl, GetYoDigits, RegExpEscape, transitionend, onLoad, ignoreMousedisappear };
|