UNPKG

mutants-appfx

Version:

appfx module

671 lines (590 loc) 24 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _getOwnPropertyDescriptor = require('babel-runtime/core-js/object/get-own-property-descriptor'); var _getOwnPropertyDescriptor2 = _interopRequireDefault(_getOwnPropertyDescriptor); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _symbol = require('babel-runtime/core-js/symbol'); var _symbol2 = _interopRequireDefault(_symbol); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _desc, _value, _class; var _mobx = require('mobx'); var _DataProviderManager = require('../DataProviderManager'); var _DataProviderManager2 = _interopRequireDefault(_DataProviderManager); var _automapper = require('automapper'); var _automapper2 = _interopRequireDefault(_automapper); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _get2 = require('lodash/get'); var _get3 = _interopRequireDefault(_get2); var _setWith2 = require('lodash/setWith'); var _setWith3 = _interopRequireDefault(_setWith2); var _camelCase2 = require('lodash/camelCase'); var _camelCase3 = _interopRequireDefault(_camelCase2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } var types = ['string', 'object', 'array', 'number', 'boolean', 'date', 'reference']; var getMeta = function getMeta(obj) { var meta = []; obj && (0, _keys2.default)(obj).forEach(function (key) { var type = void 0; var fields = void 0; var defValue = void 0; if (typeof obj[key] === 'string') { type = types.indexOf(obj[key].toLowerCase()) > -1 ? obj[key].toLowerCase() : 'string'; } else if ('type' in obj[key] || 'Type' in obj[key]) { obj[key].type = obj[key].type || obj[key].Type; //debug(obj[key].type,obj[key].fields) type = obj[key].type === 'ref' ? 'reference' : obj[key].type; fields = type === 'obj' || type === 'object' || type === 'reference' || type === 'array' ? getMeta(obj[key].fields || obj[key].Fields) : undefined; defValue = obj[key].defValue || obj[key].DefValue; } else if (Array.isArray(obj[key])) { type = 'array'; if (obj[key].length > 0) { var arrobj = obj[key][0]; if (arrobj.type) { fields = getMeta(arrobj.fields); } else { fields = getMeta(arrobj); } } } else if ((0, _typeof3.default)(obj[key]) === 'object') { type = 'reference'; // 默认是引用类型 fields = getMeta(obj[key]); } else { console.warn('not support type', key); return; } meta.push({ key: key, type: type, fields: fields, defValue: defValue }); }); return meta; }; var findFields = function findFields(fields, path) { var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var key = path[i]; if (key.endsWith(']')) { key = key.substr(0, key.indexOf('[')); } var sub = fields.find(function (it) { return it.key === key; }); if (i + 1 < path.length) { return findFields(sub.fields, path, i + 1); } if (!sub) { throw new Error(key + ' not defined!'); } return sub.fields; }; var createObj = function createObj() { var defineObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var fields = arguments[1]; var cutRef = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; (fields || []).forEach(function (it) { switch (it.type) { case 'array': if (cutRef) { defineObj[it.key] = it.defValue || []; } else { (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, it.defValue || [])); } break; case 'reference': case 'object': if (cutRef && it.type === 'reference') { var idField = it.fields.find(function (it) { return it.key.toLowerCase() === 'id'; }); if (idField) { defineObj[it.key] = (0, _defineProperty3.default)({}, idField.key, ''); } else { defineObj[it.key] = {}; } } else { var props = createObj({}, it.fields, cutRef); // debug(defineObj,{ // [it.key]: props // },subDecs) (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, it.type === 'reference' ? _mobx.observable.ref(props) : props)); } break; case 'string': if (cutRef) { defineObj[it.key] = it.defValue !== undefined ? String(it.defValue || '') : null; } else { (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, it.defValue !== undefined ? String(it.defValue || '') : null)); } break; case 'number': if (cutRef) { defineObj[it.key] = it.defValue !== undefined ? Number(it.defValue || 0) : null; } else { (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, it.defValue !== undefined ? Number(it.defValue || 0) : null)); } break; case 'boolean': if (cutRef) { defineObj[it.key] = it.defValue !== undefined ? Boolean(it.defValue || false) : null; } else { (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, it.defValue !== undefined ? Boolean(it.defValue || false) : null)); } break; case 'date': if (it.defValue === 'now') { if (cutRef) { defineObj[it.key] = Date.now; } else { (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, Date.now)); } } else { if (cutRef) { defineObj[it.key] = it.defValue !== undefined ? (0, _moment2.default)(it.defValue).toDate() : null; } else { (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, it.defValue !== undefined ? (0, _moment2.default)(it.defValue).toDate() : null)); } } break; default: if (cutRef) { defineObj[it.key] = it.defValue || null; } else { (0, _mobx.extendObservable)(defineObj, (0, _defineProperty3.default)({}, it.key, it.defValue || null)); } } }); return defineObj; }; var createMapping = function createMapping(fields, name) { var dtom = _automapper2.default.createMap('dto', name); var mtod = _automapper2.default.createMap(name, 'dto'); //console.log('Type', name, fields); (fields || []).forEach(function (it) { switch (it.type) { case 'array': createMapping(it.fields, name + '_' + it.key); dtom.forMember(it.key, function () { var sourceValue = this.__sourceValue[it.key]; var destinationValue = this.__destinationValue[it.key]; if (sourceValue instanceof Array) { destinationValue.length = sourceValue.length; // 如果是数组就循环赋值 for (var i = 0; i < sourceValue.length; i += 1) { if (it.fields && it.fields.length > 0) { // map前必须定义结构 if (destinationValue.length <= i || !destinationValue[i]) { createMapping(it.fields, name + '_' + it.key); destinationValue[i] = createObj({}, it.fields); } _automapper2.default.map('dto', name + '_' + it.key, sourceValue[i], destinationValue[i]); } else { destinationValue[i] = sourceValue[i]; } } } else if (sourceValue !== undefined) { // 可以是一个对象,直接赋给数组的第一个元素上 destinationValue.length = 0; if (it.fields && it.fields.length > 0) { createMapping(it.fields, name + '_obj' + it.key); destinationValue[0] = createObj({}, it.fields); _automapper2.default.map('dto', name + '_obj' + it.key, sourceValue, destinationValue[0]); } else { destinationValue[0] = sourceValue; } } }); mtod.forMember(it.key, function () { var sourceValue = this.__sourceValue[it.key]; var destinationValue = this.__destinationValue[it.key]; if (Array.isArray(sourceValue)) { for (var i = 0; i < sourceValue.length; i += 1) { if (it.fields && it.fields.length > 0) { if (!destinationValue[i]) { createMapping(it.fields, name + '_' + it.key, {}); destinationValue[i] = createObj({}, it.fields, true); } _automapper2.default.map(name + '_' + it.key, 'dto', sourceValue[i], destinationValue[i]); } else { destinationValue[i] = sourceValue[i]; } } } else { destinationValue.length = 0; } }); break; case 'reference': case 'object': createMapping(it.fields, name + '_' + it.key); dtom.forMember(it.key, function () { var _this = this; var sourceValue = this.__sourceValue[it.key]; if (sourceValue) { _automapper2.default.map('dto', name + '_' + it.key, sourceValue, this.__destinationValue[it.key]); } else { // 对象支持把层级拉平赋值 //console.debug(it.key, this.__sourceValue) var destinationValue = this.__destinationValue[it.key]; var sourceKeys = (0, _keys2.default)(this.__sourceValue); // ref引用类型支持 //debug(it.fields.map(it => it.key)); var flatValue = {}; //for (let key in it.fields.map(it => it.key)) { // if (!destinationValue.hasOwnProperty(key)) { // continue; // } // 把当前级别的subkey拉平成一个子对象 var flatKeys = sourceKeys.filter(function (key) { return key.toUpperCase().indexOf(it.key.toUpperCase()) > -1; }); flatKeys.forEach(function (key) { // 这里需要对大小写格式化 flatValue[(0, _camelCase3.default)(key.substr(it.key.length))] = _this.__sourceValue[key]; }); //} //debug(name + '_' + it.key, '=', flatValue) if (it.type === 'reference') { // destinationValue对象结构不是定义的结构导致map时获取props不对 var refVal = createObj({}, it.fields); //debug(refVal) _automapper2.default.map('dto', name + '_' + it.key, flatValue, refVal); this.__destinationValue[it.key] = refVal; } else { _automapper2.default.map('dto', name + '_' + it.key, flatValue, destinationValue); } } }); mtod.forMember(it.key, function () { var sourceValue = this.__sourceValue[it.key]; if (sourceValue) { _automapper2.default.map(name + '_' + it.key, 'dto', sourceValue, this.__destinationValue[it.key]); // } else { // this.__destinationValue[it.key] = sourceValue; } }); break; case 'string': [dtom, mtod].forEach(function (atob) { return atob.forMember(it.key, function () { if (this.__sourceValue.hasOwnProperty(it.key)) { this.__destinationValue[it.key] = this.__sourceValue[it.key]; // }else{ // this.__destinationValue[it.key] = ''; } }); }); break; case 'number': [dtom, mtod].forEach(function (atob) { return atob.forMember(it.key, function () { if (this.__sourceValue.hasOwnProperty(it.key)) { this.__destinationValue[it.key] = this.__sourceValue[it.key]; // }else{ // this.__destinationValue[it.key] = 0; } }); }); break; case 'boolean': [dtom, mtod].forEach(function (atob) { return atob.forMember(it.key, function () { if (this.__sourceValue.hasOwnProperty(it.key)) { this.__destinationValue[it.key] = !!this.__sourceValue[it.key]; // }else{ // this.__destinationValue[it.key] = 0; } }); }); break; case 'date': [dtom, mtod].forEach(function (atob) { return atob.forMember(it.key, function () { if (this.__sourceValue.hasOwnProperty(it.key)) { if (this.__sourceValue[it.key]) { // 支持字符串自动转换 if (mtod === atob) { this.__destinationValue[it.key] = (0, _moment2.default)(this.__sourceValue[it.key]).format(); } else { this.__destinationValue[it.key] = (0, _moment2.default)(this.__sourceValue[it.key]).toDate(); } } else { this.__destinationValue[it.key] = null; } // }else{ // this.__destinationValue[it.key] = 0; } }); }); break; default: [dtom, mtod].forEach(function (atob) { return atob.forMember(it.key, function () { if (this.__sourceValue.hasOwnProperty(it.key)) { this.__destinationValue[it.key] = this.__sourceValue[it.key]; // }else{ // this.__destinationValue[it.key] = null; } }); }); } }); }; var fieldsSymbol = (0, _symbol2.default)(); var dataKeySymbol = (0, _symbol2.default)(); var idKeySymbol = (0, _symbol2.default)(); var DataModel = (_class = function () { function DataModel(dataInfo, dataKey) { (0, _classCallCheck3.default)(this, DataModel); this[fieldsSymbol] = getMeta(dataInfo); //debug('dataInfo', JSON.stringify(this[fieldsSymbol], null, 2)) this[dataKeySymbol] = dataKey; //debug(this[dataKeySymbol]); createMapping(this[fieldsSymbol], dataKey); createObj(this, this[fieldsSymbol], false); //console.log(this); } (0, _createClass3.default)(DataModel, [{ key: 'getId', value: function getId() { return this[idKeySymbol]; } }, { key: 'getValue', value: function getValue(key) { return (0, _get3.default)(this, key); } // 对象更新,要是简单类型直接赋值即可a.b=100 }, { key: 'setValue', value: function setValue(key, value) { var subObj = this.createValue(key, value); //debug('setValue', key); (0, _setWith3.default)(this, key, subObj, function (val, key, obj) { //debug(val,key,obj,e) //return true; }); //debug(_get(this, key)) return subObj; } // 数组追加对象 }, { key: 'pushValue', value: function pushValue(key, value) { var subObj = this.createValue(key, value); (0, _get3.default)(this, key).push(subObj); return subObj; } // 插入一个对象,默认前插入 }, { key: 'insertValue', value: function insertValue(key, value) { var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var subObj = this.createValue(key, value); (0, _get3.default)(this, key).splice(index, 0, subObj); return subObj; } }, { key: 'createValue', value: function createValue(key, value) { var fields = findFields(this[fieldsSymbol], key.split('.')); var subObj = void 0; if (fields) { subObj = createObj({}, fields); var paths = [this[dataKeySymbol]].concat((0, _toConsumableArray3.default)(key.split('.'))).map(function (key) { return key.endsWith(']') ? key.substr(0, key.indexOf('[')) : key; }); //debug('pushValue', key); _automapper2.default.map('dto', paths.join('_'), value, subObj); } else { // TODO 这里还需要类型转换 // 比如value是string,但是type是date,需要转换成Date subObj = value; } return subObj; } }, { key: 'load', value: function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(_ref2, cacheData) { var sysid = _ref2.sysid, mid = _ref2.mid, id = _ref2.id, other = (0, _objectWithoutProperties3.default)(_ref2, ['sysid', 'mid', 'id']); var dto; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.t0 = cacheData; if (_context.t0) { _context.next = 5; break; } _context.next = 4; return _DataProviderManager2.default.getData((0, _extends3.default)({ sysid: sysid, mid: mid, id: id }, other)); case 4: _context.t0 = _context.sent; case 5: dto = _context.t0; this[idKeySymbol] = id; this.merge(dto); case 8: case 'end': return _context.stop(); } } }, _callee, this); })); function load(_x5, _x6) { return _ref.apply(this, arguments); } return load; }() }, { key: 'new', value: function _new() { this[idKeySymbol] = null; this.restore(); } }, { key: 'merge', value: function merge(dto) { // map必须直接到this需要固定的结构 _automapper2.default.map('dto', this[dataKeySymbol], dto, this); } }, { key: 'restore', value: function restore(initData) { this.merge(initData || createObj({}, this[fieldsSymbol])); } }, { key: 'cut', value: function cut() { // 裁剪引用类型数据结构只保留ID var dto = createObj({}, this[fieldsSymbol], true); _automapper2.default.map(this[dataKeySymbol], 'dto', this.toJS(), dto); //debug(this.toJS(), '=>', dto); return dto; } }, { key: 'save', value: function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(_ref4) { var sysid = _ref4.sysid, mid = _ref4.mid, id = _ref4.id, other = (0, _objectWithoutProperties3.default)(_ref4, ['sysid', 'mid', 'id']); return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _DataProviderManager2.default.saveData((0, _extends3.default)({ sysid: sysid, mid: mid, id: id }, other), this.cut()); case 2: case 'end': return _context2.stop(); } } }, _callee2, this); })); function save(_x7) { return _ref3.apply(this, arguments); } return save; }() }, { key: 'toJS', value: function toJS() { return (0, _mobx.toJS)(this); } }], [{ key: 'create', value: function () { var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(_ref6) { var sysid = _ref6.sysid, mid = _ref6.mid, other = (0, _objectWithoutProperties3.default)(_ref6, ['sysid', 'mid']); var dataInfo; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return _DataProviderManager2.default.getDataInfo((0, _extends3.default)({ sysid: sysid, mid: mid }, other)); case 2: dataInfo = _context3.sent; return _context3.abrupt('return', new DataModel(dataInfo, mid)); case 4: case 'end': return _context3.stop(); } } }, _callee3, this); })); function create(_x8) { return _ref5.apply(this, arguments); } return create; }() }]); return DataModel; }(), (_applyDecoratedDescriptor(_class.prototype, 'setValue', [_mobx.action], (0, _getOwnPropertyDescriptor2.default)(_class.prototype, 'setValue'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'pushValue', [_mobx.action], (0, _getOwnPropertyDescriptor2.default)(_class.prototype, 'pushValue'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'insertValue', [_mobx.action], (0, _getOwnPropertyDescriptor2.default)(_class.prototype, 'insertValue'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'load', [_mobx.action], (0, _getOwnPropertyDescriptor2.default)(_class.prototype, 'load'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'new', [_mobx.action], (0, _getOwnPropertyDescriptor2.default)(_class.prototype, 'new'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'merge', [_mobx.action], (0, _getOwnPropertyDescriptor2.default)(_class.prototype, 'merge'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'restore', [_mobx.action], (0, _getOwnPropertyDescriptor2.default)(_class.prototype, 'restore'), _class.prototype)), _class); exports.default = DataModel; //# sourceMappingURL=DataModel.js.map