UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

1,604 lines (1,329 loc) 52.5 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"]; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.EXPANDED_KEY = void 0; var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _tslib = require("tslib"); var _mobx = require("mobx"); var _raf = _interopRequireDefault(require("raf")); var _merge = _interopRequireDefault(require("lodash/merge")); var _isObject = _interopRequireDefault(require("lodash/isObject")); var _pick = _interopRequireDefault(require("lodash/pick")); var _isNil = _interopRequireDefault(require("lodash/isNil")); var _isString = _interopRequireDefault(require("lodash/isString")); var _isNumber = _interopRequireDefault(require("lodash/isNumber")); var _omit = _interopRequireDefault(require("lodash/omit")); var _isPlainObject = _interopRequireDefault(require("lodash/isPlainObject")); var _utils = require("../utils"); var _DataSet = _interopRequireWildcard(require("./DataSet")); var _Field = _interopRequireDefault(require("./Field")); var _utils2 = require("./utils"); var ObjectChainValue = _interopRequireWildcard(require("../object-chain-value")); var _enum = require("./enum"); var _treeHelper = require("../tree-helper"); var _iteratorHelper = require("../iterator-helper"); /** * 记录ID生成器 */ var IDGen = /*#__PURE__*/_regenerator["default"].mark(function _callee(start) { return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!true) { _context.next = 5; break; } _context.next = 3; return ++start; case 3: _context.next = 0; break; case 5: case "end": return _context.stop(); } } }, _callee); })(1000); var EXPANDED_KEY = '__EXPANDED_KEY__'; // TODO:Symbol exports.EXPANDED_KEY = EXPANDED_KEY; var SELECTABLE_KEY = '__SELECTABLE_KEY__'; // TODO:Symbol var DISABLED_KEY = '__DISABLED_KEY__'; // TODO:Symbol var SELECT_KEY = '__SELECT_KEY__'; // TODO:Symbol var UNSELECT_KEY = '__UNSELECT_KEY__'; // TODO:Symbol var SELECT_TIMESTAMP = '__TIMESTAMP__'; // TODO:Symbol function initRecordField(record, name, fieldProps) { var dataSet = record.dataSet; return (0, _utils2.processIntlField)(name, function (langProps) { return new _Field["default"](langProps, dataSet, record); }, fieldProps, dataSet); } function initRecordData(initData, dataSet) { var childrenField = dataSet.props.childrenField; return _mobx.observable.object(initData, childrenField && initData[childrenField] ? (0, _defineProperty2["default"])({}, childrenField, _mobx.observable.ref) : undefined); } var Record = /*#__PURE__*/function () { function Record() { var _this = this; var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var dataSet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new _DataSet["default"](); var status = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _enum.RecordStatus.add; (0, _classCallCheck2["default"])(this, Record); (0, _mobx.runInAction)(function () { _this.dataSet = dataSet; _this.ownerFields = _mobx.observable.map(); _this.status = status; _this.id = IDGen.next().value; var initData = (0, _mobx.isObservableObject)(data) ? (0, _mobx.toJS)(data) : data; _this.data = initRecordData(initData, dataSet); _this.processData(initData); (0, _raf["default"])(function () { dataSet.fields.forEach(function (field) { return field.processForLookupAndLovConfig(_this); }); }); }); } (0, _createClass2["default"])(Record, [{ key: "fields", get: function get() { var _this2 = this; (0, _utils.warning)(false, 'If you only want to get some property from dataSet field or calculated by `dynamicProps` or `computedProps`. Don\'t to iterate fields from `record.fields`, please use `dataSet.fields` instead. And then use `dsField.get(someProp, record)` to get the property which you needed.'); var fields = new Map(); this.dataSet.fields.forEach(function (_, name) { var tempField = _this2.getField(name); if (tempField) { fields.set(name, tempField); } }); return _mobx.observable.map(fields); } }, { key: "pristineData", get: function get() { var dirtyData = this.dirtyData; var data = (0, _mobx.toJS)(this.data); if (dirtyData) { dirtyData.forEach(function (value, key) { return ObjectChainValue.set(data, key, value); }); } return data; }, set: function set(data) { var _this3 = this; (0, _mobx.runInAction)(function () { var dirtyData = _this3.dirtyData, dataSet = _this3.dataSet; if (dirtyData) { var newData = {}; if (dirtyData.size) { dirtyData.forEach(function (_, key) { var item = ObjectChainValue.get(_this3.data, key); ObjectChainValue.set(newData, key, item); var newItem = ObjectChainValue.get(data, key); if ((0, _utils.isSame)(item, newItem)) { dirtyData["delete"](key); } else { dirtyData.set(key, newItem); } }); } _this3.data = initRecordData((0, _merge["default"])({}, data, newData), dataSet); } else { _this3.data = initRecordData(data, dataSet); } }); } }, { key: "selectedTimestamp", get: function get() { return this.getState(SELECT_TIMESTAMP); }, set: function set(timestamp) { this.setState(SELECT_TIMESTAMP, timestamp); } }, { key: "selectable", get: function get() { var $selectable = this.getState(SELECTABLE_KEY); if ($selectable !== undefined) { return $selectable; } return (0, _utils2.getRecordDynamicProps)(this, 'selectable', true); }, set: function set(selectable) { this.setState(SELECTABLE_KEY, selectable); } }, { key: "disabled", get: function get() { var $disabled = this.getState(DISABLED_KEY); if ($disabled !== undefined) { return $disabled; } return (0, _utils2.getRecordDynamicProps)(this, 'disabled', false); }, set: function set(selectable) { this.setState(DISABLED_KEY, selectable); } }, { key: "isDataSetInAllPageSelection", get: function get() { return this.dataSet.isAllPageSelection; } }, { key: "isSelected", get: function get() { if (this.isDataSetInAllPageSelection) { return !this.getState(UNSELECT_KEY); } var $isSelected = this.getState(SELECT_KEY); if ($isSelected !== undefined) { return $isSelected; } return (0, _utils2.getRecordDynamicProps)(this, 'defaultSelected', false); }, set: function set(isSelected) { if (isSelected !== this.isSelected) { var newState = (0, _defineProperty2["default"])({}, SELECT_TIMESTAMP, isSelected ? Date.now() : undefined); if (this.isDataSetInAllPageSelection) { newState[UNSELECT_KEY] = !isSelected; } else { newState[SELECT_KEY] = isSelected; } this.setState(newState); } } }, { key: "key", get: function get() { if (!this.isNew) { var primaryKey = this.dataSet.props.primaryKey; if (primaryKey) { var key = this.get(primaryKey); if ((0, _isString["default"])(key) || (0, _isNumber["default"])(key)) { return key; } } } return this.id; } }, { key: "index", get: function get() { return this.dataSet.indexOf(this); } }, { key: "indexInParent", get: function get() { var parent = this.parent; if (parent && parent.children) { return parent.children.indexOf(this); } return this.dataSet.treeRecords.indexOf(this); } }, { key: "isRemoved", get: function get() { return this.status === _enum.RecordStatus["delete"]; } }, { key: "isNew", get: function get() { return this.status === _enum.RecordStatus.add; } }, { key: "isSelectionIndeterminate", get: function get() { if (this.dataSet.selection === _enum.DataSetSelection.multiple) { var children = this.children; if (children) { var checkedLength = 0; return children.some(function (record) { if (record.isSelectionIndeterminate) { return true; } if (record.isSelected) { checkedLength += 1; } return false; }) || checkedLength > 0 && checkedLength !== children.length; } } return false; } }, { key: "isIndeterminate", get: function get() { var dataSet = this.dataSet; var checkField = dataSet.props.checkField; if (checkField) { var field = dataSet.getField(checkField); var trueValue = field ? field.get(_enum.BooleanValue.trueValue, this) : true; var children = this.children; if (children) { var checkedLength = 0; return children.some(function (record) { if (record.isIndeterminate) { return true; } if (record.get(checkField) === trueValue) { checkedLength += 1; } return false; }) || checkedLength > 0 && checkedLength !== children.length; } } return false; } }, { key: "isExpanded", get: function get() { var dataSet = this.dataSet; var expandField = dataSet.props.expandField; if (expandField) { var expanded = this.get(expandField); var field = dataSet.getField(expandField); return expanded === (field ? field.get(_enum.BooleanValue.trueValue, this) : true); } var $expanded = this.getState(EXPANDED_KEY); if ($expanded !== undefined) { return $expanded; } return (0, _utils2.getRecordDynamicProps)(this, 'defaultExpanded', false); }, set: function set(expand) { var dataSet = this.dataSet; var expandField = dataSet.props.expandField; if (expandField) { var field = dataSet.getField(expandField); this.set(expandField, field ? field.get(expand ? _enum.BooleanValue.trueValue : _enum.BooleanValue.falseValue, this) : expand); } else { this.setState(EXPANDED_KEY, expand); } } }, { key: "previousRecord", get: function get() { var parent = this.parent; var children = parent ? parent.children : this.dataSet.treeData; if (children) { return children[children.indexOf(this) - 1]; } return undefined; } }, { key: "nextRecord", get: function get() { var parent = this.parent; var children = parent ? parent.children : this.dataSet.treeData; if (children) { return children[children.indexOf(this) + 1]; } return undefined; } }, { key: "records", get: function get() { var dataSet = this.dataSet; var cascadeParent = this.cascadeParent; if (cascadeParent && !cascadeParent.isCurrent) { return cascadeParent.getCascadeRecordsIncludeDelete(dataSet.parentName) || []; } return dataSet.records; } }, { key: "parents", get: function get() { var parent = this.parent; if (parent) { return [parent].concat((0, _toConsumableArray2["default"])(parent.parents)); } return []; } }, { key: "path", get: function get() { var path = [this].concat((0, _toConsumableArray2["default"])(this.parents)); path.reverse(); return path; } }, { key: "level", get: function get() { var parent = this.parent; if (parent) { return parent.level + 1; } return 0; } }, { key: "dirty", get: function get() { var _this4 = this; var status = this.status; if (status === _enum.RecordStatus.update) { return true; } var dirtyData = this.dirtyData; if (dirtyData && dirtyData.size > 0) { return true; } return Object.keys(this.dataSet.children).some(function (key) { return (_this4.getCascadeRecordsIncludeDelete(key) || []).some(_utils2.isDirtyRecord); }); } }, { key: "cascadeParent", get: function get() { var _this5 = this; var _this$dataSet = this.dataSet, parent = _this$dataSet.parent, parentName = _this$dataSet.parentName; if (parent && parentName) { return parent.cascadeRecords.find(function (record) { return (record.getCascadeRecordsIncludeDelete(parentName) || []).indexOf(_this5) !== -1; }); } return undefined; } }, { key: "processTreeLevel", value: function processTreeLevel(props) { var dataSet = props.dataSet, value = props.value, fieldName = props.fieldName; var _dataSet$props = dataSet.props, parentField = _dataSet$props.parentField, idField = _dataSet$props.idField, childrenField = _dataSet$props.childrenField; if (!childrenField && parentField && idField) { if (fieldName === parentField) { var parent = this.parent; if (parent) { var oldChildren = parent.children; if (oldChildren) { var oldIndex = oldChildren.indexOf(this); if (oldIndex !== -1) { oldChildren.splice(oldIndex, 1); } if (!oldChildren.length) { parent.children = undefined; } } } var newParent = dataSet.find(function (r) { return r.get(idField) === value; }); this.parent = newParent; if (newParent) { var children = newParent.children; if (children) { children.push(this); if (children.length > 1) { var orderFields = (0, _utils2.getOrderFields)(dataSet); if (orderFields.length > 0) { newParent.children = (0, _utils2.sortTree)(children, orderFields); } } } else { newParent.children = [this]; } } } } } /** * 转换成普通数据 * 一般用于父级联数据源中的json类型字段 * 禁止通过此方法获取某一个或几个字段值 */ }, { key: "toData", value: function toData(needIgnore, noCascade, isCascadeSelect) { var _this6 = this; var all = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; if (_mobx._isComputingDerivation && (0, _mobx._isComputingDerivation)()) { (0, _utils.warning)(false, 'Please do not use the `record.toData` method to get the value during the rendering phase, please use `record.get` instead.'); } var status = this.status, dataSet = this.dataSet; var dataToJSON = dataSet.dataToJSON, fields = dataSet.fields; var cascade = noCascade === undefined && dataToJSON ? (0, _utils2.useCascade)(dataToJSON) : !noCascade; var normal = all || dataToJSON && (0, _utils2.useNormal)(dataToJSON); var dirty = status !== _enum.RecordStatus.sync; var childrenKeys = cascade ? Object.keys(dataSet.children) : undefined; var jsonFieldKeys = childrenKeys && (0, _iteratorHelper.iteratorReduce)(fields.entries(), function (fieldKeys, _ref2) { var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2), key = _ref3[0], field = _ref3[1]; if (field.get('type', _this6) === _enum.FieldType.json && childrenKeys.some(function (childKey) { return key === childKey || childKey.startsWith("".concat(key, ".")); })) { fieldKeys.push(key); } return fieldKeys; }, []); var json = this.normalizeData(needIgnore, jsonFieldKeys); if (cascade && this.normalizeCascadeData(json, normal, isCascadeSelect)) { dirty = true; } if (jsonFieldKeys) { jsonFieldKeys.forEach(function (key) { return ObjectChainValue.set(json, key, JSON.stringify(ObjectChainValue.get(json, key)), fields, _this6); }); } return (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, json), {}, { __dirty: dirty }); } /** * 转换成用于提交的数据 */ }, { key: "toJSONData", value: function toJSONData(noCascade, isCascadeSelect) { var status = this.status, dataSet = this.dataSet; return (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, this.toData(true, noCascade, isCascadeSelect, false)), {}, (0, _defineProperty2["default"])({ __id: this.id }, dataSet.getConfig('statusKey'), dataSet.getConfig('status')[status === _enum.RecordStatus.sync ? _enum.RecordStatus.update : status])); } }, { key: "validate", value: function validate(all, noCascade) { var _this7 = this; var dataSet = this.dataSet; this.validating = true; var promises = []; if (all || this.status !== _enum.RecordStatus.sync) { dataSet.fields.forEach(function (field) { return promises.push(field.checkValidity(_this7)); }); } if (!noCascade) { var children = dataSet.children; var childrenKeys = Object.keys(children); if (childrenKeys.length) { var dataSetSnapshot = this.dataSetSnapshot, isCurrent = this.isCurrent; childrenKeys.forEach(function (key) { var snapshot = dataSetSnapshot && dataSetSnapshot[key]; var ds = children[key]; var child = isCurrent ? ds : snapshot && new _DataSet["default"](undefined, dataSet.context).restore(snapshot); if (child) { promises.push(child.validate()); } else { var dataToJSON = ds.dataToJSON; var cascade = noCascade === undefined && dataToJSON ? (0, _utils2.useCascade)(dataToJSON) : !noCascade; (((0, _utils2.useSelected)(dataToJSON) ? _this7.getCascadeSelectedRecords(key) : _this7.getCascadeRecords(key)) || []).forEach(function (record) { return promises.push(record.validate(false, !cascade)); }); } }); } } return Promise.all(promises).then(function (results) { var valid = results.every(function (result) { return result; }); if (!dataSet.validating) { dataSet.reportValidity({ record: _this7, errors: _this7.getValidationErrors(), valid: valid }); } delete _this7.validating; return valid; })["catch"](function (error) { delete _this7.validating; throw error; }); } }, { key: "cancelReportValidity", value: function cancelReportValidity() { var prepareForReport = this.prepareForReport; if (prepareForReport && prepareForReport.timeout) { window.clearTimeout(prepareForReport.timeout); } } }, { key: "reportValidity", value: function reportValidity(result, fromField) { var _this8 = this; var dataSet = this.dataSet; if (!dataSet.validating) { var prepareForReport = (0, _utils2.getIf)(this, 'prepareForReport', { result: [], valid: true }); if (!result.valid) { prepareForReport.valid = false; prepareForReport.result.push(result); } if (prepareForReport.timeout) { window.clearTimeout(prepareForReport.timeout); } prepareForReport.timeout = window.setTimeout(function () { dataSet.reportValidity({ record: _this8, errors: prepareForReport.result, valid: prepareForReport.valid }, fromField); delete _this8.prepareForReport; }, 200); } } }, { key: "getValidationErrors", value: function getValidationErrors() { var _this9 = this; var validationErrors = this.validationErrors; var results = []; if (validationErrors) { validationErrors.forEach(function (errors, fieldName) { var field = _this9.ownerFields.get(fieldName) || _this9.dataSet.getField(fieldName); if (field && errors.length) { results.push({ field: field, errors: errors, valid: false }); } }); } return results; } }, { key: "addField", value: function addField(name, fieldProps) { var dataSet = this.dataSet, ownerFields = this.ownerFields; if (!dataSet.getField(name)) { dataSet.addField(name, fieldProps); } var oldField = ownerFields.get(name); if (oldField) { return oldField.replace(fieldProps); } var _initRecordField = initRecordField(this, name, fieldProps), _initRecordField2 = (0, _slicedToArray2["default"])(_initRecordField, 2), field = _initRecordField2[0], intlFields = _initRecordField2[1]; ownerFields.set(name, field); if (intlFields) { ownerFields.merge(intlFields); } return field; } }, { key: "getField", value: function getField(fieldName) { if (fieldName) { (0, _utils.warning)(false, 'If you only want to get some property from dataSet field or calculated by `dynamicProps` or `computedProps`. Don\'t to get field from `record.getField`, please use `dataSet.getField` instead. And then use `dsField.get(someProp, record)` to get the property which you needed.'); { var _field = this.ownerFields.get(fieldName); if (_field) { return _field; } } var tempFields = (0, _utils2.getIf)(this, 'tempFields', function () { return new Map(); }); { var _field2 = tempFields.get(fieldName); if (_field2) { return _field2; } } var field = new _Field["default"]({ name: fieldName }, this.dataSet, this); tempFields.set(fieldName, field); return field; } } }, { key: "getCascadeRecordsIncludeDelete", value: function getCascadeRecordsIncludeDelete(fieldName) { if (fieldName) { var childDataSet = this.dataSet.children[fieldName]; if (childDataSet) { if (this.isCurrent) { return childDataSet.records.slice(); } var dataSetSnapshot = this.dataSetSnapshot; var snapshot = dataSetSnapshot && dataSetSnapshot[fieldName]; if (snapshot) { return snapshot.records; } var cascadeRecordsMap = (0, _utils2.getIf)(this, 'cascadeRecordsMap', {}); var cascadeRecords = cascadeRecordsMap[fieldName]; if (cascadeRecords) { return cascadeRecords; } var data = this.get(fieldName); var cascading = (0, _utils2.getIf)(this, 'cascading', {}); if (!cascading[fieldName] && (0, _mobx.isObservableArray)(data)) { cascading[fieldName] = true; var records = childDataSet.processData(data, this.isNew ? _enum.RecordStatus.add : _enum.RecordStatus.sync); delete cascading[fieldName]; cascadeRecordsMap[fieldName] = records; return records; } } } } }, { key: "getCascadeRecords", value: function getCascadeRecords(fieldName) { var records = this.getCascadeRecordsIncludeDelete(fieldName); if (records) { return records.filter(function (r) { return !r.isRemoved; }); } } }, { key: "getCascadeSelectedRecordsIncludeDelete", value: function getCascadeSelectedRecordsIncludeDelete(fieldName) { var records = this.getCascadeRecordsIncludeDelete(fieldName); if (records) { return records.filter(function (r) { return r.isSelected; }); } } }, { key: "getCascadeSelectedRecords", value: function getCascadeSelectedRecords(fieldName) { var records = this.getCascadeRecordsIncludeDelete(fieldName); if (records) { return records.filter(function (r) { return !r.isRemoved && r.isSelected; }); } } }, { key: "get", value: function get(fieldName) { return (0, _utils2.getRecordValue)(this, function (child, checkField) { return child.get(checkField); }, fieldName); } }, { key: "set", value: function set(item, value) { var _this10 = this; if ((0, _isString["default"])(item)) { var dataSet = this.dataSet; var oldName = item; var fieldName = (0, _utils2.getChainFieldName)(this, oldName); var field = dataSet.getField(oldName) || dataSet.getField(fieldName) || (0, _utils2.findBindField)(oldName, fieldName, this) || (0, _DataSet.addDataSetField)(dataSet, oldName); (0, _utils2.checkFieldType)(value, field, this); var oldValue = (0, _mobx.toJS)(this.get(fieldName)); var newValue = (0, _utils2.processValue)(value, field, this); var newValueForCompare = (0, _utils2.processToJSON)(newValue, field, this); var fields = dataSet.fields; if (!(0, _utils.isSame)((0, _utils2.processToJSON)(oldValue, field, this), newValueForCompare)) { ObjectChainValue.set(this.data, fieldName, newValue, fields, this); var dirtyData = (0, _utils2.getIf)(this, 'dirtyData', function () { return _mobx.observable.map(); }); if (!dirtyData.has(fieldName)) { dirtyData.set(fieldName, oldValue); if (this.status === _enum.RecordStatus.sync) { this.status = _enum.RecordStatus.update; if (this.isCached && dataSet.cacheModifiedKeys) { dataSet.cachedModified.push(this); } } } else if ((0, _utils.isSame)((0, _utils2.processToJSON)(dirtyData.get(fieldName), field, this), newValueForCompare)) { dirtyData["delete"](fieldName); if (this.status === _enum.RecordStatus.update && dirtyData.size === 0) { this.status = _enum.RecordStatus.sync; if (this.isCached) { if (!dataSet.cacheSelectionKeys || !this.isSelected) { this.isCached = false; } var cachedModified = dataSet.cachedModified; var cachedIndex = cachedModified.indexOf(this); if (cachedIndex > -1) { cachedModified.splice(cachedIndex, 1); } } } } dataSet.fireEvent(_enum.DataSetEvents.update, { dataSet: dataSet, record: this, name: oldName, value: newValue, oldValue: oldValue }); var _dataSet$props2 = dataSet.props, checkField = _dataSet$props2.checkField, treeCheckStrictly = _dataSet$props2.treeCheckStrictly; if (treeCheckStrictly !== true && checkField && fieldName === (0, _utils2.getChainFieldName)(this, checkField)) { var children = this.children; if (children) { children.forEach(function (record) { return record.set(fieldName, value); }); } } this.processTreeLevel({ dataSet: dataSet, value: newValue, fieldName: oldName }); } [field].concat((0, _toConsumableArray2["default"])((0, _utils2.findBindFields)(field, fields, true, this)), (0, _toConsumableArray2["default"])((0, _utils2.findBindTargetFields)(field, fields, true, this)), (0, _toConsumableArray2["default"])((0, _utils2.findMinOrMaxFields)(field, fields, this))).forEach(function (oneField) { return oneField.checkValidity(_this10); }); } else if ((0, _isPlainObject["default"])(item)) { Object.keys(item).forEach(function (key) { return _this10.set(key, item[key]); }); } return this; } }, { key: "getPristineValue", value: function getPristineValue(fieldName) { if (fieldName) { var chainFieldName = (0, _utils2.getChainFieldName)(this, fieldName); var dirtyData = this.dirtyData; if (dirtyData) { if (dirtyData.has(chainFieldName)) { return dirtyData.get(chainFieldName); } var v; var has = (0, _iteratorHelper.iteratorSome)(dirtyData.entries(), function (_ref4) { var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2), key = _ref5[0], value = _ref5[1]; if (chainFieldName.startsWith("".concat(key, "."))) { v = ObjectChainValue.get(value, chainFieldName.replace("".concat(key, "."), '')); return true; } return false; }); if (has) { return v; } } return this.get(chainFieldName); } } }, { key: "init", value: function init(item, value) { var _this11 = this; var data = this.data, dirtyData = this.dirtyData; if ((0, _isString["default"])(item)) { var dataSet = this.dataSet; var oldName = item; var fieldName = (0, _utils2.getChainFieldName)(this, oldName); var field = dataSet.getField(oldName) || dataSet.getField(fieldName) || (0, _utils2.findBindField)(oldName, fieldName, this) || (0, _DataSet.addDataSetField)(dataSet, fieldName); var newValue = (0, _utils2.processValue)(value, field, this); if (dirtyData) { dirtyData["delete"](fieldName); } ObjectChainValue.set(data, fieldName, newValue, dataSet.fields, this); field.commit(this); this.processTreeLevel({ dataSet: dataSet, value: newValue, fieldName: oldName }); } else if ((0, _isPlainObject["default"])(item)) { Object.keys(item).forEach(function (key) { return _this11.init(key, item[key]); }); } return this; } }, { key: "clone", value: function clone() { var dataSet = this.dataSet; var cloneData = this.toData(); var primaryKey = dataSet.props.primaryKey; if (primaryKey) { delete cloneData[primaryKey]; } return new Record(cloneData, dataSet); } }, { key: "ready", value: function ready() { return Promise.resolve(true); // return Promise.all([...this.fields.values()].map(field => field.ready())); } }, { key: "tls", value: function () { var _tls = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(name) { var _this12 = this; var dataSet, tlsKey, tlsData, axios, lang, primaryKey, newConfig, result, dataKey; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: dataSet = this.dataSet; tlsKey = dataSet.getConfig('tlsKey'); if (!name) { _context2.next = 16; break; } tlsData = this.get(tlsKey) || {}; if (name in tlsData) { _context2.next = 16; break; } axios = dataSet.axios, lang = dataSet.lang; primaryKey = dataSet.props.primaryKey; newConfig = (0, _utils2.axiosConfigAdapter)('tls', dataSet, {}, primaryKey && { key: this.get(primaryKey) }, { name: name, record: this }); if (!(newConfig.url && !this.isNew)) { _context2.next = 15; break; } _context2.next = 11; return axios(newConfig); case 11: result = _context2.sent; if (result) { dataKey = dataSet.getConfig('dataKey'); this.commitTls((0, _utils2.generateResponseData)(result, dataKey)[0], name); } _context2.next = 16; break; case 15: this.commitTls((0, _iteratorHelper.iteratorReduce)(dataSet.fields.entries(), function (data, _ref6) { var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2), key = _ref7[0], field = _ref7[1]; if (field.get('type', _this12) === _enum.FieldType.intl) { data[key] = (0, _defineProperty2["default"])({}, lang, _this12.get(key)); } return data; }, {}), name); case 16: case "end": return _context2.stop(); } } }, _callee2, this); })); function tls(_x) { return _tls.apply(this, arguments); } return tls; }() }, { key: "reset", value: function reset() { var _this13 = this; this.cancelReportValidity(); var status = this.status, dataSet = this.dataSet, dirty = this.dirty, isRemoved = this.isRemoved, validationErrors = this.validationErrors; var hasError = false; if (validationErrors && validationErrors.size > 0) { hasError = true; validationErrors.clear(); } dataSet.fields.forEach(function (field) { return field.commit(_this13); }); if (status === _enum.RecordStatus.update || isRemoved) { this.status = _enum.RecordStatus.sync; } if (hasError || isRemoved || dirty) { this.data = initRecordData((0, _mobx.toJS)(this.pristineData), dataSet); this.dirtyData = undefined; this.memo = undefined; if (!dataSet.resetInBatch) { dataSet.fireEvent(_enum.DataSetEvents.reset, { records: [this], dataSet: dataSet, record: this }); } } return this; } }, { key: "save", value: function save() { this.memo = (0, _mobx.toJS)(this.data); return this; } }, { key: "restore", value: function restore() { var memo = this.memo; if (memo) { this.set(memo); this.memo = undefined; } return this; } }, { key: "clear", value: function clear() { var _this14 = this; this.dataSet.fields.forEach(function (_, key) { return _this14.set(key, null); }); return this; } }, { key: "commit", value: function commit(data, dataSet) { var _this15 = this; if (dataSet) { var records = this.records; if (this.isRemoved) { { var index = records.indexOf(this); if (index !== -1) { if (dataSet.records === records) { dataSet.totalCount -= 1; } records.splice(index, 1); } } var parent = this.parent; if (parent) { var children = parent.children; if (children) { var _index = children.indexOf(this); if (_index !== -1) { children.splice(_index, 1); } if (!children.length) { parent.children = undefined; } } this.parent = undefined; } return this; } if (this.isNew) { var _index2 = records.indexOf(this); if (_index2 !== -1 && dataSet.records === records) { dataSet.totalCount += 1; } } if (data) { this.data = initRecordData(data, dataSet); this.processData(data, true); var _children = dataSet.children; var keys = Object.keys(_children); if (keys.length) { var isCurrent = this.isCurrent; var tmpDs = new _DataSet["default"](undefined, dataSet.context); var dataSetSnapshot = (0, _utils2.getIf)(this, 'dataSetSnapshot', {}); keys.forEach(function (key) { var snapshot = dataSetSnapshot[key]; var ds = _children[key]; var child = isCurrent ? ds : snapshot && tmpDs.restore(snapshot); if (child) { dataSetSnapshot[key] = child.commitData(data[key] || []).snapshot(); } else { var cascadeRecords = _this15.getCascadeRecordsIncludeDelete(key); if (cascadeRecords) { cascadeRecords.forEach(function (r) { return r.commit((0, _omit["default"])(r.toData(), ['__dirty']), ds); }); } } }); } } dataSet.fields.forEach(function (field) { return field.commit(_this15); }); } this.dirtyData = undefined; this.status = _enum.RecordStatus.sync; return this; } }, { key: "setState", value: function setState(item, value) { var state = (0, _utils2.getIf)(this, 'state', function () { return _mobx.observable.map(); }); if ((0, _isString["default"])(item)) { state.set(item, value); } else if ((0, _isPlainObject["default"])(item)) { state.merge(item); } return this; } }, { key: "getState", value: function getState(key) { var state = this.state; return state && state.get(key); } }, { key: "treeReduce", value: function treeReduce(fn, initialValue) { return (0, _treeHelper.treeReduce)([this], fn, initialValue); } }, { key: "commitTls", value: function commitTls() { var _this16 = this; var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var name = arguments.length > 1 ? arguments[1] : undefined; var dataSet = this.dataSet; var tlsKey = dataSet.getConfig('tlsKey'); if (!(name in data)) { data[name] = {}; } Object.keys(data).forEach(function (key) { var value = data[key]; var field = dataSet.getField(key); if (field) { var transformResponse = field.get('transformResponse', _this16); if (transformResponse) { var originValue = (0, _objectSpread3["default"])({}, value); Object.keys(value).forEach(function (language) { value[language] = transformResponse(value[language], originValue); }); } } ObjectChainValue.set(_this16.data, key, value[dataSet.lang]); ObjectChainValue.set(_this16.data, "".concat(tlsKey, ".").concat(key), value); }); } }, { key: "processFieldValue", value: function processFieldValue(fieldName, field, fields, newData, data, needMerge) { var value = ObjectChainValue.get(newData, fieldName); var chainFieldName = (0, _utils2.getChainFieldName)(this, fieldName); var transformResponse = field.get('transformResponse', this); if (chainFieldName !== fieldName) { var bindValue = ObjectChainValue.get(newData, chainFieldName); if ((0, _isNil["default"])(value) && !(0, _isNil["default"])(bindValue)) { value = bindValue; } } if (transformResponse) { value = transformResponse(value, data); } value = (0, _utils2.processValue)(value, field, this, !needMerge && this.isNew); if (value === null) { value = undefined; } if (needMerge && (0, _isObject["default"])(value)) { var oldValue = ObjectChainValue.get(this.data, chainFieldName); if ((0, _isObject["default"])(oldValue)) { value = (0, _merge["default"])(oldValue, value); } } ObjectChainValue.set(newData, chainFieldName, value, fields, this); ObjectChainValue.set(this.data, chainFieldName, value, fields, this); } }, { key: "setValidationError", value: function setValidationError(name, result) { var validationErrors = (0, _utils2.getIf)(this, 'validationErrors', function () { return _mobx.observable.map(); }); var originalResult = validationErrors.get(name); if (result && result.length || originalResult && originalResult.length) { validationErrors.set(name, result); } } }, { key: "getValidationError", value: function getValidationError(name) { var validationErrors = this.validationErrors; if (validationErrors) { return validationErrors.get(name); } } }, { key: "clearValidationError", value: function clearValidationError(name) { var _this17 = this; var validationErrors = this.validationErrors; if (validationErrors) { var errors = validationErrors.get(name); if (errors) { errors.some(function (error) { if (error.ruleName === 'uniqueError') { var validationProps = error.validationProps; if (validationProps) { var unique = validationProps.unique; if ((0, _isString["default"])(unique)) { _this17.dataSet.fields.forEach(function (field, fieldName) { if (fieldName !== name && field.get('unique', _this17) === unique && !field.get('multiple', _this17) && !field.get('range', _this17)) { _this17.clearValidationError(fieldName); } }); } } return true; } return false; }); } return validationErrors["delete"](name); } } }, { key: "processData", value: function processData() { var _this18 = this; var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var needMerge = arguments.length > 1 ? arguments[1] : undefined; var newData = (0, _objectSpread3["default"])({}, data); var fields = (0, _utils2.getSortedFields)(this.dataSet); fields.forEach(function (field, fieldName) { return _this18.processFieldValue(fieldName, field, fields, newData, data, needMerge); }); } }, { key: "normalizeData", value: function normalizeData(needIgnore, jsonFields) { var _this19 = this; var dataSet = this.dataSet; var fields = dataSet.fields, dataToJSON = dataSet.dataToJSON; var onlyDirtyField = needIgnore && dataToJSON ? (0, _utils2.useDirtyField)(dataToJSON) : false; var neverKeys = onlyDirtyField ? (0, _utils2.getUniqueKeysAndPrimaryKey)(dataSet) : []; var json = onlyDirtyField ? (0, _pick["default"])(this.data, neverKeys) : (0, _mobx.toJS)(this.data); var fieldIgnore = onlyDirtyField ? _enum.FieldIgnore.clean : undefined; var objectFieldsList = []; var normalFields = []; var ignoreFieldNames = new Set(); fields.forEach(function (field, key) { if (field && (!jsonFields || !jsonFields.includes(key))) { var ignore = field.get('ignore', _this19) || fieldIgnore; if (needIgnore && !neverKeys.includes(key) && (ignore === _enum.FieldIgnore.always || ignore === _enum.FieldIgnore.clean && !field.isDirty(_this19))) { ignoreFieldNames.add(key); } else { var type = field.get('type', _this19); if (type === _enum.FieldType.object) { var level = key.split('.').length - 1; objectFieldsList[level] = (objectFieldsList[level] || []).concat(field); } else { normalFields.push(field); } } } }); [].concat(objectFieldsList, [normalFields]).forEach(function (items) { if (items) { items.forEach(function (field) { var name = field.name; var value = ObjectChainValue.get(onlyDirtyField ? (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, _this19.data), json) : json, name); var bind = field.get('bind', _this19); var transformRequest = field.get('transformRequest', _this19); if (bind) { value = _this19.get((0, _utils2.getChainFieldName)(_this19, name)); } var old = value; value = (0, _utils2.processToJSON)(value, field, _this19); if (transformRequest) { // compatible old logic value = (0, _isString["default"])(field.get('multiple', _this19)) && (0, _mobx.isArrayLike)(old) ? transformRequest(value, _this19) : (0, _utils2.processToJSON)(transformRequest(old, _this19), field, _this19); } if (value !== undefined) { ObjectChainValue.set(json, name, value, fields, _this19); } else { ignoreFieldNames.add(name); } }); } }); (0, _toConsumableArray2["default"])(ignoreFieldNames).forEach(function (key) { return ObjectChainValue.remove(json, key); }); return json; } }, { key: "normalizeCascadeData", value: function normalizeCascadeData(json, normal, isSelect) { var _this20 = this; var dataSetSnapshot = this.dataSetSnapshot, dataSet = this.dataSet, isRemoved = this.isRemoved; var dirty = false; var children = dataSet.children, fields = dataSet.fields; if (isRemoved) { (0, _utils2.childrenInfoForDelete)(json, children); } else { var keys = Object.keys(children); if (keys.length) { var isCurrent = this.isCurrent; keys.forEach(function (name) { var snapshot = dataSetSnapshot && dataSetSnapshot[name]; var child = !isCurrent && snapshot && new _DataSet["default"](undefined, dataSet.context).restore(snapshot) || children[name]; if (child) { var dataToJSON = child.dataToJSON; var records = _this20.getCascadeRecordsIncludeDelete(name); var selected = isSelect || (0, _utils2.useSelected)(dataToJSON) ? _this20.getCascadeSelectedRecordsIncludeDelete(name) : records; var jsonArray = normal || (0, _utils2.useNormal)(dataToJSON) ? records && (0, _utils2.generateData)(records) : selected && (0, _utils2.generateJSONData)(child, selected); if (jsonArray) { if (jsonArray.dirty) { dirty = true; } ObjectChainValue.set(json, name, jsonArray.data, fields, _this20); } } }); } } return dirty; } }]); return Record; }(); exports["default"] = Record; (0, _tslib.__decorate)([_mobx.computed], Record.prototype, "fields", null); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "ownerFields", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "data", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "dirtyData", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "validationErrors", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "lookupTokens", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "attachmentCaches", void 0); (0, _tslib.__decorate)([_mobx.computed], Record.prototype, "pristineData", null); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "status", void 0); (0, _tslib.__decorate)([_mobx.computed], Record.prototype, "isSelected", null); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "isCurrent", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "isCached", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "editing", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "pending", void 0); (0, _tslib.__decorate)([_mobx.observable], Record.prototype, "childrenLoaded", void 0); (0, _tslib._