UNPKG

bytesforce-form-render

Version:

通过 JSON Schema 生成标准 Form,常用于自定义搭建配置界面生成

161 lines (130 loc) 5.05 kB
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import { get, set, unset } from 'lodash-es'; import { cleanEmpty, clone, isObject, removeEmptyItemFromList, removeHiddenFromResult } from './utils'; // 提交前需要先处理formData的逻辑 export var processData = function processData(data, flatten, removeHiddenData) { // 1. 去掉 hidden = true 的元素 var _data = clone(data); if (removeHiddenData) { _data = removeHiddenFromResult(data, flatten); } // 2. bind 的处理 _data = transformDataWithBind(_data, flatten); // 3. 去掉list里面所有的空值 _data = removeEmptyItemFromList(_data); // 4. 去掉所有的 undefined _data = cleanEmpty(_data); return _data; }; export var transformDataWithBind = function transformDataWithBind(data, flatten) { var _data = data; var unbindKeys = []; var bindKeys = []; var bindArrKeys = []; var isMultiBind = function isMultiBind(bind) { return Array.isArray(bind) && bind.every(function (item) { return typeof item === 'string'; }); }; Object.keys(flatten).forEach(function (key) { var bind = flatten[key] && flatten[key].schema && flatten[key].schema.bind; var _key = key.replace('[]', ''); if (bind === false) { unbindKeys.push(_key); } else if (typeof bind === 'string') { bindKeys.push({ key: _key, bind: bind }); } else if (isMultiBind(bind)) { bindArrKeys.push({ key: _key, bind: bind }); } }); var handleBindData = function handleBindData(formData) { unbindKeys.forEach(function (key) { unset(formData, key); // TODO: maybe removing upper structure }); bindKeys.forEach(function (item) { var key = item.key, bind = item.bind; var temp = get(formData, key); var oldVal = get(formData, bind); if (isObject(oldVal)) { temp = _objectSpread(_objectSpread({}, oldVal), temp); } set(formData, bind, temp); unset(formData, key); }); bindArrKeys.forEach(function (item) { var key = item.key, bind = item.bind; var temp = get(formData, key); unset(formData, key); if (Array.isArray(temp)) { temp.forEach(function (t, i) { if (bind[i]) { set(formData, bind[i], t); } }); } }); }; handleBindData(_data); return _data; }; export var transformDataWithBind2 = function transformDataWithBind2(data, flatten) { var _data = clone(data); var bindKeys = []; var bindArrKeys = []; var isMultiBind = function isMultiBind(bind) { return Array.isArray(bind) && bind.every(function (item) { return typeof item === 'string'; }); }; Object.keys(flatten).forEach(function (key) { var bind = flatten[key] && flatten[key].schema && flatten[key].schema.bind; var _key = key.replace('[]', ''); if (typeof bind === 'string') { bindKeys.push({ key: _key, bind: bind }); } else if (isMultiBind(bind)) { bindArrKeys.push({ key: _key, bind: bind }); } }); var handleBindData2 = function handleBindData2(newData) { bindKeys.forEach(function (item) { var key = item.key, bind = item.bind; var temp = get(newData, bind); // 如果已经有值了,要和原来的值合并,而不是覆盖 var oldVal = get(newData, key); if (isObject(oldVal)) { temp = _objectSpread(_objectSpread({}, oldVal), temp); } set(newData, key, temp); unset(newData, bind); }); bindArrKeys.forEach(function (item) { var key = item.key, bind = item.bind; var temp = []; bind.forEach(function (b) { var bindValue = get(newData, b); if (bindValue !== undefined) { temp.push(bindValue); } unset(newData, b); }); if (temp.length > 0) { set(newData, key, temp); } }); }; handleBindData2(_data); return _data; };