@nokecy/qc-ui 1.1.80 → 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.
@@ -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;
@@ -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
  */
@@ -22,7 +22,7 @@ import { useField, useFieldSchema, RecursionField, Observer, useExpressionScope
22
22
  import { isArr, lazyMerge } from '@formily/shared';
23
23
  import { Schema } from '@formily/json-schema';
24
24
  import ArrayBase from "./arrayBase";
25
- import { fallbackFormatter, getReadOnlyFormatter } from "./readOnlyFormatters";
25
+ import { fallbackFormatter, getReadOnlyFormatter, getReadOnlyRenderer } from "./readOnlyFormatters";
26
26
  import { markHeaderGroup } from "./columnGroup";
27
27
  import { CellFocusScope } from "./cellFocusScope";
28
28
  var isColumnComponent = function isColumnComponent(schema) {
@@ -342,6 +342,7 @@ var LazyAgField = function LazyAgField(params) {
342
342
  colDef = params.colDef,
343
343
  context = params.context,
344
344
  formatter = params.formatter,
345
+ renderer = params.renderer,
345
346
  columnProps = params.columnProps,
346
347
  fieldSchema = params.fieldSchema,
347
348
  required = params.required;
@@ -461,6 +462,11 @@ var LazyAgField = function LazyAgField(params) {
461
462
  }
462
463
  }, resolveEmptyPlaceholder(fieldSchema));
463
464
  }
465
+ // 登记了只读渲染器的组件(如带颜色的 Tag)按渲染器出内容,与组件自己的阅读态一致
466
+ var shown = renderer && text !== '' ? renderer(liveValue, {
467
+ columnProps: columnProps,
468
+ fieldSchema: fieldSchema
469
+ }) : text;
464
470
  return /*#__PURE__*/React.createElement("span", {
465
471
  className: "ag-array-table-lazy-text",
466
472
  style: {
@@ -468,7 +474,7 @@ var LazyAgField = function LazyAgField(params) {
468
474
  width: '100%',
469
475
  cursor: 'text'
470
476
  }
471
- }, text);
477
+ }, shown);
472
478
  });
473
479
  };
474
480
 
@@ -488,6 +494,7 @@ var LazyReadOnlyText = function LazyReadOnlyText(params) {
488
494
  record = params.data,
489
495
  colDef = params.colDef,
490
496
  formatter = params.formatter,
497
+ renderer = params.renderer,
491
498
  columnProps = params.columnProps,
492
499
  fieldSchema = params.fieldSchema;
493
500
  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;
@@ -497,13 +504,17 @@ var LazyReadOnlyText = function LazyReadOnlyText(params) {
497
504
  columnProps: columnProps,
498
505
  fieldSchema: fieldSchema
499
506
  }) : liveValue == null ? '' : String(liveValue);
507
+ var shown = renderer && text !== '' ? renderer(liveValue, {
508
+ columnProps: columnProps,
509
+ fieldSchema: fieldSchema
510
+ }) : text;
500
511
  return /*#__PURE__*/React.createElement("span", {
501
512
  className: "ag-array-table-readonly-text",
502
513
  style: {
503
514
  display: 'inline-block',
504
515
  width: '100%'
505
516
  }
506
- }, text);
517
+ }, shown);
507
518
  });
508
519
  };
509
520
 
@@ -623,7 +634,9 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
623
634
  var readOnly = isColumnReadOnlyEligible(arrayPattern, dataField, columnProps);
624
635
  // 可编辑的数据字段(非 void 操作按钮)即使是业务自定义组件,也按兜底格式化器出懒挂载文本,默认阅读态;
625
636
  // 只读列不兜底:自定义只读组件常显示别的字段(如 SiblingText),按自身值出文本会错。@author nokecy
626
- var formatter = (_getReadOnlyFormatter = getReadOnlyFormatter(component)) !== null && _getReadOnlyFormatter !== void 0 ? _getReadOnlyFormatter : !readOnly && component && (dataField === null || dataField === void 0 ? void 0 : dataField.type) !== 'void' ? fallbackFormatter : null;
637
+ // 登记了只读渲染器的组件只读列也走快路径(渲染器出内容,兜底格式化器只用于判空)。@author nokecy
638
+ var renderer = getReadOnlyRenderer(component);
639
+ var formatter = (_getReadOnlyFormatter = getReadOnlyFormatter(component)) !== null && _getReadOnlyFormatter !== void 0 ? _getReadOnlyFormatter : (!readOnly || renderer) && component && (dataField === null || dataField === void 0 ? void 0 : dataField.type) !== 'void' ? fallbackFormatter : null;
627
640
  var hasReactions = !!(dataField && dataField['x-reactions']);
628
641
  if (!readOnly) applyNumberInputDefaults(dataField);
629
642
  var forceEager = (columnProps === null || columnProps === void 0 ? void 0 : columnProps.forceAgField) === true;
@@ -656,11 +669,32 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
656
669
  cellRenderer: LazyReadOnlyText,
657
670
  cellRendererParams: {
658
671
  formatter: formatter,
672
+ renderer: renderer,
659
673
  columnProps: columnProps,
660
674
  fieldSchema: dataField
661
675
  }
662
676
  }));
663
677
  }
678
+ if (renderer) {
679
+ // 登记了渲染器:整表阅读态也出渲染器内容(如 Tag),不退化成纯文字
680
+ return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
681
+ valueGetter: valueGetter
682
+ } : {}), {}, {
683
+ cellRenderer: function cellRenderer(params) {
684
+ var ctx = {
685
+ columnProps: columnProps,
686
+ fieldSchema: dataField
687
+ };
688
+ return formatter(params.value, ctx) === '' ? '' : renderer(params.value, ctx);
689
+ },
690
+ valueFormatter: function valueFormatter(params) {
691
+ return formatter(params.value, {
692
+ columnProps: columnProps,
693
+ fieldSchema: dataField
694
+ });
695
+ }
696
+ }));
697
+ }
664
698
  return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
665
699
  valueGetter: valueGetter
666
700
  } : {}), {}, {
@@ -686,6 +720,7 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
686
720
  schema: schema,
687
721
  field: field,
688
722
  formatter: formatter,
723
+ renderer: renderer,
689
724
  columnProps: columnProps,
690
725
  fieldSchema: dataField,
691
726
  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/esm/index.js CHANGED
@@ -35,6 +35,9 @@ useSchemeManager, useGridSchemes, LocalStorageSchemeAdapter, BackendApiSchemeAda
35
35
 
36
36
  // 导出类型定义
37
37
 
38
+ // ArrayTable 格子文本:业务自定义组件登记「值 -> 名称」或自定义格式化器
39
+ export { registerReadOnlyFormatter, registerReadOnlyLabels, registerReadOnlyRenderer } from "./array-table/readOnlyFormatters";
40
+
38
41
  // 集中式方案管理类型
39
42
 
40
43
  // 注意: 旧的方案管理类型已废弃