@ams-team/ams
Version:
Admin Materials System.
261 lines (227 loc) • 7.68 kB
JavaScript
import { parseTime } from '../../utils';
function defaultGetter(val) {
return val;
}
function isEmptyString(val) {
return val == null || val === '';
}
export const get = defaultGetter;
export const set = defaultGetter;
export const view = defaultGetter;
export const equals = function(val1, val2, field) {
// console.log('equals', JSON.stringify(val1), JSON.stringify(val2));
// 如果field要跳过空值认为相同时,需要主动设置emptyEquel为false,如radio可以为0值
if (field && field.emptyEquel !== false) {
// 同时为空值时,认为是相同值,如: '' false 0 undefined null NaN
if (!val1 && !val2) {
return true;
}
}
// 先进行直接比较数据
if (val1 === val2) {
return true;
}
// 如果是File类型
if (val1 instanceof File && val2 instanceof File) {
for (const key in val1) {
if (val1[key] !== val2[key]) {
return false;
}
}
return true;
}
const type1 = typeof val1;
const type2 = typeof val2;
if (type1 === type2 && type1 === 'object') {
// null 可能会混进来,如果进入到这里会一个null一个真object,所以直接返回false
if (val1 === null || val2 === null) {
return false;
}
const aProps = Object.getOwnPropertyNames(val1);
const bProps = Object.getOwnPropertyNames(val2);
// If number of properties is different,
// objects are not equivalent
if (aProps.length !== bProps.length) {
return false;
}
for (let i = 0; i < aProps.length; i++) {
let propName = aProps[i];
// If values of same property are not equal,
// objects are not equivalent
if (!equals(val1[propName], val2[propName])) {
return false;
}
}
// If we made it this far, objects
// are considered equivalent
return true;
}
if (type1 === 'function' || type2 === 'function') {
// console.error('ams Err: please do not use function in field set !!');
return String(val1) === String(val2);
}
return false;
};
// 文件
export const getFile = function(url) {
if (url) {
return [
{
name: url.replace(/^.*\/(?=\w+\.\w+$)/, ''),
url: url
}
];
}
return [];
};
export const setFile = function(arr) {
return Array.isArray(arr) ? arr.map(item => item.url).join(',') : '';
};
export const viewFile = function(value) {
return value ? value.replace(/^.*\/(?=\w+\.\w+$)/, '') : '';
};
// 常规的多值类型get、set
// string,string => [string, string]
export const getArray = function(val, field) {
if (isEmptyString(val)) {
return [];
} else {
const props = field && field.props && field.props.props || {};
const splitBy = props.multiple && props.splitBy;
return String(val).split(splitBy || ',');
}
};
export const setArray = function(arr, field) {
const props = field && field.props && field.props.props || {};
const splitBy = props.multiple && props.splitBy;
return Array.isArray(arr) ? arr.join(splitBy || ',') : '';
};
// 需要getter函数和setter函数的get、set
// string,string => [string, string]
export const getterArray = function(getter) {
return function(val, field) {
if (isEmptyString(val)) {
return [];
} else {
return String(val).split(',').map(item => getter(item, field));
}
};
};
export const setterArray = function(setter) {
return function(arr, field) {
return arr ? arr.map(item => setter(item, field)).join(',') : '';
};
};
export const viewerArray = function(viewer, spliter = ',') {
return function(val, field) {
const spliter = field.props.type === 'dates' ? ', ' : ' 至 ';
const arr = isEmptyString(val) ? [] : String(val).split(',').map(item => viewer(item, field));
return arr.join(spliter);
};
};
// 单选的时候得到的一维数组,多选的时候得到二维数组
export const getterCascader = function(getter) {
return function(val, field) {
if (isEmptyString(val)) {
return [];
} else if (field && field.props && field.props.props && field.props.props.multiple) {
return String(val).split(',').map(item => getter(item, field));
}
return String(val).split(',');
};
};
// 单选的时候得到 a,b,c; 多选的时候得到的是 a1/a2/a3,b1/b2/b3
export const setterCascader = function(setter) {
return function(arr, field) {
if (field && field.props && field.props.props && field.props.props.multiple) {
return arr ? arr.map(item => setter(item, field)).join(',') : '';
}
return arr ? arr.join(',') : '';
};
};
// select需要兼容多值和单值的场景
export const getSelect = function (val, field) {
if (field.props.multiple) {
return getArray(val);
} else {
return val;
}
};
export const setSelect = function (val, field) {
if (field.props.multiple) {
return setArray(val);
} else {
return val;
}
};
// date
export const getDate = function(val, field) {
// console.log('getDate', val);
// element内部的date,如果传入是时间戳,会自动转换,不需要处理
return /^(-)?\d{1,13}$/.test(val) ? Number(val) : val;
};
export const setDate = function(val, field) {
// console.log('setDate', val);
// element内部的date,如果传入是时间戳,会自动转换,不需要处理
if (val instanceof Date) {
return val.getTime();
}
return val;
};
export const viewDate = function(value, field) {
let format = field.format;
if (!format) {
switch (field.props.type) {
case 'year':
format = 'yyyy';
break;
case 'month':
format = 'yyyy-MM';
break;
case 'datetimerange':
format = 'yyyy-MM-dd HH:mm:ss';
break;
case 'datetime':
format = 'yyyy-MM-dd HH:mm:ss';
break;
case 'timepicker':
case 'timerange':
format = 'HH:mm:ss';
break;
default:
format = 'yyyy-MM-dd';
break;
}
}
return parseTime(value, format);
};
// password
export const viewPassword = function (value) {
return value ? value.replace(/./g, '*') : '';
};
// units 单位
export const getUnits = function(val, field) {
let currentUnit = field.defaultUnit;
const prependSlot = field.props && field.props.slot === 'prepend';
for (let i = 0; i < field.units.length; i++) {
const unitsReg = prependSlot ? ('^' + field.units[i]) : (field.units[i] + '$');
if (new RegExp(unitsReg).test(val)) {
currentUnit = field.units[i];
break;
}
}
// console.log('getUnits', val, 'currentUnit', currentUnit);
// console.log(field);
const reg = prependSlot ? ('^' + currentUnit) : (currentUnit + '$');
return {
unit: currentUnit,
val: val ? val.replace(new RegExp(reg), '') : ''
};
};
export const setUnits = function(val, field) {
// console.log('setUnits', val);
return field.props && field.props.slot === 'prepend' ? (val.unit + val.val) : (val.val + val.unit);
};
export const viewUnits = function(value, field) {
return value;
};