@nokecy/qc-ui 1.1.80 → 1.1.82

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;
@@ -640,6 +653,9 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
640
653
  // 懒挂载会把它降成「是/否」纯文本(点击才挂出开关),用户会以为开关消失。故可编辑态强制 eager。
641
654
  // 只读态(下方 ① 路径)仍走「是/否」文本快路径不受影响。@author nokecy
642
655
  var isInlineToggle = component === 'Switch' || component === 'Checkbox';
656
+ // ArrayTableIndex 靠「挂载时 useEffect 调 onChange(index+1)」把行号写进数据字段(如工艺路线的 sort)。
657
+ // 懒挂载只出文本、不挂真组件,effect 永远不执行,新增行的行号字段就是空的,故强制 eager。@author nokecy
658
+ var isIndexWriter = component === 'ArrayTableIndex';
643
659
 
644
660
  // formatter 路径(只读快路径/懒挂载)经 AG-Grid params.value 取值,而 params.value 由 colDef.field(=name)驱动。
645
661
  // 但设计器生成的 schema 里 Column key 多为随机 designable-id 且无 dataIndex,真实数据键在内层字段 name 上,
@@ -665,11 +681,32 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
665
681
  cellRenderer: LazyReadOnlyText,
666
682
  cellRendererParams: {
667
683
  formatter: formatter,
684
+ renderer: renderer,
668
685
  columnProps: columnProps,
669
686
  fieldSchema: dataField
670
687
  }
671
688
  }));
672
689
  }
690
+ if (renderer) {
691
+ // 登记了渲染器:整表阅读态也出渲染器内容(如 Tag),不退化成纯文字
692
+ return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
693
+ valueGetter: valueGetter
694
+ } : {}), {}, {
695
+ cellRenderer: function cellRenderer(params) {
696
+ var ctx = {
697
+ columnProps: columnProps,
698
+ fieldSchema: dataField
699
+ };
700
+ return formatter(params.value, ctx) === '' ? '' : renderer(params.value, ctx);
701
+ },
702
+ valueFormatter: function valueFormatter(params) {
703
+ return formatter(params.value, {
704
+ columnProps: columnProps,
705
+ fieldSchema: dataField
706
+ });
707
+ }
708
+ }));
709
+ }
673
710
  return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
674
711
  valueGetter: valueGetter
675
712
  } : {}), {}, {
@@ -685,7 +722,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
685
722
  }
686
723
 
687
724
  // ② 可编辑懒挂载(排除单击直控的 Switch/Checkbox:须 eager 出真控件)
688
- if (!readOnly && formatter && !hasReactions && !forceEager && !isInlineToggle && canFastPath) {
725
+ if (!readOnly && formatter && !hasReactions && !forceEager && !isInlineToggle && !isIndexWriter && canFastPath) {
689
726
  return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
690
727
  valueGetter: valueGetter
691
728
  } : {}), {}, {
@@ -695,6 +732,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
695
732
  schema: schema,
696
733
  field: field,
697
734
  formatter: formatter,
735
+ renderer: renderer,
698
736
  columnProps: columnProps,
699
737
  fieldSchema: dataField,
700
738
  lazyEditable: true,
@@ -10,10 +10,12 @@ var _arrayBase = require("../array-table/arrayBase");
10
10
  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); }
11
11
  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; }
12
12
  var _default = exports.default = function _default(props) {
13
- var onChange = props.onChange;
13
+ var onChange = props.onChange,
14
+ value = props.value;
14
15
  var index = _arrayBase.ArrayBase.useIndex();
15
16
  (0, _react.useEffect)(function () {
16
- onChange(index + 1);
17
- }, [index]);
17
+ // 行号变了、或字段值被外部覆盖/清空(如 setValues、重置)而不等于行号时,重新写入
18
+ if (value !== index + 1) onChange(index + 1);
19
+ }, [index, value]);
18
20
  return /*#__PURE__*/_react.default.createElement("span", props, "#", index + 1, ".");
19
21
  };
@@ -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;
@@ -631,6 +644,9 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
631
644
  // 懒挂载会把它降成「是/否」纯文本(点击才挂出开关),用户会以为开关消失。故可编辑态强制 eager。
632
645
  // 只读态(下方 ① 路径)仍走「是/否」文本快路径不受影响。@author nokecy
633
646
  var isInlineToggle = component === 'Switch' || component === 'Checkbox';
647
+ // ArrayTableIndex 靠「挂载时 useEffect 调 onChange(index+1)」把行号写进数据字段(如工艺路线的 sort)。
648
+ // 懒挂载只出文本、不挂真组件,effect 永远不执行,新增行的行号字段就是空的,故强制 eager。@author nokecy
649
+ var isIndexWriter = component === 'ArrayTableIndex';
634
650
 
635
651
  // formatter 路径(只读快路径/懒挂载)经 AG-Grid params.value 取值,而 params.value 由 colDef.field(=name)驱动。
636
652
  // 但设计器生成的 schema 里 Column key 多为随机 designable-id 且无 dataIndex,真实数据键在内层字段 name 上,
@@ -656,11 +672,32 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
656
672
  cellRenderer: LazyReadOnlyText,
657
673
  cellRendererParams: {
658
674
  formatter: formatter,
675
+ renderer: renderer,
659
676
  columnProps: columnProps,
660
677
  fieldSchema: dataField
661
678
  }
662
679
  }));
663
680
  }
681
+ if (renderer) {
682
+ // 登记了渲染器:整表阅读态也出渲染器内容(如 Tag),不退化成纯文字
683
+ return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
684
+ valueGetter: valueGetter
685
+ } : {}), {}, {
686
+ cellRenderer: function cellRenderer(params) {
687
+ var ctx = {
688
+ columnProps: columnProps,
689
+ fieldSchema: dataField
690
+ };
691
+ return formatter(params.value, ctx) === '' ? '' : renderer(params.value, ctx);
692
+ },
693
+ valueFormatter: function valueFormatter(params) {
694
+ return formatter(params.value, {
695
+ columnProps: columnProps,
696
+ fieldSchema: dataField
697
+ });
698
+ }
699
+ }));
700
+ }
664
701
  return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
665
702
  valueGetter: valueGetter
666
703
  } : {}), {}, {
@@ -676,7 +713,7 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
676
713
  }
677
714
 
678
715
  // ② 可编辑懒挂载(排除单击直控的 Switch/Checkbox:须 eager 出真控件)
679
- if (!readOnly && formatter && !hasReactions && !forceEager && !isInlineToggle && canFastPath) {
716
+ if (!readOnly && formatter && !hasReactions && !forceEager && !isInlineToggle && !isIndexWriter && canFastPath) {
680
717
  return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
681
718
  valueGetter: valueGetter
682
719
  } : {}), {}, {
@@ -686,6 +723,7 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
686
723
  schema: schema,
687
724
  field: field,
688
725
  formatter: formatter,
726
+ renderer: renderer,
689
727
  columnProps: columnProps,
690
728
  fieldSchema: dataField,
691
729
  lazyEditable: true,
@@ -1,10 +1,12 @@
1
1
  import React, { useEffect } from 'react';
2
2
  import { ArrayBase } from "../array-table/arrayBase";
3
3
  export default (function (props) {
4
- var onChange = props.onChange;
4
+ var onChange = props.onChange,
5
+ value = props.value;
5
6
  var index = ArrayBase.useIndex();
6
7
  useEffect(function () {
7
- onChange(index + 1);
8
- }, [index]);
8
+ // 行号变了、或字段值被外部覆盖/清空(如 setValues、重置)而不等于行号时,重新写入
9
+ if (value !== index + 1) onChange(index + 1);
10
+ }, [index, value]);
9
11
  return /*#__PURE__*/React.createElement("span", props, "#", index + 1, ".");
10
12
  });
@@ -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
  // 注意: 旧的方案管理类型已废弃