react-admin-kit
Version:
A react based UI components for admin system
184 lines (172 loc) • 8.87 kB
JavaScript
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
/**
* 表单 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'}}
*/
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 (_typeof(value) === 'object' && value !== null && !Array.isArray(value)) {
value = splitValues(value);
}
var _key$split = key.split('_'),
_key$split2 = _slicedToArray(_key$split, 2),
before = _key$split2[0],
after = _key$split2[1];
var names = before.split(',');
if (names.length > 1) {
var _value, _value2;
var _names = _slicedToArray(names, 2),
valueName = _names[0],
labelName = _names[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, 根据约定的规范,输出一个约定的值
*
* 1. 参数: values: {userId: '1', userName: 'jack'} dataIndex: 'userId,userName',
* 输出 {value: '1', label: 'jack'}
* 2. 参数: values: {userId: '1', userName: 'jack'} dataIndex: 'userId,userName_id,name'
* 输出: {id: '1', name: 'jack'}
* 3. dataIndex不含逗号原样输出
*
*/
function getConventionValue() {
var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var dataIndex = arguments.length > 1 ? arguments[1] : undefined;
var _dataIndex$split = dataIndex.split('_'),
_dataIndex$split2 = _slicedToArray(_dataIndex$split, 2),
before = _dataIndex$split2[0],
after = _dataIndex$split2[1];
var names = before.split(',');
if (names.length > 1) {
var _names2 = _slicedToArray(names, 2),
valueName = _names2[0],
labelName = _names2[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]);
} else {
return values[dataIndex];
}
}
/**
* 根据约定的规范, 分析 dataIndex, 将 values 转换成约定的数据
* @参数 values 是需要转换的数据.
* @参数 allVals 是通过 getFieldsValue 收集到的所有的表单值,通过它可以拿到所有的 dataIndex
*
* 1.
* 参数values: {userId: '1', userName: 'jack}
* 参数allVals: {'userId,userName': undefined}
* => {'userId,userName': {value: '1', label: 'jack'}, userId: '1', userName: 'jack'}
*
* 2. 自定义取值:
* 参数values: {userId: '1', userName: 'jack}
* 参数allVals: {'userId,userName_id,name': undefined}
* => {'userId,userName_id,name': {id: '1', name: 'jack'}, userId: '1', userName: 'jack'}
*
* 3. 套嵌数据也能处理:
* 参数values: {info: {userId: '1', userName: 'jack'}}
* 参数allVals: {info: {'userId,userName': undefined}}
* => {info: {'userId,userName': {value: '1', label: 'jack'}, userId: '1', userName: 'jack'}}
*/
export function convertValues(values) {
var allVals = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (!values) return values;
Object.keys(allVals).forEach(function (dataIndex) {
var val = allVals[dataIndex];
// 如果是对象处理套嵌数据
if (_typeof(val) === 'object') {
convertValues(values[dataIndex], val);
}
// bugfix: 如果 dataIndex 不是约定格式则不处理. 否则在 setFieldsValues 时会误赋值
if (!matchConvention(dataIndex)) return;
values[dataIndex] = getConventionValue(values, dataIndex);
});
return values;
}
/**
* 判断 dataIndex 格式是否满足约定式
* @param dataIndex
*/
export function matchConvention(dataIndex) {
return dataIndex && typeof dataIndex === 'string' && dataIndex.includes(',');
}
/**
* 从一个字符串中提取类似对象结构的值
* 用法可参看测试用例
*
* @todo 这个方法暂时用不上, 因为 dataIndex 可能还是数组, 需要考虑套嵌的情况
*/
export function extractValuesInString(string, key) {
var reg1 = new RegExp(key);
var reg2 = new RegExp(/\s*:\s*[\'\"]([^\"\']*)[\'\"]/, 'g');
// reg 拼接成一个新的 reg, 因为如果直接用字符串拼接可能会丢失一些特殊字符
var reg = new RegExp(reg1.source + reg2.source, 'g');
/**
* 直接字符串拼接会丢失
* const reg = new RegExp(`${key}\s*:\s*[\'\"]([^\"\']*)[\'\"]`, 'g');
* 输出: /dataIndexs*:s*['"]([^"']*)['"]/g
* 会丢失 \s 这样的转译
*/
var matchResult = string.matchAll(reg);
return Array.from(matchResult).map(function (item) {
return item[1];
});
}
export function setFieldsValueConvention(values, _ref6) {
var getFieldsValue = _ref6.getFieldsValue,
setFieldsValue = _ref6.setFieldsValue,
callback = _ref6.callback;
var fields = getFieldsValue();
var convertedVals = convertValues(values, fields);
// 第一次赋值
setFieldsValue(convertedVals);
// 第二次赋值. 因为一次赋值不够, 有些 field 是 dependency 的
setTimeout(function () {
var allFields = getFieldsValue();
var finalConvertedVals = convertValues(values, allFields);
setFieldsValue(finalConvertedVals);
if (callback) {
callback(finalConvertedVals);
}
}, 50);
}