mutants-appfx
Version:
appfx module
671 lines (590 loc) • 24 kB
JavaScript
'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