@nokecy/qc-ui 1.1.87 → 1.1.88

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.
Files changed (98) hide show
  1. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +148 -144
  2. package/dist/cjs/ag-grid-plus/context/useSchemeDataFlow.js +4 -4
  3. package/dist/cjs/ag-grid-plus/interface.d.ts +2 -0
  4. package/dist/cjs/ag-grid-plus/queryForm/index.d.ts +2 -0
  5. package/dist/cjs/ag-grid-plus/queryForm/index.js +47 -51
  6. package/dist/cjs/ag-grid-plus/queryForm/queryColumns.d.ts +8 -0
  7. package/dist/cjs/ag-grid-plus/queryForm/queryColumns.js +52 -0
  8. package/dist/cjs/ag-grid-plus/queryForm/schemaKey.d.ts +15 -8
  9. package/dist/cjs/ag-grid-plus/queryForm/schemaKey.js +64 -12
  10. package/dist/cjs/ag-grid-plus/setting/ColumnConfigForm.js +3 -0
  11. package/dist/cjs/ag-grid-plus/setting/ColumnSetting.js +69 -106
  12. package/dist/cjs/ag-grid-plus/setting/QuerySchemeManager.js +3 -1
  13. package/dist/cjs/ag-grid-plus/setting/columnGroupTypes.d.ts +2 -0
  14. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.d.ts +14 -0
  15. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +98 -110
  16. package/dist/cjs/ag-grid-plus/types.d.ts +6 -0
  17. package/dist/cjs/array-table/batchRemove.d.ts +36 -0
  18. package/dist/cjs/array-table/batchRemove.js +299 -0
  19. package/dist/cjs/array-table/cellFocusScope.js +44 -8
  20. package/dist/cjs/array-table/cellInteractionLock.d.ts +13 -0
  21. package/dist/cjs/array-table/cellInteractionLock.js +26 -0
  22. package/dist/cjs/array-table/hooks.d.ts +11 -6
  23. package/dist/cjs/array-table/hooks.js +138 -88
  24. package/dist/cjs/array-table/index.d.ts +8 -2
  25. package/dist/cjs/array-table/index.js +55 -32
  26. package/dist/cjs/array-table/indexColumn.d.ts +1 -1
  27. package/dist/cjs/array-table/indexColumn.js +3 -2
  28. package/dist/cjs/array-table/interface.d.ts +13 -1
  29. package/dist/cjs/array-table/preview.js +8 -0
  30. package/dist/cjs/array-table/readOnlyFormatters.d.ts +9 -1
  31. package/dist/cjs/array-table/readOnlyFormatters.js +41 -13
  32. package/dist/cjs/array-table/rowIdentity.d.ts +17 -0
  33. package/dist/cjs/array-table/rowIdentity.js +43 -0
  34. package/dist/cjs/array-table/sorting.d.ts +3 -0
  35. package/dist/cjs/array-table/sorting.js +46 -0
  36. package/dist/cjs/array-table/utils.js +146 -67
  37. package/dist/cjs/dialogSelect/index.d.ts +3 -0
  38. package/dist/cjs/dialogSelect/index.js +13 -3
  39. package/dist/cjs/editable/index.js +101 -139
  40. package/dist/cjs/index.d.ts +2 -2
  41. package/dist/cjs/index.js +14 -0
  42. package/dist/cjs/readPretty/arrayTable.js +29 -14
  43. package/dist/cjs/readPretty/formily.d.ts +1 -0
  44. package/dist/cjs/readPretty/formily.js +7 -0
  45. package/dist/cjs/readPretty/index.d.ts +1 -0
  46. package/dist/cjs/readPretty/index.js +7 -0
  47. package/dist/cjs/readPretty/schemaScope.d.ts +2 -0
  48. package/dist/cjs/readPretty/schemaScope.js +49 -0
  49. package/dist/esm/ag-grid-plus/ag-gridPlus.js +148 -144
  50. package/dist/esm/ag-grid-plus/context/useSchemeDataFlow.js +4 -4
  51. package/dist/esm/ag-grid-plus/interface.d.ts +2 -0
  52. package/dist/esm/ag-grid-plus/queryForm/index.d.ts +2 -0
  53. package/dist/esm/ag-grid-plus/queryForm/index.js +47 -52
  54. package/dist/esm/ag-grid-plus/queryForm/queryColumns.d.ts +8 -0
  55. package/dist/esm/ag-grid-plus/queryForm/queryColumns.js +46 -0
  56. package/dist/esm/ag-grid-plus/queryForm/schemaKey.d.ts +15 -8
  57. package/dist/esm/ag-grid-plus/queryForm/schemaKey.js +64 -12
  58. package/dist/esm/ag-grid-plus/setting/ColumnConfigForm.js +3 -0
  59. package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +70 -107
  60. package/dist/esm/ag-grid-plus/setting/QuerySchemeManager.js +3 -1
  61. package/dist/esm/ag-grid-plus/setting/columnGroupTypes.d.ts +2 -0
  62. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.d.ts +14 -0
  63. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +95 -110
  64. package/dist/esm/ag-grid-plus/types.d.ts +6 -0
  65. package/dist/esm/array-table/batchRemove.d.ts +36 -0
  66. package/dist/esm/array-table/batchRemove.js +289 -0
  67. package/dist/esm/array-table/cellFocusScope.js +45 -9
  68. package/dist/esm/array-table/cellInteractionLock.d.ts +13 -0
  69. package/dist/esm/array-table/cellInteractionLock.js +21 -0
  70. package/dist/esm/array-table/hooks.d.ts +11 -6
  71. package/dist/esm/array-table/hooks.js +139 -89
  72. package/dist/esm/array-table/index.d.ts +8 -2
  73. package/dist/esm/array-table/index.js +55 -32
  74. package/dist/esm/array-table/indexColumn.d.ts +1 -1
  75. package/dist/esm/array-table/indexColumn.js +3 -2
  76. package/dist/esm/array-table/interface.d.ts +13 -1
  77. package/dist/esm/array-table/preview.js +8 -0
  78. package/dist/esm/array-table/readOnlyFormatters.d.ts +9 -1
  79. package/dist/esm/array-table/readOnlyFormatters.js +41 -12
  80. package/dist/esm/array-table/rowIdentity.d.ts +17 -0
  81. package/dist/esm/array-table/rowIdentity.js +37 -0
  82. package/dist/esm/array-table/sorting.d.ts +3 -0
  83. package/dist/esm/array-table/sorting.js +40 -0
  84. package/dist/esm/array-table/utils.js +147 -68
  85. package/dist/esm/dialogSelect/index.d.ts +3 -0
  86. package/dist/esm/dialogSelect/index.js +13 -3
  87. package/dist/esm/editable/index.js +102 -140
  88. package/dist/esm/index.d.ts +2 -2
  89. package/dist/esm/index.js +1 -1
  90. package/dist/esm/readPretty/arrayTable.js +30 -13
  91. package/dist/esm/readPretty/formily.d.ts +1 -0
  92. package/dist/esm/readPretty/formily.js +1 -0
  93. package/dist/esm/readPretty/index.d.ts +1 -0
  94. package/dist/esm/readPretty/index.js +1 -0
  95. package/dist/esm/readPretty/schemaScope.d.ts +2 -0
  96. package/dist/esm/readPretty/schemaScope.js +42 -0
  97. package/dist/umd/qc-ui.min.js +1 -1
  98. package/package.json +1 -1
@@ -14,6 +14,7 @@ var _arrayBase = _interopRequireDefault(require("./arrayBase"));
14
14
  var _readOnlyFormatters = require("./readOnlyFormatters");
15
15
  var _columnGroup = require("./columnGroup");
16
16
  var _cellFocusScope = require("./cellFocusScope");
17
+ var _sorting = require("./sorting");
17
18
  var _excluded = ["hide", "sort", "sortIndex", "forceAgField", "headerGroup", "defaultHide"];
18
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
20
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
@@ -54,6 +55,7 @@ var isActionComponent = function isActionComponent(schema) {
54
55
  var useArrayTableSources = exports.useArrayTableSources = function useArrayTableSources() {
55
56
  var arrayField = (0, _react2.useField)();
56
57
  var schema = (0, _react2.useFieldSchema)();
58
+ var components = _react.default.useContext(_react2.SchemaComponentsContext);
57
59
  var parseSources = function parseSources(schema) {
58
60
  if (isColumnComponent(schema) || isOperationsComponent(schema) || isAdditionComponent(schema)) {
59
61
  var _schema$xComponentP, _schema$xComponentP2, _field$component;
@@ -69,7 +71,8 @@ var useArrayTableSources = exports.useArrayTableSources = function useArrayTable
69
71
  //@ts-ignore
70
72
  field: field,
71
73
  schema: schema,
72
- columnProps: columnProps
74
+ columnProps: columnProps,
75
+ components: components
73
76
  }];
74
77
  } else if (schema.properties) {
75
78
  return schema.reduceProperties(function (buf, schema) {
@@ -125,19 +128,45 @@ var useArrayTableActions = exports.useArrayTableActions = function useArrayTable
125
128
  if (!schema) throw new Error('can not found schema object');
126
129
  return schema.properties ? parseSources(schema.properties['actions'] || {}) : [];
127
130
  };
128
- var AgField = function AgField(_ref) {
129
- var _field$value$indexOf, _field$value, _field$value$indexOf2, _ref2, _node$rowIndex;
130
- var value = _ref.value,
131
- record = _ref.data,
132
- dataSource = _ref.dataSource,
133
- schema = _ref.schema,
134
- field = _ref.field,
135
- node = _ref.node;
136
- // 数据序绑定:用 field.value.indexOf(record) 取数据数组下标(record === field.value 元素引用)。
137
- // 排序/过滤后 node.rowIndex 是显示序 ≠ 数据序,会把单元格绑到别的行——故 indexOf 优先,
138
- // 仅在未命中(理论不应发生)时才回退 rowIndex/dataSource。@author nokecy
139
- var dataIndex = (_field$value$indexOf = field === null || field === void 0 || (_field$value = field.value) === null || _field$value === void 0 || (_field$value$indexOf2 = _field$value.indexOf) === null || _field$value$indexOf2 === void 0 ? void 0 : _field$value$indexOf2.call(_field$value, record)) !== null && _field$value$indexOf !== void 0 ? _field$value$indexOf : -1;
140
- var index = dataIndex >= 0 ? dataIndex : (_ref2 = (_node$rowIndex = node === null || node === void 0 ? void 0 : node.rowIndex) !== null && _node$rowIndex !== void 0 ? _node$rowIndex : dataSource === null || dataSource === void 0 ? void 0 : dataSource.indexOf(record)) !== null && _ref2 !== void 0 ? _ref2 : -1;
131
+
132
+ /**
133
+ * 从表单当前数组定位单元格所属行。批量选择可保留 _id/id 并替换整行对象,
134
+ * AG Grid 在格值未变时仍会复用带旧 data 的渲染器;判空、校验和绑定必须使用当前行。
135
+ * 不以排序/过滤后的显示行号定位数据,已删除的行也不能绑定到后继行。@author nokecy
136
+ */
137
+ var resolveCellRow = function resolveCellRow(field, record, node, dataSource) {
138
+ var _field$value, _node$data;
139
+ var rows = (_field$value = field === null || field === void 0 ? void 0 : field.value) !== null && _field$value !== void 0 ? _field$value : dataSource;
140
+ var candidate = (_node$data = node === null || node === void 0 ? void 0 : node.data) !== null && _node$data !== void 0 ? _node$data : record;
141
+ if (!Array.isArray(rows)) return {
142
+ index: -1,
143
+ record: candidate
144
+ };
145
+ var index = rows.indexOf(candidate);
146
+ if (index < 0) {
147
+ var _ref, _ref2, _candidate$_id;
148
+ var id = (_ref = (_ref2 = (_candidate$_id = candidate === null || candidate === void 0 ? void 0 : candidate._id) !== null && _candidate$_id !== void 0 ? _candidate$_id : candidate === null || candidate === void 0 ? void 0 : candidate.id) !== null && _ref2 !== void 0 ? _ref2 : record === null || record === void 0 ? void 0 : record._id) !== null && _ref !== void 0 ? _ref : record === null || record === void 0 ? void 0 : record.id;
149
+ if (id != null) index = rows.findIndex(function (row) {
150
+ var _row$_id;
151
+ var rowId = (_row$_id = row === null || row === void 0 ? void 0 : row._id) !== null && _row$_id !== void 0 ? _row$_id : row === null || row === void 0 ? void 0 : row.id;
152
+ return rowId != null && String(rowId) === String(id);
153
+ });
154
+ }
155
+ return {
156
+ index: index,
157
+ record: index >= 0 ? rows[index] : undefined
158
+ };
159
+ };
160
+ var AgField = function AgField(_ref3) {
161
+ var value = _ref3.value,
162
+ record = _ref3.data,
163
+ dataSource = _ref3.dataSource,
164
+ schema = _ref3.schema,
165
+ field = _ref3.field,
166
+ node = _ref3.node;
167
+ var _resolveCellRow = resolveCellRow(field, record, node, dataSource),
168
+ index = _resolveCellRow.index;
169
+ if (index < 0) return null;
141
170
  var children =
142
171
  /*#__PURE__*/
143
172
  //@ts-ignore
@@ -207,10 +236,10 @@ var readByFieldPath = function readByFieldPath(record, path) {
207
236
  if (record == null) return undefined;
208
237
  // 对象解构:与 Formily 一致,按成员路径分别取值拼回 {value, label} 对象 @author nokecy
209
238
  var destructure = path.startsWith('{') ? parseObjectDestructure(path) : null;
210
- if (destructure) return Object.fromEntries(destructure.map(function (_ref3) {
211
- var _ref4 = _slicedToArray(_ref3, 2),
212
- key = _ref4[0],
213
- memberPath = _ref4[1];
239
+ if (destructure) return Object.fromEntries(destructure.map(function (_ref4) {
240
+ var _ref5 = _slicedToArray(_ref4, 2),
241
+ key = _ref5[0],
242
+ memberPath = _ref5[1];
214
243
  return [key, readByFieldPath(record, memberPath)];
215
244
  }));
216
245
  if (path.indexOf('.') < 0) return record[path];
@@ -365,6 +394,7 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
365
394
  node = params.node,
366
395
  colDef = params.colDef,
367
396
  context = params.context,
397
+ api = params.api,
368
398
  formatter = params.formatter,
369
399
  renderer = params.renderer,
370
400
  columnProps = params.columnProps,
@@ -387,59 +417,88 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
387
417
 
388
418
  /** 离开本格:校验通过才卸回懒挂载文本。未触碰的空必填格保留控件等待填写。@author nokecy */
389
419
  var handleLeave = /*#__PURE__*/function () {
390
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(isStale, hadFocus) {
391
- var _field$value$indexOf3, _field$value3, _field$value3$indexOf, _field$form;
392
- var currentValue, index, cellField;
420
+ var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(isStale, hadFocus) {
421
+ var _field$form, _api$isDestroyed;
422
+ var current, currentValue, index, cellField, latest, _api$refreshCells;
393
423
  return _regeneratorRuntime().wrap(function _callee$(_context) {
394
424
  while (1) switch (_context.prev = _context.next) {
395
425
  case 0:
396
- currentValue = dataKey != null ? readByFieldPath(record, dataKey) : value; // 新增行的必填空格会预先挂载以参与提交校验;若用户从未进入该格,不在点击页面其他位置时
397
- // 主动触发校验,但已带值的格子仍可恢复静默文本态。@author nokecy
398
- if (!(required && isBlank(currentValue) && !hadFocus)) {
426
+ current = resolveCellRow(field, record, node, dataSource);
427
+ if (!(current.index < 0)) {
399
428
  _context.next = 3;
400
429
  break;
401
430
  }
402
431
  return _context.abrupt("return");
403
432
  case 3:
404
- index = (_field$value$indexOf3 = field === null || field === void 0 || (_field$value3 = field.value) === null || _field$value3 === void 0 || (_field$value3$indexOf = _field$value3.indexOf) === null || _field$value3$indexOf === void 0 ? void 0 : _field$value3$indexOf.call(_field$value3, record)) !== null && _field$value$indexOf3 !== void 0 ? _field$value$indexOf3 : -1; // 字段节点按数据路径找(不含 void 容器);从没挂载过就没有节点,无需校验
433
+ currentValue = dataKey != null ? readByFieldPath(current.record, dataKey) : value; // 新增行的必填空格会预先挂载以参与提交校验;若用户从未进入该格,不在点击页面其他位置时
434
+ // 主动触发校验,但已带值的格子仍可恢复静默文本态。@author nokecy
435
+ if (!(required && isBlank(currentValue) && !hadFocus)) {
436
+ _context.next = 6;
437
+ break;
438
+ }
439
+ return _context.abrupt("return");
440
+ case 6:
441
+ index = current.index; // 字段节点按数据路径找(不含 void 容器);从没挂载过就没有节点,无需校验
405
442
  cellField = index >= 0 && dataKey ? (_field$form = field.form) === null || _field$form === void 0 ? void 0 : _field$form.query(field.path.concat(index).concat(dataKey)).take() : undefined;
406
443
  if (!cellField) {
407
- _context.next = 14;
444
+ _context.next = 17;
408
445
  break;
409
446
  }
410
- _context.prev = 6;
411
- _context.next = 9;
447
+ _context.prev = 9;
448
+ _context.next = 12;
412
449
  return cellField.validate();
413
- case 9:
414
- _context.next = 14;
450
+ case 12:
451
+ _context.next = 17;
415
452
  break;
416
- case 11:
417
- _context.prev = 11;
418
- _context.t0 = _context["catch"](6);
419
- return _context.abrupt("return");
420
453
  case 14:
454
+ _context.prev = 14;
455
+ _context.t0 = _context["catch"](9);
456
+ return _context.abrupt("return");
457
+ case 17:
421
458
  if (!isStale()) {
422
- _context.next = 16;
459
+ _context.next = 19;
460
+ break;
461
+ }
462
+ return _context.abrupt("return");
463
+ case 19:
464
+ latest = resolveCellRow(field, record, node, dataSource); // 校验期间被替换、删除或移位的行,交给下一次离开重新校验。@author nokecy
465
+ if (!(latest.index !== index || latest.record !== current.record)) {
466
+ _context.next = 22;
423
467
  break;
424
468
  }
425
469
  return _context.abrupt("return");
426
- case 16:
427
- if (!(required && isBlank(dataKey != null ? readByFieldPath(record, dataKey) : undefined))) {
428
- _context.next = 18;
470
+ case 22:
471
+ if (!(required && isBlank(dataKey != null ? readByFieldPath(latest.record, dataKey) : undefined))) {
472
+ _context.next = 24;
429
473
  break;
430
474
  }
431
475
  return _context.abrupt("return");
432
- case 18:
433
- activeCells.delete(key);
476
+ case 24:
477
+ if (activeCells.delete(key)) {
478
+ _context.next = 26;
479
+ break;
480
+ }
481
+ return _context.abrupt("return");
482
+ case 26:
434
483
  rerender();
435
- case 20:
484
+ // 激活集合由 ArrayTable 与渲染器共享;退出时也同步通知 AG Grid 刷新本格,
485
+ // 不再依赖新增行等整表更新来收回已完成编辑的控件。字段节点和值仍保留。
486
+ // @author nokecy
487
+ if (node && colDef !== null && colDef !== void 0 && colDef.field && !(api !== null && api !== void 0 && (_api$isDestroyed = api.isDestroyed) !== null && _api$isDestroyed !== void 0 && _api$isDestroyed.call(api))) {
488
+ api === null || api === void 0 || (_api$refreshCells = api.refreshCells) === null || _api$refreshCells === void 0 || _api$refreshCells.call(api, {
489
+ rowNodes: [node],
490
+ columns: [colDef.field],
491
+ force: true
492
+ });
493
+ }
494
+ case 28:
436
495
  case "end":
437
496
  return _context.stop();
438
497
  }
439
- }, _callee, null, [[6, 11]]);
498
+ }, _callee, null, [[9, 14]]);
440
499
  }));
441
500
  return function handleLeave(_x, _x2) {
442
- return _ref5.apply(this, arguments);
501
+ return _ref6.apply(this, arguments);
443
502
  };
444
503
  }();
445
504
 
@@ -452,11 +511,11 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
452
511
  * 仅选项类组件且有值时才查;按精确地址取、放在 untracked 里,不让每个格子都订阅整张字段表。@author nokecy
453
512
  */
454
513
  var liveDataSource = function liveDataSource(liveValue) {
455
- var _field$value$indexOf4, _field$value4, _field$value4$indexOf;
456
514
  var form = field === null || field === void 0 ? void 0 : field.form;
457
515
  // 只有用「选项映射」格式化器的列(Select 一族,或登记为同一格式化器的组件)才需要运行时选项
458
516
  if (!form || !dataKey || isBlank(liveValue) || formatter !== (0, _readOnlyFormatters.getReadOnlyFormatter)('Select')) return undefined;
459
- var index = (_field$value$indexOf4 = field === null || field === void 0 || (_field$value4 = field.value) === null || _field$value4 === void 0 || (_field$value4$indexOf = _field$value4.indexOf) === null || _field$value4$indexOf === void 0 ? void 0 : _field$value4$indexOf.call(_field$value4, record)) !== null && _field$value$indexOf4 !== void 0 ? _field$value$indexOf4 : -1;
517
+ var _resolveCellRow2 = resolveCellRow(field, record, node, dataSource),
518
+ index = _resolveCellRow2.index;
460
519
  if (index < 0) return undefined;
461
520
  var own = (0, _reactive.untracked)(function () {
462
521
  return form.query(field.path.concat(index).concat(dataKey)).take();
@@ -471,14 +530,17 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
471
530
  // 改值(行引用不变 → AG-Grid 不刷新该格、外层 observer 也不重渲)时,本格能自行重渲刷新——
472
531
  // 免去调用方加 forceAgField 逃生阀。字段名缺失才回退 params.value。@author nokecy
473
532
  return /*#__PURE__*/_react.default.createElement(_react2.Observer, null, function () {
533
+ var _resolveCellRow3 = resolveCellRow(field, record, node, dataSource),
534
+ currentRecord = _resolveCellRow3.record;
535
+ if (!currentRecord) return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
474
536
  var activated = activeCells.has(key);
475
537
  // 已挂载时不读值:挂载后每敲一个字都会变,追踪它会让整棵字段树跟着重渲
476
- var liveValue = activated ? undefined : dataKey != null && record ? readByFieldPath(record, dataKey) : value;
538
+ var liveValue = activated ? undefined : dataKey != null ? readByFieldPath(currentRecord, dataKey) : value;
477
539
  // Editable 装饰器会把非新增行的格转成只读态、不参与校验(见 editable/index.tsx),
478
540
  // 这时挂了没用,还会把灰色「请输入」占位换成只读态的「N/A」,所以留在文本态
479
- var editableWillReadPretty = (fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-decorator']) === 'Editable' && (record === null || record === void 0 ? void 0 : record._isNew) !== true;
541
+ var editableWillReadPretty = (fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-decorator']) === 'Editable' && currentRecord._isNew !== true;
480
542
  if (!activated && required && !editableWillReadPretty && isBlank(liveValue)) {
481
- var _pattern = resolveLazyCellPattern(field, record, dataKey, fieldSchema, scope);
543
+ var _pattern = resolveLazyCellPattern(field, currentRecord, dataKey, fieldSchema, scope);
482
544
  if (_pattern == null || _pattern === 'editable') {
483
545
  // 记进激活集合:用户填了第一个字后值不再为空,但格子仍在编辑,要挂到失焦为止
484
546
  activeCells.add(key);
@@ -490,7 +552,7 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
490
552
  onLeave: handleLeave
491
553
  }, /*#__PURE__*/_react.default.createElement(AgField, {
492
554
  value: value,
493
- data: record,
555
+ data: currentRecord,
494
556
  dataSource: dataSource,
495
557
  schema: schema,
496
558
  field: field,
@@ -505,7 +567,7 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
505
567
  var text = formatter ? formatter(liveValue, ctx) : liveValue == null ? '' : String(liveValue);
506
568
  // 纯文本占满单元格,点击交给 AG-Grid onCellClicked 激活;样式尽量贴近 Editable 只读态避免点开跳动
507
569
  // 只读态(readPretty/disabled/readOnly)的空格不出编辑提示,留空与只读快路径一致
508
- var pattern = text === '' ? resolveLazyCellPattern(field, record, dataKey, fieldSchema, scope) : undefined;
570
+ var pattern = text === '' ? resolveLazyCellPattern(field, currentRecord, dataKey, fieldSchema, scope) : undefined;
509
571
  if (text === '' && (pattern == null || pattern === 'editable')) {
510
572
  // 空值:出淡灰 placeholder,让用户看得出这格能填(颜色取 antd 输入框 placeholder 的 token,自动跟随暗色主题)
511
573
  return /*#__PURE__*/_react.default.createElement("span", {
@@ -545,6 +607,8 @@ var LazyReadOnlyText = exports.LazyReadOnlyText = function LazyReadOnlyText(para
545
607
  var _fieldSchema$name2;
546
608
  var value = params.value,
547
609
  record = params.data,
610
+ field = params.field,
611
+ node = params.node,
548
612
  colDef = params.colDef,
549
613
  formatter = params.formatter,
550
614
  renderer = params.renderer,
@@ -552,7 +616,8 @@ var LazyReadOnlyText = exports.LazyReadOnlyText = function LazyReadOnlyText(para
552
616
  fieldSchema = params.fieldSchema;
553
617
  var dataKey = (_fieldSchema$name2 = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.name) !== null && _fieldSchema$name2 !== void 0 ? _fieldSchema$name2 : colDef === null || colDef === void 0 ? void 0 : colDef.field;
554
618
  return /*#__PURE__*/_react.default.createElement(_react2.Observer, null, function () {
555
- var liveValue = dataKey != null && record ? readByFieldPath(record, dataKey) : value;
619
+ var currentRecord = resolveCellRow(field, record, node).record;
620
+ var liveValue = dataKey != null && currentRecord ? readByFieldPath(currentRecord, dataKey) : value;
556
621
  var text = formatter ? formatter(liveValue, {
557
622
  columnProps: columnProps,
558
623
  fieldSchema: fieldSchema
@@ -640,12 +705,13 @@ var applyNumberInputDefaults = function applyNumberInputDefaults(dataField) {
640
705
  // 重命名自 useArrayTableColumns:内部无任何 Hook 调用,use 前缀违反 Hook 命名约定且曾在 useMemo 内被调用 @author nokecy
641
706
  var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArrayTableColumns(dataSource, field, sources) {
642
707
  var arrayPattern = field === null || field === void 0 ? void 0 : field.pattern;
643
- return sources.reduce(function (buf, _ref6, key) {
644
- var _getReadOnlyFormatter;
645
- var name = _ref6.name,
646
- columnProps = _ref6.columnProps,
647
- schema = _ref6.schema,
648
- display = _ref6.display;
708
+ return sources.reduce(function (buf, _ref7, key) {
709
+ var _ref8, _getReadOnlyFormatter, _dataField$xComponen, _dataField$xComponen2;
710
+ var name = _ref7.name,
711
+ columnProps = _ref7.columnProps,
712
+ schema = _ref7.schema,
713
+ display = _ref7.display,
714
+ components = _ref7.components;
649
715
  if (display && display !== 'visible') return buf;
650
716
  if (!isColumnComponent(schema)) return buf;
651
717
 
@@ -689,7 +755,15 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
689
755
  // 只读列不兜底:自定义只读组件常显示别的字段(如 SiblingText),按自身值出文本会错。@author nokecy
690
756
  // 登记了只读渲染器的组件只读列也走快路径(渲染器出内容,兜底格式化器只用于判空)。@author nokecy
691
757
  var renderer = (0, _readOnlyFormatters.getReadOnlyRenderer)(component);
692
- var formatter = (_getReadOnlyFormatter = (0, _readOnlyFormatters.getReadOnlyFormatter)(component)) !== null && _getReadOnlyFormatter !== void 0 ? _getReadOnlyFormatter : (!readOnly || renderer) && component && (dataField === null || dataField === void 0 ? void 0 : dataField.type) !== 'void' ? _readOnlyFormatters.fallbackFormatter : null;
758
+ var formatter = (_ref8 = (_getReadOnlyFormatter = (0, _readOnlyFormatters.getReadOnlyFormatter)(component, components)) !== null && _getReadOnlyFormatter !== void 0 ? _getReadOnlyFormatter : (dataField === null || dataField === void 0 || (_dataField$xComponen = dataField['x-component-props']) === null || _dataField$xComponen === void 0 ? void 0 : _dataField$xComponen.displayField) === 'value' ? _readOnlyFormatters.fallbackFormatter : null) !== null && _ref8 !== void 0 ? _ref8 : (!readOnly || renderer) && component && (dataField === null || dataField === void 0 ? void 0 : dataField.type) !== 'void' ? _readOnlyFormatters.fallbackFormatter : null;
759
+ var displayColumnProps = formatter && ((0, _readOnlyFormatters.getReadOnlyFormatter)(component, components) !== (0, _readOnlyFormatters.getReadOnlyFormatter)(component) || (dataField === null || dataField === void 0 || (_dataField$xComponen2 = dataField['x-component-props']) === null || _dataField$xComponen2 === void 0 ? void 0 : _dataField$xComponen2.displayField) === 'value') ? {
760
+ valueFormatter: function valueFormatter(params) {
761
+ return formatter(params.value, {
762
+ columnProps: columnProps,
763
+ fieldSchema: dataField
764
+ });
765
+ }
766
+ } : {};
693
767
  var hasReactions = !!(dataField && dataField['x-reactions']);
694
768
  if (!readOnly) applyNumberInputDefaults(dataField);
695
769
  var forceEager = (columnProps === null || columnProps === void 0 ? void 0 : columnProps.forceAgField) === true;
@@ -706,9 +780,11 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
706
780
  // 两者不一致时 record[name] 恒为 undefined → 单元格空白(点击挂 AgField 才按内层字段名显真值)。
707
781
  // 故按内层字段名补 valueGetter(仅在与 name 不一致时,保持 name===字段名 的现状)。@author nokecy
708
782
  var dataFieldName = dataField === null || dataField === void 0 ? void 0 : dataField.name;
709
- var valueGetter = dataFieldName && dataFieldName !== name ? function (params) {
783
+ var valueGetter = !columnProps.valueGetter && dataFieldName && dataFieldName !== name ? function (params) {
710
784
  return readByFieldPath(params === null || params === void 0 ? void 0 : params.data, dataFieldName);
711
785
  } : undefined;
786
+ // 选择器解构值仍交给渲染器;排序单独提取展示字段,不能把整对象当成相等的文本。@author nokecy
787
+ if ((!dataField || dataField.type === 'void') && !columnProps.valueGetter && columnProps.sortable == null) base.sortable = false;else if (dataField && !base.comparator) base.comparator = (0, _sorting.createArrayTableComparator)(dataField, columnProps, formatter);
712
788
  // 字段名是路径:`item.qty` 的值在 record.item.qty。快路径自己解析点号分段与对象解构(`{value:a,label:b}`);
713
789
  // 数组解构/下标等其余语法解析不了,回退全树交给 Formily。@author nokecy
714
790
  var canFastPath = !dataFieldName || isFastPathFieldName(dataFieldName);
@@ -724,6 +800,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
724
800
  } : {}), {}, {
725
801
  cellRenderer: LazyReadOnlyText,
726
802
  cellRendererParams: {
803
+ field: field,
727
804
  formatter: formatter,
728
805
  renderer: renderer,
729
806
  columnProps: columnProps,
@@ -784,11 +861,13 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
784
861
  // 必填、或带校验规则且为空的格必须挂真控件,否则没有字段节点,提交时没人校验它,见 LazyAgField
785
862
  required: isRequiredSchema(dataField) || hasValidatorRule(dataField)
786
863
  }
787
- }));
864
+ }, displayColumnProps));
788
865
  }
789
866
 
790
867
  // ③ 兜底全树
791
- return emit(_objectSpread(_objectSpread({}, base), {}, {
868
+ return emit(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
869
+ valueGetter: valueGetter
870
+ } : {}), displayColumnProps), {}, {
792
871
  cellRendererParams: {
793
872
  dataSource: dataSource,
794
873
  schema: schema,
@@ -830,9 +909,9 @@ var collectLazyDefaults = exports.collectLazyDefaults = function collectLazyDefa
830
909
  key: String((_fieldSchema$name3 = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.name) !== null && _fieldSchema$name3 !== void 0 ? _fieldSchema$name3 : col.field),
831
910
  value: fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.default
832
911
  };
833
- }).filter(function (_ref7) {
834
- var key = _ref7.key,
835
- value = _ref7.value;
912
+ }).filter(function (_ref9) {
913
+ var key = _ref9.key,
914
+ value = _ref9.value;
836
915
  return SIMPLE_FIELD_NAME.test(key) && value !== undefined && value !== null && !(typeof value === 'string' && value.includes('{{'));
837
916
  });
838
917
  };
@@ -851,9 +930,9 @@ var applyLazyDefaults = exports.applyLazyDefaults = function applyLazyDefaults(a
851
930
  // 已落库的行(带 id)保持库里的样子:补默认值会让受控字段凭空出现「变更」,
852
931
  // 已审批的数据保存时还会被要求填变更原因。只补新增行(按钮之外的途径推进来的行)。
853
932
  if (row.id != null || row._id != null) return;
854
- defaults.forEach(function (_ref8) {
855
- var key = _ref8.key,
856
- value = _ref8.value;
933
+ defaults.forEach(function (_ref10) {
934
+ var key = _ref10.key,
935
+ value = _ref10.value;
857
936
  if (row[key] == null) {
858
937
  form.setValuesIn(arrayField.path.concat(index).concat(key), _typeof(value) === 'object' ? JSON.parse(JSON.stringify(value)) : value);
859
938
  }
@@ -2,10 +2,13 @@ import { SelectProps } from 'antd/lib/select';
2
2
  import React from 'react';
3
3
  import { ColDef, ColGroupDef } from 'ag-grid-community';
4
4
  import type { PagedApiAdapter } from '../adapters';
5
+ import type { SelectDisplayField } from '../array-table/readOnlyFormatters';
5
6
  import './index.less';
6
7
  /** 选择窗口的行选择模式。 */
7
8
  type DialogSelectionMode = 'single' | 'multiple';
8
9
  interface IDialogSelectProps extends SelectProps<any> {
10
+ /** 回显编码或名称,保持原始 value/label 和联动回调不变。@author nokecy */
11
+ displayField?: SelectDisplayField;
9
12
  /** 隐藏选择窗口入口(输入框内的后缀图标),只保留输入与下拉。 */
10
13
  hideBtn?: boolean;
11
14
  request?: any;
@@ -15,9 +15,11 @@ var _draggableModal = _interopRequireDefault(require("../draggableModal"));
15
15
  var _adapters = require("../adapters");
16
16
  var _controls = require("../readPretty/controls");
17
17
  var _selectValue = require("../readPretty/selectValue");
18
+ var _readOnlyFormatters = require("../array-table/readOnlyFormatters");
19
+ var _cellInteractionLock = require("../array-table/cellInteractionLock");
18
20
  require("./index.less");
19
- var _excluded = ["request", "columnDefs", "value", "labelField", "valueField", "onChangeItem", "hideBtn", "useAutoComplete", "queryFun", "pagedApiAdapter", "modalWidth", "dialogZIndex", "dialogMode", "dialogPageSize", "dialogPageSizeOptions", "dialogGridKey", "dialogDataSource", "dialogIsRowSelectable", "dialogRenderer", "gridComponent"],
20
- _excluded2 = ["request", "columnDefs", "labelField", "valueField", "onChangeItem", "hideBtn", "useAutoComplete", "queryFun", "pagedApiAdapter", "modalWidth", "dialogZIndex", "dialogMode", "dialogPageSize", "dialogPageSizeOptions", "dialogGridKey", "dialogDataSource", "dialogIsRowSelectable", "dialogRenderer", "gridComponent"];
21
+ var _excluded = ["request", "columnDefs", "value", "labelField", "valueField", "displayField", "onChangeItem", "hideBtn", "useAutoComplete", "queryFun", "pagedApiAdapter", "modalWidth", "dialogZIndex", "dialogMode", "dialogPageSize", "dialogPageSizeOptions", "dialogGridKey", "dialogDataSource", "dialogIsRowSelectable", "dialogRenderer", "gridComponent"],
22
+ _excluded2 = ["request", "columnDefs", "labelField", "valueField", "displayField", "onChangeItem", "hideBtn", "useAutoComplete", "queryFun", "pagedApiAdapter", "modalWidth", "dialogZIndex", "dialogMode", "dialogPageSize", "dialogPageSizeOptions", "dialogGridKey", "dialogDataSource", "dialogIsRowSelectable", "dialogRenderer", "gridComponent"];
21
23
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
24
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
23
25
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -49,6 +51,7 @@ var DialogSelectInner = function DialogSelectInner(props) {
49
51
  value = props.value,
50
52
  labelField = props.labelField,
51
53
  valueField = props.valueField,
54
+ displayField = props.displayField,
52
55
  onChangeItem = props.onChangeItem,
53
56
  hideBtn = props.hideBtn,
54
57
  useAutoComplete = props.useAutoComplete,
@@ -78,6 +81,7 @@ var DialogSelectInner = function DialogSelectInner(props) {
78
81
  _useBoolean2$ = _useBoolean2[1],
79
82
  setTrue = _useBoolean2$.setTrue,
80
83
  setFalse = _useBoolean2$.setFalse;
84
+ (0, _cellInteractionLock.useCellInteractionLock)(visible);
81
85
  var _useState = (0, _react2.useState)(undefined),
82
86
  _useState2 = _slicedToArray(_useState, 2),
83
87
  selectRows = _useState2[0],
@@ -149,7 +153,11 @@ var DialogSelectInner = function DialogSelectInner(props) {
149
153
  '--qc-dialog-select-trigger-color': token.colorTextTertiary,
150
154
  '--qc-dialog-select-trigger-hover': token.colorPrimary
151
155
  };
152
- var commonProps = _objectSpread(_objectSpread({}, rest), {}, {
156
+ var commonProps = _objectSpread(_objectSpread(_objectSpread({}, rest), displayField === 'value' ? {
157
+ labelRender: function labelRender(item) {
158
+ return (0, _readOnlyFormatters.formatSelectDisplay)(item, 'value');
159
+ }
160
+ } : {}), {}, {
153
161
  className: mergedClassName,
154
162
  value: state,
155
163
  style: _objectSpread(_objectSpread({}, triggerStyle), rest.style || {})
@@ -289,6 +297,7 @@ var DialogSelect = (0, _react.observer)(function (props) {
289
297
  columnDefs = safeProps.columnDefs,
290
298
  labelField = safeProps.labelField,
291
299
  valueField = safeProps.valueField,
300
+ displayField = safeProps.displayField,
292
301
  onChangeItem = safeProps.onChangeItem,
293
302
  hideBtn = safeProps.hideBtn,
294
303
  useAutoComplete = safeProps.useAutoComplete,
@@ -305,6 +314,7 @@ var DialogSelect = (0, _react.observer)(function (props) {
305
314
  dialogRenderer = safeProps.dialogRenderer,
306
315
  gridComponent = safeProps.gridComponent,
307
316
  selectProps = _objectWithoutProperties(safeProps, _excluded2);
317
+ if (displayField === 'value') return /*#__PURE__*/_react2.default.createElement("span", null, (0, _readOnlyFormatters.formatSelectDisplay)('value' in safeProps ? safeProps.value : safeProps.defaultValue, 'value') || '—');
308
318
  return /*#__PURE__*/_react2.default.createElement(_controls.Select, _extends({}, selectProps, {
309
319
  disabled: true
310
320
  }));