aiccs/src/plugins/EasyComponent/utils.js

226 lines
5.5 KiB
JavaScript

import Vue from 'vue'
const findTarget = function(obj, prop) {
let target = obj
let targetProp = prop
if (typeof prop === 'string') {
const paths = prop.split('.')
targetProp = paths.pop()
for (const path of paths) {
if (!obj[path]) {
Vue.set(obj, path, createPathObject({}))
}
target = obj[path]
}
}
return [target, targetProp]
}
function getAllKeys(obj, parent) {
const result = []
for (const key in obj) {
const nextKey = (parent ? `${parent}.` : '') + key
if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
result.push(...getAllKeys(obj[key], nextKey))
} else {
result.push(nextKey)
}
}
return result
}
export function createPathObject(originObject) {
originObject = originObject || {}
return originObject._isPathObject ? originObject : new Proxy(originObject, {
set: (obj, prop, value) => {
const [target, targetProp] = findTarget(obj, prop)
Vue.set(target, targetProp, value)
return true
},
get: (obj, prop) => {
if (prop === '_isPathObject') {
return true
}
if (prop === '_pathKeys') {
return getAllKeys(obj)
}
const [target, targetProp] = findTarget(obj, prop)
return target[targetProp]
},
has: (obj, prop) => {
const [target, targetProp] = findTarget(obj, prop)
return targetProp in target
},
deleteProperty: (obj, prop) => {
const [target, targetProp] = findTarget(obj, prop)
Vue.delete(target, targetProp)
return true
}
})
}
export function assignPathObject(target, ...args) {
const pathObjectTarget = createPathObject(target)
for (const obj of args) {
const pathObj = createPathObject(obj)
for (const key of pathObj._pathKeys) {
pathObjectTarget[key] = pathObj[key]
}
}
return pathObjectTarget
}
/**
* 格式化时间
* @param {(Object|string|number)} time
* @param {string} cFormat
* @returns {string}
*/
export function parseDate(time, format = 'yyyy-MM-dd hh:mm:ss') {
const date = time instanceof Date ? time : new Date(time)
if (isNaN(date.valueOf())) {
return ''
}
const o = {
'M+': date.getMonth() + 1, // 月份
'd+': date.getDate(), // 日
'h+': date.getHours(), // 小时
'H+': date.getHours(), // 小时
'm+': date.getMinutes(), // 分
's+': date.getSeconds(), // 秒
'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
'S': date.getMilliseconds() // 毫秒
}
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
}
for (const k in o) {
if (new RegExp('(' + k + ')').test(format)) {
format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
}
}
if (/CN/.test(format)) {
format = format.replace('CN', () => {
const now = Date.now()
const diff = (now - date) / 1000
if (diff < 30) {
return '刚刚'
} else if (diff < 3600) {
// less 1 hour
return Math.ceil(diff / 60) + '分钟前'
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前'
} else if (diff < 3600 * 24 * 2) {
return '1天前'
}
})
}
return format
}
const warningMap = new Set()
export function showWarning(text) {
if (!warningMap.has(text)) {
console.warn(`[EasyComponent]${text}`)
warningMap.add(text)
}
}
/**
*
* @param {*} options
* @param {*} predicate
* @param {*} deepLimit 往下查找深度限制 1表示仅在顶层查找
* @returns
*/
export function findDeepOption(options, predicate, deepLimit) {
for (const item of options) {
if (predicate(item)) {
return item
}
if (typeof deepLimit === 'number') {
deepLimit = deepLimit - 1
}
if (Array.isArray(item.children) && (typeof deepLimit !== 'number' || deepLimit > 0)) {
const child = findDeepOption(item.children, predicate, deepLimit)
if (child) {
return child
}
}
}
}
export function findDeepOptionIndex(options, predicate, scopeData = { index: -1 }) {
for (const item of options) {
scopeData.index++
if (predicate(item)) {
return scopeData.index
}
if (Array.isArray(item.children)) {
const childIndex = findDeepOptionIndex(item.children, predicate, scopeData)
if (childIndex > -1) {
return childIndex
}
}
}
return -1
}
export function filterDeepOption(options, predicate, arr = []) {
for (const item of options) {
if (predicate(item)) {
arr.push(item)
}
if (Array.isArray(item.children)) {
filterDeepOption(item.children, predicate, arr)
}
}
return arr
}
export function JSONStringify(obj) {
return JSON.stringify(obj, (key, value) => {
if (typeof value === 'function') {
return value.toString()
}
return value
})
}
export function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj
}
if (obj instanceof File) {
return obj
}
if (Array.isArray(obj)) {
const newArr = []
for (const item of obj) {
newArr.push(deepClone(item))
}
return newArr
}
const newObj = {}
for (const key in obj) {
if (typeof obj[key] === 'object') {
newObj[key] = deepClone(obj[key])
} else {
newObj[key] = obj[key]
}
}
return newObj
}
/**
* 取第一个不为undefined的值
*/
export function getValueByLevel(...args) {
for (const value of args) {
if (value !== undefined) {
return value
}
}
return undefined
}