1371 lines
34 KiB
JavaScript
1371 lines
34 KiB
JavaScript
// import { random, omit } from 'lodash';
|
||
// import moment from 'moment';
|
||
// import { color } from 'html2canvas/dist/types/css/types/color'; //wyw 这个会影响
|
||
|
||
|
||
export function timeFix() {
|
||
const time = new Date()
|
||
const hour = time.getHours()
|
||
return hour < 9 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 20 ? '下午好' : '晚上好'
|
||
}
|
||
|
||
/**
|
||
* 对Date的扩展,将 Date 转化为指定格式的String
|
||
* 月(Y)、月(m)、日(d)、小时(H)、分(M)、秒(S) 可以用 1-2 个占位符,
|
||
* 例子:
|
||
* dateFormat('YYYY-mm-dd HH:MM:SS', new Date()) ==> 2020-01-01 08:00:00
|
||
*/
|
||
export const dateFormat = (fmt, date) => {
|
||
const opt = {
|
||
"Y+": date.getFullYear().toString(), // 年
|
||
"m+": (date.getMonth() + 1).toString(), // 月
|
||
"d+": date.getDate().toString(), // 日
|
||
"H+": date.getHours().toString(), // 时
|
||
"M+": date.getMinutes().toString(), // 分
|
||
"S+": date.getSeconds().toString() // 秒
|
||
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
||
};
|
||
let ret
|
||
for (let k in opt) {
|
||
ret = new RegExp("(" + k + ")").exec(fmt)
|
||
if (ret) {
|
||
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
|
||
};
|
||
};
|
||
return fmt
|
||
}
|
||
|
||
export function handleScrollHeader(callback) {
|
||
let timer = 0
|
||
|
||
let beforeScrollTop = window.pageYOffset
|
||
callback = callback || function() {}
|
||
window.addEventListener(
|
||
'scroll',
|
||
event => {
|
||
clearTimeout(timer)
|
||
timer = setTimeout(() => {
|
||
let direction = 'up'
|
||
const afterScrollTop = window.pageYOffset
|
||
const delta = afterScrollTop - beforeScrollTop
|
||
if (delta === 0) {
|
||
return false
|
||
}
|
||
direction = delta > 0 ? 'down' : 'up'
|
||
callback(direction)
|
||
beforeScrollTop = afterScrollTop
|
||
}, 50)
|
||
},
|
||
false
|
||
)
|
||
}
|
||
|
||
/**
|
||
* Remove loading animate
|
||
* @param id parent element id or class
|
||
* @param timeout
|
||
*/
|
||
export function removeLoadingAnimate(id = '', timeout = 1500) {
|
||
if (id === '') {
|
||
return
|
||
}
|
||
setTimeout(() => {
|
||
document.body.removeChild(document.getElementById(id))
|
||
}, timeout)
|
||
}
|
||
|
||
// 节流
|
||
// 思路: 第一次先设定一个变量true,
|
||
// 第二次执行这个函数时,会判断变量是否true,
|
||
// 是则返回。当第一次的定时器执行完函数最后会设定变量为flase。
|
||
// 那么下次判断变量时则为flase,函数会依次运行。
|
||
export function throttle(fn, delay = 100) {
|
||
// 首先设定一个变量,在没有执行我们的定时器时为null
|
||
var timer = null
|
||
return function() {
|
||
// 当我们发现这个定时器存在时,则表示定时器已经在运行中,需要返回
|
||
if (timer) return
|
||
timer = setTimeout(() => {
|
||
fn.apply(this, arguments)
|
||
timer = null
|
||
}, delay)
|
||
}
|
||
}
|
||
|
||
// 防抖
|
||
// 首次运行时把定时器赋值给一个变量, 第二次执行时,
|
||
// 如果间隔没超过定时器设定的时间则会清除掉定时器,
|
||
// 重新设定定时器, 依次反复, 当我们停止下来时,
|
||
// 没有执行清除定时器, 超过一定时间后触发回调函数。
|
||
export function debounce(fun, delay) {
|
||
return function(args) {
|
||
// 获取函数的作用域和变量
|
||
const that = this
|
||
const _args = args
|
||
// 每次事件被触发,都会清除当前的timeer,然后重写设置超时调用
|
||
clearTimeout(fun.id)
|
||
fun.id = setTimeout(function() {
|
||
fun.call(that, _args)
|
||
}, delay)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 判断是否为空对象
|
||
* @param {*} object 源对象
|
||
*/
|
||
export function isEmptyObject(object) {
|
||
return Object.keys(object).length === 0
|
||
}
|
||
|
||
/**
|
||
* 判断是否为对象
|
||
* @param {*} object
|
||
*/
|
||
export function isObject(object) {
|
||
return Object.prototype.toString.call(object) === '[object Object]'
|
||
}
|
||
|
||
/**
|
||
* 判断是否为对象
|
||
* @param {*} array
|
||
*/
|
||
export function isArray(array) {
|
||
return Object.prototype.toString.call(array) === '[object Array]'
|
||
}
|
||
|
||
/**
|
||
* 判断是否为空
|
||
* @param {*} object 源对象
|
||
*/
|
||
export function isEmpty(value) {
|
||
if (isArray(value)) {
|
||
return value.length === 0
|
||
}
|
||
if (isObject(value)) {
|
||
return isEmptyObject(value)
|
||
}
|
||
return !value
|
||
}
|
||
|
||
/**
|
||
* 判断是否在数组中
|
||
* @param {*} search
|
||
* @param {*} array
|
||
*/
|
||
export function inArray(search, array) {
|
||
return array.includes(search)
|
||
}
|
||
|
||
/**
|
||
* 获取指定天数的日期
|
||
* @param day
|
||
* @returns {string}
|
||
*/
|
||
export function getDateByDay(day) {
|
||
var today = new Date()
|
||
var targetdaySeconds = today.getTime() + 1000 * 60 * 60 * 24 * day
|
||
today.setTime(targetdaySeconds) // 注意,这行是关键代码
|
||
return today.getFullYear() + '-' + zeroFillLeft(today.getMonth() + 1) + '-' + zeroFillLeft(today.getDate())
|
||
}
|
||
|
||
/**
|
||
* 左侧补0
|
||
* @param value
|
||
* @returns {*}
|
||
*/
|
||
export function zeroFillLeft(value) {
|
||
return (value.toString().length === 1) ? ('0' + value) : value
|
||
}
|
||
|
||
/**
|
||
* 批量给指定对象赋值
|
||
* @param obj obj 指定的对象,一般为vue实例
|
||
* @param obj assignment 赋值的元素 { a: '123' }
|
||
*/
|
||
export function assignment(obj, assignment) {
|
||
Object.keys(assignment).forEach(key => {
|
||
obj[key] = assignment[key]
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 对象转URL
|
||
* @param {object} obj
|
||
*/
|
||
export const urlEncode = (obj = {}) => {
|
||
const result = []
|
||
for (const key in obj) {
|
||
const item = obj[key]
|
||
if (!item) {
|
||
continue
|
||
}
|
||
if (isArray(item)) {
|
||
item.forEach(val => {
|
||
result.push(key + '=' + val)
|
||
})
|
||
} else {
|
||
result.push(key + '=' + item)
|
||
}
|
||
}
|
||
return result.join('&')
|
||
}
|
||
|
||
export const formatTime = date => {
|
||
const year = date.getFullYear()
|
||
const month = date.getMonth() + 1
|
||
const day = date.getDate()
|
||
const hour = date.getHours()
|
||
const minute = date.getMinutes()
|
||
const second = date.getSeconds()
|
||
|
||
return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
|
||
}
|
||
|
||
/**
|
||
* 生成url (带参数)
|
||
* @param {string} path 链接
|
||
* @param {object} params query参数
|
||
*/
|
||
export function buildUrL(path, params) {
|
||
const queryStr = urlEncode(params)
|
||
if (!isEmpty(queryStr)) {
|
||
return path + '?' + queryStr
|
||
}
|
||
return path
|
||
}
|
||
|
||
const RFC4122_TEMPLATE = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
|
||
|
||
// export function uuid(placeholder) {
|
||
// return RFC4122_TEMPLATE.replace(/[xy]/g, function () {
|
||
// let value = random(15)
|
||
// value = placeholder === 'x' ? value : (value & 0x3 | 0x8)
|
||
// return value.toString(16)
|
||
// })
|
||
// }
|
||
|
||
export function Base64_Encode(str) { // base64转换
|
||
let c1, c2, c3;
|
||
let base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
let i = 0;
|
||
let len = str.length;
|
||
let string = '';
|
||
|
||
while (i < len) {
|
||
c1 = str.charCodeAt(i++) & 0xff;
|
||
if (i === len) {
|
||
string += base64EncodeChars.charAt(c1 >> 2);
|
||
string += base64EncodeChars.charAt((c1 & 0x3) << 4);
|
||
string += "==";
|
||
break;
|
||
}
|
||
c2 = str.charCodeAt(i++);
|
||
if (i === len) {
|
||
string += base64EncodeChars.charAt(c1 >> 2);
|
||
string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
|
||
string += base64EncodeChars.charAt((c2 & 0xF) << 2);
|
||
string += "=";
|
||
break;
|
||
}
|
||
c3 = str.charCodeAt(i++);
|
||
string += base64EncodeChars.charAt(c1 >> 2);
|
||
string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
|
||
string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
|
||
string += base64EncodeChars.charAt(c3 & 0x3F);
|
||
}
|
||
return string;
|
||
}
|
||
|
||
export function guid() {
|
||
function S4() {
|
||
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1)
|
||
}
|
||
return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4();
|
||
}
|
||
|
||
export function extend(obj1, obj2) {
|
||
if (typeof(obj2) === 'object')
|
||
for (let p in obj2) obj1[p] = obj2[p];
|
||
}
|
||
|
||
export function extendRule(obj, filed, op, value, isSysParam) { //查询条件
|
||
let data = {};
|
||
if (value === null) {
|
||
value = '';
|
||
}
|
||
data['Field'] = filed;
|
||
data['Operate'] = op;
|
||
data['Value'] = isSysParam ? value.toString() : value;
|
||
if (isSysParam) {
|
||
data["IsSysParamRule"] = true;
|
||
}
|
||
|
||
if (!obj.FilterGroup) {
|
||
obj.FilterGroup = {};
|
||
}
|
||
if (!obj.FilterGroup.Rules) {
|
||
obj.FilterGroup.Rules = [];
|
||
}
|
||
obj.FilterGroup.Rules.push(data);
|
||
}
|
||
|
||
export function initFilterGroup(IsAnd = true) {
|
||
return {
|
||
IsAnd,
|
||
Rules: [],
|
||
Groups: [],
|
||
}
|
||
}
|
||
|
||
export function extendFilterGroup(obj, obj2) {
|
||
|
||
if (!obj.FilterGroup) {
|
||
obj.FilterGroup = {};
|
||
}
|
||
if (!obj.FilterGroup.Groups) {
|
||
obj.FilterGroup.Groups = [];
|
||
}
|
||
obj.FilterGroup.Groups.push(obj2);
|
||
}
|
||
|
||
export function extendChildGroup(obj, obj2) {
|
||
if (!obj.Groups) {
|
||
obj.Groups = [];
|
||
}
|
||
obj.Groups.push(obj2);
|
||
}
|
||
|
||
export function extendGroupRule(obj, filed, op, value, isSysParam) { //查询条件
|
||
let data = {};
|
||
if (value === null) {
|
||
value = '';
|
||
}
|
||
data['Field'] = filed;
|
||
data['Operate'] = op;
|
||
data['Value'] = isSysParam ? value.toString() : value;
|
||
if (isSysParam) {
|
||
data["IsSysParamRule"] = true;
|
||
}
|
||
|
||
if (!obj.Rules) {
|
||
obj.Rules = [];
|
||
}
|
||
obj.Rules.push(data);
|
||
|
||
}
|
||
|
||
export function initQueryFilter(OrgId, PageIndex, Limit, Sort, Order) {
|
||
return {
|
||
OrgId,
|
||
PageIndex,
|
||
Limit,
|
||
Start: (PageIndex - 1) * Limit,
|
||
Sort,
|
||
Order: (Order === '' ? 0 : Order),
|
||
RuleCount: 0,
|
||
IncludeCount: 0,
|
||
OrderCount: 0,
|
||
FilterGroupCount: 0,
|
||
Include: [],
|
||
Orders: [],
|
||
FilterGroup: {
|
||
Rules: [],
|
||
Groups: []
|
||
}
|
||
};
|
||
}
|
||
|
||
export function initFilter(OrgId, Keyword = "", Sort, Order, PageIndex = 1, Parameter1, Parameter2, Parameter3,
|
||
Parameter4, Parameter5, Parameter6) {
|
||
return {
|
||
Keyword,
|
||
Parameter1,
|
||
Parameter2,
|
||
Parameter3,
|
||
Parameter4,
|
||
Parameter5,
|
||
Parameter6,
|
||
OrgId,
|
||
PageIndex,
|
||
Limit: 10,
|
||
Start: (PageIndex - 1) * 10,
|
||
Sort,
|
||
Order: (Order === '' ? 0 : Order),
|
||
RuleCount: 0,
|
||
IncludeCount: 0,
|
||
OrderCount: 0,
|
||
FilterGroupCount: 0,
|
||
Include: [],
|
||
Orders: [],
|
||
FilterGroup: {
|
||
Rules: [],
|
||
Groups: []
|
||
},
|
||
SelectField: [],
|
||
DataRule: [],
|
||
IgnoreDataRule: false
|
||
};
|
||
// let params = $("#search-form").elFilterParam();
|
||
// extend(json, params);
|
||
}
|
||
|
||
export function extendInclude(obj, clude) {
|
||
|
||
if (!obj.Include) {
|
||
obj.Include = [];
|
||
}
|
||
obj.Include.push(clude);
|
||
}
|
||
|
||
//wyw 添加 子表过滤条件
|
||
export function extendFilterGroupGroupRules(obj, filed, op, value, isSysParam) { //查询条件
|
||
let data = {};
|
||
if (value === null) {
|
||
value = '';
|
||
}
|
||
data['Field'] = filed;
|
||
data['Operate'] = op;
|
||
data['Value'] = isSysParam ? value.toString() : value;
|
||
if (isSysParam) {
|
||
data["IsSysParamRule"] = true;
|
||
}
|
||
if (!obj.FilterGroup) {
|
||
obj.FilterGroup = {};
|
||
}
|
||
if (!obj.FilterGroup.Groups) {
|
||
obj.FilterGroup.Groups = [];
|
||
}
|
||
|
||
if (obj.FilterGroup.Groups.length == 0) {
|
||
let groupGroup = initFilterGroup(false)
|
||
obj.FilterGroup.Groups.push(groupGroup)
|
||
}
|
||
|
||
if (!obj.FilterGroup.Groups[0].Rules) {
|
||
obj.FilterGroup.Groups[0].Groups = [];
|
||
obj.FilterGroup.Groups[0].Rules = [];
|
||
obj.FilterGroup.Groups[0].IsAnd = false;
|
||
}
|
||
obj.FilterGroup.Groups[0].Rules.push(data);
|
||
}
|
||
|
||
export function extendOrder(obj, filed, order) {
|
||
var data = {};
|
||
data["Field"] = filed;
|
||
data["Order"] = order;
|
||
if (!obj.Orders) {
|
||
obj.Orders = [];
|
||
}
|
||
obj.Orders.push(data);
|
||
}
|
||
export function extendIgnoreDataRule(obj) {
|
||
obj.IgnoreDataRule = true
|
||
}
|
||
|
||
function trim(str) { // ?
|
||
for (var i = 0; i < str.length && str.charAt(i) == " "; i++)
|
||
;
|
||
for (var j = str.length; j > 0 && str.charAt(j - 1) == " "; j--)
|
||
;
|
||
if (i > j)
|
||
return "";
|
||
return str.substring(i, j);
|
||
}
|
||
|
||
export function empty(v, allowZero) {
|
||
if (v === "null" || v === undefined || v === "") return true;
|
||
switch (typeof v) {
|
||
case 'undefined':
|
||
return true;
|
||
case 'string':
|
||
if (trim(v).length == 0)
|
||
return true;
|
||
break;
|
||
case 'boolean':
|
||
if (!v)
|
||
return true;
|
||
break;
|
||
case 'number':
|
||
if (0 === v && !allowZero)
|
||
return true;
|
||
break;
|
||
case 'object':
|
||
if (null === v)
|
||
return true;
|
||
if (undefined !== v.length && v.length == 0)
|
||
return true;
|
||
for (var k in v) {
|
||
return false;
|
||
}
|
||
return true;
|
||
default:
|
||
return false;
|
||
}
|
||
}
|
||
|
||
export function strConvert(target, def) { // 点字符串转对象
|
||
// str为需要转换的值, def为有固定的最后一个属性值
|
||
let splitFiles = target.split('.');
|
||
let str = '';
|
||
let len = splitFiles.length;
|
||
splitFiles.forEach(item => {
|
||
str += '{\"' + item + '\":'
|
||
});
|
||
str += "" + def + ""
|
||
for (let j = 0; j < len; j++) {
|
||
str += '}'
|
||
}
|
||
let mat = JSON.parse(str);
|
||
return mat
|
||
}
|
||
|
||
//仅仅获取对象的基础属性,不包含属性中的对象
|
||
export function getOnlyPropertyData(data, isGetSysParam) {
|
||
let result = {};
|
||
Object.keys(data).forEach((n) => {
|
||
if (n.indexOf('.') !== -1) return;
|
||
if (isGetSysParam && n === 'Nav_SysParams') {
|
||
result[n] = data[n];
|
||
} else if (Array.isArray(data[n])) {
|
||
result[n] = data[n];
|
||
} else if (typeof(data[n]) !== "object") {
|
||
result[n] = data[n];
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
|
||
//仅仅获取对象的基础属性及列表,不包含属性中的对象
|
||
export function getPropertyData(data, isSetDelete) {
|
||
let result = {};
|
||
Object.keys(data).forEach((n) => {
|
||
if (n.indexOf('.') != -1) return;
|
||
if (typeof(data[n]) !== "object") {
|
||
result[n] = data[n];
|
||
} else if (data[n] && data[n].length) {
|
||
const array = [];
|
||
data[n].forEach(nx => {
|
||
const d = getPropertyData(nx, isSetDelete);
|
||
array.push(d);
|
||
});
|
||
result[n] = array;
|
||
}
|
||
if (isSetDelete) {
|
||
result['IS_DELETED'] = true;
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
|
||
// 取导航属性的最后一个字段
|
||
export function dataIndexName(field) {
|
||
const valueValid = field ? field.split('.') : [];
|
||
return valueValid[valueValid.length - 1]
|
||
}
|
||
|
||
export function splitEnum(str) {
|
||
let newArr = [];
|
||
let oArr = str ? str.split(',') : [];
|
||
oArr.forEach(item => {
|
||
let n = item.split(':');
|
||
newArr.push({
|
||
label: n[0],
|
||
value: n[1]
|
||
})
|
||
});
|
||
return newArr
|
||
}
|
||
|
||
export function getDataFieldValueByCol(data, field, defaultValue) {
|
||
if (!data || !field) return null;
|
||
let opIndex = field.lastIndexOf('/');
|
||
let op = 0;
|
||
if (opIndex === -1) {
|
||
opIndex = field.indexOf('*');
|
||
if (opIndex === -1) {
|
||
opIndex = field.indexOf('+');
|
||
if (opIndex === -1) {
|
||
opIndex = field.lastIndexOf('-');
|
||
if (opIndex !== -1) {
|
||
op = 2;
|
||
}
|
||
} else {
|
||
op = 1;
|
||
}
|
||
} else {
|
||
op = 3;
|
||
}
|
||
} else {
|
||
op = 4;
|
||
}
|
||
|
||
let controlValue = null;
|
||
if (opIndex !== -1) {
|
||
const leftField = field.substring(0, opIndex);
|
||
const rightField = field.substring(opIndex + 1);
|
||
const leftText = getDataFieldValueByCol(data, leftField);
|
||
const rigthText = getDataFieldValueByCol(data, rightField);
|
||
if (leftText !== '' && rigthText !== '' && !isNaN(leftText) && !isNaN(rigthText)) {
|
||
if (op === 1) {
|
||
controlValue = (+leftText) + (+rigthText);
|
||
} else if (op === 2) {
|
||
controlValue = (+leftText) - (+rigthText);
|
||
} else if (op === 3) {
|
||
controlValue = (+leftText) * (+rigthText);
|
||
} else if (op === 3 && (+rigthText) !== 0) {
|
||
controlValue = (+leftText) / (+rigthText);
|
||
}
|
||
}
|
||
} else {
|
||
controlValue = getDataFieldValue(data, field, defaultValue);
|
||
}
|
||
return controlValue;
|
||
}
|
||
|
||
function innerGetDataFieldValue(data, field, defaultValue) {
|
||
if (!data || !field) return null;
|
||
const valueValid = field ? field.split('.') : [];
|
||
let controlValue = null;
|
||
let tmp = {
|
||
...data
|
||
};
|
||
if (tmp) {
|
||
for (let j = 0; j < valueValid.length; j++) {
|
||
if (j < valueValid.length - 1) {
|
||
if (!Array.isArray(tmp)) {
|
||
if (tmp && tmp.hasOwnProperty(valueValid[j])) {
|
||
tmp = tmp[valueValid[j]];
|
||
} else {
|
||
tmp = null;
|
||
}
|
||
} else {
|
||
let arrayTmp = [];
|
||
tmp.forEach(item => {
|
||
if (item && item.hasOwnProperty(valueValid[j])) {
|
||
arrayTmp.push(item[valueValid[j]]);
|
||
}
|
||
})
|
||
tmp = arrayTmp;
|
||
}
|
||
} else {
|
||
if (!Array.isArray(tmp)) {
|
||
if (tmp && tmp.hasOwnProperty(valueValid[j])) {
|
||
controlValue = tmp[valueValid[j]];
|
||
}
|
||
} else {
|
||
controlValue = '';
|
||
tmp.forEach(item => {
|
||
controlValue += item[valueValid[j]] + ",";
|
||
})
|
||
if (controlValue && controlValue.indexOf(',') > 0) {
|
||
controlValue = controlValue.substring(0, controlValue.length - 1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (controlValue == null && defaultValue !== undefined) {
|
||
return defaultValue;
|
||
}
|
||
return controlValue;
|
||
}
|
||
|
||
export function getDataFieldValue(data, field, defaultValue) {
|
||
if (!data || !field) {
|
||
if (defaultValue !== undefined) {
|
||
return defaultValue;
|
||
}
|
||
return null;
|
||
}
|
||
const key = 'Nav_SysParams';
|
||
const index = field.indexOf(key);
|
||
if (index === -1) {
|
||
return innerGetDataFieldValue(data, field, defaultValue);
|
||
} else {
|
||
const f1 = index > 0 ? field.substring(0, index - 1) : null;
|
||
const f2 = field.substring(index + key.length + 1);
|
||
let temp = null;
|
||
if (f1) {
|
||
temp = innerGetDataFieldValue(data, f1);
|
||
} else {
|
||
temp = data;
|
||
}
|
||
if (temp) {
|
||
let sysParams = temp[key];
|
||
if (sysParams) {
|
||
let paramRecord = sysParams.filter(t => t.CODE === f2)[0];
|
||
if (paramRecord) {
|
||
return paramRecord.VALUE;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (defaultValue !== undefined) {
|
||
return defaultValue;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function innerSetDataFieldValue(data, field, value) {
|
||
let tmp = data;
|
||
const valueValid = field ? field.split('.') : [];
|
||
for (let j = 0; j < valueValid.length; j++) {
|
||
if (j < valueValid.length - 1) {
|
||
if (!tmp.hasOwnProperty(valueValid[j]) || !tmp[valueValid[j]]) {
|
||
tmp[valueValid[j]] = {};
|
||
}
|
||
let tmpData = tmp[valueValid[j]];
|
||
if (!tmpData) {
|
||
tmpData = {};
|
||
}
|
||
tmp = tmpData;
|
||
} else {
|
||
tmp[valueValid[j]] = value;
|
||
}
|
||
}
|
||
return data;
|
||
}
|
||
|
||
export function setDataFieldValue(data, field, value) {
|
||
if (!data || !field) return data;
|
||
const key = 'Nav_SysParams';
|
||
const index = field.indexOf(key);
|
||
if (index === -1) {
|
||
innerSetDataFieldValue(data, field, value);
|
||
} else {
|
||
const f1 = index > 0 ? field.substring(0, index - 1) : null;
|
||
const f2 = field.substring(index + key.length + 1);
|
||
let temp = null;
|
||
if (f1) {
|
||
temp = innerGetDataFieldValue(data, f1);
|
||
if (!temp) {
|
||
temp = {};
|
||
innerSetDataFieldValue(data, f1, temp);
|
||
}
|
||
} else {
|
||
temp = data;
|
||
}
|
||
let sysParams = temp[key];
|
||
if (!sysParams) {
|
||
sysParams = [];
|
||
temp[key] = sysParams;
|
||
}
|
||
let paramRecord = sysParams.filter(t => t.CODE === f2)[0];
|
||
if (!paramRecord) {
|
||
paramRecord = {
|
||
ID: guid(),
|
||
CODE: f2,
|
||
ENTITY_ID: temp.ID,
|
||
}
|
||
sysParams.push(paramRecord);
|
||
}
|
||
paramRecord.VALUE = value;
|
||
}
|
||
return data;
|
||
}
|
||
|
||
export function permissionUtils(login) {
|
||
const checkPermission = (formId, keyId, type) => {
|
||
if (login.userType == 99 || !formId) return true; //管理员
|
||
let hasPermission = false;
|
||
const currActivatedMenu = login.currActivatedMenu || {}
|
||
if (login.rolePerm && login.rolePerm.Nav_RolePermForms && login.rolePerm.Nav_RolePermForms
|
||
.length) { //只要一个角色有权限就有权限
|
||
/**
|
||
* hasPermssion 判断为 true 之后,必须直接赋值为 true,
|
||
* 不能用条件判断(比如:hasPermission = matchForm;)去赋值
|
||
* 因为一直在循环,满足 if 条件后,可能 hasPermission 又被置为 false 了
|
||
*/
|
||
login.rolePerm.Nav_RolePermForms.forEach((n1, i1) => {
|
||
if (!currActivatedMenu.ID) {
|
||
hasPermission = true
|
||
} else {
|
||
if (n1.PermFormId === formId) {
|
||
const matchForm = (n1.MenuId === currActivatedMenu.ID || !currActivatedMenu.ID)
|
||
if (type == 0 && matchForm) { //表单权限
|
||
hasPermission = true;
|
||
} else if (type == 1) { //按钮权限
|
||
if (n1.Nav_Btns && n1.Nav_Btns.length) {
|
||
n1.Nav_Btns.forEach((n2, i2) => {
|
||
const matchBtn = (n2.MenuId === currActivatedMenu.ID || !
|
||
currActivatedMenu.ID)
|
||
if (n2.BtnId === keyId && matchBtn) {
|
||
hasPermission = true;
|
||
}
|
||
});
|
||
}
|
||
} else if (type == 2) { //行权限
|
||
if (n1.Nav_Columns && n1.Nav_Columns.length) {
|
||
n1.Nav_Columns.forEach((n2, i2) => {
|
||
const matchRow = (n2.MenuId === currActivatedMenu.ID || !
|
||
currActivatedMenu.ID)
|
||
if (n2.ColumnId === keyId && matchRow) {
|
||
hasPermission = true;
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
});
|
||
}
|
||
return hasPermission;
|
||
};
|
||
return {
|
||
checkBtn: (formId, btnId) => {
|
||
return checkPermission(formId, btnId, 1);
|
||
},
|
||
checkColumn: (formId, columnId) => {
|
||
return checkPermission(formId, columnId, 2);
|
||
},
|
||
checkForm: (formId) => {
|
||
return checkPermission(formId, '', 0);
|
||
},
|
||
};
|
||
}
|
||
|
||
//根据枚举字符串获取枚举列表
|
||
export function getEnums(str) {
|
||
let newArr = {};
|
||
let oArr = str ? str.split(',') : [];
|
||
oArr.forEach(item => {
|
||
let n = item.split(':');
|
||
newArr[[n[1]]] = n[0];
|
||
});
|
||
return newArr
|
||
}
|
||
|
||
export function getCustomParams(customParamsStr) {
|
||
const customParams = {};
|
||
if (customParamsStr && typeof customParamsStr === 'string') {
|
||
let arrays = customParamsStr.split('|');
|
||
arrays.forEach(function(n, i) {
|
||
let paris = n.split("=");
|
||
if (paris.length >= 2) {
|
||
customParams[paris[0]] = paris[1];
|
||
} else {
|
||
customParams[paris[0]] = null;
|
||
}
|
||
});
|
||
}
|
||
return customParams;
|
||
}
|
||
|
||
export function getGroupByQueryFields(fields, groups, parentId, parent, list) {
|
||
if (groups && groups.length) {
|
||
const tempGroups = groups.filter(t => t.PARENT_ID === parentId);
|
||
if (tempGroups && tempGroups.length) {
|
||
tempGroups.forEach(t => {
|
||
const group = {
|
||
rules: [],
|
||
childGroups: [],
|
||
isAnd: t.RELATION_TYPE !== 1,
|
||
};
|
||
if (fields && fields.length) {
|
||
const tempFields = fields.filter(t1 => t1.USER_C_C_QUERY_GROUP_ID === t.ID);
|
||
if (tempFields && tempFields.length) {
|
||
group.rules = getRulesByQueryFields(tempFields, group.childGroups);
|
||
}
|
||
}
|
||
if (parent) {
|
||
parent.childGroups.push(group)
|
||
} else {
|
||
list.push(group);
|
||
}
|
||
getGroupByQueryFields(fields, groups, t.ID, group, list);
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
export function getRuleAndGroupsByQueryFields(queryFields, queryGroups) {
|
||
const result = {};
|
||
if (queryFields != null && queryFields.length) {
|
||
const sysFields = queryFields.filter(t => !t.USER_C_C_QUERY_GROUP_ID);
|
||
result.groups = [];
|
||
result.rules = getRulesByQueryFields(sysFields, result.groups);
|
||
getGroupByQueryFields(queryFields, queryGroups, null, null, result.groups);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
export function locationQuery(query) {
|
||
if (!query) return {};
|
||
let querys = query.split('?')[1];
|
||
let pair = querys.split('&');
|
||
let obj = {};
|
||
for (let i = 0; i < pair.length; i++) {
|
||
let propertys = pair[i].split('=');
|
||
obj[propertys[0]] = propertys[1]
|
||
}
|
||
return obj;
|
||
}
|
||
|
||
export function addChildGroups(list, group) {
|
||
if (list && list.length) {
|
||
list.forEach(t => {
|
||
const tempGroup = initFilterGroup(t.isAnd);
|
||
if (t.rules && t.rules.length) {
|
||
t.rules.forEach(t1 => {
|
||
extendGroupRule(tempGroup, t1.field, t1.operator, t1.value, t1.isSysParam);
|
||
});
|
||
}
|
||
if (t.childGroups && t.childGroups.length) {
|
||
addChildGroups(t.childGroups, tempGroup);
|
||
}
|
||
extendChildGroup(group, tempGroup);
|
||
});
|
||
}
|
||
}
|
||
|
||
// export function getRandomCode(len) {
|
||
// len = len || 32;
|
||
// var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678=-*&@#$%!~+,./?\;:|' /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
|
||
// var maxPos = $chars.length;
|
||
// var pwd = '';
|
||
// for (var i = 0; i < len; i++) {
|
||
// pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
|
||
// }
|
||
// return pwd;
|
||
// }
|
||
|
||
export function addRuleAndGroups(json, ruleAndGroupJson) {
|
||
if (json && ruleAndGroupJson) {
|
||
if (ruleAndGroupJson.rules && ruleAndGroupJson.rules.length) {
|
||
ruleAndGroupJson.rules.forEach(t => {
|
||
if (t.isCustom) { //自定义字段
|
||
|
||
if (t.field.indexOf(',') > -1) //modify by陈昌雨 2020/6/4
|
||
{
|
||
var splitFileds = t.field.split(',');
|
||
let values = null;
|
||
if (typeof(t.value) === 'number' && t.value !== undefined && t.value != null) {
|
||
values = t.value.toString().split(',');
|
||
} else {
|
||
values = t.value.split(',');
|
||
}
|
||
|
||
if (splitFileds && values) {
|
||
splitFileds.forEach((n, i) => {
|
||
json[n] = values[i];
|
||
});
|
||
}
|
||
} else {
|
||
json[t.field] = t.value;
|
||
}
|
||
|
||
|
||
} else {
|
||
extendRule(json, t.field, t.operator, t.value, t.isSysParam);
|
||
}
|
||
});
|
||
}
|
||
|
||
if (ruleAndGroupJson.groups && ruleAndGroupJson.groups.length) {
|
||
ruleAndGroupJson.groups.forEach(t => {
|
||
const tempGroup = initFilterGroup(t.isAnd);
|
||
if (t.rules && t.rules.length) {
|
||
t.rules.forEach(t1 => {
|
||
extendGroupRule(tempGroup, t1.field, t1.operator, t1.value, t1.isSysParam);
|
||
});
|
||
}
|
||
if (t.childGroups && t.childGroups.length) {
|
||
addChildGroups(t.childGroups, tempGroup);
|
||
}
|
||
extendFilterGroup(json, tempGroup);
|
||
});
|
||
}
|
||
if (ruleAndGroupJson.orgType) {
|
||
json.OrgType = ruleAndGroupJson.orgType;
|
||
}
|
||
if (ruleAndGroupJson.menuParameter) {
|
||
json.MenuParameter = ruleAndGroupJson.menuParameter
|
||
}
|
||
}
|
||
}
|
||
|
||
export function constructStandardTreeData(data, cascader) {
|
||
data.forEach(item => {
|
||
const {
|
||
Node,
|
||
Children
|
||
} = item
|
||
const {
|
||
NAME,
|
||
ID
|
||
} = Node
|
||
if (cascader) {
|
||
item.label = NAME
|
||
item.value = ID
|
||
Array.isArray(Children) && Children.length && (item.children = Children)
|
||
for (let key in Node) {
|
||
item[key] = Node[key]
|
||
}
|
||
} else {
|
||
item.title = NAME
|
||
item.key = ID
|
||
item.value = ID
|
||
item.children = Children
|
||
}
|
||
if (Array.isArray(Children) && Children.length) {
|
||
constructStandardTreeData(Children, cascader)
|
||
}
|
||
})
|
||
}
|
||
|
||
// 树搜索
|
||
// export function flatTreeData(tree = [], data = []) {
|
||
// if (Array.isArray(tree) && tree.length) {
|
||
// tree.forEach(item => {
|
||
// data.push(omit(item, ['children']))
|
||
// flatTreeData(item.children, data)
|
||
// })
|
||
// }
|
||
// }
|
||
|
||
export function digTreeData(arr, target) {
|
||
for (let i = 0, j = arr.length; i < j; i++) {
|
||
if (arr[i].Node && arr[i].Node.ID === target) return arr[i]
|
||
if (Array.isArray(arr[i].Children) && arr[i].Children.length) {
|
||
const result = digTreeData(arr[i].Children, target)
|
||
if (result) return result
|
||
}
|
||
}
|
||
}
|
||
|
||
export function toFixed(num, base = 2, notCeil = true) {
|
||
if (typeof num !== 'number') return num
|
||
let str = num.toFixed(notCeil ? base + 1 : base)
|
||
base === 0 && notCeil && (str = str.substring(0, str.length - 1)) // 防止出现 120. 这类多一个点的字符串
|
||
return str.substring(0, notCeil ? str.length - 1 : str.length)
|
||
}
|
||
|
||
//排序
|
||
export function compare(obj1, obj2) {
|
||
var val1 = obj1.num;
|
||
var val2 = obj2.num;
|
||
if (val1 < val2) {
|
||
return -1;
|
||
} else if (val1 > val2) {
|
||
return 1;
|
||
} else {
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
export function validUUID(value) {
|
||
if (!value) return false
|
||
if (value.toString().split('-').length === 4 && value.toString().length === 32) return true
|
||
if (value.toString().split('-').length === 5 && value.toString().length === 36) return true
|
||
return false
|
||
}
|
||
|
||
//显示用户签名
|
||
export function showUsersSign(listUsers, imgHost, width, height) {
|
||
var result = []
|
||
if (width == undefined) {
|
||
width = 200
|
||
}
|
||
if (height == undefined) {
|
||
height = 50
|
||
}
|
||
listUsers = listUsers.sort(function(a, b) {
|
||
if (a.CREATE_TIME > b.CREATE_TIME) {
|
||
return 1
|
||
} else {
|
||
return -1
|
||
}
|
||
})
|
||
|
||
// listUsers?.map((item, i) => {
|
||
// if (item.Nav_User != null && item.Nav_User.Nav_UserSignFiles != null && item.Nav_User.Nav_UserSignFiles.length > 0) {
|
||
// result.push( < img width = {
|
||
// width
|
||
// }
|
||
// style = {{margin: "0 0 0 5px",
|
||
// maxHeight: "100px"
|
||
// }
|
||
// }
|
||
// src = {
|
||
// imgHost + item.Nav_User?.Nav_UserSignFiles[0]?.Nav_ImgFile.Nav_File.FILE_PATH
|
||
// }
|
||
// title = {
|
||
// item.Nav_User?.NAME
|
||
// }
|
||
// alt = {
|
||
// item.Nav_User?.NAME
|
||
// }
|
||
// />)
|
||
// }
|
||
// else {
|
||
// result.push( < img width = {
|
||
// width
|
||
// }
|
||
// style = {
|
||
// {
|
||
// margin: "0 0 0 5px",
|
||
// maxHeight: "100px"
|
||
// }
|
||
// }
|
||
// src = ''
|
||
// title = {
|
||
// item.Nav_User?.NAME
|
||
// }
|
||
// alt = {
|
||
// item.Nav_User?.NAME
|
||
// }
|
||
// />)
|
||
// }
|
||
|
||
// })
|
||
return result
|
||
}
|
||
|
||
//显示用户签名
|
||
export function showUserSign(user, imgHost, width, height) {
|
||
var result = []
|
||
if (width == undefined) {
|
||
width = 200
|
||
}
|
||
if (height == undefined) {
|
||
height = 50
|
||
}
|
||
// height={height}
|
||
// if (user != null && user.Nav_UserSignFiles != null && user.Nav_UserSignFiles.length > 0) {
|
||
// result.push( < img width = {
|
||
// width
|
||
// }
|
||
// style = {
|
||
// {
|
||
// margin: "0 0 0 5px",
|
||
// maxHeight: "100px"
|
||
// }
|
||
// }
|
||
// src = {
|
||
// imgHost + user?.Nav_UserSignFiles[0]?.Nav_ImgFile.Nav_File.FILE_PATH
|
||
// }
|
||
// title = {
|
||
// user.NAME
|
||
// }
|
||
// alt = {
|
||
// user.NAME
|
||
// }
|
||
// />)
|
||
// }
|
||
// else {
|
||
// result.push( < img width = {
|
||
// width
|
||
// }
|
||
// style = {
|
||
// {
|
||
// margin: "0 0 0 5px",
|
||
// maxHeight: "100px"
|
||
// }
|
||
// }
|
||
// src = ''
|
||
// title = {
|
||
// user.NAME
|
||
// }
|
||
// alt = {
|
||
// user.NAME
|
||
// }
|
||
// />)
|
||
// }
|
||
return result
|
||
}
|
||
|
||
//判断是PC还是移动端
|
||
export function getIsPC() {
|
||
if (navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/WebOS/i) || navigator
|
||
.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent
|
||
.match(/iPod/i) || navigator.userAgent.match(/Windows Phone/i)) {
|
||
return false
|
||
} else {
|
||
return true
|
||
}
|
||
}
|
||
|
||
//task未空的onBeforeSaveHandleRecord事件日志
|
||
export function onBeforeSaveHandleRecordLog(params, formCode, title) {
|
||
if (params.data.TaskID == '00000000-0000-0000-0000-000000000000' || params.data.id ==
|
||
'00000000-0000-0000-0000-000000000000') {
|
||
var orgId = params.login.OrgId; //登录后有存储登录信息
|
||
let json = initFilter(orgId, null, null, null, null, formCode, title, params.data.TaskID,
|
||
" params.pageCode:[" + params.pageCode + "] params.data.id:[" + params.data.id +
|
||
"] UserId:[" + params.login.loginInfo.User.ID + "] params.data.taskCode: [" + params
|
||
.data.taskCode + "] homeReload: [" + params.data.homeReload + "]");
|
||
params.dispatch({
|
||
type: 'app/getDataByPost',
|
||
url: 'PF/PFSysLog/addLog',
|
||
payload: json,
|
||
onlyData: false,
|
||
onComplete: (ret) => {}
|
||
})
|
||
}
|
||
}
|
||
|
||
//显示附件
|
||
export function showFiles(Nav_Files, imgHost) {
|
||
var result = []
|
||
// Nav_Files && Nav_Files?.map((item, i) => {
|
||
// result.push( < a width = {
|
||
// '20%'
|
||
// }
|
||
// title = {
|
||
// item.Nav_ImgFile.FILE_NAME
|
||
// }
|
||
// target = '_blank'
|
||
// href = {
|
||
// imgHost + item.Nav_ImgFile.Nav_File.FILE_PATH
|
||
// } > {
|
||
// item.Nav_ImgFile.FILE_NAME
|
||
// } < /a>)
|
||
// })
|
||
return result
|
||
}
|
||
|
||
export function ShowDateTime(datetime, fmt) {
|
||
if (datetime == undefined || datetime == null || datetime.length < 1) {
|
||
return ''
|
||
} else {
|
||
if (fmt == undefined || fmt == null || fmt.length < 1)
|
||
fmt = 'yyyy-MM-dd'
|
||
return new Date(datetime).Format(fmt)
|
||
}
|
||
}
|
||
|
||
export function downLoad(imgHost, fileName) {
|
||
if (fileName) {
|
||
let link = document.createElement('a')
|
||
link.href = imgHost + '/' + fileName
|
||
document.body.appendChild(link)
|
||
window.open(link)
|
||
} else {
|
||
alert('获取参数配置失败!')
|
||
}
|
||
}
|
||
|
||
Date.prototype.Format = function(fmt) {
|
||
var o = {
|
||
"M+": this.getMonth() + 1, //月份
|
||
"d+": this.getDate(), //日
|
||
"H+": this.getHours(), //小时
|
||
"m+": this.getMinutes(), //分
|
||
"s+": this.getSeconds(), //秒
|
||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||
"S": this.getMilliseconds() //毫秒
|
||
};
|
||
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 -
|
||
RegExp.$1.length));
|
||
for (var k in o)
|
||
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1
|
||
.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||
return fmt;
|
||
}
|
||
|
||
|
||
export function ShowPrintClose(props) {
|
||
if (typeof props.data.onCancel != "undefined" && typeof props.data.onCancel == 'function')
|
||
props.data.onCancel();
|
||
}
|
||
|
||
|
||
//附件数据结构转换
|
||
export function fileStructChange(files) {
|
||
let result = []
|
||
files.forEach(e => {
|
||
result.push({
|
||
...e,
|
||
remotePath: e.Nav_ImgFile.Nav_File.FILE_PATH,
|
||
name: e.Nav_ImgFile.FILE_NAME
|
||
})
|
||
})
|
||
return result
|
||
}
|
||
|
||
//查重
|
||
export function duplicated(array) {
|
||
for (let j = 0; j < array.length; j++) {
|
||
if (array.indexOf(array[j]) < array.lastIndexOf(array[j])) {
|
||
return true
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
export function isChinaMobilePhone(phone) {
|
||
// 2024
|
||
var reg = new RegExp(/^(13[0-9]|14[05679]|15[012356789]|16[2567]|17[01235678]|18[0-9]|19[012356789])[0-9]{8}$/)
|
||
return reg.test(phone)
|
||
}
|
||
export function easyCheckID(code) {
|
||
return /^([0-9a-zA-Z]{15}|[0-9a-zA-Z]{18})$/.test(code)
|
||
}
|
||
export function IsChinese(str) {
|
||
// var reg = /^[\u0391-\uFFE5]+$/;
|
||
var reg =/[^\u4e00-\u9fa5]/
|
||
if (reg.test(str)) {
|
||
return false
|
||
} else {
|
||
return true
|
||
}
|
||
|
||
}
|
||
export function checkIDCard(code) {
|
||
// 校验非空
|
||
if (!code) {
|
||
return false
|
||
}
|
||
// 校验长度
|
||
if (code.length != 15 && code.length != 18) {
|
||
return false
|
||
}
|
||
// 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
|
||
//假设18位身份证号码:41000119910101123X 410001 19910101 123X
|
||
//^开头
|
||
//[1-9] 第一位1-9中的一个 4
|
||
//\\d{5} 五位数字 10001(前六位省市县地区)
|
||
//(18|19|20) 19(现阶段可能取值范围18xx-20xx年)
|
||
//\\d{2} 91(年份)
|
||
//((0[1-9])|(10|11|12)) 01(月份)
|
||
//(([0-2][1-9])|10|20|30|31)01(日期)
|
||
//\\d{3} 三位数字 123(第十七位奇数代表男,偶数代表女)
|
||
//[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
|
||
//$结尾
|
||
|
||
//假设15位身份证号码:410001910101123 410001 910101 123
|
||
//^开头
|
||
//[1-9] 第一位1-9中的一个 4
|
||
//\\d{5} 五位数字 10001(前六位省市县地区)
|
||
//\\d{2} 91(年份)
|
||
//((0[1-9])|(10|11|12)) 01(月份)
|
||
//(([0-2][1-9])|10|20|30|31)01(日期)
|
||
//\\d{3} 三位数字 123(第十五位奇数代表男,偶数代表女),15位身份证不含X
|
||
//$结尾
|
||
|
||
var reg = new RegExp(/(^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/)
|
||
var matches = reg.test(code)
|
||
if (matches) {
|
||
// 15位的身份证,直接返回合法
|
||
if (code.length == 15) {
|
||
return true
|
||
}
|
||
// 18位的进一步校验
|
||
try {
|
||
// TODO:
|
||
if (/^([0-9a-zA-Z]{18})$/.test(code)) {
|
||
return true
|
||
} else {
|
||
return false
|
||
}
|
||
|
||
} catch (e) {
|
||
console.error(e)
|
||
return false
|
||
}
|
||
|
||
}
|
||
return matches
|
||
} |