react-admin-kit
Version:
A react based UI components for admin system
221 lines (209 loc) • 7.93 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _typeof from "@babel/runtime/helpers/esm/typeof";
/**
* 表单 onFinish 时,将符合约定规范的 dataIndex 转成需要的数据, 看下面的例子
*
* {'user,userName': {value: '1', label: 'jack'}} => {user: '1', userName: 'jack}
*
* 自定义取值:
* {'user,userName_id,name': {id: '1', name: 'jack'}} => {user: '1', userName: 'jack}
*
* 套嵌数据也能处理:
* {info: {'user,userName': {value: '1', label: 'jack'}}} => {info: {user: '1, userName: 'jack'}}
*/
import get from 'lodash/get';
import cloneDeep from 'lodash/cloneDeep';
import isPlainObject from 'lodash/isPlainObject';
export function splitValues() {
var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var result = {};
Object.keys(values).forEach(function (key) {
var value = values[key];
// 处理数组
if (Array.isArray(value)) {
value = value.map(function (item) {
return _typeof(item) === 'object' && item !== null ? splitValues(item) : item;
});
// 把对象的形式全都循环处理一遍
} else if (_typeof(value) === 'object' && value !== null) {
value = splitValues(value);
}
if (_stringMatchConvention(key)) {
var _value, _value2;
var _key$split = key.split('_'),
_key$split2 = _slicedToArray(_key$split, 2),
before = _key$split2[0],
after = _key$split2[1];
var _before$split = before.split(','),
_before$split2 = _slicedToArray(_before$split, 2),
valueName = _before$split2[0],
labelName = _before$split2[1];
var _ref = after ? after.split(',') : [],
_ref2 = _slicedToArray(_ref, 2),
_ref2$ = _ref2[0],
toValueName = _ref2$ === void 0 ? 'value' : _ref2$,
_ref2$2 = _ref2[1],
toLabelName = _ref2$2 === void 0 ? 'label' : _ref2$2;
result[valueName] = (_value = value) === null || _value === void 0 ? void 0 : _value[toValueName];
result[labelName] = (_value2 = value) === null || _value2 === void 0 ? void 0 : _value2[toLabelName];
} else {
result[key] = value;
}
});
return result;
}
/**
* 内部调用
* dataIndex 必有值
*/
var _stringMatchConvention = function _stringMatchConvention(dataIndex) {
return dataIndex.toString().includes(',');
};
/**
* 内部调用
* dataIndex 是数组
* 若符合返回所在的 index
*/
var _arrMatchConventionIndex = function _arrMatchConventionIndex(dataIndexArr) {
return dataIndexArr.findIndex(function (dataIndex) {
return _stringMatchConvention(dataIndex);
});
};
export var _genDataIndex = function _genDataIndex(key, baseName) {
if (baseName || baseName === 0) {
if (Array.isArray(key)) {
return [baseName].concat(key);
} else {
return [baseName, key];
}
}
return key;
};
/**
* 数组套嵌数组去重
* @param arrays 要去重的数组
* @returns 去重后的数组
*/
export var uniqueNestedArrays = function uniqueNestedArrays(arrays) {
var seen = new Set();
return arrays.filter(function (item) {
var key = JSON.stringify(item);
if (seen.has(key)) {
return false;
}
seen.add(key);
return true;
});
};
/**
* 收集单个列的 dataIndex
* 用于循环
*/
var collectDataIndexByColumn = function collectDataIndexByColumn(column) {
var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var baseName = arguments.length > 2 ? arguments[2] : undefined;
var result = [];
if (column.valueType === 'dependency') {
if (typeof column.columns === 'function') {
// 如果是函数, 需要执行函数获取 dataIndex
var columns = column.columns(transformValuesForConvention(value, column.name));
result = result.concat(collectDataIndex(columns, value, baseName));
}
} else if (column.valueType === 'group') {
if (Array.isArray(column.columns)) {
result = result.concat(collectDataIndex(column.columns, value, baseName));
}
} else if (column.valueType === 'formList') {
// todo: 对于 formList 暂不考虑额外 baseName 前缀, formList 本身就是一个前缀
var dataIndex = column.dataIndex;
// @ts-ignore dataIndex 可能是 number
if (!!dataIndex || dataIndex === 0) {
// result.push(_genDataIndex(dataIndex));
if (Array.isArray(column.columns)) {
var arrValue = value[dataIndex.toString()] || [];
// 使用数组存储结果,最后再去重
var listResult = [];
arrValue.forEach(function (itemValue) {
collectDataIndex(
// @ts-ignore
column.columns, itemValue, dataIndex // baseName
).forEach(function (key) {
listResult.push(key);
});
});
result = result.concat(uniqueNestedArrays(listResult));
}
}
// @ts-ignore dataIndex 可能是 number
} else if (!!column.dataIndex || column.dataIndex === 0) {
if (!isPlainObject(column.dataIndex)) {
// @ts-ignore dataIndex 的类型是 unknow, 理论上只能是 React.key 或 React.key[]. 这里为了安全排除了对象
result.push(_genDataIndex(column.dataIndex, baseName));
}
}
return result;
};
/**
* 收集所有的 dataIndex, 包括套嵌的(dependency)
*/
export var collectDataIndex = function collectDataIndex(columns) {
var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var baseName = arguments.length > 2 ? arguments[2] : undefined;
var result = [];
columns.forEach(function (column) {
result = result.concat(collectDataIndexByColumn(column, value, baseName));
});
return result;
};
// 处理单个 dataIndex
// 内部调用
export var _transformValueForConvention = function _transformValueForConvention(values, dataIndex) {
var _dataIndex$split = dataIndex.split('_'),
_dataIndex$split2 = _slicedToArray(_dataIndex$split, 2),
before = _dataIndex$split2[0],
after = _dataIndex$split2[1];
var _before$split3 = before.split(','),
_before$split4 = _slicedToArray(_before$split3, 2),
valueName = _before$split4[0],
labelName = _before$split4[1];
var _ref3 = after ? after.split(',') : [],
_ref4 = _slicedToArray(_ref3, 2),
_ref4$ = _ref4[0],
toValueName = _ref4$ === void 0 ? 'value' : _ref4$,
_ref4$2 = _ref4[1],
toLabelName = _ref4$2 === void 0 ? 'label' : _ref4$2;
if (values[valueName] === undefined && values[labelName] === undefined) {
return undefined;
}
return _defineProperty(_defineProperty({}, toValueName, values[valueName]), toLabelName, values[labelName]);
};
export var transformValuesForConvention = function transformValuesForConvention(_values) {
var dataIndexes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var values = cloneDeep(_values);
if (!values) return values;
dataIndexes.forEach(function (dataIndex) {
if (typeof dataIndex === 'string' || typeof dataIndex === 'number') {
if (_stringMatchConvention(dataIndex)) {
values[dataIndex] = _transformValueForConvention(values, dataIndex);
}
}
if (Array.isArray(dataIndex)) {
var matchIndex = _arrMatchConventionIndex(dataIndex);
if (matchIndex > 0) {
var path = dataIndex.slice(0, matchIndex).join('.');
var $values = get(values, path);
var $dataIndex = dataIndex[matchIndex];
// formList 的情况
if (Array.isArray($values)) {
$values.forEach(function (itemValue, index) {
$values[index][$dataIndex.toString()] = _transformValueForConvention(itemValue, $dataIndex);
});
} else {
$values[$dataIndex] = _transformValueForConvention($values, $dataIndex);
}
}
}
});
return values;
};