@nokecy/qc-ui 1.1.79 → 1.1.81

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.
@@ -453,18 +453,8 @@ function AgGridPlus(props) {
453
453
  return undefined;
454
454
  };
455
455
 
456
- // 辅助函数: 自定义单元格渲染器
457
- var cellRenderer = function cellRenderer(params) {
458
- var value = params.value,
459
- node = params.node,
460
- colDef = params.colDef;
461
- //@ts-ignore
462
- if (node.isRowPinned() || !colDef.customCellRenderer) {
463
- return value;
464
- }
465
- //@ts-ignore
466
- return colDef.customCellRenderer(params);
467
- };
456
+ // 辅助函数: 自定义单元格渲染器(无自定义渲染器时显示 valueFormatter 的结果,见 renderDefaultCell)
457
+ var cellRenderer = _columnProcessors.renderDefaultCell;
468
458
 
469
459
  // 辅助函数: 处理单个列配置
470
460
  var processColumnConfig = function processColumnConfig(col, data) {
@@ -95,13 +95,24 @@ export declare function processEnumColumn(col: any, dataType?: DataTypeInference
95
95
  * @returns 处理后的列定义
96
96
  */
97
97
  export declare function processEllipsisColumn(col: any): ColDef;
98
+ /**
99
+ * 默认单元格渲染:固定行(合计等)显示原值;数据行有自定义渲染器(`customCellRenderer`)时交给它;
100
+ * 否则显示 `valueFormatted`(列上配了 `valueFormatter` 时由 AG Grid 算好),没配则显示原值。
101
+ *
102
+ * 以前这里直接返回 `params.value`,普通列(没有 `type`、没有自定义渲染器)上写的 `valueFormatter`
103
+ * 被绕过:状态码列显示原码、「0/1」列显示 0/1,而不是格式化后的文字。
104
+ * 固定行保持原行为:格式化函数多按数据行写,空值常被格式化成「—」,不能让合计行冒出占位符。
105
+ *
106
+ * @author nokecy
107
+ */
108
+ export declare function renderDefaultCell(params: ICellRendererParams): any;
98
109
  /**
99
110
  * 创建自定义单元格渲染器包装
100
111
  *
101
- * @param customRenderer 自定义渲染器
112
+ * @param _customRenderer 保留参数,实际取列上的 `customCellRenderer`
102
113
  * @returns 包装后的渲染器
103
114
  */
104
- export declare function createCellRenderer(customRenderer: any): (params: ICellRendererParams) => any;
115
+ export declare function createCellRenderer(_customRenderer?: any): typeof renderDefaultCell;
105
116
  /**
106
117
  * 构建查询表单项
107
118
  *
@@ -12,6 +12,7 @@ exports.inferDataType = inferDataType;
12
12
  exports.mergeInferredColumnType = mergeInferredColumnType;
13
13
  exports.processEllipsisColumn = processEllipsisColumn;
14
14
  exports.processEnumColumn = processEnumColumn;
15
+ exports.renderDefaultCell = renderDefaultCell;
15
16
  exports.toColumnType = toColumnType;
16
17
  var _react = _interopRequireDefault(require("react"));
17
18
  var _antd = require("antd");
@@ -245,26 +246,36 @@ function processEllipsisColumn(col) {
245
246
  });
246
247
  }
247
248
 
249
+ /**
250
+ * 默认单元格渲染:固定行(合计等)显示原值;数据行有自定义渲染器(`customCellRenderer`)时交给它;
251
+ * 否则显示 `valueFormatted`(列上配了 `valueFormatter` 时由 AG Grid 算好),没配则显示原值。
252
+ *
253
+ * 以前这里直接返回 `params.value`,普通列(没有 `type`、没有自定义渲染器)上写的 `valueFormatter`
254
+ * 被绕过:状态码列显示原码、「0/1」列显示 0/1,而不是格式化后的文字。
255
+ * 固定行保持原行为:格式化函数多按数据行写,空值常被格式化成「—」,不能让合计行冒出占位符。
256
+ *
257
+ * @author nokecy
258
+ */
259
+ function renderDefaultCell(params) {
260
+ var _node$isRowPinned;
261
+ var value = params.value,
262
+ valueFormatted = params.valueFormatted,
263
+ node = params.node,
264
+ colDef = params.colDef;
265
+ if (node !== null && node !== void 0 && (_node$isRowPinned = node.isRowPinned) !== null && _node$isRowPinned !== void 0 && _node$isRowPinned.call(node)) return value;
266
+ var customRenderer = colDef === null || colDef === void 0 ? void 0 : colDef.customCellRenderer;
267
+ if (!customRenderer) return valueFormatted !== null && valueFormatted !== void 0 ? valueFormatted : value;
268
+ return customRenderer(params);
269
+ }
270
+
248
271
  /**
249
272
  * 创建自定义单元格渲染器包装
250
273
  *
251
- * @param customRenderer 自定义渲染器
274
+ * @param _customRenderer 保留参数,实际取列上的 `customCellRenderer`
252
275
  * @returns 包装后的渲染器
253
276
  */
254
- function createCellRenderer(customRenderer) {
255
- return function (params) {
256
- var value = params.value,
257
- node = params.node,
258
- colDef = params.colDef;
259
-
260
- // 固定行或没有自定义渲染器时,直接返回值
261
- if (node.isRowPinned() || !colDef.customCellRenderer) {
262
- return value;
263
- }
264
-
265
- // 使用自定义渲染器
266
- return colDef.customCellRenderer(params);
267
- };
277
+ function createCellRenderer(_customRenderer) {
278
+ return renderDefaultCell;
268
279
  }
269
280
 
270
281
  /**
@@ -1,3 +1,4 @@
1
+ import type { ReactNode } from 'react';
1
2
  export type ReadOnlyFormatterCtx = {
2
3
  /** 列的 x-component-props(headerName/width/options/format 等) */
3
4
  columnProps: any;
@@ -15,6 +16,31 @@ export type ReadOnlyFormatter = (value: any, ctx: ReadOnlyFormatterCtx) => strin
15
16
  export declare const fallbackFormatter: ReadOnlyFormatter;
16
17
  /** 消费方扩展自定义只读列的显示逻辑 */
17
18
  export declare const registerReadOnlyFormatter: (component: string, formatter: ReadOnlyFormatter) => void;
19
+ /** 值 -> 名称表:对象 `{ '10': '参与' }`,或与 Select 同形的选项数组 `[{ label, value }]` */
20
+ export type ReadOnlyLabels = Record<string, string> | Array<{
21
+ label?: any;
22
+ value?: any;
23
+ }>;
24
+ /**
25
+ * 给业务自定义选择器登记「值 -> 名称」,ArrayTable 未激活的格子与只读列按名称出文本。
26
+ *
27
+ * 业务组件(如「执行动作」「是否参与校验」这类固定选项的选择器)不在内置注册表里,
28
+ * 格子文本会走兜底格式化器把原值原样显示(10、00 这类编码)。在组件模块里调用一次即可,
29
+ * 所有用到该 x-component 的列都生效;同一组件在不同 Schema 里注册名不同时传名字数组。
30
+ * 按 String 宽松比对(容忍后端返回数字/字符串漂移);labelInValue 对象显示其 label;
31
+ * 数组逐个映射后逗号拼接;表里没有的值原样显示。@author nokecy
32
+ */
33
+ export declare const registerReadOnlyLabels: (component: string | string[], labels: ReadOnlyLabels) => void;
34
+ /** 只读渲染器:按值出一段 React 内容(如组件自己的阅读态 Tag),格子未激活和只读列都用它显示 */
35
+ export type ReadOnlyRenderer = (value: any, ctx: ReadOnlyFormatterCtx) => ReactNode;
36
+ /**
37
+ * 给业务自定义组件登记只读渲染器。登记后 ArrayTable 可编辑列未激活的格子、只读列都渲染它的返回内容,
38
+ * 与组件自己的阅读态一致(例如带颜色的 Tag),仍不挂 Formily 字段树。空值不调用渲染器(出占位/留空)。
39
+ * 只要文字时用 registerReadOnlyLabels;两者都登记时显示走渲染器。@author nokecy
40
+ */
41
+ export declare const registerReadOnlyRenderer: (component: string | string[], renderer: ReadOnlyRenderer) => void;
42
+ /** 取某组件类型的只读渲染器,未登记返回 null */
43
+ export declare const getReadOnlyRenderer: (component: string | undefined) => ReadOnlyRenderer | null;
18
44
  /**
19
45
  * 取某组件类型的只读格式化器。命中返回函数,未命中返回 null(调用方回退 AgField)。
20
46
  */
@@ -3,9 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.registerReadOnlyFormatter = exports.getReadOnlyFormatter = exports.fallbackFormatter = void 0;
6
+ exports.registerReadOnlyRenderer = exports.registerReadOnlyLabels = exports.registerReadOnlyFormatter = exports.getReadOnlyRenderer = exports.getReadOnlyFormatter = exports.fallbackFormatter = void 0;
7
7
  var _dayjs = _interopRequireDefault(require("dayjs"));
8
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
10
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
11
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(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(o, minLen); }
12
+ function _arrayLikeToArray(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; }
13
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
14
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
9
15
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } /**
10
16
  * 只读列「纯文本快路径」格式化器注册表
11
17
  *
@@ -127,6 +133,68 @@ var registerReadOnlyFormatter = exports.registerReadOnlyFormatter = function reg
127
133
  registry[component] = formatter;
128
134
  };
129
135
 
136
+ /** 值 -> 名称表:对象 `{ '10': '参与' }`,或与 Select 同形的选项数组 `[{ label, value }]` */
137
+
138
+ /**
139
+ * 给业务自定义选择器登记「值 -> 名称」,ArrayTable 未激活的格子与只读列按名称出文本。
140
+ *
141
+ * 业务组件(如「执行动作」「是否参与校验」这类固定选项的选择器)不在内置注册表里,
142
+ * 格子文本会走兜底格式化器把原值原样显示(10、00 这类编码)。在组件模块里调用一次即可,
143
+ * 所有用到该 x-component 的列都生效;同一组件在不同 Schema 里注册名不同时传名字数组。
144
+ * 按 String 宽松比对(容忍后端返回数字/字符串漂移);labelInValue 对象显示其 label;
145
+ * 数组逐个映射后逗号拼接;表里没有的值原样显示。@author nokecy
146
+ */
147
+ var registerReadOnlyLabels = exports.registerReadOnlyLabels = function registerReadOnlyLabels(component, labels) {
148
+ var map = new Map();
149
+ if (Array.isArray(labels)) {
150
+ labels.forEach(function (o) {
151
+ var _o$label;
152
+ if (o && o.value != null) map.set(String(o.value), String((_o$label = o.label) !== null && _o$label !== void 0 ? _o$label : o.value));
153
+ });
154
+ } else {
155
+ Object.entries(labels !== null && labels !== void 0 ? labels : {}).forEach(function (_ref7) {
156
+ var _ref8 = _slicedToArray(_ref7, 2),
157
+ k = _ref8[0],
158
+ v = _ref8[1];
159
+ return map.set(String(k), String(v));
160
+ });
161
+ }
162
+ var toText = function toText(v) {
163
+ var _ref9, _v$label, _map$get;
164
+ if (v == null || v === '') return '';
165
+ if (_typeof(v) === 'object') return String((_ref9 = (_v$label = v.label) !== null && _v$label !== void 0 ? _v$label : v.value) !== null && _ref9 !== void 0 ? _ref9 : '');
166
+ return (_map$get = map.get(String(v))) !== null && _map$get !== void 0 ? _map$get : String(v);
167
+ };
168
+ var formatter = function formatter(value) {
169
+ return Array.isArray(value) ? value.map(toText).filter(Boolean).join(', ') : toText(value);
170
+ };
171
+ (Array.isArray(component) ? component : [component]).forEach(function (name) {
172
+ return registerReadOnlyFormatter(name, formatter);
173
+ });
174
+ };
175
+
176
+ /** 只读渲染器:按值出一段 React 内容(如组件自己的阅读态 Tag),格子未激活和只读列都用它显示 */
177
+
178
+ var renderers = {};
179
+
180
+ /**
181
+ * 给业务自定义组件登记只读渲染器。登记后 ArrayTable 可编辑列未激活的格子、只读列都渲染它的返回内容,
182
+ * 与组件自己的阅读态一致(例如带颜色的 Tag),仍不挂 Formily 字段树。空值不调用渲染器(出占位/留空)。
183
+ * 只要文字时用 registerReadOnlyLabels;两者都登记时显示走渲染器。@author nokecy
184
+ */
185
+ var registerReadOnlyRenderer = exports.registerReadOnlyRenderer = function registerReadOnlyRenderer(component, renderer) {
186
+ (Array.isArray(component) ? component : [component]).forEach(function (name) {
187
+ renderers[name] = renderer;
188
+ });
189
+ };
190
+
191
+ /** 取某组件类型的只读渲染器,未登记返回 null */
192
+ var getReadOnlyRenderer = exports.getReadOnlyRenderer = function getReadOnlyRenderer(component) {
193
+ var _renderers$component;
194
+ if (!component) return null;
195
+ return (_renderers$component = renderers[component]) !== null && _renderers$component !== void 0 ? _renderers$component : null;
196
+ };
197
+
130
198
  /**
131
199
  * 取某组件类型的只读格式化器。命中返回函数,未命中返回 null(调用方回退 AgField)。
132
200
  */
@@ -351,6 +351,7 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
351
351
  colDef = params.colDef,
352
352
  context = params.context,
353
353
  formatter = params.formatter,
354
+ renderer = params.renderer,
354
355
  columnProps = params.columnProps,
355
356
  fieldSchema = params.fieldSchema,
356
357
  required = params.required;
@@ -470,6 +471,11 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
470
471
  }
471
472
  }, resolveEmptyPlaceholder(fieldSchema));
472
473
  }
474
+ // 登记了只读渲染器的组件(如带颜色的 Tag)按渲染器出内容,与组件自己的阅读态一致
475
+ var shown = renderer && text !== '' ? renderer(liveValue, {
476
+ columnProps: columnProps,
477
+ fieldSchema: fieldSchema
478
+ }) : text;
473
479
  return /*#__PURE__*/_react.default.createElement("span", {
474
480
  className: "ag-array-table-lazy-text",
475
481
  style: {
@@ -477,7 +483,7 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
477
483
  width: '100%',
478
484
  cursor: 'text'
479
485
  }
480
- }, text);
486
+ }, shown);
481
487
  });
482
488
  };
483
489
 
@@ -497,6 +503,7 @@ var LazyReadOnlyText = exports.LazyReadOnlyText = function LazyReadOnlyText(para
497
503
  record = params.data,
498
504
  colDef = params.colDef,
499
505
  formatter = params.formatter,
506
+ renderer = params.renderer,
500
507
  columnProps = params.columnProps,
501
508
  fieldSchema = params.fieldSchema;
502
509
  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;
@@ -506,13 +513,17 @@ var LazyReadOnlyText = exports.LazyReadOnlyText = function LazyReadOnlyText(para
506
513
  columnProps: columnProps,
507
514
  fieldSchema: fieldSchema
508
515
  }) : liveValue == null ? '' : String(liveValue);
516
+ var shown = renderer && text !== '' ? renderer(liveValue, {
517
+ columnProps: columnProps,
518
+ fieldSchema: fieldSchema
519
+ }) : text;
509
520
  return /*#__PURE__*/_react.default.createElement("span", {
510
521
  className: "ag-array-table-readonly-text",
511
522
  style: {
512
523
  display: 'inline-block',
513
524
  width: '100%'
514
525
  }
515
- }, text);
526
+ }, shown);
516
527
  });
517
528
  };
518
529
 
@@ -632,7 +643,9 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
632
643
  var readOnly = isColumnReadOnlyEligible(arrayPattern, dataField, columnProps);
633
644
  // 可编辑的数据字段(非 void 操作按钮)即使是业务自定义组件,也按兜底格式化器出懒挂载文本,默认阅读态;
634
645
  // 只读列不兜底:自定义只读组件常显示别的字段(如 SiblingText),按自身值出文本会错。@author nokecy
635
- var formatter = (_getReadOnlyFormatter = (0, _readOnlyFormatters.getReadOnlyFormatter)(component)) !== null && _getReadOnlyFormatter !== void 0 ? _getReadOnlyFormatter : !readOnly && component && (dataField === null || dataField === void 0 ? void 0 : dataField.type) !== 'void' ? _readOnlyFormatters.fallbackFormatter : null;
646
+ // 登记了只读渲染器的组件只读列也走快路径(渲染器出内容,兜底格式化器只用于判空)。@author nokecy
647
+ var renderer = (0, _readOnlyFormatters.getReadOnlyRenderer)(component);
648
+ 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;
636
649
  var hasReactions = !!(dataField && dataField['x-reactions']);
637
650
  if (!readOnly) applyNumberInputDefaults(dataField);
638
651
  var forceEager = (columnProps === null || columnProps === void 0 ? void 0 : columnProps.forceAgField) === true;
@@ -665,11 +678,32 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
665
678
  cellRenderer: LazyReadOnlyText,
666
679
  cellRendererParams: {
667
680
  formatter: formatter,
681
+ renderer: renderer,
668
682
  columnProps: columnProps,
669
683
  fieldSchema: dataField
670
684
  }
671
685
  }));
672
686
  }
687
+ if (renderer) {
688
+ // 登记了渲染器:整表阅读态也出渲染器内容(如 Tag),不退化成纯文字
689
+ return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
690
+ valueGetter: valueGetter
691
+ } : {}), {}, {
692
+ cellRenderer: function cellRenderer(params) {
693
+ var ctx = {
694
+ columnProps: columnProps,
695
+ fieldSchema: dataField
696
+ };
697
+ return formatter(params.value, ctx) === '' ? '' : renderer(params.value, ctx);
698
+ },
699
+ valueFormatter: function valueFormatter(params) {
700
+ return formatter(params.value, {
701
+ columnProps: columnProps,
702
+ fieldSchema: dataField
703
+ });
704
+ }
705
+ }));
706
+ }
673
707
  return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
674
708
  valueGetter: valueGetter
675
709
  } : {}), {}, {
@@ -695,6 +729,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
695
729
  schema: schema,
696
730
  field: field,
697
731
  formatter: formatter,
732
+ renderer: renderer,
698
733
  columnProps: columnProps,
699
734
  fieldSchema: dataField,
700
735
  lazyEditable: true,
@@ -29,6 +29,8 @@ export type * from "./importModal";
29
29
  export type * from "./fullScreenAlert";
30
30
  export type * from "./RuleBuilder";
31
31
  export type { ColumnConfig } from "./array-table/columnHelper";
32
+ export { registerReadOnlyFormatter, registerReadOnlyLabels, registerReadOnlyRenderer } from "./array-table/readOnlyFormatters";
33
+ export type { ReadOnlyFormatter, ReadOnlyFormatterCtx, ReadOnlyLabels, ReadOnlyRenderer } from "./array-table/readOnlyFormatters";
32
34
  export type { CentralizedColumnScheme, QueryScheme, SchemeStorageAdapter, SchemeSyncDataDto, CurrentSchemeDto, SchemeStorageConfig, LocalStorageAdapterConfig, BackendApiAdapterConfig, UseSchemeManagerConfig, GridPlusContextValue, GlobalConfigPermissions, } from "./ag-grid-plus";
33
35
  export * from './adapters';
34
36
  export * from "./readPretty";
package/dist/cjs/index.js CHANGED
@@ -48,6 +48,9 @@ var _exportNames = {
48
48
  FlagsSelector: true,
49
49
  MatchItem: true,
50
50
  RegexRailroadDiagram: true,
51
+ registerReadOnlyFormatter: true,
52
+ registerReadOnlyLabels: true,
53
+ registerReadOnlyRenderer: true,
51
54
  createEntitySelect: true,
52
55
  ExportButton: true,
53
56
  buildExportUrl: true,
@@ -380,6 +383,24 @@ Object.defineProperty(exports, "nonNegativeDecimal", {
380
383
  return _businessDecimal.nonNegativeDecimal;
381
384
  }
382
385
  });
386
+ Object.defineProperty(exports, "registerReadOnlyFormatter", {
387
+ enumerable: true,
388
+ get: function get() {
389
+ return _readOnlyFormatters.registerReadOnlyFormatter;
390
+ }
391
+ });
392
+ Object.defineProperty(exports, "registerReadOnlyLabels", {
393
+ enumerable: true,
394
+ get: function get() {
395
+ return _readOnlyFormatters.registerReadOnlyLabels;
396
+ }
397
+ });
398
+ Object.defineProperty(exports, "registerReadOnlyRenderer", {
399
+ enumerable: true,
400
+ get: function get() {
401
+ return _readOnlyFormatters.registerReadOnlyRenderer;
402
+ }
403
+ });
383
404
  Object.defineProperty(exports, "relativeLuminance", {
384
405
  enumerable: true,
385
406
  get: function get() {
@@ -505,6 +526,7 @@ var _standardFormDialog = require("./standardFormDialog");
505
526
  var _deleteConfirm = _interopRequireDefault(require("./deleteConfirm"));
506
527
  var _RuleBuilder = require("./RuleBuilder");
507
528
  var _RegexEditor = require("./components/RegexEditor");
529
+ var _readOnlyFormatters = require("./array-table/readOnlyFormatters");
508
530
  var _adapters = require("./adapters");
509
531
  Object.keys(_adapters).forEach(function (key) {
510
532
  if (key === "default" || key === "__esModule") return;
@@ -36,7 +36,7 @@ import ToolBar from "./toolBar";
36
36
  import SettingItem from "./settingItem";
37
37
  import { RedoOutlined, FilterOutlined } from '@ant-design/icons';
38
38
  import { convertFilterModel, dateTimeValueFormatter, dateValueFormatter, flatten, toTree } from "./utils";
39
- import { mergeInferredColumnType, processEllipsisColumn, processEnumColumn } from "./utils/columnProcessors";
39
+ import { mergeInferredColumnType, processEllipsisColumn, processEnumColumn, renderDefaultCell } from "./utils/columnProcessors";
40
40
  import AdvancedQueryBuilder from "./queryForm/AdvancedQueryBuilder";
41
41
  import { v4 as uuidv4 } from 'uuid';
42
42
  import Setting from "./setting";
@@ -445,18 +445,8 @@ function AgGridPlus(props) {
445
445
  return undefined;
446
446
  };
447
447
 
448
- // 辅助函数: 自定义单元格渲染器
449
- var cellRenderer = function cellRenderer(params) {
450
- var value = params.value,
451
- node = params.node,
452
- colDef = params.colDef;
453
- //@ts-ignore
454
- if (node.isRowPinned() || !colDef.customCellRenderer) {
455
- return value;
456
- }
457
- //@ts-ignore
458
- return colDef.customCellRenderer(params);
459
- };
448
+ // 辅助函数: 自定义单元格渲染器(无自定义渲染器时显示 valueFormatter 的结果,见 renderDefaultCell)
449
+ var cellRenderer = renderDefaultCell;
460
450
 
461
451
  // 辅助函数: 处理单个列配置
462
452
  var processColumnConfig = function processColumnConfig(col, data) {
@@ -95,13 +95,24 @@ export declare function processEnumColumn(col: any, dataType?: DataTypeInference
95
95
  * @returns 处理后的列定义
96
96
  */
97
97
  export declare function processEllipsisColumn(col: any): ColDef;
98
+ /**
99
+ * 默认单元格渲染:固定行(合计等)显示原值;数据行有自定义渲染器(`customCellRenderer`)时交给它;
100
+ * 否则显示 `valueFormatted`(列上配了 `valueFormatter` 时由 AG Grid 算好),没配则显示原值。
101
+ *
102
+ * 以前这里直接返回 `params.value`,普通列(没有 `type`、没有自定义渲染器)上写的 `valueFormatter`
103
+ * 被绕过:状态码列显示原码、「0/1」列显示 0/1,而不是格式化后的文字。
104
+ * 固定行保持原行为:格式化函数多按数据行写,空值常被格式化成「—」,不能让合计行冒出占位符。
105
+ *
106
+ * @author nokecy
107
+ */
108
+ export declare function renderDefaultCell(params: ICellRendererParams): any;
98
109
  /**
99
110
  * 创建自定义单元格渲染器包装
100
111
  *
101
- * @param customRenderer 自定义渲染器
112
+ * @param _customRenderer 保留参数,实际取列上的 `customCellRenderer`
102
113
  * @returns 包装后的渲染器
103
114
  */
104
- export declare function createCellRenderer(customRenderer: any): (params: ICellRendererParams) => any;
115
+ export declare function createCellRenderer(_customRenderer?: any): typeof renderDefaultCell;
105
116
  /**
106
117
  * 构建查询表单项
107
118
  *
@@ -229,26 +229,36 @@ export function processEllipsisColumn(col) {
229
229
  });
230
230
  }
231
231
 
232
+ /**
233
+ * 默认单元格渲染:固定行(合计等)显示原值;数据行有自定义渲染器(`customCellRenderer`)时交给它;
234
+ * 否则显示 `valueFormatted`(列上配了 `valueFormatter` 时由 AG Grid 算好),没配则显示原值。
235
+ *
236
+ * 以前这里直接返回 `params.value`,普通列(没有 `type`、没有自定义渲染器)上写的 `valueFormatter`
237
+ * 被绕过:状态码列显示原码、「0/1」列显示 0/1,而不是格式化后的文字。
238
+ * 固定行保持原行为:格式化函数多按数据行写,空值常被格式化成「—」,不能让合计行冒出占位符。
239
+ *
240
+ * @author nokecy
241
+ */
242
+ export function renderDefaultCell(params) {
243
+ var _node$isRowPinned;
244
+ var value = params.value,
245
+ valueFormatted = params.valueFormatted,
246
+ node = params.node,
247
+ colDef = params.colDef;
248
+ if (node !== null && node !== void 0 && (_node$isRowPinned = node.isRowPinned) !== null && _node$isRowPinned !== void 0 && _node$isRowPinned.call(node)) return value;
249
+ var customRenderer = colDef === null || colDef === void 0 ? void 0 : colDef.customCellRenderer;
250
+ if (!customRenderer) return valueFormatted !== null && valueFormatted !== void 0 ? valueFormatted : value;
251
+ return customRenderer(params);
252
+ }
253
+
232
254
  /**
233
255
  * 创建自定义单元格渲染器包装
234
256
  *
235
- * @param customRenderer 自定义渲染器
257
+ * @param _customRenderer 保留参数,实际取列上的 `customCellRenderer`
236
258
  * @returns 包装后的渲染器
237
259
  */
238
- export function createCellRenderer(customRenderer) {
239
- return function (params) {
240
- var value = params.value,
241
- node = params.node,
242
- colDef = params.colDef;
243
-
244
- // 固定行或没有自定义渲染器时,直接返回值
245
- if (node.isRowPinned() || !colDef.customCellRenderer) {
246
- return value;
247
- }
248
-
249
- // 使用自定义渲染器
250
- return colDef.customCellRenderer(params);
251
- };
260
+ export function createCellRenderer(_customRenderer) {
261
+ return renderDefaultCell;
252
262
  }
253
263
 
254
264
  /**
@@ -1,3 +1,4 @@
1
+ import type { ReactNode } from 'react';
1
2
  export type ReadOnlyFormatterCtx = {
2
3
  /** 列的 x-component-props(headerName/width/options/format 等) */
3
4
  columnProps: any;
@@ -15,6 +16,31 @@ export type ReadOnlyFormatter = (value: any, ctx: ReadOnlyFormatterCtx) => strin
15
16
  export declare const fallbackFormatter: ReadOnlyFormatter;
16
17
  /** 消费方扩展自定义只读列的显示逻辑 */
17
18
  export declare const registerReadOnlyFormatter: (component: string, formatter: ReadOnlyFormatter) => void;
19
+ /** 值 -> 名称表:对象 `{ '10': '参与' }`,或与 Select 同形的选项数组 `[{ label, value }]` */
20
+ export type ReadOnlyLabels = Record<string, string> | Array<{
21
+ label?: any;
22
+ value?: any;
23
+ }>;
24
+ /**
25
+ * 给业务自定义选择器登记「值 -> 名称」,ArrayTable 未激活的格子与只读列按名称出文本。
26
+ *
27
+ * 业务组件(如「执行动作」「是否参与校验」这类固定选项的选择器)不在内置注册表里,
28
+ * 格子文本会走兜底格式化器把原值原样显示(10、00 这类编码)。在组件模块里调用一次即可,
29
+ * 所有用到该 x-component 的列都生效;同一组件在不同 Schema 里注册名不同时传名字数组。
30
+ * 按 String 宽松比对(容忍后端返回数字/字符串漂移);labelInValue 对象显示其 label;
31
+ * 数组逐个映射后逗号拼接;表里没有的值原样显示。@author nokecy
32
+ */
33
+ export declare const registerReadOnlyLabels: (component: string | string[], labels: ReadOnlyLabels) => void;
34
+ /** 只读渲染器:按值出一段 React 内容(如组件自己的阅读态 Tag),格子未激活和只读列都用它显示 */
35
+ export type ReadOnlyRenderer = (value: any, ctx: ReadOnlyFormatterCtx) => ReactNode;
36
+ /**
37
+ * 给业务自定义组件登记只读渲染器。登记后 ArrayTable 可编辑列未激活的格子、只读列都渲染它的返回内容,
38
+ * 与组件自己的阅读态一致(例如带颜色的 Tag),仍不挂 Formily 字段树。空值不调用渲染器(出占位/留空)。
39
+ * 只要文字时用 registerReadOnlyLabels;两者都登记时显示走渲染器。@author nokecy
40
+ */
41
+ export declare const registerReadOnlyRenderer: (component: string | string[], renderer: ReadOnlyRenderer) => void;
42
+ /** 取某组件类型的只读渲染器,未登记返回 null */
43
+ export declare const getReadOnlyRenderer: (component: string | undefined) => ReadOnlyRenderer | null;
18
44
  /**
19
45
  * 取某组件类型的只读格式化器。命中返回函数,未命中返回 null(调用方回退 AgField)。
20
46
  */
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(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(o, minLen); }
4
+ function _arrayLikeToArray(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; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
1
7
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
8
  /**
3
9
  * 只读列「纯文本快路径」格式化器注册表
@@ -121,6 +127,68 @@ export var registerReadOnlyFormatter = function registerReadOnlyFormatter(compon
121
127
  registry[component] = formatter;
122
128
  };
123
129
 
130
+ /** 值 -> 名称表:对象 `{ '10': '参与' }`,或与 Select 同形的选项数组 `[{ label, value }]` */
131
+
132
+ /**
133
+ * 给业务自定义选择器登记「值 -> 名称」,ArrayTable 未激活的格子与只读列按名称出文本。
134
+ *
135
+ * 业务组件(如「执行动作」「是否参与校验」这类固定选项的选择器)不在内置注册表里,
136
+ * 格子文本会走兜底格式化器把原值原样显示(10、00 这类编码)。在组件模块里调用一次即可,
137
+ * 所有用到该 x-component 的列都生效;同一组件在不同 Schema 里注册名不同时传名字数组。
138
+ * 按 String 宽松比对(容忍后端返回数字/字符串漂移);labelInValue 对象显示其 label;
139
+ * 数组逐个映射后逗号拼接;表里没有的值原样显示。@author nokecy
140
+ */
141
+ export var registerReadOnlyLabels = function registerReadOnlyLabels(component, labels) {
142
+ var map = new Map();
143
+ if (Array.isArray(labels)) {
144
+ labels.forEach(function (o) {
145
+ var _o$label;
146
+ if (o && o.value != null) map.set(String(o.value), String((_o$label = o.label) !== null && _o$label !== void 0 ? _o$label : o.value));
147
+ });
148
+ } else {
149
+ Object.entries(labels !== null && labels !== void 0 ? labels : {}).forEach(function (_ref7) {
150
+ var _ref8 = _slicedToArray(_ref7, 2),
151
+ k = _ref8[0],
152
+ v = _ref8[1];
153
+ return map.set(String(k), String(v));
154
+ });
155
+ }
156
+ var toText = function toText(v) {
157
+ var _ref9, _v$label, _map$get;
158
+ if (v == null || v === '') return '';
159
+ if (_typeof(v) === 'object') return String((_ref9 = (_v$label = v.label) !== null && _v$label !== void 0 ? _v$label : v.value) !== null && _ref9 !== void 0 ? _ref9 : '');
160
+ return (_map$get = map.get(String(v))) !== null && _map$get !== void 0 ? _map$get : String(v);
161
+ };
162
+ var formatter = function formatter(value) {
163
+ return Array.isArray(value) ? value.map(toText).filter(Boolean).join(', ') : toText(value);
164
+ };
165
+ (Array.isArray(component) ? component : [component]).forEach(function (name) {
166
+ return registerReadOnlyFormatter(name, formatter);
167
+ });
168
+ };
169
+
170
+ /** 只读渲染器:按值出一段 React 内容(如组件自己的阅读态 Tag),格子未激活和只读列都用它显示 */
171
+
172
+ var renderers = {};
173
+
174
+ /**
175
+ * 给业务自定义组件登记只读渲染器。登记后 ArrayTable 可编辑列未激活的格子、只读列都渲染它的返回内容,
176
+ * 与组件自己的阅读态一致(例如带颜色的 Tag),仍不挂 Formily 字段树。空值不调用渲染器(出占位/留空)。
177
+ * 只要文字时用 registerReadOnlyLabels;两者都登记时显示走渲染器。@author nokecy
178
+ */
179
+ export var registerReadOnlyRenderer = function registerReadOnlyRenderer(component, renderer) {
180
+ (Array.isArray(component) ? component : [component]).forEach(function (name) {
181
+ renderers[name] = renderer;
182
+ });
183
+ };
184
+
185
+ /** 取某组件类型的只读渲染器,未登记返回 null */
186
+ export var getReadOnlyRenderer = function getReadOnlyRenderer(component) {
187
+ var _renderers$component;
188
+ if (!component) return null;
189
+ return (_renderers$component = renderers[component]) !== null && _renderers$component !== void 0 ? _renderers$component : null;
190
+ };
191
+
124
192
  /**
125
193
  * 取某组件类型的只读格式化器。命中返回函数,未命中返回 null(调用方回退 AgField)。
126
194
  */