UNPKG

saturn-ui

Version:

🪐 一款轻量级、模块化的Web可视化UI组件库(含大屏、GIS、图表、视频、后台等模块) 👍

227 lines (222 loc) 7.53 kB
var Validator = { validPhone: /^1[3456789]\d{9}$/, validPwd: /^(?!_+$)(?!\d+$)(?!\D+$)[A-Za-z0-9]{6,12}$/i, validEmail: /^(\w|-)+@(\w|-)+(\.(\w|-)+)+$/i, validIdcard: /^((\d{18})|([0-9x]{18})|([0-9X]{18}))$/i, validImgs: /\.(svg|gif|png|jpe?g)$/i, validThousand: /(\d)(?=(\d{3})+$)/g, validThousandFloat: /(\d)(?=(\d{3})+\.)/g }; const { validThousand, validThousandFloat } = Validator; const IsType = (type, value) => Object.prototype.toString.call(value).slice(8, -1) === type; const DeepCopyRA = (arg) => { const newValue = IsType('Object', arg) ? {} : IsType('Array', arg) ? [] : IsType('Date', arg) ? new arg.constructor(+arg) : IsType('RegExp', arg) || IsType('Error', arg) ? new arg.constructor(arg) : arg; IsType('Object', arg) || (IsType('Array', arg) && Object.keys(arg).forEach(key => { newValue[key] = DeepCopyRA(arg[key]); })); return newValue; }; const IsLeapyear = (num) => { if (!IsType('Number', num)) { throw new Error(`${num} is not number`); } return (num % 4 === 0 && num % 100 !== 0) || num % 400 === 0; }; const FormatTime = (arg = new Date()) => { if (arg.trim() === '') throw new Error(`${arg} is not null`); const str = IsType('Number', arg) && String(arg).length < 13 ? arg * 1000 : arg; IsType('string', arg) && str.replace(/-/g, '/'); const O = new Date(str); const doubleDigit = (num) => (num < 10 ? `0${num}` : String(num)); const weeks = ['日', '一', '二', '三', '四', '五', '六']; const [Y, M, D, w, h, m, s] = [ String(O.getFullYear()), doubleDigit(O.getMonth() + 1), doubleDigit(O.getDate()), `星期${weeks[O.getDay()]}`, doubleDigit(O.getHours()), doubleDigit(O.getMinutes()), doubleDigit(O.getSeconds()) ]; const date = `${Y}-${M}-${D}`; const time = `${h}:${m}:${s}`; const datetime = `${date} ${time}`; return { Y, M, D, w, h, m, s, date, time, datetime }; }; const CountDown = (num, format = 'hh:mm:ss') => { if (!IsType('Number', num)) throw new Error(`${num} is not number`); if (!'DD:hh:mm:ss:ms'.includes(format)) { throw new Error(`${format} form error`); } const DD = ~~(num / (1000 * 60 * 60 * 24)); let hh = ~~((num / (1000 * 60 * 60)) % 24); let mm = ~~((num / (1000 * 60)) % 60); let ss = ~~((num / 1000) % 60); let ms = ~~(num % 1000); const formatData = {}; const doubleDigit = (digit) => (digit < 10 ? `0${digit}` : String(digit)); format.includes('DD') ? (formatData.DD = doubleDigit(DD)) : (hh += DD * 24); format.includes('hh') ? (formatData.hh = doubleDigit(hh)) : (mm += hh * 60); format.includes('mm') ? (formatData.mm = doubleDigit(mm)) : (ss += mm * 60); format.includes('ss') ? (formatData.ss = doubleDigit(ss)) : (ms += ss * 1000); if (format.includes('ms')) { const curMs = format.includes('mm') ? doubleDigit(ms) : num; formatData.ms = +String(curMs).slice(0, 2); } return formatData; }; const Throttle = (fn, time = 1000) => { let timer = null; return (e) => { !timer && (timer = setTimeout(() => { fn(e); timer = null; }, time)); }; }; const Debounce = (fn, time = 300) => { let timer; return (e) => { if (timer !== undefined) clearTimeout(timer); timer = setTimeout(() => { fn(e); }, time); }; }; const FormatThousand = (num) => { if (!IsType('Number', num)) throw new Error(`${num} is not number`); const numStr = String(num); return numStr.replace(numStr.includes('.') ? validThousandFloat : validThousand, '$1,'); }; const Locked = (fn, time = 5000) => { let timer = null; const isLocked = { value: false }; const isLockedProxy = new Proxy(isLocked, { get(obj, prop) { return obj[prop]; }, set(obj, prop, value) { obj[prop] = value; if (value) { timer = setTimeout(() => { obj[prop] = false; }, time); } else { clearInterval(timer); } return true; } }); return (e) => { !isLockedProxy.value && fn(e, (value) => { isLockedProxy.value = value; }); }; }; const AddZero = (str, float1, float2) => str + new Array(Math.abs(float1 - float2) + 1).join('0'); const Calculation = (num1, num2) => { if (!IsType('Number', num1) || !IsType('Number', num2)) { throw new Error(`${num1} or ${num2} is not number`); } const list1 = String(num1).split('.'); const list2 = String(num2).split('.'); const float1 = list1[1]?.length ?? 0; const float2 = list2[1]?.length ?? 0; float1 < float2 && (list1[1] = AddZero(list1[1], float1, float2)); float1 > float2 && (list2[1] = AddZero(list2[1], float1, float2)); const newNum1 = +list1.join(''); const newNum2 = +list2.join(''); const maxFloat = Math.max(float1, float2); const add = () => (newNum1 + newNum2) / 10 ** maxFloat; const subtract = () => (newNum1 - newNum2) / 10 ** maxFloat; const multiply = () => (newNum1 * newNum2) / 10 ** (maxFloat * 2); const divide = () => newNum1 / newNum2; return { add, subtract, multiply, divide }; }; const GenerateRandom = () => +new Date() + String.prototype.slice.call(Math.random(), 2, 7); const Retarder = (time = 500) => new Promise(resolve => { setTimeout(() => { resolve(true); }, time); }); const DateFormat = (date, format = 'yyyy-MM-dd hh:mm:ss') => { const year = `${date.getFullYear()}`; let month = `${date.getMonth() + 1}`; if (month.length === 1) { month = `0${month}`; } let day = `${date.getDate()}`; if (day.length === 1) { day = `0${day}`; } let hours = `${date.getHours()}`; if (hours.length === 1) { hours = `0${hours}`; } let minutes = `${date.getMinutes()}`; if (minutes.length === 1) { minutes = `0${minutes}`; } let seconds = `${date.getSeconds()}`; if (seconds.length === 1) { seconds = `0${seconds}`; } return format .replace(/yyyy/gi, year) .replace(/MM/g, month) .replace(/dd/gi, day) .replace(/hh/gi, hours) .replace(/mm/g, minutes) .replace(/ss/gi, seconds); }; const Random = (min, max) => { return Math.floor(Math.random() * (max - min)) + min; }; var API = { IsType, DeepCopyRA, IsLeapyear, FormatTime, CountDown, Throttle, Debounce, FormatThousand, Locked, AddZero, Calculation, GenerateRandom, Retarder, DateFormat, Random }; const Bind = (dom, event, fn, flag = false) => { dom.addEventListener(event, fn, flag); return dom; }; const Unbind = (dom, event, fn, flag = false) => { dom.removeEventListener(event, fn, flag); return dom; }; var BindEvent = { Bind, Unbind }; var index = { ...API, ...BindEvent, Validator }; export { index as default };