form-driver 0.4.19 → 0.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/m3.js CHANGED
@@ -3,7 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  require('antd/dist/antd.css');
6
- require('antd-mobile/dist/antd-mobile.css');
7
6
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
8
7
  var antd = require('antd');
9
8
  var React = require('react');
@@ -13,7 +12,7 @@ var _inheritsLoose = require('@babel/runtime/helpers/inheritsLoose');
13
12
  var _construct = require('@babel/runtime/helpers/construct');
14
13
  var moment = require('moment');
15
14
  var antdMobile = require('antd-mobile');
16
- var zhCN = require('antd/lib/date-picker/locale/zh_CN');
15
+ var zhCN = require('antd/es/locale/zh_CN');
17
16
  var _assertThisInitialized = require('@babel/runtime/helpers/assertThisInitialized');
18
17
  var icons = require('@ant-design/icons');
19
18
  var TextArea = require('antd/lib/input/TextArea');
@@ -22,8 +21,10 @@ var adapter = require('@atlaskit/pragmatic-drag-and-drop/element/adapter');
22
21
  var clsx = require('clsx');
23
22
  var Button = require('antd/lib/button');
24
23
  var _objectWithoutPropertiesLoose = require('@babel/runtime/helpers/objectWithoutPropertiesLoose');
24
+ var zhCN$1 = require('antd/lib/date-picker/locale/zh_CN');
25
25
  var ReactDOM = require('react-dom');
26
26
  var debounce = require('lodash/debounce');
27
+ require('moment/locale/zh-cn');
27
28
  var _extends = require('@babel/runtime/helpers/extends');
28
29
  var OSS = require('ali-oss');
29
30
 
@@ -42,6 +43,7 @@ var Select__default = /*#__PURE__*/_interopDefaultLegacy(Select);
42
43
  var clsx__default = /*#__PURE__*/_interopDefaultLegacy(clsx);
43
44
  var Button__default = /*#__PURE__*/_interopDefaultLegacy(Button);
44
45
  var _objectWithoutPropertiesLoose__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutPropertiesLoose);
46
+ var zhCN__default$1 = /*#__PURE__*/_interopDefaultLegacy(zhCN$1);
45
47
  var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
46
48
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
47
49
  var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
@@ -200,1279 +202,1658 @@ function _createForOfIteratorHelperLoose$e(o, allowArrayLike) { var it = typeof
200
202
  function _unsupportedIterableToArray$e(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$e(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$e(o, minLen); }
201
203
 
202
204
  function _arrayLikeToArray$e(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
203
- var next = Date.now() - 1617265950471; // /** 用来测量字符串长度 */
204
- // let _messurer: HTMLCanvasElement|undefined;
205
-
206
- var MUtil = {
207
- /**
208
- * 每次调用,返回不一样的数字
209
- * @returns
210
- */
211
- unique: function unique() {
212
- return next++;
213
- },
214
-
215
- /**
216
- * 枚举字段可以写成空格分隔的字符串,也能写成MEnumField[],这个函数将两种形式转换成统一的MEnumField[]
217
- * @deprecated 改成用MUtils.option
218
- */
219
- standardFields: function standardFields(fs) {
220
- if (typeof fs === "string") {
221
- return fs.split(" ").map(function (aEnum) {
222
- var _kv$;
223
-
224
- var kv = aEnum.split("=");
225
- return {
226
- label: kv[0],
227
- value: (_kv$ = kv[1]) != null ? _kv$ : kv[0]
228
- };
229
- });
230
- } else if (fs) {
231
- return fs;
232
- } else {
233
- return [];
234
- }
235
- },
236
-
237
- /**
238
- * 获取enumFields或者setFields,返回标准的MEnumField[]
239
- * @param f 如果f是nil,返回[]
240
- */
241
- option: function option(f) {
242
- var _result;
243
-
244
- var result;
205
+ var defaultTheme = {
206
+ READABLE_UNKNOWN: "?",
207
+ READABLE_BLANK: "-",
208
+ READABLE_INVALID: "❓",
209
+ READABLE_ERROR: "❗",
210
+ themeName: "antMiddle"
211
+ };
212
+ /**
213
+ * 注册viewer,type,morph(viewer和type之间的关联)
214
+ */
245
215
 
246
- if (___default["default"].isArray(f.option)) {
247
- result = f.option;
248
- } else {
249
- var ori;
216
+ var Assembly = /*#__PURE__*/function () {
217
+ var _proto = Assembly.prototype;
250
218
 
251
- if (f.type == "set") {
252
- ori = f.setFields;
253
- } else if (f.type == "enum") {
254
- ori = f.enumFields;
219
+ /** 根据定义返回View,返回nil表示没有可用的View */
220
+ _proto.getViewerOf = function getViewerOf(f, morph) {
221
+ if (f.editor && morph === "editor") {
222
+ if (___default["default"].isString(f.editor)) {
223
+ return ___default["default"].get(this.viewers, f.editor);
255
224
  } else {
256
- var _ref, _f$option;
257
-
258
- ori = (_ref = (_f$option = f.option) != null ? _f$option : f.setFields) != null ? _ref : f.enumFields; // 只是为了保险
225
+ return f.editor;
259
226
  }
227
+ } else if (f.readable && morph === "readable") {
228
+ if (___default["default"].isString(f.readable)) {
229
+ return ___default["default"].get(this.viewers, f.readable);
230
+ } else {
231
+ return f.readable;
232
+ }
233
+ } else {
234
+ var viewer = ___default["default"].get(this.morph, morph + "." + f.type);
260
235
 
261
- if (typeof ori === "string") {
262
- f.option = result = ori.split(" ").map(function (aEnum) {
263
- var _kv$2;
264
-
265
- var kv = aEnum.split("=");
266
- return {
267
- label: kv[0],
268
- value: (_kv$2 = kv[1]) != null ? _kv$2 : kv[0]
269
- };
270
- });
236
+ if (___default["default"].isString(viewer)) {
237
+ return ___default["default"].get(this.viewers, viewer);
271
238
  } else {
272
- f.option = result = ori; // TODO children 可能有递归的,还是得靠预处理解决
239
+ return viewer;
273
240
  }
274
241
  }
242
+ };
275
243
 
276
- return (_result = result) != null ? _result : [];
277
- },
278
-
279
- /** 如果出错了,返回这么个元素,可能用在BaseEditor子类或者其他的东西上 */
280
- error: function error(msg, schema) {
281
- return jsxRuntime.jsxs("div", {
282
- style: {
283
- color: "white",
284
- border: "1px solid darkgrey",
285
- background: "red",
286
- textAlign: "center",
287
- borderRadius: "5px"
288
- },
289
- children: [msg, schema ? jsxRuntime.jsx("pre", {
290
- style: {
291
- whiteSpace: "pre-wrap",
292
- textAlign: "left"
293
- },
294
- children: JSON.stringify(schema)
295
- }) : undefined]
296
- }, Date.now());
297
- },
298
- sign: function sign(v) {
299
- if (___default["default"].isNil(v)) {
300
- return null;
244
+ _proto.validate = function validate(s, v, path) {
245
+ if (path === void 0) {
246
+ path = "";
301
247
  }
302
248
 
303
- return Math.sign(v);
304
- },
249
+ var result = undefined;
305
250
 
306
- /**
307
- * 当前设备是不是个手机(或者类似手机的设备,比如ipad上运行iphone app中的webview)
308
- */
309
- phoneLike: function phoneLike() {
310
- // eslint-disable-next-line no-restricted-globals
311
- return screen.height / screen.width > 1.5;
312
- },
313
- // /**
314
- // * 计算文字的宽度
315
- // * @param text 文字
316
- // * @param font 字体
317
- // * @returns 宽度,单位是px
318
- // */
319
- // getTextWidth(text:string, font?:string) {
320
- // var canvas = _messurer ?? (_messurer = document.createElement("canvas"));
321
- // var context = canvas.getContext("2d");
322
- // if(!context) {
323
- // console.error('神奇的事情发生了:canvas.getContext("2d")居然能返回null');
324
- // return text.length * 10; // 总比出不来好
325
- // }
326
- // if(font){
327
- // context.font = font;
328
- // }
329
- // var metrics = context.measureText(text);
330
- // return metrics.width;
331
- // }
251
+ for (var _iterator = _createForOfIteratorHelperLoose$e(this.types[s.type].validators), _step; !(_step = _iterator()).done;) {
252
+ var validator = _step.value;
253
+ result = validator(this, s, v, path);
332
254
 
333
- /**
334
- * 计算文字的宽度
335
- * @param text
336
- */
337
- antdTextWidth: function antdTextWidth(text) {
338
- if (!text) {
339
- return 0;
255
+ if (result === "pass" && s.type !== "weight") {
256
+ return undefined;
257
+ } else if (typeof result === "object") {
258
+ MUtil.debug("校验", path, result.message);
259
+ return result;
260
+ }
340
261
  }
341
262
 
342
- return text.length * 16;
343
- },
263
+ return undefined;
264
+ };
265
+
266
+ _proto.addViewer = function addViewer(name, v) {
267
+ if (this.viewers[name]) {
268
+ console.error("addViewer: \u5DF2\u7ECF\u5B58\u5728\u540D\u4E3A " + name + " \u7684 Viewer\uFF0C\u65E0\u6CD5\u518D\u6B21\u6DFB\u52A0\uFF01");
269
+ return;
270
+ } else {
271
+ this.viewers[name] = v;
272
+ }
273
+ };
344
274
 
275
+ _proto.addEditor = function addEditor(name, v) {
276
+ if (this.editors[name]) {
277
+ console.error("addEditor: \u5DF2\u7ECF\u5B58\u5728\u540D\u4E3A " + name + " \u7684 Editor\uFF0C\u65E0\u6CD5\u518D\u6B21\u6DFB\u52A0\uFF01");
278
+ return;
279
+ } else {
280
+ this.editors[name] = v;
281
+ }
282
+ }
345
283
  /**
346
- * 从数组中删掉一个元素
347
- * @param a 这个数组会被改变的
348
- * @param element 要删的元素
349
- * @returns 修改后的数组(如果它不是nil)
284
+ * 增加一种数据类型
285
+ * 例:
286
+ * const hpOrg = {name: "hpOrg", type: {validators: ..., toReadable: ...}, editor: HPOrgEditor, readable: "DivViewer"}
287
+ * addType(hpOrg)
288
+ * @param typeParam 类型的描述对象
350
289
  */
351
- arrayRemove: function arrayRemove(a, element) {
352
- if (a) {
353
- var idx = a.indexOf(element);
290
+ ;
354
291
 
355
- if (idx >= 0) {
356
- a.splice(idx, 1);
357
- }
292
+ _proto.addType = function addType(typeParam) {
293
+ var name = typeParam.name,
294
+ type = typeParam.type,
295
+ editor = typeParam.editor,
296
+ _typeParam$readable = typeParam.readable,
297
+ readable = _typeParam$readable === void 0 ? "DivViewer" : _typeParam$readable;
298
+ this.types[name] = type;
358
299
 
359
- return a;
360
- } else {
361
- return a;
362
- }
363
- },
364
- fieldOfLayout: function fieldOfLayout(fields, spec) {
365
- var objectFieldMap = ___default["default"].chain(fields).keyBy("name").value();
300
+ ___default["default"].set(this.morph, "editor." + name, editor);
366
301
 
367
- var r = {};
302
+ ___default["default"].set(this.morph, "readable." + name, readable);
303
+ };
368
304
 
369
- for (var _iterator = _createForOfIteratorHelperLoose$e((_spec$segments = spec.segments) != null ? _spec$segments : []), _step; !(_step = _iterator()).done;) {
370
- var _spec$segments;
305
+ function Assembly() {
306
+ var _this = this;
371
307
 
372
- var s = _step.value;
308
+ this.types = {};
309
+ this.viewers = {};
310
+ this.editors = {};
311
+ this.morph = {};
312
+ this.theme = defaultTheme;
373
313
 
374
- for (var _iterator2 = _createForOfIteratorHelperLoose$e((_s$fields = s.fields) != null ? _s$fields : []), _step2; !(_step2 = _iterator2()).done;) {
375
- var _s$fields;
314
+ this.toReadable = function (s, v, parent) {
315
+ var t = _this.types[s.type];
376
316
 
377
- var f = _step2.value;
317
+ if (t) {
318
+ var _r;
378
319
 
379
- if (___default["default"].isString(f)) {
380
- var def = objectFieldMap[f];
320
+ var r;
381
321
 
382
- if (def) {
383
- r[f] = def;
384
- }
322
+ if (___default["default"].isString(s.toReadable)) {
323
+ // eslint-disable-next-line no-new-func
324
+ r = new Function("_", "value", "theme", "const {READABLE_UNKNOWN, READABLE_BLANK, READABLE_INVALID, READABLE_ERROR} = theme; return " + s.toReadable)(___default["default"], v, _this.theme);
325
+ } else if (___default["default"].isFunction(s.toReadable)) {
326
+ r = s.toReadable(v, parent, _this);
385
327
  }
386
- }
387
- }
388
328
 
389
- return ___default["default"].values(r);
390
- },
329
+ r = (_r = r) != null ? _r : t.toReadable(_this, s, v);
391
330
 
392
- /**
393
- * 跟lodash的get一样,除了:
394
- * 1. path是nil时返回undefined
395
- * 2. path是""时返回原始对象
396
- * @param a
397
- * @param path
398
- */
399
- get: function get(a, path) {
400
- if (___default["default"].isNil(a) || ___default["default"].isNil(path)) {
401
- return undefined;
402
- } else if (path === "") {
403
- return a;
404
- }
405
-
406
- return ___default["default"].get(a, path);
407
- },
408
-
409
- /**
410
- * a : database
411
- * v : newValue
412
- * 跟lodash的set一样,除了path是""时等效于_.assign(a, v)
413
- */
414
- set: function set(a, path, v) {
415
- if (path === "") {
416
- // 如果 database 是数组,需要特殊处理
417
- if (___default["default"].isArray(a)) a.length = v.length;
418
-
419
- ___default["default"].assign(a, v);
420
- } else {
421
- ___default["default"].set(a, path, v);
422
- }
423
- },
424
- debug: function debug(d) {
425
- for (var _len = arguments.length, optionalParams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
426
- optionalParams[_key - 1] = arguments[_key];
427
- }
331
+ if (s.postfix) {
332
+ r += s.postfix;
333
+ }
428
334
 
429
- console.log(d, optionalParams);
430
- },
335
+ return r;
336
+ } else {
337
+ return s.type + "类型无效";
338
+ }
339
+ }; // 校验types是否使用了无效的编辑器名字
431
340
 
432
- /**
433
- * 填入默认值
434
- * @param schema 你懂得
435
- * @param database 数据库,会被修改的
436
- * @param path 路径
437
- */
438
- applyDefaultValue: function applyDefaultValue(schema, database, path) {
439
- // FIXME 多测试下,type是object或其他简单类型的情况
440
- if (schema.type === "object") {
441
- for (var _iterator3 = _createForOfIteratorHelperLoose$e((_schema$objectFields = schema.objectFields) != null ? _schema$objectFields : []), _step3; !(_step3 = _iterator3()).done;) {
442
- var _schema$objectFields;
443
341
 
444
- var f = _step3.value;
445
- this.applyDefaultValue(f, database, (path ? path + "." : "") + f.name);
446
- }
447
- } else {
448
- if (!___default["default"].isNil(schema.defaultValue) && ___default["default"].isNil(___default["default"].get(database, path))) {
449
- ___default["default"].set(database, path, schema.defaultValue);
450
- }
451
- }
452
- },
453
- filterHide: function filterHide(schema, database) {
454
- var _schema$objectFields2;
342
+ for (var morphName in this.morph) {
343
+ for (var typeName in this.morph[morphName]) {
344
+ if (!this.types[typeName]) {
345
+ throw SyntaxError("\u7C7B\u578B" + typeName + "\u672A\u5B9A\u4E49");
346
+ }
455
347
 
456
- // TODO 要改成递归的
457
- var hm = MUtil.hideMap(database, (_schema$objectFields2 = schema.objectFields) != null ? _schema$objectFields2 : [], schema.uispec);
458
- var finalData = ___default["default"].isArray(database) ? [] : {};
348
+ var viewerName = this.morph[morphName][typeName];
459
349
 
460
- for (var k in database) {
461
- if (!hm[k]) {
462
- finalData[k] = database[k];
350
+ if (!this.viewers[viewerName]) {
351
+ throw SyntaxError("\u89C6\u56FE" + viewerName + "\u672A\u5B9A\u4E49");
352
+ }
463
353
  }
464
354
  }
355
+ }
465
356
 
466
- return finalData;
467
- },
357
+ return Assembly;
358
+ }();
359
+ var assembly = new Assembly();
468
360
 
469
- /**
470
- * 计算哪些field、segment需要隐藏
471
- * 支持ShowIfFunc里的函数
472
- * TODO 如果segment隐藏,里面的字段全都要隐藏
473
- * @returns 示例:
474
- * let {name,role,gender,alias,birthday,company,position,tel,email,citizenship,politicsCode,companyArch,address,work,edu,assistant,student,mib} = data;
475
- * return {politicsCode: !(citizenship=='中国大陆'),"segment:学员信息": !(_.intersection(role, ['校友']).length > 0))}
476
- * @param objectFields
477
- * @param uispec 用来计算segment是不是要展示,不填就不计算
478
- */
479
- hideMap: function hideMap(database, objectFields, uispec) {
480
- // 构造字段依赖计算的脚本,类似这样:
481
- // let {name,role,gender,alias,tel,email,citizenship,student} = {"name":"aaa","alias":"bbb","tel":"1"};citizenship=='中国大陆'
482
- var l1fields = ___default["default"].uniq( // 名字要唯一
483
- objectFields.filter(function (e) {
484
- return !!e.name;
485
- }) // 过滤掉没有名字的字段
486
- .map(function (e) {
487
- return ___default["default"].first(e.name.split("."));
488
- }) // 对于objectFields里类似student.no/student.state的字段,这里只要拼一个student就可以了
489
- );
361
+ /**
362
+ * 非空校验,数据不能是null/undefined/""/NaN/[]
363
+ * 要在其他条件之前,以便required=false时短路掉nil的数据,否则后面的校验全都得处理nil
364
+ * @param a
365
+ * @param schema
366
+ * @param value
367
+ * @param path
368
+ * @returns
369
+ */
490
370
 
491
- var showIfScript = "let {" + l1fields.join(",") + "} = data || {};\nlet hide = {";
371
+ function validateRequired$1(a, schema, value, path) {
372
+ if (schema.required) {
373
+ if (___default["default"].isNil(value) || value === "" || ___default["default"].isNaN(value) || ___default["default"].isArray(value) && value.length == 0) {
374
+ return {
375
+ message: "您还没有填完这一项",
376
+ path: path
377
+ };
378
+ } // 凡是总有例外
492
379
 
493
- for (var _iterator4 = _createForOfIteratorHelperLoose$e(objectFields), _step4; !(_step4 = _iterator4()).done;) {
494
- var f = _step4.value;
495
380
 
496
- if (f.showIf) {
497
- showIfScript += "'" + f.name + "': !(" + f.showIf + "),";
381
+ if (schema.type === "set" && schema.openOption) {
382
+ if (value.length === 1 && !value[0]) {
383
+ return {
384
+ message: "您还没有填完这一项",
385
+ path: path
386
+ }; // 开放set,只勾了开放选项,没有填内容,也要算空
498
387
  }
499
388
  }
389
+ } else {
390
+ if (___default["default"].isNil(value)) {
391
+ return "pass";
392
+ }
393
+ }
500
394
 
501
- for (var _iterator5 = _createForOfIteratorHelperLoose$e((_uispec$segments = uispec == null ? void 0 : uispec.segments) != null ? _uispec$segments : []), _step5; !(_step5 = _iterator5()).done;) {
502
- var _uispec$segments;
395
+ return undefined;
396
+ }
397
+ /** 和validateRequired相同,但不短路 */
503
398
 
504
- var s = _step5.value;
399
+ function validateRequiredNS(a, schema, value, path) {
400
+ var v = validateRequired$1(a, schema, value, path);
505
401
 
506
- if (s.showIf) {
507
- showIfScript += "\"segment:" + s.label + "\": !(" + s.showIf + "),";
508
- }
402
+ if (v === "pass") {
403
+ return undefined;
404
+ }
405
+ }
406
+ function validateDateMinMax(a, schema, value, path) {
407
+ if (schema.min) {
408
+ if (!value || value < schema.min) {
409
+ return {
410
+ message: "\u8BF7\u9009\u62E9" + schema.min + "\u4E4B\u540E\u7684\u65F6\u95F4",
411
+ path: path
412
+ };
509
413
  }
414
+ }
510
415
 
511
- showIfScript += "}\n"; // 如果一个segment里的所有字段都隐藏,segment就要隐藏
512
-
513
- for (var _iterator6 = _createForOfIteratorHelperLoose$e((_uispec$segments2 = uispec == null ? void 0 : uispec.segments) != null ? _uispec$segments2 : []), _step6; !(_step6 = _iterator6()).done;) {
514
- var _uispec$segments2;
515
-
516
- var _s = _step6.value;
416
+ if (schema.max) {
417
+ if (!value || value > schema.max) {
418
+ return {
419
+ message: "\u8BF7\u9009\u62E9" + schema.min + "\u4E4B\u524D\u7684\u65F6\u95F4",
420
+ path: path
421
+ };
422
+ }
423
+ }
517
424
 
518
- var cond = _s.fields.map(function (f) {
519
- return "(hide['" + f + "'])";
520
- }).join(" && ");
425
+ return undefined;
426
+ }
427
+ /**
428
+ * 数组项数不超过[min, max]
429
+ * @param schema
430
+ * @param value 应该是个数组
431
+ */
521
432
 
522
- showIfScript += "if(" + cond + ") { hide[\"segment:" + _s.label + "\"] = true }\n";
433
+ function validateArrayItemMinMax(a, schema, value, path) {
434
+ if (schema.min) {
435
+ if (!value || value.length < schema.min) {
436
+ return {
437
+ message: "\u81F3\u5C11\u9009\u62E9" + schema.min + "\u9879",
438
+ path: path
439
+ };
523
440
  }
441
+ }
524
442
 
525
- showIfScript += "return hide;\n"; // eslint-disable-next-line no-new-func
526
-
527
- try {
528
- var fn = Object.keys(SchemaFunc);
529
- var fv = Object.values(SchemaFunc);
443
+ if (schema.max) {
444
+ if (!value || value.length > schema.max) {
445
+ return {
446
+ message: "\u6700\u591A\u9009\u62E9" + schema.max + "\u9879",
447
+ path: path
448
+ };
449
+ }
450
+ }
530
451
 
531
- var hideMap = _construct__default["default"](Function, ["_", "data"].concat(fn, [showIfScript])).apply(void 0, [___default["default"], database].concat(fv));
452
+ return undefined;
453
+ }
454
+ /**
455
+ * 字符串长度不超过[min, max]
456
+ * @param schema
457
+ * @param value 应该是个字符串
458
+ */
532
459
 
533
- return hideMap;
534
- } catch (e) {
535
- console.error("Calc hideMap failed: " + e.message, "function(_,data){" + showIfScript + "}", database);
536
- return {};
460
+ function validateStringMinMax$1(a, schema, value, path) {
461
+ if (schema.min) {
462
+ if (!value || value.length < schema.min) {
463
+ return {
464
+ message: "\u81F3\u5C11" + schema.min + "\u4E2A\u5B57",
465
+ path: path
466
+ };
537
467
  }
538
- },
468
+ }
539
469
 
540
- /**
541
- * 计算 showIf 的值
542
- * @returns Boolean
543
- * @param database
544
- * @param objectFields
545
- */
546
- isShow: function isShow(database, objectFields, showIfExpr) {
547
- if (!showIfExpr) return true;
470
+ if (schema.max) {
471
+ if (value && value.length > schema.max) {
472
+ return {
473
+ message: "\u6700\u591A" + schema.max + "\u4E2A\u5B57",
474
+ path: path
475
+ };
476
+ }
477
+ }
548
478
 
549
- var l1fields = ___default["default"].uniq(objectFields.filter(function (e) {
550
- return !!e.name;
551
- }).map(function (e) {
552
- return ___default["default"].first(e.name.split("."));
553
- }));
479
+ return undefined;
480
+ }
481
+ /**
482
+ * 数字不超过[min, max]
483
+ * @param schema
484
+ * @param value 应该是个数字
485
+ */
554
486
 
555
- var showIfScript = "let {" + l1fields.join(",") + "} = data || {};\n return " + showIfExpr;
487
+ function validateNumberMinMax(a, schema, value, path) {
488
+ var temp = Number(value);
556
489
 
557
- try {
558
- var fn = Object.keys(SchemaFunc);
559
- var fv = Object.values(SchemaFunc);
490
+ if (!___default["default"].isNil(schema.max)) {
491
+ if (!___default["default"].isFinite(temp) || temp > schema.max) {
492
+ return {
493
+ message: "\u6700\u591A" + schema.max,
494
+ path: path
495
+ };
496
+ }
497
+ }
560
498
 
561
- var res = _construct__default["default"](Function, ["_", "data"].concat(fn, [showIfScript])).apply(void 0, [___default["default"], database].concat(fv));
499
+ if (!___default["default"].isNil(schema.min)) {
500
+ if (!___default["default"].isFinite(temp) || temp < schema.min) {
501
+ return {
502
+ message: "\u6700\u5C11" + schema.min,
503
+ path: path
504
+ };
505
+ }
506
+ }
562
507
 
563
- return res;
564
- } catch (e) {
565
- console.error("Calc isShow failed: " + e.message, "function(_,data){" + showIfScript + "}", database);
566
- return true;
508
+ return undefined;
509
+ }
510
+ function generateRegexValidate$1(regex, mismatchMsg) {
511
+ return function (a, schema, value, path) {
512
+ var asstr = ___default["default"].toString(value);
513
+
514
+ if (!regex.test(asstr)) {
515
+ return {
516
+ message: mismatchMsg,
517
+ path: path
518
+ };
567
519
  }
568
- },
569
- scoreOf: function scoreOf(f, database) {
570
- var v = ___default["default"].get(database, f.name);
571
520
 
572
- if (f.type == "enum") {
573
- var _MUtil$standardFields, _MUtil$standardFields2;
521
+ return undefined;
522
+ };
523
+ }
524
+ /**
525
+ * 数据用Object.prototype.toString.call返回的类型是预期的
526
+ * 可以用Object.prototype.toString.call(<预期的类型>)来查看你想要的数据类型的expectType
527
+ * @param expectType 预期类型,例如:"[object Object]" "[object Null]" "[object Number]" "[object Date]" "[object Array]"
528
+ * @param mismatchMsg 如果不匹配,提示的错误信息
529
+ * @returns
530
+ */
574
531
 
575
- return ___default["default"].toNumber((_MUtil$standardFields = MUtil.standardFields(f.enumFields)) == null ? void 0 : (_MUtil$standardFields2 = _MUtil$standardFields.find(function (e) {
576
- return e.value == v;
577
- })) == null ? void 0 : _MUtil$standardFields2.score);
578
- } else if (f.type == "set") {
579
- var score = 0;
580
- var opts = MUtil.standardFields(f.setFields);
532
+ function generateJsPrototypeValidate(expectType, mismatchMsg) {
533
+ if (mismatchMsg === void 0) {
534
+ mismatchMsg = "数据有误,请重填此项";
535
+ }
581
536
 
582
- for (var _iterator7 = _createForOfIteratorHelperLoose$e(opts), _step7; !(_step7 = _iterator7()).done;) {
583
- var s = _step7.value;
537
+ return function (a, schema, value, path) {
538
+ if (Object.prototype.toString.call(value) == expectType) {
539
+ return undefined;
540
+ } else {
541
+ return {
542
+ message: mismatchMsg,
543
+ path: path
544
+ };
545
+ }
546
+ };
547
+ }
548
+ function generateSchemaValidate(valueSchema, mismatchMsg) {
549
+ return function (a, schema, value, path) {
550
+ var r = assembly.validate(valueSchema, value, "");
584
551
 
585
- if (___default["default"].find(opts, {
586
- value: v
587
- })) {
588
- score += ___default["default"].toNumber(s.score);
589
- }
590
- }
552
+ if (!r) {
553
+ return r;
554
+ } else {
555
+ return {
556
+ message: mismatchMsg != null ? mismatchMsg : r.message,
557
+ path: path
558
+ };
559
+ }
560
+ };
561
+ }
562
+ var Validator = {
563
+ validateRequired: validateRequired$1,
564
+ validateRequiredNS: validateRequiredNS,
565
+ validateDateMinMax: validateDateMinMax,
566
+ validateStringMinMax: validateStringMinMax$1,
567
+ validateNumberMinMax: validateNumberMinMax,
568
+ generateRegexValidate: generateRegexValidate$1
569
+ };
591
570
 
592
- return score;
571
+ var EmtpyType = {
572
+ validators: [],
573
+ createDefaultValue: function createDefaultValue(assembly, s) {
574
+ if (s.defaultValue) {
575
+ return ___default["default"].clone(s.defaultValue);
593
576
  } else {
594
- return 0;
577
+ return undefined;
595
578
  }
596
579
  },
580
+ standardValue: function standardValue(assembly, s, v, strict) {
581
+ return v;
582
+ },
583
+ toReadable: function toReadable(assembly, s, vs) {
584
+ if (___default["default"].isNil(vs)) {
585
+ return assembly.theme.READABLE_BLANK;
586
+ }
597
587
 
598
- /**
599
- * 查找fs依赖(通过showIf)的所有字段
600
- * @param fs
601
- * @param all
602
- * @returns fs依赖的所有字段,包含fs。这个数组中下标小的元素,依赖下标大的元素
603
- */
604
- dependency: function dependency(fs, all) {
605
- // 先建个索引
606
- var allFieldsIdx = ___default["default"].keyBy(all, "name"); // 构造未被依赖的集合
607
-
588
+ return vs;
589
+ }
590
+ };
591
+ function createDefaultValue(assembly, s) {
592
+ if (s.defaultValue) {
593
+ return ___default["default"].clone(s.defaultValue);
594
+ } else {
595
+ return undefined;
596
+ }
597
+ }
608
598
 
609
- var ndep = ___default["default"].keyBy(all, "name"); // 全体
599
+ var MDateTimeType = ___default["default"].assign({}, EmtpyType, {
600
+ validators: [validateRequired$1, validateDateMinMax],
601
+ antConf: function antConf(schema) {
602
+ var _dataFormat, _dataFormat2, _dataFormat3, _dataFormat4, _dataFormat5, _dataFormat6, _dataFormat7, _dataFormat8;
610
603
 
604
+ var dataFormat = schema.dataFormat;
605
+ var readableFormat;
606
+ var mode;
607
+ var showTime = false;
611
608
 
612
- ndep = ___default["default"].omit(ndep, fs.map(function (f) {
613
- return f.name;
614
- })); // 去掉fs
615
- // 构造被依赖的集合
609
+ switch (schema.type) {
610
+ case "year":
611
+ mode = "year";
612
+ dataFormat = (_dataFormat = dataFormat) != null ? _dataFormat : "YYYY";
613
+ readableFormat = "YYYY";
614
+ break;
616
615
 
617
- var dep = new Map();
618
- fs.forEach(function (f) {
619
- return dep[f.name] = f;
620
- }); // 循环从ndep里把被依赖的字段放到dep中,直到dep不再增加
621
- // 算法有点粗暴,将就用吧
616
+ case "yearMonth":
617
+ mode = "month";
618
+ dataFormat = (_dataFormat2 = dataFormat) != null ? _dataFormat2 : "YYYYMM";
619
+ readableFormat = "YYYY.MM";
620
+ break;
622
621
 
623
- for (var i = 0; i < all.length; i++) {
624
- // 轮数最多all.length,防止卡死
625
- var newDepNames = [];
622
+ case "yearMonthDay":
623
+ mode = "date";
624
+ dataFormat = (_dataFormat3 = dataFormat) != null ? _dataFormat3 : "YYYYMMDD";
625
+ readableFormat = "YYYY.MM.DD";
626
+ break;
626
627
 
627
- for (var dn in dep) {
628
- var _dep$dn$showIf;
628
+ case "datetime":
629
+ mode = undefined;
630
+ dataFormat = (_dataFormat4 = dataFormat) != null ? _dataFormat4 : "x";
631
+ readableFormat = "YYYY.MM.DD HH:mm";
632
+ showTime = true;
633
+ break;
629
634
 
630
- var _i = ___default["default"].intersection((_dep$dn$showIf = dep[dn].showIf) == null ? void 0 : _dep$dn$showIf.split(/[^a-zA-Z0-9_$]/), Object.keys(ndep));
635
+ case "date":
636
+ switch (schema.datePrecision) {
637
+ case "year":
638
+ mode = "year";
639
+ dataFormat = (_dataFormat5 = dataFormat) != null ? _dataFormat5 : "YYYY";
640
+ readableFormat = "YYYY";
641
+ break;
631
642
 
632
- newDepNames = newDepNames.concat(_i);
633
- }
643
+ case "month":
644
+ mode = "month";
645
+ dataFormat = (_dataFormat6 = dataFormat) != null ? _dataFormat6 : "YYYYMM";
646
+ readableFormat = "YYYY.MM";
647
+ break;
634
648
 
635
- var prevSize = Object.keys(dep).length;
649
+ case "minute":
650
+ mode = undefined;
651
+ dataFormat = (_dataFormat7 = dataFormat) != null ? _dataFormat7 : "x";
652
+ readableFormat = "YYYY.MM.DD HH:mm";
653
+ showTime = true;
654
+ break;
636
655
 
637
- for (var _iterator8 = _createForOfIteratorHelperLoose$e(newDepNames), _step8; !(_step8 = _iterator8()).done;) {
638
- var n = _step8.value;
639
- dep[n] = allFieldsIdx[n];
640
- delete ndep[n];
641
- }
656
+ default:
657
+ // "day" 或未指定
658
+ mode = "date";
659
+ dataFormat = (_dataFormat8 = dataFormat) != null ? _dataFormat8 : "YYYYMMDD";
660
+ readableFormat = "YYYY.MM.DD";
661
+ break;
662
+ }
642
663
 
643
- var afterSize = Object.keys(dep).length;
664
+ break;
665
+ // case "yearAndQuarter":
666
+ // case "yearAndWeek":
667
+ // return MUtil.error(`移动端不支持${this.props.schema.type}`, this.props.schema);
644
668
 
645
- if (prevSize == afterSize) {
646
- break; // 如果找不到更多依赖,就可以结束了
647
- }
669
+ default:
670
+ return undefined;
648
671
  }
649
672
 
650
- return Object.values(dep);
673
+ return {
674
+ dataFormat: dataFormat,
675
+ readableFormat: readableFormat,
676
+ mode: mode,
677
+ showTime: showTime
678
+ };
651
679
  },
652
-
653
- /**
654
- * 用moment格式化
655
- * @param s 原始数据,参见moment
656
- * @param srcFormat 原始数据的格式,默认x(时间戳)
657
- * @param dstFormat 转换成的数据格式,默认YYYY年MM月DD日
658
- * @param fallback 如果原始数据是nil,返回fallback
659
- */
660
- momentFormat: function momentFormat(s, srcFormat, dstFormat, fallback) {
661
- if (srcFormat === void 0) {
662
- srcFormat = "x";
680
+ toReadable: function toReadable(assembly, schema, v) {
681
+ if (___default["default"].isNil(v)) {
682
+ return assembly.theme.READABLE_BLANK;
663
683
  }
664
684
 
665
- if (dstFormat === void 0) {
666
- dstFormat = "YYYY年MM月DD日";
667
- }
685
+ var c = MDateTimeType.antConf(schema);
668
686
 
669
- if (fallback === void 0) {
670
- fallback = "不详";
687
+ if (!c) {
688
+ return assembly.theme.READABLE_INVALID;
671
689
  }
672
690
 
673
- if (___default["default"].isNil(s)) {
674
- return fallback;
675
- }
691
+ var asMoment = moment__default["default"](v, c.dataFormat);
692
+ return asMoment.format(c.readableFormat);
693
+ }
694
+ });
676
695
 
677
- return moment__default["default"](s, srcFormat).format(dstFormat);
678
- },
696
+ /** 根据 precision 获取可读格式 */
679
697
 
680
- /**
681
- * 将标准的json schema转换成m3的schema
682
- * @param e json schema
683
- * @param base 如果填了一个对象,转换出的属性会放在这个对象上
684
- * @param template 如果有子结构,创建子结构的模板
685
- */
686
- jsonSchema2MFieldSchema: function jsonSchema2MFieldSchema(e, base, template) {
687
- if (base === void 0) {
688
- base = {
689
- name: "",
690
- type: "string"
691
- };
692
- }
698
+ function getReadableFormat(precision, showTime) {
699
+ switch (precision) {
700
+ case "year":
701
+ return "YYYY";
693
702
 
694
- if (template === void 0) {
695
- template = {};
696
- }
703
+ case "month":
704
+ return "YYYY.MM";
697
705
 
698
- switch (e.type) {
699
- case "string":
700
- if (e.enum) {
701
- var _base$enumFields;
706
+ case "minute":
707
+ return "YYYY.MM.DD HH:mm";
702
708
 
703
- base.type = "enum";
704
- base.enumFields = (_base$enumFields = base.enumFields) != null ? _base$enumFields : e.enum.map(function (v) {
705
- return {
706
- value: (v != null ? v : "").toString()
707
- };
708
- });
709
- } else {
710
- base.type = "string";
711
- base.max = e.maxLength;
712
- }
713
-
714
- break;
715
-
716
- case "number":
717
- case "integer":
718
- base.type = "int";
719
- break;
720
-
721
- case "object":
722
- base.type = "object";
723
- base.objectFields = [];
724
- base.uispec = {
725
- type: "flowForm",
726
- layout: MUtil.phoneLike() ? "vertical" : "horizontal",
727
- comma: ":"
728
- };
729
-
730
- for (var key in e.properties) {
731
- var jsmField = e.properties[key];
732
-
733
- var m3Field = ___default["default"].assign({}, template, {
734
- name: key,
735
- label: key,
736
- type: "object"
737
- });
709
+ default:
710
+ return showTime ? "YYYY.MM.DD HH:mm:ss" : "YYYY.MM.DD";
711
+ }
712
+ }
738
713
 
739
- if (!___default["default"].isBoolean(jsmField)) {
740
- var _jsmField$title;
714
+ function timeExpr(assembly, v, tillNow, readableFormat) {
715
+ if (tillNow) {
716
+ return "至今";
717
+ }
741
718
 
742
- m3Field.label = (_jsmField$title = jsmField.title) != null ? _jsmField$title : key;
743
- this.jsonSchema2MFieldSchema(jsmField, m3Field, template);
744
- base.objectFields.push(m3Field);
745
- } else {
746
- m3Field.type = "不支持的json schema:object.properties的value是boolean";
747
- base.objectFields.push();
748
- }
749
- }
719
+ if (!v) {
720
+ return assembly.theme.READABLE_UNKNOWN;
721
+ }
750
722
 
751
- break;
723
+ return moment__default["default"](v, "x").format(readableFormat);
724
+ }
752
725
 
753
- case "array":
754
- base.type = "array";
755
- base.arrayMember = {
756
- label: "",
757
- type: "array"
758
- };
726
+ function timeRangeExpr(assembly, from, to, tillNow, readableFormat) {
727
+ if (readableFormat === void 0) {
728
+ readableFormat = "YYYY.MM.DD";
729
+ }
759
730
 
760
- if (___default["default"].isArray(e.items)) {
761
- base.arrayMember.type = "不支持的json schema:array.items是数组";
762
- } else if (___default["default"].isBoolean(e.items)) {
763
- base.arrayMember.type = "不支持的json schema:array.items是boolean";
764
- } else if (e.items) {
765
- this.jsonSchema2MFieldSchema(e.items, base, template);
766
- } else {
767
- base.arrayMember.type = "不支持的json schema:array.items是undefined";
768
- }
731
+ return timeExpr(assembly, from, false, readableFormat) + " - " + timeExpr(assembly, to, tillNow, readableFormat);
732
+ }
733
+ var MDateRangeType = ___default["default"].assign({}, EmtpyType, {
734
+ validators: [validateRequired$1],
735
+ toReadable: function toReadable(assembly, s, vs) {
736
+ var _s$dateRange;
769
737
 
770
- break;
738
+ if (___default["default"].isNil(vs)) {
739
+ return assembly.theme.READABLE_BLANK;
740
+ }
771
741
 
772
- case "null":
773
- case "any":
774
- case "boolean":
775
- default:
776
- base.type = "不支持的json schema:array.items是" + e.type;
777
- break;
742
+ if (!___default["default"].isArray(vs)) {
743
+ return assembly.theme.READABLE_INVALID;
778
744
  }
779
745
 
780
- return base;
746
+ var fmt = getReadableFormat(s.dateRangePrecision, (_s$dateRange = s.dateRange) == null ? void 0 : _s$dateRange.showTime);
747
+ return timeRangeExpr(assembly, vs[0], vs[1], vs[2], fmt);
781
748
  },
782
749
 
783
750
  /**
784
- * 修改一个对象里的key
785
- * @param object 要修改的对象,
786
- * @param renameTo
787
- * @param removeNotExistKey 是否在结果里面去除renameTo里不存在的key
788
- * @returns 返回一个改过key名字的新对象
751
+ * 同toReadable,但数据无效时返回nil
789
752
  */
790
- renameKey: function renameKey(object, renameTo, removeNotExistKey) {
791
- if (removeNotExistKey === void 0) {
792
- removeNotExistKey = false;
793
- }
794
-
795
- var result = {};
753
+ toReadableN: function toReadableN(assembly, s, vs) {
754
+ if (!___default["default"].isNil(vs) && ___default["default"].isArray(vs)) {
755
+ var _s$dateRange2;
796
756
 
797
- for (var oldKey in object) {
798
- var newKey = renameTo[oldKey];
757
+ var fmt = getReadableFormat(s.dateRangePrecision, (_s$dateRange2 = s.dateRange) == null ? void 0 : _s$dateRange2.showTime);
758
+ return timeRangeExpr(assembly, vs[0], vs[1], vs[2], fmt);
759
+ }
799
760
 
800
- if (!newKey) {
801
- if (removeNotExistKey) {
802
- continue;
803
- } else {
804
- newKey = oldKey;
805
- }
806
- }
761
+ return undefined;
762
+ }
763
+ });
807
764
 
808
- result[newKey] = object[oldKey];
809
- }
765
+ function _createForOfIteratorHelperLoose$d(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$d(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
810
766
 
811
- return result;
812
- },
767
+ function _unsupportedIterableToArray$d(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$d(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$d(o, minLen); }
813
768
 
814
- /** 啥也不干的空回调 */
815
- doNothing: function doNothing() {},
769
+ function _arrayLikeToArray$d(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
770
+ var next = Date.now() - 1617265950471; // /** 用来测量字符串长度 */
771
+ // let _messurer: HTMLCanvasElement|undefined;
816
772
 
773
+ var MUtil = {
817
774
  /**
818
- * 去掉arr中的undefined和null,拼出来一个json path
775
+ * 每次调用,返回不一样的数字
776
+ * @returns
819
777
  */
820
- jsonPath: function jsonPath() {
821
- for (var _len2 = arguments.length, arr = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
822
- arr[_key2] = arguments[_key2];
823
- }
824
-
825
- return ___default["default"].compact(arr).join(".");
778
+ unique: function unique() {
779
+ return next++;
826
780
  },
827
781
 
828
782
  /**
829
- * 获取一个json path的父path。
830
- * @param path 如果path是空的返回也是空的
783
+ * 枚举字段可以写成空格分隔的字符串,也能写成MEnumField[],这个函数将两种形式转换成统一的MEnumField[]
784
+ * @deprecated 改成用MUtils.option
831
785
  */
832
- parentPath: function parentPath(path) {
833
- var split = path.replace(/]/g, "").split(/[.\\[]/);
834
- split.splice(-1, 1);
835
- return split.join(".");
786
+ standardFields: function standardFields(fs) {
787
+ if (typeof fs === "string") {
788
+ return fs.split(" ").map(function (aEnum) {
789
+ var _kv$;
790
+
791
+ var kv = aEnum.split("=");
792
+ return {
793
+ label: kv[0],
794
+ value: (_kv$ = kv[1]) != null ? _kv$ : kv[0]
795
+ };
796
+ });
797
+ } else if (fs) {
798
+ return fs;
799
+ } else {
800
+ return [];
801
+ }
836
802
  },
837
803
 
838
804
  /**
839
- * 校验一个schema
840
- * @param s 要校验的schema
841
- * @returns 空数组表示校验通过,否则返回校验错误信息
805
+ * 获取enumFields或者setFields,返回标准的MEnumField[]
806
+ * @param f 如果f是nil,返回[]
842
807
  */
843
- validateSchema: function validateSchema(s, parentPath) {
844
- var result = [];
845
-
846
- var error = function error(msg) {
847
- return result.push({
848
- message: msg,
849
- path: MUtil.jsonPath(parentPath, s.name)
850
- });
851
- };
808
+ option: function option(f) {
809
+ var _result;
852
810
 
853
- var checkDup = function checkDup(a, msgIfFail) {
854
- if (___default["default"].uniq(a).length !== a.length) {
855
- error(msgIfFail);
856
- }
857
- };
811
+ var result;
858
812
 
859
- var checkVL = function checkVL(fs) {
860
- checkDup(fs.map(function (f) {
861
- return f.value;
862
- }), s.name + "值有重复");
863
- checkDup(fs.map(function (f) {
864
- return f.label;
865
- }).filter(function (l) {
866
- return l;
867
- }), s.name + "文案有重复");
868
- };
813
+ if (___default["default"].isArray(f.option)) {
814
+ result = f.option;
815
+ } else {
816
+ var ori;
869
817
 
870
- var stringOnlyEnum = function stringOnlyEnum(candidate) {
871
- var ns = MUtil.standardFields(candidate).find(function (f) {
872
- return !___default["default"].isString(f.value);
873
- });
818
+ if (f.type == "set") {
819
+ ori = f.setFields;
820
+ } else if (f.type == "enum") {
821
+ ori = f.enumFields;
822
+ } else {
823
+ var _ref, _f$option;
874
824
 
875
- if (ns) {
876
- error("暂不支持的选项数据类型:" + JSON.stringify(ns) + ": " + typeof ns);
825
+ ori = (_ref = (_f$option = f.option) != null ? _f$option : f.setFields) != null ? _ref : f.enumFields; // 只是为了保险
877
826
  }
878
- };
879
827
 
880
- if (s.type === "decoration") {
881
- return [];
882
- } else if (s.type === "enum") {
883
- checkVL(MUtil.standardFields(s.enumFields));
884
- } else if (s.type === "set") {
885
- checkVL(MUtil.standardFields(s.setFields));
886
- } else if (s.type === "matrix") {
887
- stringOnlyEnum(s.matrix.x);
888
- stringOnlyEnum(s.matrix.y);
889
- } else if (s.type === "object") {
890
- if (!s.objectFields) {
891
- error("object类型未定义成员");
892
- } else {
893
- var _s$uispec;
828
+ if (typeof ori === "string") {
829
+ f.option = result = ori.split(" ").map(function (aEnum) {
830
+ var _kv$2;
894
831
 
895
- checkDup(s.objectFields.filter(function (f) {
896
- return f.type !== "decoration";
897
- }).map(function (f) {
898
- return f.name;
899
- }), "字段名有重复");
832
+ var kv = aEnum.split("=");
833
+ return {
834
+ label: kv[0],
835
+ value: (_kv$2 = kv[1]) != null ? _kv$2 : kv[0]
836
+ };
837
+ });
838
+ } else {
839
+ f.option = result = ori; // TODO children 可能有递归的,还是得靠预处理解决
840
+ }
841
+ }
900
842
 
901
- for (var _iterator9 = _createForOfIteratorHelperLoose$e(s.objectFields), _step9; !(_step9 = _iterator9()).done;) {
902
- var f = _step9.value;
903
- result = ___default["default"].concat(result, MUtil.validateSchema(f, MUtil.jsonPath(parentPath, s.name)));
904
- }
843
+ return (_result = result) != null ? _result : [];
844
+ },
905
845
 
906
- if (((_s$uispec = s.uispec) == null ? void 0 : _s$uispec.type) === "segmentForm") {
907
- if (!s.uispec.segments) {
908
- error("分段未定义");
909
- } else {
910
- checkDup(s.uispec.segments.map(function (f) {
911
- return f.label;
912
- }), "分段文案有重复");
913
-
914
- var fieldsInSegments = ___default["default"].flatten(s.uispec.segments.map(function (f) {
915
- return f.fields;
916
- }));
917
-
918
- checkDup(fieldsInSegments, "分段字段有重复");
919
- var fields = s.objectFields.map(function (f) {
920
- return f.name;
921
- });
922
- checkDup(fields, "字段名有重复");
923
-
924
- var notInSegment = ___default["default"].difference(fields, fieldsInSegments);
925
-
926
- if (notInSegment.length > 0) {
927
- error("字段" + notInSegment.join(",") + "未体现在分段中");
928
- }
929
-
930
- var fieldNotExist = ___default["default"].difference(fieldsInSegments, fields);
931
-
932
- if (fieldNotExist.length > 0) {
933
- error("分段字段名无效:" + notInSegment.join(","));
934
- }
935
- }
936
- }
937
- }
846
+ /** 如果出错了,返回这么个元素,可能用在BaseEditor子类或者其他的东西上 */
847
+ error: function error(msg, schema) {
848
+ return jsxRuntime.jsxs("div", {
849
+ style: {
850
+ color: "white",
851
+ border: "1px solid darkgrey",
852
+ background: "red",
853
+ textAlign: "center",
854
+ borderRadius: "5px"
855
+ },
856
+ children: [msg, schema ? jsxRuntime.jsx("pre", {
857
+ style: {
858
+ whiteSpace: "pre-wrap",
859
+ textAlign: "left"
860
+ },
861
+ children: JSON.stringify(schema)
862
+ }) : undefined]
863
+ }, Date.now());
864
+ },
865
+ sign: function sign(v) {
866
+ if (___default["default"].isNil(v)) {
867
+ return null;
938
868
  }
939
869
 
940
- return result;
870
+ return Math.sign(v);
941
871
  },
942
872
 
943
873
  /**
944
- * 参考https://stackoverflow.com/questions/3362471/how-can-i-call-a-javascript-constructor-using-call-or-apply
945
- * 示例: var d = applyToConstructor(Date, [2008, 10, 8, 00, 16, 34, 254]);
946
- * @param constructor
947
- * @param argArray
874
+ * 当前设备是不是个手机(或者类似手机的设备,比如ipad上运行iphone app中的webview)
948
875
  */
949
- applyToConstructor: function applyToConstructor(constructor, argArray) {
950
- var args = [null].concat(argArray);
951
- var factoryFunction = constructor.bind.apply(constructor, args);
952
- return new factoryFunction();
876
+ phoneLike: function phoneLike() {
877
+ // eslint-disable-next-line no-restricted-globals
878
+ return screen.height / screen.width > 1.5;
953
879
  },
880
+ // /**
881
+ // * 计算文字的宽度
882
+ // * @param text 文字
883
+ // * @param font 字体
884
+ // * @returns 宽度,单位是px
885
+ // */
886
+ // getTextWidth(text:string, font?:string) {
887
+ // var canvas = _messurer ?? (_messurer = document.createElement("canvas"));
888
+ // var context = canvas.getContext("2d");
889
+ // if(!context) {
890
+ // console.error('神奇的事情发生了:canvas.getContext("2d")居然能返回null');
891
+ // return text.length * 10; // 总比出不来好
892
+ // }
893
+ // if(font){
894
+ // context.font = font;
895
+ // }
896
+ // var metrics = context.measureText(text);
897
+ // return metrics.width;
898
+ // }
954
899
 
955
900
  /**
956
- * 执行表达式或者回调函数
957
- * @param exprOrFunction 表达式或者回调函数
958
- * @param paramName 参数名字
959
- * @param paramValue 参数值
960
- * @param fallback 如果exprOrFunction无效,返回fallback
961
- * @param _this this指针
901
+ * 计算文字的宽度
902
+ * @param text
962
903
  */
963
- evalExprOrFunction: function evalExprOrFunction(exprOrFunction, paramName, paramValue, fallback, _this) {
964
- if (fallback === void 0) {
965
- fallback = undefined;
904
+ antdTextWidth: function antdTextWidth(text) {
905
+ if (!text) {
906
+ return 0;
966
907
  }
967
908
 
968
- if (_this === void 0) {
969
- _this = undefined;
970
- }
909
+ return text.length * 16;
910
+ },
971
911
 
972
- if (___default["default"].isFunction(exprOrFunction)) {
973
- return exprOrFunction.apply(_this, paramValue);
974
- } else if (___default["default"].isString(exprOrFunction)) {
975
- //return new Function("_", "value", "parent", "return (" + labelExpr + ");")(_, value, parent);
976
- var func = MUtil.applyToConstructor(Function, [].concat(paramName, ["return (" + exprOrFunction + ")"]));
977
- return func.apply(_this, paramValue);
912
+ /**
913
+ * 从数组中删掉一个元素
914
+ * @param a 这个数组会被改变的
915
+ * @param element 要删的元素
916
+ * @returns 修改后的数组(如果它不是nil)
917
+ */
918
+ arrayRemove: function arrayRemove(a, element) {
919
+ if (a) {
920
+ var idx = a.indexOf(element);
921
+
922
+ if (idx >= 0) {
923
+ a.splice(idx, 1);
924
+ }
925
+
926
+ return a;
978
927
  } else {
979
- return fallback;
928
+ return a;
980
929
  }
981
930
  },
931
+ fieldOfLayout: function fieldOfLayout(fields, spec) {
932
+ var objectFieldMap = ___default["default"].chain(fields).keyBy("name").value();
982
933
 
983
- /**
984
- * 读取url参数,转换成map
985
- * @param hashPrefix nil表示不读取hash里的参数,字符串表示读取hash里的参数,并加上这个前缀返回。默认是返回,但前缀是空字符串
986
- */
987
- getQuery: function getQuery(hashPrefix) {
934
+ var r = {};
988
935
 
989
- var arrs = [].concat(window.location.search.split(/[?&]/), window.location.hash.split(/[#?&]/));
990
- var result = {};
991
- arrs.forEach(function (item) {
992
- var kv = item.split(/=/);
936
+ for (var _iterator = _createForOfIteratorHelperLoose$d((_spec$segments = spec.segments) != null ? _spec$segments : []), _step; !(_step = _iterator()).done;) {
937
+ var _spec$segments;
993
938
 
994
- if (kv.length <= 2 && kv[0]) {
995
- result[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);
939
+ var s = _step.value;
940
+
941
+ for (var _iterator2 = _createForOfIteratorHelperLoose$d((_s$fields = s.fields) != null ? _s$fields : []), _step2; !(_step2 = _iterator2()).done;) {
942
+ var _s$fields;
943
+
944
+ var f = _step2.value;
945
+
946
+ if (___default["default"].isString(f)) {
947
+ var def = objectFieldMap[f];
948
+
949
+ if (def) {
950
+ r[f] = def;
951
+ }
952
+ }
996
953
  }
997
- });
998
- return result;
954
+ }
955
+
956
+ return ___default["default"].values(r);
999
957
  },
1000
958
 
1001
959
  /**
1002
- * 动态创建一个CSS样式
1003
- * @param css css内容,会被写进style标签里
1004
- * @param id <style>的id,可以没有。如果已经存在,会被覆盖掉。
960
+ * 跟lodash的get一样,除了:
961
+ * 1. path是nil时返回undefined
962
+ * 2. path是""时返回原始对象
963
+ * @param a
964
+ * @param path
1005
965
  */
1006
- setCss: function setCss(css, id) {
1007
- var _document$getElementB;
966
+ get: function get(a, path) {
967
+ if (___default["default"].isNil(a) || ___default["default"].isNil(path)) {
968
+ return undefined;
969
+ } else if (path === "") {
970
+ return a;
971
+ }
1008
972
 
1009
- var s = (_document$getElementB = document.getElementById(id)) != null ? _document$getElementB : document.createElement("style");
1010
- s.id = id;
1011
- s.type = "text/css";
1012
- s.innerHTML = css;
1013
- document.getElementsByTagName("head")[0].appendChild(s);
973
+ return ___default["default"].get(a, path);
1014
974
  },
1015
975
 
1016
976
  /**
1017
- * escape数值
1018
- * @param str - 字符串
1019
- * @returns 会带上引号,类似"abc",str=nil时会返回""
977
+ * a : database
978
+ * v : newValue
979
+ * 跟lodash的set一样,除了path是""时等效于_.assign(a, v)
1020
980
  */
1021
- escapeCsv: function escapeCsv(str) {
1022
- if (!___default["default"].isString(str)) {
1023
- str = ___default["default"].toString(str);
981
+ set: function set(a, path, v) {
982
+ if (path === "") {
983
+ // 如果 database 是数组,需要特殊处理
984
+ if (___default["default"].isArray(a)) a.length = v.length;
985
+
986
+ ___default["default"].assign(a, v);
987
+ } else {
988
+ ___default["default"].set(a, path, v);
989
+ }
990
+ },
991
+ debug: function debug(d) {
992
+ for (var _len = arguments.length, optionalParams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
993
+ optionalParams[_key - 1] = arguments[_key];
1024
994
  }
1025
995
 
1026
- return '"' + str.replace(/["]/g, '""') + '"';
996
+ console.log(d, optionalParams);
1027
997
  },
1028
998
 
1029
999
  /**
1030
- * 判断两个值是否相同
1031
- * @param v1 一个值
1032
- * @param v2 另一个值
1033
- * @param tolerate true用==判断,false用===判断
1000
+ * 填入默认值
1001
+ * @param schema 你懂得
1002
+ * @param database 数据库,会被修改的
1003
+ * @param path 路径
1034
1004
  */
1035
- isEquals: function isEquals(v1, v2, tolerate) {
1036
- if (tolerate) {
1037
- return v1 == v2;
1038
- } else {
1039
- return v1 === v2;
1040
- }
1041
- }
1042
- };
1043
- var CompactArray = {
1044
- indexOf: function indexOf(ca, d) {
1045
- if (___default["default"].isNil(d) || ___default["default"].isNil(ca)) {
1046
- return -1;
1047
- }
1005
+ applyDefaultValue: function applyDefaultValue(schema, database, path) {
1006
+ // FIXME 多测试下,type是object或其他简单类型的情况
1007
+ if (schema.type === "object") {
1008
+ for (var _iterator3 = _createForOfIteratorHelperLoose$d((_schema$objectFields = schema.objectFields) != null ? _schema$objectFields : []), _step3; !(_step3 = _iterator3()).done;) {
1009
+ var _schema$objectFields;
1048
1010
 
1049
- if (___default["default"].isArray(ca)) {
1050
- return ca.indexOf(d);
1011
+ var f = _step3.value;
1012
+ this.applyDefaultValue(f, database, (path ? path + "." : "") + f.name);
1013
+ }
1051
1014
  } else {
1052
- return ca === d ? 0 : -1;
1015
+ if (!___default["default"].isNil(schema.defaultValue) && ___default["default"].isNil(___default["default"].get(database, path))) {
1016
+ ___default["default"].set(database, path, schema.defaultValue);
1017
+ }
1053
1018
  }
1054
- }
1055
- };
1019
+ },
1020
+ filterHide: function filterHide(schema, database) {
1021
+ var _schema$objectFields2;
1056
1022
 
1057
- function _createForOfIteratorHelperLoose$d(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$d(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
1023
+ // TODO 要改成递归的
1024
+ var hm = MUtil.hideMap(database, (_schema$objectFields2 = schema.objectFields) != null ? _schema$objectFields2 : [], schema.uispec);
1025
+ var finalData = ___default["default"].isArray(database) ? [] : {};
1058
1026
 
1059
- function _unsupportedIterableToArray$d(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$d(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$d(o, minLen); }
1027
+ for (var k in database) {
1028
+ if (!hm[k]) {
1029
+ finalData[k] = database[k];
1030
+ }
1031
+ }
1060
1032
 
1061
- function _arrayLikeToArray$d(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
1062
- var defaultTheme = {
1063
- READABLE_UNKNOWN: "?",
1064
- READABLE_BLANK: "-",
1065
- READABLE_INVALID: "❓",
1066
- READABLE_ERROR: "❗",
1067
- themeName: "antMiddle"
1068
- };
1069
- /**
1070
- * 注册viewer,type,morph(viewer和type之间的关联)
1071
- */
1033
+ return finalData;
1034
+ },
1072
1035
 
1073
- var Assembly = /*#__PURE__*/function () {
1074
- var _proto = Assembly.prototype;
1036
+ /**
1037
+ * 计算哪些field、segment需要隐藏
1038
+ * 支持ShowIfFunc里的函数
1039
+ * TODO 如果segment隐藏,里面的字段全都要隐藏
1040
+ * @returns 示例:
1041
+ * let {name,role,gender,alias,birthday,company,position,tel,email,citizenship,politicsCode,companyArch,address,work,edu,assistant,student,mib} = data;
1042
+ * return {politicsCode: !(citizenship=='中国大陆'),"segment:学员信息": !(_.intersection(role, ['校友']).length > 0))}
1043
+ * @param objectFields
1044
+ * @param uispec 用来计算segment是不是要展示,不填就不计算
1045
+ */
1046
+ hideMap: function hideMap(database, objectFields, uispec) {
1047
+ // 构造字段依赖计算的脚本,类似这样:
1048
+ // let {name,role,gender,alias,tel,email,citizenship,student} = {"name":"aaa","alias":"bbb","tel":"1"};citizenship=='中国大陆'
1049
+ var l1fields = ___default["default"].uniq( // 名字要唯一
1050
+ objectFields.filter(function (e) {
1051
+ return !!e.name;
1052
+ }) // 过滤掉没有名字的字段
1053
+ .map(function (e) {
1054
+ return ___default["default"].first(e.name.split("."));
1055
+ }) // 对于objectFields里类似student.no/student.state的字段,这里只要拼一个student就可以了
1056
+ );
1075
1057
 
1076
- /** 根据定义返回View,返回nil表示没有可用的View */
1077
- _proto.getViewerOf = function getViewerOf(f, morph) {
1078
- if (f.editor && morph === "editor") {
1079
- if (___default["default"].isString(f.editor)) {
1080
- return ___default["default"].get(this.viewers, f.editor);
1081
- } else {
1082
- return f.editor;
1083
- }
1084
- } else if (f.readable && morph === "readable") {
1085
- if (___default["default"].isString(f.readable)) {
1086
- return ___default["default"].get(this.viewers, f.readable);
1087
- } else {
1088
- return f.readable;
1089
- }
1090
- } else {
1091
- var viewer = ___default["default"].get(this.morph, morph + "." + f.type);
1058
+ var showIfScript = "let {" + l1fields.join(",") + "} = data || {};\nlet hide = {";
1092
1059
 
1093
- if (___default["default"].isString(viewer)) {
1094
- return ___default["default"].get(this.viewers, viewer);
1095
- } else {
1096
- return viewer;
1097
- }
1098
- }
1099
- };
1060
+ for (var _iterator4 = _createForOfIteratorHelperLoose$d(objectFields), _step4; !(_step4 = _iterator4()).done;) {
1061
+ var f = _step4.value;
1100
1062
 
1101
- _proto.validate = function validate(s, v, path) {
1102
- if (path === void 0) {
1103
- path = "";
1063
+ if (f.showIf) {
1064
+ showIfScript += "'" + f.name + "': !(" + f.showIf + "),";
1065
+ }
1104
1066
  }
1105
1067
 
1106
- var result = undefined;
1068
+ for (var _iterator5 = _createForOfIteratorHelperLoose$d((_uispec$segments = uispec == null ? void 0 : uispec.segments) != null ? _uispec$segments : []), _step5; !(_step5 = _iterator5()).done;) {
1069
+ var _uispec$segments;
1107
1070
 
1108
- for (var _iterator = _createForOfIteratorHelperLoose$d(this.types[s.type].validators), _step; !(_step = _iterator()).done;) {
1109
- var validator = _step.value;
1110
- result = validator(this, s, v, path);
1071
+ var s = _step5.value;
1111
1072
 
1112
- if (result === "pass" && s.type !== "weight") {
1113
- return undefined;
1114
- } else if (typeof result === "object") {
1115
- MUtil.debug("校验", path, result.message);
1116
- return result;
1073
+ if (s.showIf) {
1074
+ showIfScript += "\"segment:" + s.label + "\": !(" + s.showIf + "),";
1117
1075
  }
1118
1076
  }
1119
1077
 
1120
- return undefined;
1121
- };
1078
+ showIfScript += "}\n"; // 如果一个segment里的所有字段都隐藏,segment就要隐藏
1122
1079
 
1123
- _proto.addViewer = function addViewer(name, v) {
1124
- if (this.viewers[name]) {
1125
- console.error("addViewer: \u5DF2\u7ECF\u5B58\u5728\u540D\u4E3A " + name + " \u7684 Viewer\uFF0C\u65E0\u6CD5\u518D\u6B21\u6DFB\u52A0\uFF01");
1126
- return;
1127
- } else {
1128
- this.viewers[name] = v;
1129
- }
1130
- };
1080
+ for (var _iterator6 = _createForOfIteratorHelperLoose$d((_uispec$segments2 = uispec == null ? void 0 : uispec.segments) != null ? _uispec$segments2 : []), _step6; !(_step6 = _iterator6()).done;) {
1081
+ var _uispec$segments2;
1131
1082
 
1132
- _proto.addEditor = function addEditor(name, v) {
1133
- if (this.editors[name]) {
1134
- console.error("addEditor: \u5DF2\u7ECF\u5B58\u5728\u540D\u4E3A " + name + " \u7684 Editor\uFF0C\u65E0\u6CD5\u518D\u6B21\u6DFB\u52A0\uFF01");
1135
- return;
1136
- } else {
1137
- this.editors[name] = v;
1138
- }
1139
- }
1140
- /**
1141
- * 增加一种数据类型
1142
- * 例:
1143
- * const hpOrg = {name: "hpOrg", type: {validators: ..., toReadable: ...}, editor: HPOrgEditor, readable: "DivViewer"}
1144
- * addType(hpOrg)
1145
- * @param typeParam 类型的描述对象
1146
- */
1147
- ;
1083
+ var _s = _step6.value;
1148
1084
 
1149
- _proto.addType = function addType(typeParam) {
1150
- var name = typeParam.name,
1151
- type = typeParam.type,
1152
- editor = typeParam.editor,
1153
- _typeParam$readable = typeParam.readable,
1154
- readable = _typeParam$readable === void 0 ? "DivViewer" : _typeParam$readable;
1155
- this.types[name] = type;
1085
+ var cond = _s.fields.map(function (f) {
1086
+ return "(hide['" + f + "'])";
1087
+ }).join(" && ");
1156
1088
 
1157
- ___default["default"].set(this.morph, "editor." + name, editor);
1089
+ showIfScript += "if(" + cond + ") { hide[\"segment:" + _s.label + "\"] = true }\n";
1090
+ }
1158
1091
 
1159
- ___default["default"].set(this.morph, "readable." + name, readable);
1160
- };
1092
+ showIfScript += "return hide;\n"; // eslint-disable-next-line no-new-func
1161
1093
 
1162
- function Assembly() {
1163
- var _this = this;
1094
+ try {
1095
+ var fn = Object.keys(SchemaFunc);
1096
+ var fv = Object.values(SchemaFunc);
1164
1097
 
1165
- this.types = {};
1166
- this.viewers = {};
1167
- this.editors = {};
1168
- this.morph = {};
1169
- this.theme = defaultTheme;
1098
+ var hideMap = _construct__default["default"](Function, ["_", "data"].concat(fn, [showIfScript])).apply(void 0, [___default["default"], database].concat(fv));
1170
1099
 
1171
- this.toReadable = function (s, v, parent) {
1172
- var t = _this.types[s.type];
1100
+ return hideMap;
1101
+ } catch (e) {
1102
+ console.error("Calc hideMap failed: " + e.message, "function(_,data){" + showIfScript + "}", database);
1103
+ return {};
1104
+ }
1105
+ },
1173
1106
 
1174
- if (t) {
1175
- var _r;
1107
+ /**
1108
+ * 计算 showIf 的值
1109
+ * @returns Boolean
1110
+ * @param database
1111
+ * @param objectFields
1112
+ */
1113
+ isShow: function isShow(database, objectFields, showIfExpr) {
1114
+ if (!showIfExpr) return true;
1176
1115
 
1177
- var r;
1116
+ var l1fields = ___default["default"].uniq(objectFields.filter(function (e) {
1117
+ return !!e.name;
1118
+ }).map(function (e) {
1119
+ return ___default["default"].first(e.name.split("."));
1120
+ }));
1178
1121
 
1179
- if (___default["default"].isString(s.toReadable)) {
1180
- // eslint-disable-next-line no-new-func
1181
- r = new Function("_", "value", "theme", "const {READABLE_UNKNOWN, READABLE_BLANK, READABLE_INVALID, READABLE_ERROR} = theme; return " + s.toReadable)(___default["default"], v, _this.theme);
1182
- } else if (___default["default"].isFunction(s.toReadable)) {
1183
- r = s.toReadable(v, parent, _this);
1184
- }
1122
+ var showIfScript = "let {" + l1fields.join(",") + "} = data || {};\n return " + showIfExpr;
1185
1123
 
1186
- r = (_r = r) != null ? _r : t.toReadable(_this, s, v);
1124
+ try {
1125
+ var fn = Object.keys(SchemaFunc);
1126
+ var fv = Object.values(SchemaFunc);
1187
1127
 
1188
- if (s.postfix) {
1189
- r += s.postfix;
1190
- }
1128
+ var res = _construct__default["default"](Function, ["_", "data"].concat(fn, [showIfScript])).apply(void 0, [___default["default"], database].concat(fv));
1191
1129
 
1192
- return r;
1193
- } else {
1194
- return s.type + "类型无效";
1195
- }
1196
- }; // 校验types是否使用了无效的编辑器名字
1130
+ return res;
1131
+ } catch (e) {
1132
+ console.error("Calc isShow failed: " + e.message, "function(_,data){" + showIfScript + "}", database);
1133
+ return true;
1134
+ }
1135
+ },
1136
+ scoreOf: function scoreOf(f, database) {
1137
+ var v = ___default["default"].get(database, f.name);
1197
1138
 
1139
+ if (f.type == "enum") {
1140
+ var _MUtil$standardFields, _MUtil$standardFields2;
1198
1141
 
1199
- for (var morphName in this.morph) {
1200
- for (var typeName in this.morph[morphName]) {
1201
- if (!this.types[typeName]) {
1202
- throw SyntaxError("\u7C7B\u578B" + typeName + "\u672A\u5B9A\u4E49");
1203
- }
1142
+ return ___default["default"].toNumber((_MUtil$standardFields = MUtil.standardFields(f.enumFields)) == null ? void 0 : (_MUtil$standardFields2 = _MUtil$standardFields.find(function (e) {
1143
+ return e.value == v;
1144
+ })) == null ? void 0 : _MUtil$standardFields2.score);
1145
+ } else if (f.type == "set") {
1146
+ var score = 0;
1147
+ var opts = MUtil.standardFields(f.setFields);
1204
1148
 
1205
- var viewerName = this.morph[morphName][typeName];
1149
+ for (var _iterator7 = _createForOfIteratorHelperLoose$d(opts), _step7; !(_step7 = _iterator7()).done;) {
1150
+ var s = _step7.value;
1206
1151
 
1207
- if (!this.viewers[viewerName]) {
1208
- throw SyntaxError("\u89C6\u56FE" + viewerName + "\u672A\u5B9A\u4E49");
1152
+ if (___default["default"].find(opts, {
1153
+ value: v
1154
+ })) {
1155
+ score += ___default["default"].toNumber(s.score);
1209
1156
  }
1210
1157
  }
1158
+
1159
+ return score;
1160
+ } else {
1161
+ return 0;
1211
1162
  }
1212
- }
1163
+ },
1213
1164
 
1214
- return Assembly;
1215
- }();
1216
- var assembly = new Assembly();
1165
+ /**
1166
+ * 查找fs依赖(通过showIf)的所有字段
1167
+ * @param fs
1168
+ * @param all
1169
+ * @returns fs依赖的所有字段,包含fs。这个数组中下标小的元素,依赖下标大的元素
1170
+ */
1171
+ dependency: function dependency(fs, all) {
1172
+ // 先建个索引
1173
+ var allFieldsIdx = ___default["default"].keyBy(all, "name"); // 构造未被依赖的集合
1217
1174
 
1218
- var MContext = /*#__PURE__*/React__default["default"].createContext(undefined);
1219
1175
 
1220
- function ownKeys$x(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1176
+ var ndep = ___default["default"].keyBy(all, "name"); // 全体
1221
1177
 
1222
- function _objectSpread$x(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$x(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$x(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1223
- /**
1224
- * 一个字段的视图
1225
- */
1226
1178
 
1227
- var MFieldViewer = /*#__PURE__*/function (_React$Component) {
1228
- _inheritsLoose__default["default"](MFieldViewer, _React$Component);
1179
+ ndep = ___default["default"].omit(ndep, fs.map(function (f) {
1180
+ return f.name;
1181
+ })); // 去掉fs
1182
+ // 构造被依赖的集合
1229
1183
 
1230
- function MFieldViewer() {
1231
- return _React$Component.apply(this, arguments) || this;
1232
- }
1184
+ var dep = new Map();
1185
+ fs.forEach(function (f) {
1186
+ return dep[f.name] = f;
1187
+ }); // 循环从ndep里把被依赖的字段放到dep中,直到dep不再增加
1188
+ // 算法有点粗暴,将就用吧
1233
1189
 
1234
- var _proto = MFieldViewer.prototype;
1190
+ for (var i = 0; i < all.length; i++) {
1191
+ // 轮数最多all.length,防止卡死
1192
+ var newDepNames = [];
1235
1193
 
1236
- _proto.render = function render() {
1237
- var _this = this;
1194
+ for (var dn in dep) {
1195
+ var _dep$dn$showIf;
1238
1196
 
1239
- var viewer = assembly.getViewerOf(this.props.schema, this.props.morph); // console.log('MFieldViewer.viewer', viewer);
1197
+ var _i = ___default["default"].intersection((_dep$dn$showIf = dep[dn].showIf) == null ? void 0 : _dep$dn$showIf.split(/[^a-zA-Z0-9_$]/), Object.keys(ndep));
1240
1198
 
1241
- if (!viewer) {
1242
- return MUtil.error("\u5B57\u6BB5\u7684\u89C6\u56FE\u5C1A\u672A\u5B9E\u73B0", this.props.schema);
1243
- }
1199
+ newDepNames = newDepNames.concat(_i);
1200
+ }
1244
1201
 
1245
- var props = _objectSpread$x({
1246
- afterChange: function afterChange() {},
1247
- changeSchema: function changeSchema() {},
1248
- changeDatabase: function changeDatabase() {},
1249
- name: this.props.path
1250
- }, this.props);
1202
+ var prevSize = Object.keys(dep).length;
1251
1203
 
1252
- var ele = /*#__PURE__*/React__default["default"].createElement(viewer, props, null);
1253
- return jsxRuntime.jsx(MContext.Consumer, {
1254
- children: function children(ctx) {
1255
- if (ctx.rootProps.wrapper && _this.props.schema.type !== 'object' && _this.props.schema.type !== 'array') {
1256
- return ctx.rootProps.wrapper(ele, _this.props.schema);
1257
- } else {
1258
- return ele;
1259
- }
1204
+ for (var _iterator8 = _createForOfIteratorHelperLoose$d(newDepNames), _step8; !(_step8 = _iterator8()).done;) {
1205
+ var n = _step8.value;
1206
+ dep[n] = allFieldsIdx[n];
1207
+ delete ndep[n];
1260
1208
  }
1261
- });
1262
- };
1263
1209
 
1264
- return MFieldViewer;
1265
- }(React__default["default"].Component);
1210
+ var afterSize = Object.keys(dep).length;
1266
1211
 
1267
- /**
1268
- * 非空校验,数据不能是null/undefined/""/NaN/[]
1269
- * 要在其他条件之前,以便required=false时短路掉nil的数据,否则后面的校验全都得处理nil
1270
- * @param a
1271
- * @param schema
1272
- * @param value
1273
- * @param path
1274
- * @returns
1275
- */
1212
+ if (prevSize == afterSize) {
1213
+ break; // 如果找不到更多依赖,就可以结束了
1214
+ }
1215
+ }
1276
1216
 
1277
- function validateRequired$1(a, schema, value, path) {
1278
- if (schema.required) {
1279
- if (___default["default"].isNil(value) || value === "" || ___default["default"].isNaN(value) || ___default["default"].isArray(value) && value.length == 0) {
1280
- return {
1281
- message: "您还没有填完这一项",
1282
- path: path
1283
- };
1284
- } // 凡是总有例外
1217
+ return Object.values(dep);
1218
+ },
1285
1219
 
1220
+ /**
1221
+ * 用moment格式化
1222
+ * @param s 原始数据,参见moment
1223
+ * @param srcFormat 原始数据的格式,默认x(时间戳)
1224
+ * @param dstFormat 转换成的数据格式,默认YYYY年MM月DD日
1225
+ * @param fallback 如果原始数据是nil,返回fallback
1226
+ */
1227
+ momentFormat: function momentFormat(s, srcFormat, dstFormat, fallback) {
1228
+ if (srcFormat === void 0) {
1229
+ srcFormat = "x";
1230
+ }
1286
1231
 
1287
- if (schema.type === "set" && schema.openOption) {
1288
- if (value.length === 1 && !value[0]) {
1289
- return {
1290
- message: "您还没有填完这一项",
1291
- path: path
1292
- }; // 开放set,只勾了开放选项,没有填内容,也要算空
1293
- }
1232
+ if (dstFormat === void 0) {
1233
+ dstFormat = "YYYY年MM月DD日";
1294
1234
  }
1295
- } else {
1296
- if (___default["default"].isNil(value)) {
1297
- return "pass";
1235
+
1236
+ if (fallback === void 0) {
1237
+ fallback = "不详";
1298
1238
  }
1299
- }
1300
1239
 
1301
- return undefined;
1302
- }
1303
- /** 和validateRequired相同,但不短路 */
1240
+ if (___default["default"].isNil(s)) {
1241
+ return fallback;
1242
+ }
1304
1243
 
1305
- function validateRequiredNS(a, schema, value, path) {
1306
- var v = validateRequired$1(a, schema, value, path);
1244
+ return moment__default["default"](s, srcFormat).format(dstFormat);
1245
+ },
1307
1246
 
1308
- if (v === "pass") {
1309
- return undefined;
1310
- }
1311
- }
1312
- function validateDateMinMax(a, schema, value, path) {
1313
- if (schema.min) {
1314
- if (!value || value < schema.min) {
1315
- return {
1316
- message: "\u8BF7\u9009\u62E9" + schema.min + "\u4E4B\u540E\u7684\u65F6\u95F4",
1317
- path: path
1247
+ /**
1248
+ * 将标准的json schema转换成m3的schema
1249
+ * @param e json schema
1250
+ * @param base 如果填了一个对象,转换出的属性会放在这个对象上
1251
+ * @param template 如果有子结构,创建子结构的模板
1252
+ */
1253
+ jsonSchema2MFieldSchema: function jsonSchema2MFieldSchema(e, base, template) {
1254
+ if (base === void 0) {
1255
+ base = {
1256
+ name: "",
1257
+ type: "string"
1318
1258
  };
1319
1259
  }
1320
- }
1321
1260
 
1322
- if (schema.max) {
1323
- if (!value || value > schema.max) {
1324
- return {
1325
- message: "\u8BF7\u9009\u62E9" + schema.min + "\u4E4B\u524D\u7684\u65F6\u95F4",
1326
- path: path
1327
- };
1261
+ if (template === void 0) {
1262
+ template = {};
1328
1263
  }
1329
- }
1330
1264
 
1331
- return undefined;
1332
- }
1333
- /**
1334
- * 数组项数不超过[min, max]
1335
- * @param schema
1336
- * @param value 应该是个数组
1337
- */
1265
+ switch (e.type) {
1266
+ case "string":
1267
+ if (e.enum) {
1268
+ var _base$enumFields;
1338
1269
 
1339
- function validateArrayItemMinMax(a, schema, value, path) {
1340
- if (schema.min) {
1341
- if (!value || value.length < schema.min) {
1342
- return {
1343
- message: "\u81F3\u5C11\u9009\u62E9" + schema.min + "\u9879",
1344
- path: path
1345
- };
1270
+ base.type = "enum";
1271
+ base.enumFields = (_base$enumFields = base.enumFields) != null ? _base$enumFields : e.enum.map(function (v) {
1272
+ return {
1273
+ value: (v != null ? v : "").toString()
1274
+ };
1275
+ });
1276
+ } else {
1277
+ base.type = "string";
1278
+ base.max = e.maxLength;
1279
+ }
1280
+
1281
+ break;
1282
+
1283
+ case "number":
1284
+ case "integer":
1285
+ base.type = "int";
1286
+ break;
1287
+
1288
+ case "object":
1289
+ base.type = "object";
1290
+ base.objectFields = [];
1291
+ base.uispec = {
1292
+ type: "flowForm",
1293
+ layout: MUtil.phoneLike() ? "vertical" : "horizontal",
1294
+ comma: ":"
1295
+ };
1296
+
1297
+ for (var key in e.properties) {
1298
+ var jsmField = e.properties[key];
1299
+
1300
+ var m3Field = ___default["default"].assign({}, template, {
1301
+ name: key,
1302
+ label: key,
1303
+ type: "object"
1304
+ });
1305
+
1306
+ if (!___default["default"].isBoolean(jsmField)) {
1307
+ var _jsmField$title;
1308
+
1309
+ m3Field.label = (_jsmField$title = jsmField.title) != null ? _jsmField$title : key;
1310
+ this.jsonSchema2MFieldSchema(jsmField, m3Field, template);
1311
+ base.objectFields.push(m3Field);
1312
+ } else {
1313
+ m3Field.type = "不支持的json schema:object.properties的value是boolean";
1314
+ base.objectFields.push();
1315
+ }
1316
+ }
1317
+
1318
+ break;
1319
+
1320
+ case "array":
1321
+ base.type = "array";
1322
+ base.arrayMember = {
1323
+ label: "",
1324
+ type: "array"
1325
+ };
1326
+
1327
+ if (___default["default"].isArray(e.items)) {
1328
+ base.arrayMember.type = "不支持的json schema:array.items是数组";
1329
+ } else if (___default["default"].isBoolean(e.items)) {
1330
+ base.arrayMember.type = "不支持的json schema:array.items是boolean";
1331
+ } else if (e.items) {
1332
+ this.jsonSchema2MFieldSchema(e.items, base, template);
1333
+ } else {
1334
+ base.arrayMember.type = "不支持的json schema:array.items是undefined";
1335
+ }
1336
+
1337
+ break;
1338
+
1339
+ case "null":
1340
+ case "any":
1341
+ case "boolean":
1342
+ default:
1343
+ base.type = "不支持的json schema:array.items是" + e.type;
1344
+ break;
1346
1345
  }
1347
- }
1348
1346
 
1349
- if (schema.max) {
1350
- if (!value || value.length > schema.max) {
1351
- return {
1352
- message: "\u6700\u591A\u9009\u62E9" + schema.max + "\u9879",
1353
- path: path
1354
- };
1347
+ return base;
1348
+ },
1349
+
1350
+ /**
1351
+ * 修改一个对象里的key
1352
+ * @param object 要修改的对象,
1353
+ * @param renameTo
1354
+ * @param removeNotExistKey 是否在结果里面去除renameTo里不存在的key
1355
+ * @returns 返回一个改过key名字的新对象
1356
+ */
1357
+ renameKey: function renameKey(object, renameTo, removeNotExistKey) {
1358
+ if (removeNotExistKey === void 0) {
1359
+ removeNotExistKey = false;
1360
+ }
1361
+
1362
+ var result = {};
1363
+
1364
+ for (var oldKey in object) {
1365
+ var newKey = renameTo[oldKey];
1366
+
1367
+ if (!newKey) {
1368
+ if (removeNotExistKey) {
1369
+ continue;
1370
+ } else {
1371
+ newKey = oldKey;
1372
+ }
1373
+ }
1374
+
1375
+ result[newKey] = object[oldKey];
1376
+ }
1377
+
1378
+ return result;
1379
+ },
1380
+
1381
+ /**
1382
+ * 提交时将时间字段转换为可读格式
1383
+ * @param schema 表单 schema(type 为 object 的根 schema)
1384
+ * @param database 表单数据
1385
+ * @returns 深拷贝后转换过的数据
1386
+ */
1387
+ formatForExport: function formatForExport(schema, database) {
1388
+ if (___default["default"].isNil(database)) {
1389
+ return database;
1390
+ }
1391
+
1392
+ var result = ___default["default"].cloneDeep(database);
1393
+
1394
+ var fields = schema.objectFields;
1395
+
1396
+ if (!fields) {
1397
+ return result;
1398
+ }
1399
+
1400
+ var _loop = function _loop() {
1401
+ var field = _step9.value;
1402
+ var value = result[field.name];
1403
+
1404
+ if (___default["default"].isNil(value)) {
1405
+ return "continue";
1406
+ }
1407
+
1408
+ var type = field.type; // 时间选择器
1409
+
1410
+ if (type === "year" || type === "yearMonth" || type === "yearMonthDay" || type === "datetime" || type === "date") {
1411
+ var antConf = MDateTimeType.antConf(field);
1412
+
1413
+ if (antConf) {
1414
+ var m = moment__default["default"](value, antConf.dataFormat);
1415
+
1416
+ if (m.isValid()) {
1417
+ result[field.name] = m.format(antConf.readableFormat);
1418
+ }
1419
+ }
1420
+ } // 时间范围选择器
1421
+ else if (type === "dateRange") {
1422
+ if (___default["default"].isArray(value)) {
1423
+ var _field$dateRange, _field$dataFormat;
1424
+
1425
+ var start = value[0],
1426
+ end = value[1],
1427
+ tillNow = value[2];
1428
+ var fmt = getReadableFormat(field.dateRangePrecision, (_field$dateRange = field.dateRange) == null ? void 0 : _field$dateRange.showTime);
1429
+ var dataFormat = (_field$dataFormat = field.dataFormat) != null ? _field$dataFormat : "x";
1430
+ var startStr = "";
1431
+ var endStr = "";
1432
+
1433
+ if (!___default["default"].isNil(start)) {
1434
+ var _m = moment__default["default"](start, dataFormat);
1435
+
1436
+ startStr = _m.isValid() ? _m.format(fmt) : "";
1437
+ }
1438
+
1439
+ if (tillNow) {
1440
+ endStr = "至今";
1441
+ } else if (!___default["default"].isNil(end)) {
1442
+ var _m2 = moment__default["default"](end, dataFormat);
1443
+
1444
+ endStr = _m2.isValid() ? _m2.format(fmt) : "";
1445
+ }
1446
+
1447
+ result[field.name] = startStr + " - " + endStr;
1448
+ }
1449
+ } // 嵌套 object
1450
+ else if (type === "object" && field.objectFields) {
1451
+ result[field.name] = MUtil.formatForExport(field, value);
1452
+ } // 嵌套 array
1453
+ else if (type === "array" && field.arrayMember && ___default["default"].isArray(value)) {
1454
+ if (field.arrayMember.objectFields) {
1455
+ result[field.name] = value.map(function (item) {
1456
+ return MUtil.formatForExport(field.arrayMember, item);
1457
+ });
1458
+ }
1459
+ }
1460
+ };
1461
+
1462
+ for (var _iterator9 = _createForOfIteratorHelperLoose$d(fields), _step9; !(_step9 = _iterator9()).done;) {
1463
+ var _ret = _loop();
1464
+
1465
+ if (_ret === "continue") continue;
1466
+ }
1467
+
1468
+ return result;
1469
+ },
1470
+
1471
+ /**
1472
+ * 回填时将可读格式的时间字段反解析为内部格式
1473
+ * @param schema 表单 schema(type 为 object 的根 schema)
1474
+ * @param database 可读格式的数据
1475
+ * @returns 深拷贝后反解析过的数据
1476
+ */
1477
+ parseFromExport: function parseFromExport(schema, database) {
1478
+ if (___default["default"].isNil(database)) {
1479
+ return database;
1480
+ }
1481
+
1482
+ var result = ___default["default"].cloneDeep(database);
1483
+
1484
+ var fields = schema.objectFields;
1485
+
1486
+ if (!fields) {
1487
+ return result;
1488
+ }
1489
+
1490
+ var _loop2 = function _loop2() {
1491
+ var field = _step10.value;
1492
+ var value = result[field.name];
1493
+
1494
+ if (___default["default"].isNil(value)) {
1495
+ return "continue";
1496
+ }
1497
+
1498
+ var type = field.type; // 时间选择器
1499
+
1500
+ if (type === "year" || type === "yearMonth" || type === "yearMonthDay" || type === "datetime" || type === "date") {
1501
+ var antConf = MDateTimeType.antConf(field);
1502
+
1503
+ if (antConf && ___default["default"].isString(value)) {
1504
+ var m = moment__default["default"](value, antConf.readableFormat);
1505
+
1506
+ if (m.isValid()) {
1507
+ result[field.name] = m.format(antConf.dataFormat);
1508
+ }
1509
+ }
1510
+ } // 时间范围选择器
1511
+ else if (type === "dateRange") {
1512
+ if (___default["default"].isString(value)) {
1513
+ var _field$dateRange2, _field$dataFormat2, _parts$, _parts$2;
1514
+
1515
+ var fmt = getReadableFormat(field.dateRangePrecision, (_field$dateRange2 = field.dateRange) == null ? void 0 : _field$dateRange2.showTime);
1516
+ var dataFormat = (_field$dataFormat2 = field.dataFormat) != null ? _field$dataFormat2 : "x";
1517
+ var parts = value.split(" - ");
1518
+ var startStr = (_parts$ = parts[0]) == null ? void 0 : _parts$.trim();
1519
+ var endStr = (_parts$2 = parts[1]) == null ? void 0 : _parts$2.trim();
1520
+ var start = null;
1521
+ var end = null;
1522
+ var tillNow = false;
1523
+
1524
+ if (startStr) {
1525
+ var _m3 = moment__default["default"](startStr, fmt);
1526
+
1527
+ if (_m3.isValid()) {
1528
+ start = _m3.format(dataFormat);
1529
+ }
1530
+ }
1531
+
1532
+ if (endStr === "至今") {
1533
+ tillNow = true;
1534
+ } else if (endStr) {
1535
+ var _m4 = moment__default["default"](endStr, fmt);
1536
+
1537
+ if (_m4.isValid()) {
1538
+ end = _m4.format(dataFormat);
1539
+ }
1540
+ }
1541
+
1542
+ result[field.name] = [start, end, tillNow];
1543
+ }
1544
+ } // 嵌套 object
1545
+ else if (type === "object" && field.objectFields) {
1546
+ result[field.name] = MUtil.parseFromExport(field, value);
1547
+ } // 嵌套 array
1548
+ else if (type === "array" && field.arrayMember && ___default["default"].isArray(value)) {
1549
+ if (field.arrayMember.objectFields) {
1550
+ result[field.name] = value.map(function (item) {
1551
+ return MUtil.parseFromExport(field.arrayMember, item);
1552
+ });
1553
+ }
1554
+ }
1555
+ };
1556
+
1557
+ for (var _iterator10 = _createForOfIteratorHelperLoose$d(fields), _step10; !(_step10 = _iterator10()).done;) {
1558
+ var _ret2 = _loop2();
1559
+
1560
+ if (_ret2 === "continue") continue;
1561
+ }
1562
+
1563
+ return result;
1564
+ },
1565
+
1566
+ /** 啥也不干的空回调 */
1567
+ doNothing: function doNothing() {},
1568
+
1569
+ /**
1570
+ * 去掉arr中的undefined和null,拼出来一个json path
1571
+ */
1572
+ jsonPath: function jsonPath() {
1573
+ for (var _len2 = arguments.length, arr = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
1574
+ arr[_key2] = arguments[_key2];
1575
+ }
1576
+
1577
+ return ___default["default"].compact(arr).join(".");
1578
+ },
1579
+
1580
+ /**
1581
+ * 获取一个json path的父path。
1582
+ * @param path 如果path是空的返回也是空的
1583
+ */
1584
+ parentPath: function parentPath(path) {
1585
+ var split = path.replace(/]/g, "").split(/[.\\[]/);
1586
+ split.splice(-1, 1);
1587
+ return split.join(".");
1588
+ },
1589
+
1590
+ /**
1591
+ * 校验一个schema
1592
+ * @param s 要校验的schema
1593
+ * @returns 空数组表示校验通过,否则返回校验错误信息
1594
+ */
1595
+ validateSchema: function validateSchema(s, parentPath) {
1596
+ var result = [];
1597
+
1598
+ var error = function error(msg) {
1599
+ return result.push({
1600
+ message: msg,
1601
+ path: MUtil.jsonPath(parentPath, s.name)
1602
+ });
1603
+ };
1604
+
1605
+ var checkDup = function checkDup(a, msgIfFail) {
1606
+ if (___default["default"].uniq(a).length !== a.length) {
1607
+ error(msgIfFail);
1608
+ }
1609
+ };
1610
+
1611
+ var checkVL = function checkVL(fs) {
1612
+ checkDup(fs.map(function (f) {
1613
+ return f.value;
1614
+ }), s.name + "值有重复");
1615
+ checkDup(fs.map(function (f) {
1616
+ return f.label;
1617
+ }).filter(function (l) {
1618
+ return l;
1619
+ }), s.name + "文案有重复");
1620
+ };
1621
+
1622
+ var stringOnlyEnum = function stringOnlyEnum(candidate) {
1623
+ var ns = MUtil.standardFields(candidate).find(function (f) {
1624
+ return !___default["default"].isString(f.value);
1625
+ });
1626
+
1627
+ if (ns) {
1628
+ error("暂不支持的选项数据类型:" + JSON.stringify(ns) + ": " + typeof ns);
1629
+ }
1630
+ };
1631
+
1632
+ if (s.type === "decoration") {
1633
+ return [];
1634
+ } else if (s.type === "enum") {
1635
+ checkVL(MUtil.standardFields(s.enumFields));
1636
+ } else if (s.type === "set") {
1637
+ checkVL(MUtil.standardFields(s.setFields));
1638
+ } else if (s.type === "matrix") {
1639
+ stringOnlyEnum(s.matrix.x);
1640
+ stringOnlyEnum(s.matrix.y);
1641
+ } else if (s.type === "object") {
1642
+ if (!s.objectFields) {
1643
+ error("object类型未定义成员");
1644
+ } else {
1645
+ var _s$uispec;
1646
+
1647
+ checkDup(s.objectFields.filter(function (f) {
1648
+ return f.type !== "decoration";
1649
+ }).map(function (f) {
1650
+ return f.name;
1651
+ }), "字段名有重复");
1652
+
1653
+ for (var _iterator11 = _createForOfIteratorHelperLoose$d(s.objectFields), _step11; !(_step11 = _iterator11()).done;) {
1654
+ var f = _step11.value;
1655
+ result = ___default["default"].concat(result, MUtil.validateSchema(f, MUtil.jsonPath(parentPath, s.name)));
1656
+ }
1657
+
1658
+ if (((_s$uispec = s.uispec) == null ? void 0 : _s$uispec.type) === "segmentForm") {
1659
+ if (!s.uispec.segments) {
1660
+ error("分段未定义");
1661
+ } else {
1662
+ checkDup(s.uispec.segments.map(function (f) {
1663
+ return f.label;
1664
+ }), "分段文案有重复");
1665
+
1666
+ var fieldsInSegments = ___default["default"].flatten(s.uispec.segments.map(function (f) {
1667
+ return f.fields;
1668
+ }));
1669
+
1670
+ checkDup(fieldsInSegments, "分段字段有重复");
1671
+ var fields = s.objectFields.map(function (f) {
1672
+ return f.name;
1673
+ });
1674
+ checkDup(fields, "字段名有重复");
1675
+
1676
+ var notInSegment = ___default["default"].difference(fields, fieldsInSegments);
1677
+
1678
+ if (notInSegment.length > 0) {
1679
+ error("字段" + notInSegment.join(",") + "未体现在分段中");
1680
+ }
1681
+
1682
+ var fieldNotExist = ___default["default"].difference(fieldsInSegments, fields);
1683
+
1684
+ if (fieldNotExist.length > 0) {
1685
+ error("分段字段名无效:" + notInSegment.join(","));
1686
+ }
1687
+ }
1688
+ }
1689
+ }
1690
+ }
1691
+
1692
+ return result;
1693
+ },
1694
+
1695
+ /**
1696
+ * 参考https://stackoverflow.com/questions/3362471/how-can-i-call-a-javascript-constructor-using-call-or-apply
1697
+ * 示例: var d = applyToConstructor(Date, [2008, 10, 8, 00, 16, 34, 254]);
1698
+ * @param constructor
1699
+ * @param argArray
1700
+ */
1701
+ applyToConstructor: function applyToConstructor(constructor, argArray) {
1702
+ var args = [null].concat(argArray);
1703
+ var factoryFunction = constructor.bind.apply(constructor, args);
1704
+ return new factoryFunction();
1705
+ },
1706
+
1707
+ /**
1708
+ * 执行表达式或者回调函数
1709
+ * @param exprOrFunction 表达式或者回调函数
1710
+ * @param paramName 参数名字
1711
+ * @param paramValue 参数值
1712
+ * @param fallback 如果exprOrFunction无效,返回fallback
1713
+ * @param _this this指针
1714
+ */
1715
+ evalExprOrFunction: function evalExprOrFunction(exprOrFunction, paramName, paramValue, fallback, _this) {
1716
+ if (fallback === void 0) {
1717
+ fallback = undefined;
1718
+ }
1719
+
1720
+ if (_this === void 0) {
1721
+ _this = undefined;
1722
+ }
1723
+
1724
+ if (___default["default"].isFunction(exprOrFunction)) {
1725
+ return exprOrFunction.apply(_this, paramValue);
1726
+ } else if (___default["default"].isString(exprOrFunction)) {
1727
+ //return new Function("_", "value", "parent", "return (" + labelExpr + ");")(_, value, parent);
1728
+ var func = MUtil.applyToConstructor(Function, [].concat(paramName, ["return (" + exprOrFunction + ")"]));
1729
+ return func.apply(_this, paramValue);
1730
+ } else {
1731
+ return fallback;
1732
+ }
1733
+ },
1734
+
1735
+ /**
1736
+ * 读取url参数,转换成map
1737
+ * @param hashPrefix nil表示不读取hash里的参数,字符串表示读取hash里的参数,并加上这个前缀返回。默认是返回,但前缀是空字符串
1738
+ */
1739
+ getQuery: function getQuery(hashPrefix) {
1740
+
1741
+ var arrs = [].concat(window.location.search.split(/[?&]/), window.location.hash.split(/[#?&]/));
1742
+ var result = {};
1743
+ arrs.forEach(function (item) {
1744
+ var kv = item.split(/=/);
1745
+
1746
+ if (kv.length <= 2 && kv[0]) {
1747
+ result[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);
1748
+ }
1749
+ });
1750
+ return result;
1751
+ },
1752
+
1753
+ /**
1754
+ * 动态创建一个CSS样式
1755
+ * @param css css内容,会被写进style标签里
1756
+ * @param id <style>的id,可以没有。如果已经存在,会被覆盖掉。
1757
+ */
1758
+ setCss: function setCss(css, id) {
1759
+ var _document$getElementB;
1760
+
1761
+ var s = (_document$getElementB = document.getElementById(id)) != null ? _document$getElementB : document.createElement("style");
1762
+ s.id = id;
1763
+ s.type = "text/css";
1764
+ s.innerHTML = css;
1765
+ document.getElementsByTagName("head")[0].appendChild(s);
1766
+ },
1767
+
1768
+ /**
1769
+ * escape数值
1770
+ * @param str - 字符串
1771
+ * @returns 会带上引号,类似"abc",str=nil时会返回""
1772
+ */
1773
+ escapeCsv: function escapeCsv(str) {
1774
+ if (!___default["default"].isString(str)) {
1775
+ str = ___default["default"].toString(str);
1355
1776
  }
1356
- }
1357
1777
 
1358
- return undefined;
1359
- }
1360
- /**
1361
- * 字符串长度不超过[min, max]
1362
- * @param schema
1363
- * @param value 应该是个字符串
1364
- */
1778
+ return '"' + str.replace(/["]/g, '""') + '"';
1779
+ },
1365
1780
 
1366
- function validateStringMinMax$1(a, schema, value, path) {
1367
- if (schema.min) {
1368
- if (!value || value.length < schema.min) {
1369
- return {
1370
- message: "\u81F3\u5C11" + schema.min + "\u4E2A\u5B57",
1371
- path: path
1372
- };
1781
+ /**
1782
+ * 判断两个值是否相同
1783
+ * @param v1 一个值
1784
+ * @param v2 另一个值
1785
+ * @param tolerate true用==判断,false用===判断
1786
+ */
1787
+ isEquals: function isEquals(v1, v2, tolerate) {
1788
+ if (tolerate) {
1789
+ return v1 == v2;
1790
+ } else {
1791
+ return v1 === v2;
1373
1792
  }
1374
1793
  }
1794
+ };
1795
+ var CompactArray = {
1796
+ indexOf: function indexOf(ca, d) {
1797
+ if (___default["default"].isNil(d) || ___default["default"].isNil(ca)) {
1798
+ return -1;
1799
+ }
1375
1800
 
1376
- if (schema.max) {
1377
- if (value && value.length > schema.max) {
1378
- return {
1379
- message: "\u6700\u591A" + schema.max + "\u4E2A\u5B57",
1380
- path: path
1381
- };
1801
+ if (___default["default"].isArray(ca)) {
1802
+ return ca.indexOf(d);
1803
+ } else {
1804
+ return ca === d ? 0 : -1;
1382
1805
  }
1383
1806
  }
1807
+ };
1384
1808
 
1385
- return undefined;
1386
- }
1809
+ var MContext = /*#__PURE__*/React__default["default"].createContext(undefined);
1810
+
1811
+ function ownKeys$x(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1812
+
1813
+ function _objectSpread$x(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$x(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$x(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1387
1814
  /**
1388
- * 数字不超过[min, max]
1389
- * @param schema
1390
- * @param value 应该是个数字
1815
+ * 一个字段的视图
1391
1816
  */
1392
1817
 
1393
- function validateNumberMinMax(a, schema, value, path) {
1394
- var temp = Number(value);
1818
+ var MFieldViewer = /*#__PURE__*/function (_React$Component) {
1819
+ _inheritsLoose__default["default"](MFieldViewer, _React$Component);
1395
1820
 
1396
- if (!___default["default"].isNil(schema.max)) {
1397
- if (!___default["default"].isFinite(temp) || temp > schema.max) {
1398
- return {
1399
- message: "\u6700\u591A" + schema.max,
1400
- path: path
1401
- };
1402
- }
1821
+ function MFieldViewer() {
1822
+ return _React$Component.apply(this, arguments) || this;
1403
1823
  }
1404
1824
 
1405
- if (!___default["default"].isNil(schema.min)) {
1406
- if (!___default["default"].isFinite(temp) || temp < schema.min) {
1407
- return {
1408
- message: "\u6700\u5C11" + schema.min,
1409
- path: path
1410
- };
1411
- }
1412
- }
1825
+ var _proto = MFieldViewer.prototype;
1413
1826
 
1414
- return undefined;
1415
- }
1416
- function generateRegexValidate$1(regex, mismatchMsg) {
1417
- return function (a, schema, value, path) {
1418
- var asstr = ___default["default"].toString(value);
1827
+ _proto.render = function render() {
1828
+ var _this = this;
1419
1829
 
1420
- if (!regex.test(asstr)) {
1421
- return {
1422
- message: mismatchMsg,
1423
- path: path
1424
- };
1425
- }
1830
+ var viewer = assembly.getViewerOf(this.props.schema, this.props.morph); // console.log('MFieldViewer.viewer', viewer);
1426
1831
 
1427
- return undefined;
1428
- };
1429
- }
1430
- /**
1431
- * 数据用Object.prototype.toString.call返回的类型是预期的
1432
- * 可以用Object.prototype.toString.call(<预期的类型>)来查看你想要的数据类型的expectType
1433
- * @param expectType 预期类型,例如:"[object Object]" "[object Null]" "[object Number]" "[object Date]" "[object Array]"
1434
- * @param mismatchMsg 如果不匹配,提示的错误信息
1435
- * @returns
1436
- */
1832
+ if (!viewer) {
1833
+ return MUtil.error("\u5B57\u6BB5\u7684\u89C6\u56FE\u5C1A\u672A\u5B9E\u73B0", this.props.schema);
1834
+ }
1437
1835
 
1438
- function generateJsPrototypeValidate(expectType, mismatchMsg) {
1439
- if (mismatchMsg === void 0) {
1440
- mismatchMsg = "数据有误,请重填此项";
1441
- }
1836
+ var props = _objectSpread$x({
1837
+ afterChange: function afterChange() {},
1838
+ changeSchema: function changeSchema() {},
1839
+ changeDatabase: function changeDatabase() {},
1840
+ name: this.props.path
1841
+ }, this.props);
1442
1842
 
1443
- return function (a, schema, value, path) {
1444
- if (Object.prototype.toString.call(value) == expectType) {
1445
- return undefined;
1446
- } else {
1447
- return {
1448
- message: mismatchMsg,
1449
- path: path
1450
- };
1451
- }
1843
+ var ele = /*#__PURE__*/React__default["default"].createElement(viewer, props, null);
1844
+ return jsxRuntime.jsx(MContext.Consumer, {
1845
+ children: function children(ctx) {
1846
+ if (ctx.rootProps.wrapper && _this.props.schema.type !== 'object' && _this.props.schema.type !== 'array') {
1847
+ return ctx.rootProps.wrapper(ele, _this.props.schema);
1848
+ } else {
1849
+ return ele;
1850
+ }
1851
+ }
1852
+ });
1452
1853
  };
1453
- }
1454
- function generateSchemaValidate(valueSchema, mismatchMsg) {
1455
- return function (a, schema, value, path) {
1456
- var r = assembly.validate(valueSchema, value, "");
1457
1854
 
1458
- if (!r) {
1459
- return r;
1460
- } else {
1461
- return {
1462
- message: mismatchMsg != null ? mismatchMsg : r.message,
1463
- path: path
1464
- };
1465
- }
1466
- };
1467
- }
1468
- var Validator = {
1469
- validateRequired: validateRequired$1,
1470
- validateRequiredNS: validateRequiredNS,
1471
- validateDateMinMax: validateDateMinMax,
1472
- validateStringMinMax: validateStringMinMax$1,
1473
- validateNumberMinMax: validateNumberMinMax,
1474
- generateRegexValidate: generateRegexValidate$1
1475
- };
1855
+ return MFieldViewer;
1856
+ }(React__default["default"].Component);
1476
1857
 
1477
1858
  function _createForOfIteratorHelperLoose$c(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$c(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
1478
1859
 
@@ -1559,34 +1940,6 @@ var MEnumType = {
1559
1940
  }
1560
1941
  };
1561
1942
 
1562
- var EmtpyType = {
1563
- validators: [],
1564
- createDefaultValue: function createDefaultValue(assembly, s) {
1565
- if (s.defaultValue) {
1566
- return ___default["default"].clone(s.defaultValue);
1567
- } else {
1568
- return undefined;
1569
- }
1570
- },
1571
- standardValue: function standardValue(assembly, s, v, strict) {
1572
- return v;
1573
- },
1574
- toReadable: function toReadable(assembly, s, vs) {
1575
- if (___default["default"].isNil(vs)) {
1576
- return assembly.theme.READABLE_BLANK;
1577
- }
1578
-
1579
- return vs;
1580
- }
1581
- };
1582
- function createDefaultValue(assembly, s) {
1583
- if (s.defaultValue) {
1584
- return ___default["default"].clone(s.defaultValue);
1585
- } else {
1586
- return undefined;
1587
- }
1588
- }
1589
-
1590
1943
  var gb2260 = [
1591
1944
  {
1592
1945
  value: "110000",
@@ -15091,102 +15444,36 @@ var MGB2260Type = ___default["default"].assign({}, EmtpyType, {
15091
15444
  }
15092
15445
 
15093
15446
  for (var _iterator2 = _createForOfIteratorHelperLoose$b(prv.children), _step2; !(_step2 = _iterator2()).done;) {
15094
- var city = _step2.value;
15095
- // @ts-ignore city.value全是数字,ts并不知道
15096
- var cdiff = code - city.value; // @ts-ignore
15097
-
15098
- if (cdiff === 0) {
15099
- return {
15100
- label: [prv.label, city.label],
15101
- code: [prv.value, city.value]
15102
- };
15103
- } else if (cdiff > 0 && cdiff < 100) {
15104
- // @ts-ignore
15105
- for (var _iterator3 = _createForOfIteratorHelperLoose$b((_city$children = city.children) != null ? _city$children : []), _step3; !(_step3 = _iterator3()).done;) {
15106
- var _city$children;
15107
-
15108
- var dst = _step3.value;
15109
-
15110
- // eslint-disable-next-line eqeqeq
15111
- if (dst.value == code) {
15112
- return {
15113
- label: [prv.label, city.label, dst.label],
15114
- code: [prv.value, city.value, dst.value]
15115
- };
15116
- }
15117
- }
15118
- }
15119
- }
15120
- }
15121
- }
15122
-
15123
- return undefined;
15124
- }
15125
- });
15126
-
15127
- var MDateTimeType = ___default["default"].assign({}, EmtpyType, {
15128
- validators: [validateRequired$1, validateDateMinMax],
15129
- antConf: function antConf(schema) {
15130
- var _dataFormat, _dataFormat2, _dataFormat3, _dataFormat4;
15131
-
15132
- var dataFormat = schema.dataFormat;
15133
- var readableFormat;
15134
- var mode;
15135
- var showTime = false;
15136
-
15137
- switch (schema.type) {
15138
- case "year":
15139
- mode = "year";
15140
- dataFormat = (_dataFormat = dataFormat) != null ? _dataFormat : 'YYYY';
15141
- readableFormat = 'YYYY';
15142
- break;
15143
-
15144
- case "yearMonth":
15145
- mode = "month";
15146
- dataFormat = (_dataFormat2 = dataFormat) != null ? _dataFormat2 : 'YYYYMM';
15147
- readableFormat = 'YYYY-MM';
15148
- break;
15149
-
15150
- case "yearMonthDay":
15151
- mode = "date";
15152
- dataFormat = (_dataFormat3 = dataFormat) != null ? _dataFormat3 : 'YYYYMMDD';
15153
- readableFormat = 'YYYY-MM-DD';
15154
- break;
15155
-
15156
- case "datetime":
15157
- mode = undefined;
15158
- dataFormat = (_dataFormat4 = dataFormat) != null ? _dataFormat4 : 'x';
15159
- readableFormat = 'YYYY-MM-DD HH:mm';
15160
- showTime = true;
15161
- break;
15162
- // case "yearAndQuarter":
15163
- // case "yearAndWeek":
15164
- // return MUtil.error(`移动端不支持${this.props.schema.type}`, this.props.schema);
15165
-
15166
- default:
15167
- return undefined;
15168
- }
15447
+ var city = _step2.value;
15448
+ // @ts-ignore city.value全是数字,ts并不知道
15449
+ var cdiff = code - city.value; // @ts-ignore
15169
15450
 
15170
- return {
15171
- dataFormat: dataFormat,
15172
- readableFormat: readableFormat,
15173
- mode: mode,
15174
- showTime: showTime
15175
- };
15176
- },
15177
- toReadable: function toReadable(assembly, schema, v) {
15178
- if (___default["default"].isNil(v)) {
15179
- return assembly.theme.READABLE_BLANK;
15180
- }
15451
+ if (cdiff === 0) {
15452
+ return {
15453
+ label: [prv.label, city.label],
15454
+ code: [prv.value, city.value]
15455
+ };
15456
+ } else if (cdiff > 0 && cdiff < 100) {
15457
+ // @ts-ignore
15458
+ for (var _iterator3 = _createForOfIteratorHelperLoose$b((_city$children = city.children) != null ? _city$children : []), _step3; !(_step3 = _iterator3()).done;) {
15459
+ var _city$children;
15181
15460
 
15182
- var c = MDateTimeType.antConf(schema);
15461
+ var dst = _step3.value;
15183
15462
 
15184
- if (!c) {
15185
- return assembly.theme.READABLE_INVALID;
15463
+ // eslint-disable-next-line eqeqeq
15464
+ if (dst.value == code) {
15465
+ return {
15466
+ label: [prv.label, city.label, dst.label],
15467
+ code: [prv.value, city.value, dst.value]
15468
+ };
15469
+ }
15470
+ }
15471
+ }
15472
+ }
15473
+ }
15186
15474
  }
15187
15475
 
15188
- var asMoment = moment__default["default"](v, c.dataFormat);
15189
- return asMoment.format(c.readableFormat);
15476
+ return undefined;
15190
15477
  }
15191
15478
  });
15192
15479
 
@@ -15841,59 +16128,6 @@ var MObjectType = {
15841
16128
  }
15842
16129
  };
15843
16130
 
15844
- function timeExpr(assembly, v, tillNow, readableFormat) {
15845
- if (tillNow) {
15846
- return "至今";
15847
- }
15848
-
15849
- if (!v) {
15850
- return assembly.theme.READABLE_UNKNOWN;
15851
- }
15852
-
15853
- return moment__default["default"](v, "x").format(readableFormat);
15854
- }
15855
-
15856
- function timeRangeExpr(assembly, from, to, tillNow, readableFormat) {
15857
- if (readableFormat === void 0) {
15858
- readableFormat = "YYYY年MM月DD日";
15859
- }
15860
-
15861
- return timeExpr(assembly, from, false, readableFormat) + " ~ " + timeExpr(assembly, to, tillNow, readableFormat);
15862
- }
15863
- var MDateRangeType = ___default["default"].assign({}, EmtpyType, {
15864
- validators: [validateRequired$1],
15865
- toReadable: function toReadable(assembly, s, vs) {
15866
- var _s$dateRange;
15867
-
15868
- if (___default["default"].isNil(vs)) {
15869
- return assembly.theme.READABLE_BLANK;
15870
- }
15871
-
15872
- if (!___default["default"].isArray(vs)) {
15873
- return assembly.theme.READABLE_INVALID;
15874
- }
15875
-
15876
- return timeRangeExpr(assembly, vs[0], vs[1], vs[2], (_s$dateRange = s.dateRange) != null && _s$dateRange.showTime ? "YYYY年MM月DD日 HH:mm:ss" : "YYYY年MM月DD日");
15877
- },
15878
-
15879
- /**
15880
- * 同toReadable,但数据无效时返回nil
15881
- * @param assembly
15882
- * @param s
15883
- * @param vs
15884
- * @returns
15885
- */
15886
- toReadableN: function toReadableN(assembly, s, vs) {
15887
- if (!___default["default"].isNil(vs) && ___default["default"].isArray(vs)) {
15888
- var _s$dateRange2;
15889
-
15890
- return timeRangeExpr(assembly, vs[0], vs[1], vs[2], (_s$dateRange2 = s.dateRange) != null && _s$dateRange2.showTime ? "YYYY年MM月DD日 HH:mm:ss" : "YYYY年MM月DD日");
15891
- }
15892
-
15893
- return undefined;
15894
- }
15895
- });
15896
-
15897
16131
  function _createForOfIteratorHelperLoose$6(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$6(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
15898
16132
 
15899
16133
  function _unsupportedIterableToArray$6(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$6(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$6(o, minLen); }
@@ -16413,6 +16647,23 @@ var ArrayViewer = /*#__PURE__*/function (_BaseViewer) {
16413
16647
  function ownKeys$v(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
16414
16648
 
16415
16649
  function _objectSpread$v(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$v(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$v(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
16650
+
16651
+ function toPrecision(mode) {
16652
+ switch (mode) {
16653
+ case "year":
16654
+ return "year";
16655
+
16656
+ case "month":
16657
+ return "month";
16658
+
16659
+ case "date":
16660
+ return "day";
16661
+
16662
+ default:
16663
+ return "minute";
16664
+ // datetime 场景
16665
+ }
16666
+ }
16416
16667
  /**
16417
16668
  * 日期选择框
16418
16669
  * 配置示例:
@@ -16424,17 +16675,22 @@ function _objectSpread$v(target) { for (var i = 1; i < arguments.length; i++) {
16424
16675
  * 类型是dateTime时,dataFormat默认是x,例如1608897466955
16425
16676
  */
16426
16677
 
16678
+
16427
16679
  var ADatetimePicker = /*#__PURE__*/function (_BaseViewer) {
16428
16680
  _inheritsLoose__default["default"](ADatetimePicker, _BaseViewer);
16429
16681
 
16430
- function ADatetimePicker() {
16431
- return _BaseViewer.apply(this, arguments) || this;
16682
+ function ADatetimePicker(props) {
16683
+ var _this;
16684
+
16685
+ _this = _BaseViewer.call(this, props) || this;
16686
+ _this.state.pickerVisible = false;
16687
+ return _this;
16432
16688
  }
16433
16689
 
16434
16690
  var _proto = ADatetimePicker.prototype;
16435
16691
 
16436
16692
  _proto.element = function element() {
16437
- var _this = this,
16693
+ var _this2 = this,
16438
16694
  _this$props$schema$pr;
16439
16695
 
16440
16696
  var antConf = MDateTimeType.antConf(this.props.schema);
@@ -16451,9 +16707,9 @@ var ADatetimePicker = /*#__PURE__*/function (_BaseViewer) {
16451
16707
  if (vv) {
16452
16708
  var vvAsM = ___default["default"].isDate(vv) ? moment__default["default"](vv) : vv;
16453
16709
 
16454
- _BaseViewer.prototype.changeValue.call(_this, vvAsM.format(antConf.dataFormat));
16710
+ _BaseViewer.prototype.changeValue.call(_this2, vvAsM.format(antConf.dataFormat));
16455
16711
  } else {
16456
- _BaseViewer.prototype.changeValue.call(_this, undefined);
16712
+ _BaseViewer.prototype.changeValue.call(_this2, undefined);
16457
16713
  }
16458
16714
  };
16459
16715
 
@@ -16461,36 +16717,60 @@ var ADatetimePicker = /*#__PURE__*/function (_BaseViewer) {
16461
16717
 
16462
16718
  if (MUtil.phoneLike()) {
16463
16719
  // 手机
16464
- return jsxRuntime.jsx(antdMobile.DatePicker, _objectSpread$v(_objectSpread$v({
16465
- disabled: this.props.disable,
16466
- value: dataAsDate,
16467
- minDate: this.props.schema.min ? moment__default["default"](this.props.schema.min, antConf.dataFormat).toDate() : undefined,
16468
- maxDate: this.props.schema.max ? moment__default["default"](this.props.schema.max, antConf.dataFormat).toDate() : undefined,
16469
- mode: antConf.mode,
16470
- onChange: onChange
16471
- }, p), {}, {
16472
- children: jsxRuntime.jsx("div", {
16720
+ return jsxRuntime.jsxs(jsxRuntime.Fragment, {
16721
+ children: [jsxRuntime.jsx("div", {
16473
16722
  className: "backfill",
16723
+ onClick: function onClick() {
16724
+ if (!_this2.props.disable) _this2.setState({
16725
+ pickerVisible: true
16726
+ });
16727
+ },
16474
16728
  children: dataAsDate ? moment__default["default"](dataAsDate).format(antConf.readableFormat) : "请点击选择"
16475
- })
16476
- }), this.props.path);
16729
+ }), jsxRuntime.jsx(antdMobile.DatePicker, _objectSpread$v({
16730
+ visible: this.state.pickerVisible,
16731
+ value: dataAsDate,
16732
+ min: this.props.schema.min ? moment__default["default"](this.props.schema.min, antConf.dataFormat).toDate() : undefined,
16733
+ max: this.props.schema.max ? moment__default["default"](this.props.schema.max, antConf.dataFormat).toDate() : undefined,
16734
+ precision: toPrecision(antConf.mode),
16735
+ onConfirm: function onConfirm(val) {
16736
+ onChange(val);
16737
+
16738
+ _this2.setState({
16739
+ pickerVisible: false
16740
+ });
16741
+ },
16742
+ onClose: function onClose() {
16743
+ _this2.setState({
16744
+ pickerVisible: false
16745
+ });
16746
+ }
16747
+ }, p))]
16748
+ });
16477
16749
  } else {
16750
+ var _antConf$mode;
16751
+
16478
16752
  // 大屏
16479
- return jsxRuntime.jsx(antd.DatePicker, _objectSpread$v({
16480
- disabled: this.props.disable,
16481
- bordered: this.props.hideBorder ? false : true,
16482
- disabledDate: function disabledDate(m) {
16483
- var d = _this.props.schema.min && moment__default["default"](_this.props.schema.min, antConf.dataFormat).isAfter(m) || _this.props.schema.max && moment__default["default"](_this.props.schema.max, antConf.dataFormat).isBefore(m);
16484
- return !!d;
16485
- },
16486
- format: antConf.readableFormat,
16487
- style: this.props.style,
16753
+ // key 中加入 mode 信息,确保精度切换时组件重新挂载
16754
+ var pickerKey = this.props.path + "_" + ((_antConf$mode = antConf.mode) != null ? _antConf$mode : "datetime");
16755
+ return jsxRuntime.jsx(antd.ConfigProvider, {
16488
16756
  locale: zhCN__default["default"],
16489
- defaultValue: dataAsMoment,
16490
- showTime: antConf.showTime,
16491
- picker: antConf.mode,
16492
- onChange: onChange
16493
- }, p), this.props.path);
16757
+ children: jsxRuntime.jsx(antd.DatePicker, _objectSpread$v({
16758
+ disabled: this.props.disable,
16759
+ bordered: this.props.hideBorder ? false : true,
16760
+ disabledDate: function disabledDate(m) {
16761
+ var d = _this2.props.schema.min && moment__default["default"](_this2.props.schema.min, antConf.dataFormat).isAfter(m) || _this2.props.schema.max && moment__default["default"](_this2.props.schema.max, antConf.dataFormat).isBefore(m);
16762
+ return !!d;
16763
+ },
16764
+ format: antConf.readableFormat,
16765
+ style: {
16766
+ width: "300px"
16767
+ },
16768
+ defaultValue: dataAsMoment,
16769
+ showTime: antConf.showTime,
16770
+ picker: antConf.mode,
16771
+ onChange: onChange
16772
+ }, p), pickerKey)
16773
+ });
16494
16774
  }
16495
16775
  };
16496
16776
 
@@ -16509,8 +16789,12 @@ function _objectSpread$u(target) { for (var i = 1; i < arguments.length; i++) {
16509
16789
  var AGB2260 = /*#__PURE__*/function (_BaseViewer) {
16510
16790
  _inheritsLoose__default["default"](AGB2260, _BaseViewer);
16511
16791
 
16512
- function AGB2260() {
16513
- return _BaseViewer.apply(this, arguments) || this;
16792
+ function AGB2260(props) {
16793
+ var _this;
16794
+
16795
+ _this = _BaseViewer.call(this, props) || this;
16796
+ _this.state.pickerVisible = false;
16797
+ return _this;
16514
16798
  }
16515
16799
 
16516
16800
  var _proto = AGB2260.prototype;
@@ -16518,7 +16802,7 @@ var AGB2260 = /*#__PURE__*/function (_BaseViewer) {
16518
16802
  _proto.element = function element() {
16519
16803
  var _MGB2260Type$lookup,
16520
16804
  _this$props$schema$pr,
16521
- _this = this;
16805
+ _this2 = this;
16522
16806
 
16523
16807
  var v = _BaseViewer.prototype.getValue.call(this);
16524
16808
 
@@ -16533,26 +16817,34 @@ var AGB2260 = /*#__PURE__*/function (_BaseViewer) {
16533
16817
  var _looked$label;
16534
16818
 
16535
16819
  // 手机
16536
- return jsxRuntime.jsx(antdMobile.Picker, _objectSpread$u(_objectSpread$u({
16537
- extra: _BaseViewer.prototype.getPlaceholder.call(this),
16538
- disabled: this.props.disable,
16539
- className: "AGB2260",
16540
- data: MGB2260Type.gb2260,
16541
- value: looked.code,
16542
- title: this.props.schema.label,
16543
- onDismiss: function onDismiss() {
16544
- return console.log('dismiss');
16545
- },
16546
- onOk: function onOk(e) {
16547
- return _BaseViewer.prototype.changeValue.call(_this, ___default["default"].last(e));
16548
- }
16549
- }, p), {}, {
16550
- children: jsxRuntime.jsx("div", {
16820
+ return jsxRuntime.jsxs(jsxRuntime.Fragment, {
16821
+ children: [jsxRuntime.jsx("div", {
16551
16822
  className: "backfill",
16552
16823
  style: this.props.style,
16824
+ onClick: function onClick() {
16825
+ if (!_this2.props.disable) _this2.setState({
16826
+ pickerVisible: true
16827
+ });
16828
+ },
16553
16829
  children: looked == null ? void 0 : (_looked$label = looked.label) == null ? void 0 : _looked$label.join("/")
16554
- })
16555
- }), this.props.path);
16830
+ }), jsxRuntime.jsx(antdMobile.Picker, _objectSpread$u({
16831
+ columns: MGB2260Type.gb2260,
16832
+ value: looked.code,
16833
+ visible: this.state.pickerVisible,
16834
+ onConfirm: function onConfirm(e) {
16835
+ _BaseViewer.prototype.changeValue.call(_this2, ___default["default"].last(e));
16836
+
16837
+ _this2.setState({
16838
+ pickerVisible: false
16839
+ });
16840
+ },
16841
+ onClose: function onClose() {
16842
+ _this2.setState({
16843
+ pickerVisible: false
16844
+ });
16845
+ }
16846
+ }, p))]
16847
+ });
16556
16848
  } else {
16557
16849
  // PC
16558
16850
  return jsxRuntime.jsx(antd.Cascader, _objectSpread$u({
@@ -16564,7 +16856,7 @@ var AGB2260 = /*#__PURE__*/function (_BaseViewer) {
16564
16856
  style: this.props.style,
16565
16857
  defaultValue: looked.code,
16566
16858
  onChange: function onChange(vv) {
16567
- _BaseViewer.prototype.changeValue.call(_this, ___default["default"].last(vv));
16859
+ _BaseViewer.prototype.changeValue.call(_this2, ___default["default"].last(vv));
16568
16860
  }
16569
16861
  }, p), this.props.path);
16570
16862
  }
@@ -17393,39 +17685,58 @@ var UnderlineInputBox = /*#__PURE__*/function (_React$Component) {
17393
17685
  var SelectBox = /*#__PURE__*/function (_React$Component) {
17394
17686
  _inheritsLoose__default["default"](SelectBox, _React$Component);
17395
17687
 
17396
- function SelectBox() {
17397
- return _React$Component.apply(this, arguments) || this;
17688
+ function SelectBox(props) {
17689
+ var _this;
17690
+
17691
+ _this = _React$Component.call(this, props) || this;
17692
+ _this.state = {
17693
+ pickerVisible: false
17694
+ };
17695
+ return _this;
17398
17696
  }
17399
17697
 
17400
17698
  var _proto = SelectBox.prototype;
17401
17699
 
17402
17700
  _proto.render = function render() {
17403
- var _this = this;
17701
+ var _this2 = this;
17404
17702
 
17405
17703
  if (MUtil.phoneLike()) {
17406
17704
  var _looked$label;
17407
17705
 
17408
17706
  var looked = this.props.options.find(function (o) {
17409
- return o.value === _this.props.data;
17707
+ return o.value === _this2.props.data;
17410
17708
  });
17411
17709
  var backfillClass = looked ? "backfill" : "backfill_empty";
17412
- return jsxRuntime.jsx(antdMobile.Picker, {
17413
- extra: "\u8BF7\u9009\u62E9(\u53EF\u9009)",
17414
- cols: 1,
17415
- data: this.props.options,
17416
- value: [this.props.data],
17417
- onOk: function onOk(e) {
17418
- return _this.props.onChange(___default["default"].last(e));
17419
- },
17420
- onDismiss: function onDismiss() {
17421
- if (_this.props.onBlur) {
17422
- _this.props.onBlur();
17423
- }
17424
- },
17425
- children: jsxRuntime.jsx("div", {
17710
+ return jsxRuntime.jsxs(jsxRuntime.Fragment, {
17711
+ children: [jsxRuntime.jsx("div", {
17426
17712
  className: backfillClass,
17713
+ onClick: function onClick() {
17714
+ return _this2.setState({
17715
+ pickerVisible: true
17716
+ });
17717
+ },
17427
17718
  children: (_looked$label = looked == null ? void 0 : looked.label) != null ? _looked$label : "点击选择"
17428
- })
17719
+ }), jsxRuntime.jsx(antdMobile.Picker, {
17720
+ columns: [this.props.options],
17721
+ value: [this.props.data],
17722
+ visible: this.state.pickerVisible,
17723
+ onConfirm: function onConfirm(e) {
17724
+ _this2.props.onChange(___default["default"].last(e));
17725
+
17726
+ _this2.setState({
17727
+ pickerVisible: false
17728
+ });
17729
+ },
17730
+ onClose: function onClose() {
17731
+ _this2.setState({
17732
+ pickerVisible: false
17733
+ });
17734
+
17735
+ if (_this2.props.onBlur) {
17736
+ _this2.props.onBlur();
17737
+ }
17738
+ }
17739
+ })]
17429
17740
  });
17430
17741
  } else {
17431
17742
  return jsxRuntime.jsx(antd.Select, {
@@ -22659,10 +22970,13 @@ var ARangePicker = /*#__PURE__*/function (_Viewer) {
22659
22970
 
22660
22971
  _this = _Viewer.call(this, p) || this;
22661
22972
  _this._pickerRef = /*#__PURE__*/React__default["default"].createRef();
22973
+ _this._startConfirmed = false; // 标记开始日期是否已确认,用于区分 onClose 是取消还是确认后的自动触发
22974
+
22662
22975
  _this.state = {
22663
22976
  ctrlVersion: 1,
22664
22977
  noValidate: false,
22665
- mobileDlg: false
22978
+ mobileDlg: false,
22979
+ mobileStep: 'start'
22666
22980
  };
22667
22981
  return _this;
22668
22982
  }
@@ -22725,57 +23039,142 @@ var ARangePicker = /*#__PURE__*/function (_Viewer) {
22725
23039
  _this$getValue,
22726
23040
  _this2 = this;
22727
23041
 
22728
- var p = (_this$props$schema$pr = this.props.schema.props) != null ? _this$props$schema$pr : {};
23042
+ (_this$props$schema$pr = this.props.schema.props) != null ? _this$props$schema$pr : {};
22729
23043
 
22730
23044
  var rangePickerData = this._data2rangePicker((_this$getValue = this.getValue()) != null ? _this$getValue : []);
22731
23045
 
22732
23046
  if (MUtil.phoneLike()) {
22733
- var _this$props$schema$da3;
23047
+ var _this$props$schema$da3, _this$props$schema$da4;
22734
23048
 
22735
- var show = MDateRangeType.toReadableN(assembly, this.props.schema, _Viewer.prototype.getValue.call(this));
23049
+ var show = MDateRangeType.toReadableN(assembly, this.props.schema, _Viewer.prototype.getValue.call(this)); // 根据 precision 配置确定移动端 DatePicker 精度(使用扁平化属性 dateRangePrecision)
23050
+
23051
+ var mobilePrecision = this.props.schema.dateRangePrecision || 'day';
22736
23052
  return jsxRuntime.jsxs(jsxRuntime.Fragment, {
22737
23053
  children: [jsxRuntime.jsxs("div", {
22738
23054
  className: "backfill",
22739
23055
  onClick: function onClick() {
22740
23056
  return _this2.setState({
22741
- mobileDlg: true
23057
+ mobileDlg: true,
23058
+ mobileStep: 'start'
22742
23059
  });
22743
23060
  },
22744
23061
  children: [" ", show != null ? show : '请点击选择', " "]
22745
- }), jsxRuntime.jsx(antdMobile.Calendar, _objectSpread$8({
22746
- visible: this.state.mobileDlg,
22747
- pickTime: (_this$props$schema$da3 = this.props.schema.dateRange) == null ? void 0 : _this$props$schema$da3.showTime,
22748
- minDate: this.props.schema.min ? new Date(this.props.schema.min) : undefined,
22749
- maxDate: this.props.schema.min ? new Date(this.props.schema.max) : undefined,
22750
- onCancel: function onCancel() {
22751
- return _this2.setState({
22752
- mobileDlg: false
23062
+ }), jsxRuntime.jsx(antdMobile.DatePicker, {
23063
+ visible: this.state.mobileDlg && this.state.mobileStep === 'start',
23064
+ precision: mobilePrecision,
23065
+ title: "\u9009\u62E9\u5F00\u59CB\u65E5\u671F",
23066
+ min: this.props.schema.min ? new Date(this.props.schema.min) : undefined,
23067
+ max: this.props.schema.max ? new Date(this.props.schema.max) : undefined,
23068
+ onConfirm: function onConfirm(val) {
23069
+ _this2._startConfirmed = true;
23070
+
23071
+ _this2.setState({
23072
+ mobileStartDate: val,
23073
+ mobileStep: 'end'
22753
23074
  });
22754
23075
  },
22755
- onConfirm: function onConfirm(start, end) {
22756
- _Viewer.prototype.changeValueEx.call(_this2, _this2._rangePicker2Data([moment__default["default"](start), moment__default["default"](end)], false), true, true);
23076
+ onClose: function onClose() {
23077
+ // antd-mobile v5 确认时会同时触发 onConfirm 和 onClose
23078
+ // 用实例变量同步判断:确认后的 onClose 应忽略,仅用户主动取消时才关闭
23079
+ if (_this2._startConfirmed) {
23080
+ _this2._startConfirmed = false;
23081
+ return;
23082
+ }
22757
23083
 
22758
23084
  _this2.setState({
22759
23085
  mobileDlg: false
22760
23086
  });
22761
23087
  }
22762
- }, p))]
23088
+ }, "start_" + mobilePrecision), jsxRuntime.jsx(antdMobile.DatePicker, {
23089
+ visible: this.state.mobileDlg && this.state.mobileStep === 'end',
23090
+ precision: mobilePrecision,
23091
+ title: // 如果允许"至今"且开始时间不在未来,在标题区域展示"至今"按钮
23092
+ !((_this$props$schema$da3 = this.props.schema.dateRange) != null && _this$props$schema$da3.hideTillNow) && !((_this$props$schema$da4 = this.props.schema.dateRange) != null && _this$props$schema$da4.showTime) && !(this.state.mobileStartDate && this.state.mobileStartDate > new Date()) ? jsxRuntime.jsxs("div", {
23093
+ style: {
23094
+ display: 'flex',
23095
+ alignItems: 'center',
23096
+ justifyContent: 'center',
23097
+ gap: 12
23098
+ },
23099
+ children: [jsxRuntime.jsx("span", {
23100
+ children: "\u9009\u62E9\u7ED3\u675F\u65E5\u671F"
23101
+ }), jsxRuntime.jsx(antd.Button, {
23102
+ size: "small",
23103
+ type: "primary",
23104
+ onClick: function onClick() {
23105
+ var startDate = _this2.state.mobileStartDate;
23106
+
23107
+ if (startDate) {
23108
+ _Viewer.prototype.changeValueEx.call(_this2, _this2._rangePicker2Data([moment__default["default"](startDate), moment__default["default"]()], true), true, true);
23109
+ }
23110
+
23111
+ _this2.setState({
23112
+ mobileDlg: false
23113
+ });
23114
+ },
23115
+ children: "\u81F3\u4ECA"
23116
+ })]
23117
+ }) : "选择结束日期",
23118
+ min: this.state.mobileStartDate || (this.props.schema.min ? new Date(this.props.schema.min) : undefined),
23119
+ max: this.props.schema.max ? new Date(this.props.schema.max) : undefined,
23120
+ onConfirm: function onConfirm(val) {
23121
+ var startDate = _this2.state.mobileStartDate;
23122
+
23123
+ if (startDate) {
23124
+ // 防御:结束日期不能早于开始日期
23125
+ var finalEnd = val < startDate ? startDate : val;
23126
+
23127
+ _Viewer.prototype.changeValueEx.call(_this2, _this2._rangePicker2Data([moment__default["default"](startDate), moment__default["default"](finalEnd)], false), true, true);
23128
+ }
23129
+
23130
+ _this2.setState({
23131
+ mobileDlg: false
23132
+ });
23133
+ },
23134
+ onClose: function onClose() {
23135
+ // 回退到第一步,让用户可以重新选择开始日期
23136
+ _this2.setState({
23137
+ mobileStep: 'start'
23138
+ });
23139
+ }
23140
+ }, "end_" + mobilePrecision)]
22763
23141
  });
22764
23142
  } else {
22765
- var _this$props$schema$da4, _this$props$schema$da5, _this$props$schema$da6;
23143
+ var _this$props$schema$da5, _this$props$schema$da6, _this$props$schema$da7;
23144
+
23145
+ // 根据 precision 配置确定 PC 端 picker 模式和 showTime(使用扁平化属性 dateRangePrecision)
23146
+ var precision = this.props.schema.dateRangePrecision;
23147
+ var pcShowTime = precision === 'minute' || ((_this$props$schema$da5 = this.props.schema.dateRange) == null ? void 0 : _this$props$schema$da5.showTime);
23148
+ var hideFooter = ((_this$props$schema$da6 = this.props.schema.dateRange) == null ? void 0 : _this$props$schema$da6.hideTillNow) || pcShowTime; // 动态构建额外属性,避免 showTime 和 picker 同时传入导致类型冲突
23149
+
23150
+ var extraProps = {};
23151
+
23152
+ if (precision === 'year') {
23153
+ extraProps.picker = 'year';
23154
+ } else if (precision === 'month') {
23155
+ extraProps.picker = 'month';
23156
+ } else if (pcShowTime) {
23157
+ extraProps.showTime = true;
23158
+ } // 构造元素
22766
23159
 
22767
- // 构造元素
22768
- return jsxRuntime.jsx(antd.DatePicker.RangePicker, {
23160
+
23161
+ return jsxRuntime.jsx(antd.DatePicker.RangePicker, _objectSpread$8({
22769
23162
  ref: this._pickerRef,
22770
- showTime: (_this$props$schema$da4 = this.props.schema.dateRange) == null ? void 0 : _this$props$schema$da4.showTime,
22771
- renderExtraFooter: (_this$props$schema$da5 = this.props.schema.dateRange) != null && _this$props$schema$da5.hideTillNow || (_this$props$schema$da6 = this.props.schema.dateRange) != null && _this$props$schema$da6.showTime // TODO 显示时间时,“至今”无法支持
22772
- ? undefined : function (mode) {
22773
- return jsxRuntime.jsx("div", _objectSpread$8(_objectSpread$8({
23163
+ renderExtraFooter: hideFooter ? undefined : function (mode) {
23164
+ var _this2$_onCalendarCha;
23165
+
23166
+ // 如果开始时间超过当前时间(未来时间),不展示"至今"按钮
23167
+ var startMoment = (_this2$_onCalendarCha = _this2._onCalendarChangeValue) == null ? void 0 : _this2$_onCalendarCha[0];
23168
+
23169
+ if (startMoment && startMoment.isAfter(moment__default["default"]())) {
23170
+ return null;
23171
+ }
23172
+
23173
+ return jsxRuntime.jsx("div", {
22774
23174
  style: {
22775
23175
  textAlign: "right"
22776
- }
22777
- }, p), {}, {
22778
- children: jsxRuntime.jsx(antdMobile.Button, {
23176
+ },
23177
+ children: jsxRuntime.jsx(antd.Button, {
22779
23178
  size: "small",
22780
23179
  style: {
22781
23180
  width: "100px",
@@ -22787,13 +23186,13 @@ var ARangePicker = /*#__PURE__*/function (_Viewer) {
22787
23186
  },
22788
23187
  children: "\u81F3\u4ECA"
22789
23188
  })
22790
- }));
23189
+ });
22791
23190
  },
22792
23191
  bordered: this.props.hideBorder ? false : true,
22793
23192
  style: {
22794
- minWidth: "240px"
23193
+ width: "300px"
22795
23194
  },
22796
- locale: zhCN__default["default"],
23195
+ locale: zhCN__default$1["default"],
22797
23196
  defaultValue: rangePickerData,
22798
23197
  onCalendarChange: function onCalendarChange(d) {
22799
23198
  _this2._onCalendarChangeValue = d;
@@ -22801,7 +23200,7 @@ var ARangePicker = /*#__PURE__*/function (_Viewer) {
22801
23200
  onChange: function onChange(vv) {
22802
23201
  _Viewer.prototype.changeValueEx.call(_this2, _this2._rangePicker2Data(vv, false), true, true);
22803
23202
  }
22804
- }, this.state.ctrlVersion);
23203
+ }, extraProps), this.state.ctrlVersion + "_" + ((_this$props$schema$da7 = this.props.schema.dateRangePrecision) != null ? _this$props$schema$da7 : 'day'));
22805
23204
  }
22806
23205
  };
22807
23206
 
@@ -23866,7 +24265,50 @@ var ACascadePicker = /*#__PURE__*/function (_BaseViewer) {
23866
24265
  var p = (_this$props$schema$pr = this.props.schema.props) != null ? _this$props$schema$pr : {};
23867
24266
 
23868
24267
  if (MUtil.phoneLike()) {
23869
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
24268
+ var _this$state;
24269
+
24270
+ return jsxRuntime.jsxs(jsxRuntime.Fragment, {
24271
+ children: [jsxRuntime.jsx("div", {
24272
+ className: "backfill",
24273
+ onClick: function onClick() {
24274
+ return _this.setState({
24275
+ cascadeVisible: true
24276
+ });
24277
+ },
24278
+ children: show.length > 0 ? show.map(function (item) {
24279
+ return item.label || item.value || item;
24280
+ }).join('-') : '请点击选择'
24281
+ }), jsxRuntime.jsx(antdMobile.CascadePicker, _objectSpread$4({
24282
+ options: candidate,
24283
+ value: show.map(function (item) {
24284
+ return item.value || item;
24285
+ }),
24286
+ visible: (_this$state = this.state) == null ? void 0 : _this$state.cascadeVisible,
24287
+ onConfirm: function onConfirm(v) {
24288
+ var vLabel = [];
24289
+ v.forEach(function (item) {
24290
+ candidate.forEach(function (dataItem) {
24291
+ var findItem = findById(dataItem, item, "label", "value", "children");
24292
+
24293
+ if (findItem !== -1) {
24294
+ vLabel.push(findItem);
24295
+ }
24296
+ });
24297
+ });
24298
+
24299
+ _BaseViewer.prototype.changeValue.call(_this, vLabel);
24300
+
24301
+ _this.setState({
24302
+ cascadeVisible: false
24303
+ });
24304
+ },
24305
+ onClose: function onClose() {
24306
+ _this.setState({
24307
+ cascadeVisible: false
24308
+ });
24309
+ }
24310
+ }, p))]
24311
+ });
23870
24312
  } else {
23871
24313
  return jsxRuntime.jsx(antd.Cascader, _objectSpread$4({
23872
24314
  options: candidate,
@@ -24514,9 +24956,11 @@ function ensureM3() {
24514
24956
  }
24515
24957
 
24516
24958
  init = true;
24959
+ moment__default["default"].locale('zh-cn');
24517
24960
  assembly.types = ___default["default"].merge(assembly.types, {
24518
24961
  enum: MEnumType,
24519
24962
  gb2260: MGB2260Type,
24963
+ date: MDateTimeType,
24520
24964
  datetime: MDateTimeType,
24521
24965
  year: MDateTimeType,
24522
24966
  yearMonth: MDateTimeType,
@@ -24582,6 +25026,7 @@ function ensureM3() {
24582
25026
  editor: {
24583
25027
  enum: "ASelector",
24584
25028
  gb2260: "AGB2260",
25029
+ date: "ADatetimePicker",
24585
25030
  datetime: "ADatetimePicker",
24586
25031
  year: "ADatetimePicker",
24587
25032
  yearMonth: "ADatetimePicker",
@@ -24610,6 +25055,7 @@ function ensureM3() {
24610
25055
  readable: {
24611
25056
  enum: "DivViewer",
24612
25057
  gb2260: "DivViewer",
25058
+ date: "DivViewer",
24613
25059
  datetime: "DivViewer",
24614
25060
  year: "DivViewer",
24615
25061
  yearMonth: "DivViewer",