maycur-business
Version:
maycur business react components of web
674 lines (536 loc) • 28.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireWildcard(require("react"));
var _PureJs = _interopRequireDefault(require("../PureJs"));
var _FormChefCommon = _interopRequireDefault(require("../FormChefCommon"));
var _FormTombStone = _interopRequireWildcard(require("../FormTombStone"));
var _formDishDefault = _interopRequireDefault(require("./formDishDefault"));
var _generateValidator = _interopRequireDefault(require("./generateValidator"));
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (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 = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { 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; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
var RootFormDish = null;
var AssociationSort = _PureJs["default"].AssociationSort;
function defineDish(obj) {
RootFormDish = obj;
}
var FormChef = function FormChef(option) {
return function (WrappedComponent) {
var defaultFormOption = {
cookerOption: {},
formReadyLock: true,
preDefinedFormulas: [],
formMode: 'EDIT',
//NOTE EDIT:编辑,VIEW:查看模式
formFields: [],
isValueMap: false //谨慎使用
};
var formOption = Object.assign(defaultFormOption, option);
var FormDish = formOption.FormDish ? formOption.FormDish : RootFormDish;
var WrapperFormChef =
/*#__PURE__*/
function (_Component) {
_inherits(WrapperFormChef, _Component);
function WrapperFormChef(_props) {
var _this;
_classCallCheck(this, WrapperFormChef);
_this = _possibleConstructorReturn(this, _getPrototypeOf(WrapperFormChef).call(this, _props));
_this.formMapFields = function (props) {
var _this$state = _this.state,
formFields = _this$state.formFields,
formReady = _this$state.formReady;
var formValue = props.formValue;
var modifyFieldValues = {};
if (formReady && formFields && formFields.length > 0 && formValue) {
console.log('formValue==', formValue, _this.fields);
_lodash["default"].forEach(formFields, function (item) {
var matchedField = _this.fields[item.identifier];
if (matchedField && !_lodash["default"].isEqual(matchedField.value, formValue[item.identifier])) {
modifyFieldValues[item.identifier] = formValue[item.identifier];
}
});
if (!_lodash["default"].isEmpty(modifyFieldValues)) {
console.log('formMapFields changed===', modifyFieldValues);
_this.setFieldsValue(modifyFieldValues, {
modifyFromProps: true
});
}
}
};
_this.updateFormFields = function (fields) {
//只有在编辑页面的时候,需要根据条件里面的只读性(isFieldReadOnly)设置到formFields的isReadonly属性上
if (formOption.formMode === 'EDIT') {
var effectedFieldValues = {};
_lodash["default"].forEach(fields, function (field) {
field.property.isReadonly = field.property.isFieldReadOnly;
if (field.detailTableFields) {
_lodash["default"].forEach(field.detailTableFields, function (detailField) {
detailField.property.isReadonly = detailField.property.isFieldReadOnly;
});
}
if (field.property.isFieldHide && _this.getFieldValue([field.identifier])) {
effectedFieldValues[field.identifier] = undefined;
}
});
_this.setFieldsValue(effectedFieldValues);
}
_this.setState({
formFields: fields
});
};
_this.getFieldError = function (name) {
var matchField = _this.fields[name];
if (matchField) {
return matchField.validateError;
}
};
_this.setFormReady = function (val) {
if (formOption.formReadyLock) {
_this.setState({
formReady: !!val
});
}
};
_this.fetchData = function () {
if (_this.rcFormRef) return _this.rcFormRef.getFieldsValue();
};
_this.setFieldsValue = function (changeValues) {
var modifyOption = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (!changeValues || _lodash["default"].isEmpty(changeValues)) return;
var blockChangeEffect = modifyOption.blockChangeEffect,
modifyFromProps = modifyOption.modifyFromProps;
var formReady = _this.state.formReady;
var formData = _this.fetchFormData(); //是否触发条件公式
if (formOption.formMode === 'EDIT') _this.fieldChangeOnCondition(formData, changeValues);
var identifierList = []; //NOTE 触发watch函数
/* 触发观察函数 */
//如果表单是查看模式或者formReady=false的情况,不触发观察函数
if (formOption.formMode === 'EDIT' && formReady) {
_lodash["default"].forEach(changeValues, function (value, key) {
identifierList.push(key);
if (key in _this.fields) {
var fieldInstance = _this.fields[key];
_lodash["default"].forEach(fieldInstance.watch, function (item) {
if (typeof item === 'function') {
item(value, formData[key]);
}
});
}
});
}
_this.modifyFormData(_objectSpread({}, formData, {}, changeValues), modifyFromProps ? false : true); //如果表单是查看模式||formReady=false||blockChangeEffect(明确改值不需要联动)的情况,不触发表单联动
if (!blockChangeEffect && formOption.formMode === 'EDIT' && formReady) {
var modifyValues = {};
/* 表单联动触发 */
_lodash["default"].forEach(changeValues, function (val, key) {
var formulaEffectData = _this.formChefParser.triggerFormula(key, val);
modifyValues = _objectSpread({}, modifyValues, {}, formulaEffectData);
});
if (!_lodash["default"].isEmpty(modifyValues)) {
_this.setFieldsValue(modifyValues);
}
}
};
_this.modifyFormData = function (formData) {
var needUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var formChange = _this.props.formChange;
_lodash["default"].forEach(formData, function (val, key) {
if (_this.fields[key]) {
_this.fields[key].setValue(val);
}
});
if (formOption.isValueMap && needUpdate) {
//props的更改已经让组件render过一次
var onChange = _this.props.onChange;
if (typeof onChange === 'function') onChange(_this.fetchFormData());
/* 表单值改变回调函数 */
if (typeof formChange === 'function') formChange(formData);
} else {
if (needUpdate) _this.forceUpdate();
}
};
_this.fetchFormData = function () {
var formData = {};
_lodash["default"].forEach(_this.fields, function (field, name) {
formData[name] = field.value;
});
return formData;
};
_this.getFieldDecorator = function (name, rule) {
return function (fieldElem) {
var matcheField = _this.fields[name];
if (matcheField) {
// console.log(this.validators);
if (_this.validators) _this.validators.addRule(name, rule);
return _react["default"].cloneElement(fieldElem, {
value: matcheField.value,
onChange: function onChange(val) {
_this.setFieldsValue(_defineProperty({}, name, val));
},
ref: function ref(_ref) {
matcheField.componentInstance = _ref;
}
});
} else {
return null;
}
};
};
_this.setFieldWatch = function (fieldName, fn) {
if (typeof fn === 'function' && fieldName && fieldName in _this.fields) {
var fieldInstacne = _this.fields[fieldName];
fieldInstacne.setWatch(fn);
}
};
_this.cookForm = function () {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
/*
publicProps:表单级别的公共props每个field都应该接受
privateProps:字段级别的props,包含所有field的私有props,需要过滤后传入对应的字段组件
params:用于方法本身的一些逻辑参数
*/
var publicProps = options.publicProps,
privateProps = options.privateProps,
bottomExtra = options.bottomExtra,
topExtra = options.topExtra;
var _this$state2 = _this.state,
formFields = _this$state2.formFields,
formReady = _this$state2.formReady;
var FormNode = null;
if (!_lodash["default"].isEmpty(formFields) && formReady) {
FormNode = _react["default"].createElement("section", {
className: "mk-form"
}, topExtra ? topExtra : null, formFields.map(function (field, index) {
if (field.property.isFieldHide) return null;
return _react["default"].createElement(FormDish, {
FormBuild: FormChef,
key: field.code || index,
form: _this.instance,
field: field,
publicProps: publicProps,
privateProps: privateProps
});
}), bottomExtra ? bottomExtra : null);
} else {
FormNode = _react["default"].createElement(_FormTombStone["default"], null);
}
;
return FormNode;
};
_this.formInstantiate =
/*#__PURE__*/
function () {
var _ref2 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee(orgFormFields) {
var formFields;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(!orgFormFields && _lodash["default"].isEmpty(orgFormFields))) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
formFields = formOption.formMode === 'EDIT' ? _this.dynamicFormCtrl.init(orgFormFields) : orgFormFields;
_context.next = 5;
return new Promise(function (resolve, reject) {
_this.setState({
formFields: formFields
}, function () {
resolve();
});
});
case 5:
_this.validators = (0, _generateValidator["default"])(formFields);
_this.fieldInstantiate(formFields);
if (formOption.formMode === 'EDIT') _this.buildFormulaParser({
formFields: formFields
});
case 8:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function (_x) {
return _ref2.apply(this, arguments);
};
}();
_this.initData = function (data) {
var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (!data) return;
var formFields = _this.state.formFields;
var cloneFormData = _lodash["default"].clone(_this.formData);
_lodash["default"].forEach(formFields, function (field) {
if (_lodash["default"].has(data, field.identifier)) {
cloneFormData[field.identifier] = {
value: data[field.identifier]
};
}
});
_this.fieldChangeOnCondition(cloneFormData, cloneFormData, formFields, true);
_this.formChefParser.updateParserPool({
pool: _objectSpread({}, cloneFormData)
});
_this.setFormReady(true);
_this.modifyFormData(cloneFormData);
if (isNew && formOption.formMode === 'EDIT') {
//默认值的获取方式有些是要通过后台去请求,所以默认值的步骤独立出去
_this.formDefaultProcess(formFields);
}
};
_this.fieldChangeOnCondition = function (formData, changedFields, _formFields, isFirstUpdate) {
if (_this.dynamicFormCtrl && _this.dynamicFormCtrl.hasCondition) {
var formFields = _this.state.formFields;
_this.dynamicFormCtrl && _this.dynamicFormCtrl.onFieldChange(_formFields || formFields, formData, changedFields, isFirstUpdate);
}
};
_this.buildFormulaParser = function () {
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var formFields = data.formFields || _this.state.formFields;
if (formFields && formFields.length > 0) {
var formulaRules = [];
_this.formChefParser.buildFormFormula(formFields, defaultFormOption.preDefinedFormulas);
var associationFields = _lodash["default"].filter(formFields, {
type: 'AssociationInput'
});
if (associationFields && associationFields.length) {
// 构建一个类似的有向无环图
// 碧桂园的轻表单里基本全是数据互联组件,组件之间互相依赖,会发很多重复的请求。因此将这些依赖关系排个序,按序发请求
// 设置为隐藏的数据互联,在其显示时,在didmount中触发请求
var _associationFields = _lodash["default"].cloneDeep(associationFields);
_lodash["default"].remove(_associationFields, function (item) {
return item.property.isFieldHide;
});
_this.associationSort = new AssociationSort();
_this.associationSort.buildGraph(_associationFields);
_lodash["default"].each(associationFields, function (field, fIndex) {
_lodash["default"].each(field.cascadeDataRelations, function (f, sIndex) {
formulaRules.push({
targetField: field.identifier,
referField: f.value,
// 受影响字段
formula: "clear".concat(fIndex).concat(sIndex, "()"),
// maycur-business中同名方法会被覆盖
setFunctionList: _defineProperty({}, "clear".concat(fIndex).concat(sIndex), function clear() {
// 初始化请求已完成
if (_this.associationInit) {
var _formFields2 = _this.state.formConfig.formFields;
var target = _lodash["default"].find(_formFields2, {
identifier: field.identifier
});
if (target && !target.property.isFieldHide) {
_this.setFieldsValue(_defineProperty({}, "".concat(field.identifier), undefined));
_this.getAssociationFieldDefaultValue(field);
}
}
}),
privateParser: true
});
});
});
}
_this.formChefParser.genFormula(formulaRules); // TODO this.fieldInstance这里有歧义
var id = setInterval(function () {// if (!_.isEmpty(this.fieldInstance)) {
// this.associationSort && this.associationSort.traversalSortedList(this.getAssociationFieldDefaultValue)
// .then(() => {
// this.associationInit = true;
// })
// .catch(() => { });
// clearInterval(id);
// }
}, 100);
}
};
_this.formDefaultProcess = function () {
var formFields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var fieldsValue = {};
_lodash["default"].forEach(formFields, function (field) {
var fieldInstance = _this.fields[field.identifier];
if (fieldInstance) {
var v = fieldInstance.getDefault();
if (v && v.then && typeof v.then === 'function') {
v.then(function (r) {
if (r && r.hasDefault && fieldInstance.value !== undefined) {
_this.setDefaultValues(_defineProperty({}, field.identifier, r.value));
}
});
} else if (v && v.hasDefault) {
fieldsValue[field.identifier] = v.value;
}
}
});
_this.setFieldsValue(fieldsValue);
};
_this.setDefaultValues = function () {
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (_this.rcFormRef) {
var fieldsValue = {};
_lodash["default"].forEach(data, function (val, key) {
var fieldValue = _this.rcFormRef.getFieldValue(key);
if (fieldValue === undefined) fieldsValue[key] = val;
});
if (_lodash["default"].isEmpty(fieldsValue)) _this.rcFormRef.setFieldsValue(fieldsValue);
}
};
_this.fieldInstantiate = function () {
var formFields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
_lodash["default"].forEach(formFields, function (field) {
var fieldInstance = new _formDishDefault["default"]({
config: field
});
fieldInstance.setValidator(_this.validators);
_this.fields[field.identifier] = fieldInstance;
});
};
_this.validateFields = function (cb) {
var formData = _this.fetchFormData();
var firstField;
_this.validators.validate(formData, {
formFields: _this.state.formFields
}, function (errors, fields) {
if (errors) {
_lodash["default"].forEach(errors, function (err) {
var message = err.message,
field = err.field;
if (_this.fields[field]) {
_this.fields[field].validateError = [message];
if (!firstField) firstField = _this.fields[field];
}
});
} else {
_lodash["default"].forEach(_this.fields, function (field) {
field.validateError = undefined;
});
}
if (typeof cb === 'function') cb(errors, fields);
_this.forceUpdate();
if (firstField) firstField.scroll();
});
};
_this.monitorFormValue = function () {} // const { formValue } = this.props;
// const { formFields } = this.state;
// let syncFormValue = {};
// const createFormField = formOption.createFormField || rcCreateFormField;
// _.forEach(formFields, field => {
// if (_.has(formValue, field.identifier)) {
// syncFormValue[field.identifier] = createFormField({ value: formValue[field.identifier] });
// }
// })
// console.log(syncFormValue);
// if (!_.isEmpty(syncFormValue)) {
// this.rcFormRef.updateFields(syncFormValue);
// }
// TODO 获取数据互联的默认值
;
_this.getAssociationFieldDefaultValue =
/*#__PURE__*/
function () {
var _ref3 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee2(field) {
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function (_x2) {
return _ref3.apply(this, arguments);
};
}();
_this.state = {
formReady: formOption.formReadyLock ? false : true,
formFields: []
};
_this.formData = {};
_this.fields = {};
_this.validators = undefined;
_this.dynamicFormCtrl = new _FormChefCommon["default"].DynamicFormCtrl({
updateFormFields: _this.updateFormFields
});
_this.formChefParser = new _FormChefCommon["default"].formChefParser();
_this.instance = {
initData: _this.initData,
cookForm: _this.cookForm,
formInstantiate: _this.formInstantiate,
setWatch: _this.setFieldWatch,
setFieldsValue: _this.setFieldsValue,
getFieldDecorator: _this.getFieldDecorator,
getFieldError: _this.getFieldError,
validateFields: _this.validateFields
};
return _this;
}
_createClass(WrapperFormChef, [{
key: "componentWillReceiveProps",
// componentDidUpdate(prevProps, prevState) {
// if (formOption.isValueMap) {
// this.formMapFields(this.props);
// }
// }
value: function componentWillReceiveProps(nextProps) {
if (formOption.isValueMap) {
this.formMapFields(nextProps);
}
} // componentWillUnmount() {
// // 手动回收变量,防止有闭包的数据调用,内存无法回收
// if (this) {
// this.formData = null;
// this.fields = null;
// this.validators = null;
// this.dynamicFormCtrl = null;
// this.formChefParser = null;
// this.instance = null;
// }
// }
}, {
key: "render",
value: function render() {
var _this$state3 = this.state,
formReady = _this$state3.formReady,
formFields = _this$state3.formFields;
return _react["default"].createElement(WrappedComponent, _extends({}, this.props, {
FormBuild: FormChef,
FormDish: formReady ? FormDish : _FormTombStone.TombStone // formFields={formFields}
,
form: this.instance
}));
}
}]);
return WrapperFormChef;
}(_react.Component);
WrapperFormChef.displayName = 'FormChef';
return WrapperFormChef;
};
};
FormChef.defineDish = defineDish;
var _default = FormChef;
exports["default"] = _default;