UNPKG

gentelella-rtl

Version:

Gentelella RTL Admin is a free to use Bootstrap admin template

211 lines (182 loc) 5.92 kB
import $ from 'jquery'; var globalID = 1; var pastWarnings = {}; var Utils = { // Parsley DOM-API // returns object from dom attributes and values attr: function (element, namespace, obj) { var i; var attribute; var attributes; var regex = new RegExp('^' + namespace, 'i'); if ('undefined' === typeof obj) obj = {}; else { // Clear all own properties. This won't affect prototype's values for (i in obj) { if (obj.hasOwnProperty(i)) delete obj[i]; } } if (!element) return obj; attributes = element.attributes; for (i = attributes.length; i--; ) { attribute = attributes[i]; if (attribute && attribute.specified && regex.test(attribute.name)) { obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value); } } return obj; }, checkAttr: function (element, namespace, checkAttr) { return element.hasAttribute(namespace + checkAttr); }, setAttr: function (element, namespace, attr, value) { element.setAttribute(this.dasherize(namespace + attr), String(value)); }, getType: function(element) { return element.getAttribute('type') || 'text'; }, generateID: function () { return '' + globalID++; }, /** Third party functions **/ deserializeValue: function (value) { var num; try { return value ? value == "true" || (value == "false" ? false : value == "null" ? null : !isNaN(num = Number(value)) ? num : /^[\[\{]/.test(value) ? JSON.parse(value) : value) : value; } catch (e) { return value; } }, // Zepto camelize function camelize: function (str) { return str.replace(/-+(.)?/g, function (match, chr) { return chr ? chr.toUpperCase() : ''; }); }, // Zepto dasherize function dasherize: function (str) { return str.replace(/::/g, '/') .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') .replace(/([a-z\d])([A-Z])/g, '$1_$2') .replace(/_/g, '-') .toLowerCase(); }, warn: function () { if (window.console && 'function' === typeof window.console.warn) window.console.warn(...arguments); }, warnOnce: function(msg) { if (!pastWarnings[msg]) { pastWarnings[msg] = true; this.warn(...arguments); } }, _resetWarnings: function () { pastWarnings = {}; }, trimString: function(string) { return string.replace(/^\s+|\s+$/g, ''); }, parse: { date: function(string) { let parsed = string.match(/^(\d{4,})-(\d\d)-(\d\d)$/); if (!parsed) return null; let [_, year, month, day] = parsed.map(x => parseInt(x, 10)); let date = new Date(year, month - 1, day); if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) return null; return date; }, string: function(string) { return string; }, integer: function(string) { if (isNaN(string)) return null; return parseInt(string, 10); }, number: function(string) { if (isNaN(string)) throw null; return parseFloat(string); }, 'boolean': function _boolean(string) { return !(/^\s*false\s*$/i.test(string)); }, object: function(string) { return Utils.deserializeValue(string); }, regexp: function(regexp) { var flags = ''; // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern if (/^\/.*\/(?:[gimy]*)$/.test(regexp)) { // Replace the regexp literal string with the first match group: ([gimy]*) // If no flag is present, this will be a blank string flags = regexp.replace(/.*\/([gimy]*)$/, '$1'); // Again, replace the regexp literal string with the first match group: // everything excluding the opening and closing slashes and the flags regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1'); } else { // Anchor regexp: regexp = '^' + regexp + '$'; } return new RegExp(regexp, flags); } }, parseRequirement: function(requirementType, string) { var converter = this.parse[requirementType || 'string']; if (!converter) throw 'Unknown requirement specification: "' + requirementType + '"'; let converted = converter(string); if (converted === null) throw `Requirement is not a ${requirementType}: "${string}"`; return converted; }, namespaceEvents: function(events, namespace) { events = this.trimString(events || '').split(/\s+/); if (!events[0]) return ''; return $.map(events, evt => `${evt}.${namespace}`).join(' '); }, difference: function(array, remove) { // This is O(N^2), should be optimized let result = []; $.each(array, (_, elem) => { if (remove.indexOf(elem) == -1) result.push(elem); }); return result; }, // Alter-ego to native Promise.all, but for jQuery all: function(promises) { // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements return $.when(...promises, 42, 42); }, // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill objectCreate: Object.create || (function () { var Object = function () {}; return function (prototype) { if (arguments.length > 1) { throw Error('Second argument not supported'); } if (typeof prototype != 'object') { throw TypeError('Argument must be an object'); } Object.prototype = prototype; var result = new Object(); Object.prototype = null; return result; }; })(), _SubmitSelector: 'input[type="submit"], button:submit' }; export default Utils;