@nokecy/qc-ui 1.1.49 → 1.1.51

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,9 +1,4 @@
1
1
  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
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
2
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
8
3
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
4
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
@@ -11,6 +6,11 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
11
6
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
12
7
  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); }
13
8
  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; }
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
13
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
14
14
  /**
15
15
  * 表头分组配置工具函数
16
16
  * 负责 Grid State 与扁平化配置之间的转换
@@ -25,6 +25,39 @@ export var generateId = function generateId() {
25
25
  return uniqueId('col_');
26
26
  };
27
27
 
28
+ /**
29
+ * 去掉只做查询条件的列(hideInTable),含分组内的
30
+ * 这类列只进查询表单,不是表格列:列方案的还原、新增列检测都不能把它带进表格
31
+ * @author nokecy
32
+ */
33
+ export function excludeQueryOnlyColumns(defs) {
34
+ return defs === null || defs === void 0 ? void 0 : defs.filter(function (def) {
35
+ return !def.hideInTable;
36
+ }).map(function (def) {
37
+ return 'children' in def && def.children ? _objectSpread(_objectSpread({}, def), {}, {
38
+ children: excludeQueryOnlyColumns(def.children)
39
+ }) : def;
40
+ });
41
+ }
42
+
43
+ /**
44
+ * 从已存的列方案中去掉只做查询条件的列
45
+ * 旧版本方案会把它们当新增列存进去,还原时要按当前列定义剔除
46
+ * @author nokecy
47
+ */
48
+ export function dropQueryOnlyItems(flatConfig, originalColumnDefs) {
49
+ var queryOnlyFields = new Set();
50
+ var collect = function collect(defs) {
51
+ return defs.forEach(function (def) {
52
+ if ('children' in def && def.children) collect(def.children);else if (def.hideInTable && def.field) queryOnlyFields.add(def.field);
53
+ });
54
+ };
55
+ collect(originalColumnDefs !== null && originalColumnDefs !== void 0 ? originalColumnDefs : []);
56
+ return flatConfig.filter(function (item) {
57
+ return item.type !== 'column' || !item.field || !queryOnlyFields.has(item.field);
58
+ });
59
+ }
60
+
28
61
  /**
29
62
  * Grid State → 扁平化配置
30
63
  * 将 AG-Grid 的树形结构转换为扁平化数组,用于 UI 展示和编辑
@@ -134,6 +167,10 @@ export function gridStateToFlatConfig(columnDefs, originalColumnDefs) {
134
167
  * @returns AG-Grid 列定义数组
135
168
  */
136
169
  export function flatConfigToGridState(flatConfig, originalColumnDefs) {
170
+ // 只做查询条件的列不进表格:方案里存过的剔除,也不当新增列补回 @author nokecy
171
+ flatConfig = dropQueryOnlyItems(flatConfig, originalColumnDefs);
172
+ originalColumnDefs = excludeQueryOnlyColumns(originalColumnDefs);
173
+
137
174
  /**
138
175
  * 从原始列定义中查找指定字段的列定义(支持递归查找分组内的列)
139
176
  */
@@ -451,6 +488,10 @@ export function isOldSchemeData(data) {
451
488
  * @returns AG-Grid columnState 数组
452
489
  */
453
490
  export function flatConfigToColumnState(flatConfig, originalColumnDefs) {
491
+ // 只做查询条件的列不进表格:方案里存过的剔除,也不当新增列补回 @author nokecy
492
+ flatConfig = dropQueryOnlyItems(flatConfig, originalColumnDefs);
493
+ originalColumnDefs = excludeQueryOnlyColumns(originalColumnDefs);
494
+
454
495
  /**
455
496
  * 递归收集所有列定义(包括分组内的列)
456
497
  */
@@ -0,0 +1,39 @@
1
+ /**
2
+ * ArrayTable 分组表头(多级表头)。
3
+ *
4
+ * 背景:schema 里的每个 ArrayTable.Column 被抽成「扁平」列定义(buildArrayTableColumns),
5
+ * 内部一批逻辑(懒挂载列识别、列方案还原、首列拖拽等)都按扁平列取值,不能改。
6
+ * 所以分组只在「交给 AG-Grid 的那一份 columnDefs」上做:
7
+ * 1. buildArrayTableColumns 生成列定义时,用 markHeaderGroup 把列声明的 headerGroup 记下来;
8
+ * 2. index.tsx 把扁平列定义交给 groupColumnDefs,得到含列组的 columnDefs 传给 AgGridReact。
9
+ *
10
+ * 分组名记在模块内的 WeakMap 里,不往 colDef 上塞自定义字段——AG-Grid 会把未知属性当作错误告警。
11
+ *
12
+ * 只支持一级分组;分组名相同但不相邻的列各自成组。
13
+ *
14
+ * @author nokecy
15
+ */
16
+ import type { ColDef, ColGroupDef } from 'ag-grid-community';
17
+ /**
18
+ * 记下列定义所属的表头分组。
19
+ * headerGroup 不是非空字符串(没声明、空串、纯空白)时不做任何事,该列按无分组处理。
20
+ * 返回传入的 colDef 本身,方便链式使用。
21
+ */
22
+ export declare const markHeaderGroup: <T extends object>(colDef: T, headerGroup: unknown) => T;
23
+ /**
24
+ * 把扁平列定义按「相邻且 headerGroup 相同」合并成 AG-Grid 列组。
25
+ *
26
+ * - 相邻同名的列 -> 一个 { headerName, groupId, children } 列组;
27
+ * - 同名但被别的列隔开 -> 各自成组,groupId 各不相同;
28
+ * - 没声明分组的列原样保留(同一个对象);
29
+ * - 一个分组也没有时直接返回传入的数组本身,没用到分组的表格行为零变化。
30
+ *
31
+ * groupId 由分组名派生(同名第 N 次出现追加 _N),同样的输入永远得到同样的 id:
32
+ * columnDefs 因别的原因重建时,AG-Grid 靠 groupId 认出还是那个列组,列组状态不丢。
33
+ *
34
+ * 有意不设 marryChildren:设了以后,任何打破组内相邻的列顺序(用户旧的扁平列方案、
35
+ * 列设置面板里跨组拖动的实时预览)都会被 AG-Grid 整体丢弃并报 error #39;不设则顺序照常生效,
36
+ * 组被隔开时表头显示成多段。
37
+ * openByDefault:列组默认展开(只对配了 columnGroupShow 的可折叠列组有意义)。
38
+ */
39
+ export declare const groupColumnDefs: (colDefs: ColDef[]) => (ColDef | ColGroupDef)[];
@@ -0,0 +1,100 @@
1
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
2
+ 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); }
3
+ 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; }
4
+ /**
5
+ * ArrayTable 分组表头(多级表头)。
6
+ *
7
+ * 背景:schema 里的每个 ArrayTable.Column 被抽成「扁平」列定义(buildArrayTableColumns),
8
+ * 内部一批逻辑(懒挂载列识别、列方案还原、首列拖拽等)都按扁平列取值,不能改。
9
+ * 所以分组只在「交给 AG-Grid 的那一份 columnDefs」上做:
10
+ * 1. buildArrayTableColumns 生成列定义时,用 markHeaderGroup 把列声明的 headerGroup 记下来;
11
+ * 2. index.tsx 把扁平列定义交给 groupColumnDefs,得到含列组的 columnDefs 传给 AgGridReact。
12
+ *
13
+ * 分组名记在模块内的 WeakMap 里,不往 colDef 上塞自定义字段——AG-Grid 会把未知属性当作错误告警。
14
+ *
15
+ * 只支持一级分组;分组名相同但不相邻的列各自成组。
16
+ *
17
+ * @author nokecy
18
+ */
19
+
20
+ /** 列定义 -> 它在 schema 里声明的 headerGroup */
21
+ var headerGroupOf = new WeakMap();
22
+
23
+ /** 列组 id 前缀,与列方案里生成的 col_N 区分开 */
24
+ var GROUP_ID_PREFIX = 'arrayTableGroup_';
25
+
26
+ /**
27
+ * 记下列定义所属的表头分组。
28
+ * headerGroup 不是非空字符串(没声明、空串、纯空白)时不做任何事,该列按无分组处理。
29
+ * 返回传入的 colDef 本身,方便链式使用。
30
+ */
31
+ export var markHeaderGroup = function markHeaderGroup(colDef, headerGroup) {
32
+ if (typeof headerGroup === 'string' && headerGroup.trim() !== '') {
33
+ headerGroupOf.set(colDef, headerGroup);
34
+ }
35
+ return colDef;
36
+ };
37
+
38
+ /**
39
+ * 把扁平列定义按「相邻且 headerGroup 相同」合并成 AG-Grid 列组。
40
+ *
41
+ * - 相邻同名的列 -> 一个 { headerName, groupId, children } 列组;
42
+ * - 同名但被别的列隔开 -> 各自成组,groupId 各不相同;
43
+ * - 没声明分组的列原样保留(同一个对象);
44
+ * - 一个分组也没有时直接返回传入的数组本身,没用到分组的表格行为零变化。
45
+ *
46
+ * groupId 由分组名派生(同名第 N 次出现追加 _N),同样的输入永远得到同样的 id:
47
+ * columnDefs 因别的原因重建时,AG-Grid 靠 groupId 认出还是那个列组,列组状态不丢。
48
+ *
49
+ * 有意不设 marryChildren:设了以后,任何打破组内相邻的列顺序(用户旧的扁平列方案、
50
+ * 列设置面板里跨组拖动的实时预览)都会被 AG-Grid 整体丢弃并报 error #39;不设则顺序照常生效,
51
+ * 组被隔开时表头显示成多段。
52
+ * openByDefault:列组默认展开(只对配了 columnGroupShow 的可折叠列组有意义)。
53
+ */
54
+ export var groupColumnDefs = function groupColumnDefs(colDefs) {
55
+ if (!colDefs.some(function (colDef) {
56
+ return headerGroupOf.has(colDef);
57
+ })) return colDefs;
58
+ var usedGroupIds = new Set();
59
+ var makeGroupId = function makeGroupId(name) {
60
+ var id = "".concat(GROUP_ID_PREFIX).concat(name);
61
+ for (var n = 2; usedGroupIds.has(id); n++) {
62
+ id = "".concat(GROUP_ID_PREFIX).concat(name, "_").concat(n);
63
+ }
64
+ usedGroupIds.add(id);
65
+ return id;
66
+ };
67
+ var result = [];
68
+ var current = null;
69
+ var _iterator = _createForOfIteratorHelper(colDefs),
70
+ _step;
71
+ try {
72
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
73
+ var colDef = _step.value;
74
+ var name = headerGroupOf.get(colDef);
75
+ if (name === undefined) {
76
+ current = null;
77
+ result.push(colDef);
78
+ } else if (current && current.name === name) {
79
+ current.group.children.push(colDef);
80
+ } else {
81
+ var group = {
82
+ headerName: name,
83
+ groupId: makeGroupId(name),
84
+ openByDefault: true,
85
+ children: [colDef]
86
+ };
87
+ current = {
88
+ name: name,
89
+ group: group
90
+ };
91
+ result.push(group);
92
+ }
93
+ }
94
+ } catch (err) {
95
+ _iterator.e(err);
96
+ } finally {
97
+ _iterator.f();
98
+ }
99
+ return result;
100
+ };
@@ -18,6 +18,7 @@ import { useFieldSchema } from "@formily/react";
18
18
  import { connect, mapProps, mapReadPretty } from "@formily/react";
19
19
  import uniqueId from "lodash/uniqueId";
20
20
  import { useAddition, buildArrayTableColumns, useArrayTableSources, useArrayTableActions, isColumnComponent } from "./utils";
21
+ import { groupColumnDefs } from "./columnGroup";
21
22
  import { useCellFocus, useKeyboardNavigation, useRowDrag } from "./hooks";
22
23
  import ArrayBase from "./arrayBase";
23
24
  import ArrayAddBtn from "./arrayAddBtn";
@@ -78,14 +79,16 @@ var ArrayTableInner = observer(function (props) {
78
79
  // 通过 JSON.stringify 比较内容,只有内容真正变化时才返回新引用
79
80
  var sourcesKey = useMemo(function () {
80
81
  return JSON.stringify(rawSources.map(function (s) {
81
- var _s$columnProps$header, _s$columnProps, _s$columnProps2;
82
+ var _s$columnProps$header, _s$columnProps, _s$columnProps2, _s$columnProps3;
82
83
  return {
83
84
  name: s.name,
84
85
  display: s.display,
85
86
  // 列标题可由 reactions 运行时改写,纳入 key 才能让 stableColumnDefs 跟着重建。
86
87
  // 宽度/隐藏/固定由 applyColumnState(方案)管,故意不纳入,避免行编辑时列状态被重置。
87
88
  // 可编辑性:带 x-reactions 的列在 buildArrayTableColumns 里已强制走 AgField 全树(尊重运行时 pattern),无需进 key。@author nokecy
88
- headerName: (_s$columnProps$header = (_s$columnProps = s.columnProps) === null || _s$columnProps === void 0 ? void 0 : _s$columnProps.headerName) !== null && _s$columnProps$header !== void 0 ? _s$columnProps$header : (_s$columnProps2 = s.columnProps) === null || _s$columnProps2 === void 0 ? void 0 : _s$columnProps2.title
89
+ headerName: (_s$columnProps$header = (_s$columnProps = s.columnProps) === null || _s$columnProps === void 0 ? void 0 : _s$columnProps.headerName) !== null && _s$columnProps$header !== void 0 ? _s$columnProps$header : (_s$columnProps2 = s.columnProps) === null || _s$columnProps2 === void 0 ? void 0 : _s$columnProps2.title,
90
+ // 分组名变了列组结构就变,同样要重建。@author nokecy
91
+ headerGroup: (_s$columnProps3 = s.columnProps) === null || _s$columnProps3 === void 0 ? void 0 : _s$columnProps3.headerGroup
89
92
  };
90
93
  }));
91
94
  }, [rawSources]);
@@ -146,6 +149,12 @@ var ArrayTableInner = observer(function (props) {
146
149
  return cols;
147
150
  }, [sources, props.onRowDrag]); // 移除 field 依赖,避免数据变化时重新计算
148
151
 
152
+ // 交给 AgGridReact 的列定义:按 x-component-props.headerGroup 把相邻同组的列合并成列组(多级表头)。
153
+ // stableColumnDefs 保持扁平,懒列识别、列方案还原等内部逻辑仍用它;只有喂给 AG-Grid 的这一份带分组。@author nokecy
154
+ var gridColumnDefs = useMemo(function () {
155
+ return groupColumnDefs(stableColumnDefs);
156
+ }, [stableColumnDefs]);
157
+
149
158
  // 懒挂载:把激活态 Set 通过 AG-Grid context 暴露给 LazyAgField(引用稳定,原地 mutate)。@author nokecy
150
159
  var gridContext = useMemo(function () {
151
160
  return {
@@ -222,8 +231,8 @@ var ArrayTableInner = observer(function (props) {
222
231
  if (hasGroups) {
223
232
  // 传入 stableColumnDefs 作为原始定义,保留 cellRenderer(AgField/LazyAgField)及其
224
233
  // cellRendererParams——否则分组方案重建出的是裸列,单元格退化为纯文本、编辑失效。@author nokecy
225
- var gridColumnDefs = flatConfigToGridState(currentScheme.columnConfig, stableColumnDefs);
226
- gridApiState.setGridOption('columnDefs', gridColumnDefs);
234
+ var _gridColumnDefs = flatConfigToGridState(currentScheme.columnConfig, stableColumnDefs);
235
+ gridApiState.setGridOption('columnDefs', _gridColumnDefs);
227
236
  }
228
237
 
229
238
  // 2. 应用列状态(列顺序、宽度、隐藏、固定等)
@@ -416,7 +425,7 @@ var ArrayTableInner = observer(function (props) {
416
425
  ,
417
426
  rowHeight: 38,
418
427
  pagination: false,
419
- columnDefs: stableColumnDefs,
428
+ columnDefs: gridColumnDefs,
420
429
  rowData: dataSource
421
430
  })), sources.map(function (column, key) {
422
431
  //专门用来承接对Column的状态管理
@@ -3,9 +3,28 @@ import { FieldDisplayTypes, GeneralField } from "@formily/core";
3
3
  import { Schema } from "@formily/json-schema";
4
4
  import { AgGridReactProps } from "ag-grid-react";
5
5
  import React from "react";
6
+ /**
7
+ * ArrayTable.Column 的 x-component-props 里 qc-ui 自己认的扩展属性;
8
+ * 其余属性(width、headerName、pinned 等)按 AG-Grid 列定义处理。
9
+ *
10
+ * @author nokecy
11
+ */
12
+ interface ArrayTableColumnProps {
13
+ /**
14
+ * 表头分组名(多级表头,仅一级)。
15
+ * 相邻且 headerGroup 相同的列合并成一个列组,分组名作为组头;
16
+ * 同名但不相邻的列各自成组;不写则该列不分组。
17
+ */
18
+ headerGroup?: string;
19
+ /**
20
+ * 默认隐藏:为 true 时该列首次出现时是隐藏的,用户可在列设置里打开,列方案(applyColumnState)优先。
21
+ * 对应 AG-Grid 的 initialHide。注意 hide 在 ArrayTable 里不生效(状态归列方案管),要默认隐藏请用它。
22
+ */
23
+ defaultHide?: boolean;
24
+ }
6
25
  interface ObservableColumnSource {
7
26
  field: GeneralField;
8
- columnProps: any;
27
+ columnProps: ArrayTableColumnProps & Record<string, any>;
9
28
  schema: Schema;
10
29
  display: FieldDisplayTypes;
11
30
  name: string;
@@ -13,4 +32,4 @@ interface ObservableColumnSource {
13
32
  type ComposedArrayTable = React.FC<React.PropsWithChildren<AgGridReactProps>> & ArrayBaseMixins & {
14
33
  Column?: any;
15
34
  };
16
- export { ComposedArrayTable, ObservableColumnSource };
35
+ export { ComposedArrayTable, ObservableColumnSource, ArrayTableColumnProps };
@@ -1,5 +1,5 @@
1
1
  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
- var _excluded = ["hide", "sort", "sortIndex", "forceAgField"];
2
+ var _excluded = ["hide", "sort", "sortIndex", "forceAgField", "headerGroup", "defaultHide"];
3
3
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
4
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
5
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -9,10 +9,12 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
9
9
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
10
10
  import React from 'react';
11
11
  import { theme } from 'antd';
12
- import { useField, useFieldSchema, RecursionField, Observer } from '@formily/react';
13
- import { isArr } from '@formily/shared';
12
+ import { useField, useFieldSchema, RecursionField, Observer, useExpressionScope } from '@formily/react';
13
+ import { isArr, lazyMerge } from '@formily/shared';
14
+ import { Schema } from '@formily/json-schema';
14
15
  import ArrayBase from "./arrayBase";
15
16
  import { getReadOnlyFormatter } from "./readOnlyFormatters";
17
+ import { markHeaderGroup } from "./columnGroup";
16
18
  var isColumnComponent = function isColumnComponent(schema) {
17
19
  var _schema$xComponent;
18
20
  return ((_schema$xComponent = schema['x-component']) === null || _schema$xComponent === void 0 ? void 0 : _schema$xComponent.indexOf('Column')) > -1;
@@ -183,6 +185,56 @@ var resolveEmptyPlaceholder = function resolveEmptyPlaceholder(fieldSchema) {
183
185
  return SELECT_LIKE.has(fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-component']) ? '请选择' : '请输入';
184
186
  };
185
187
 
188
+ /** Formily 字段的四种 pattern;x-pattern 求出来不在其中,视为「求不出」 */
189
+ var CELL_PATTERNS = new Set(['editable', 'disabled', 'readOnly', 'readPretty']);
190
+
191
+ /**
192
+ * 懒挂载格此刻的 pattern。
193
+ *
194
+ * 懒挂载不创建 Formily 字段,拿不到字段实例上求好的 pattern,只能按同一套规则自己求:
195
+ * 字段自己的 x-pattern 优先(表达式按本行本格的作用域求值,$self 只提供 path/index/value/form/parent/query),
196
+ * 没写则继承整表 pattern。表达式用到本格没有的能力、抛错或求出非法值时返回 undefined,
197
+ * 调用方按「可编辑」处理,保持原有提示。@author nokecy
198
+ */
199
+ var resolveLazyCellPattern = function resolveLazyCellPattern(arrayField, record, dataKey, fieldSchema, scope) {
200
+ var own = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-pattern'];
201
+ if (own == null) return arrayField === null || arrayField === void 0 ? void 0 : arrayField.pattern;
202
+ if (typeof own !== 'string') return undefined;
203
+ if (CELL_PATTERNS.has(own)) return own;
204
+ var form = arrayField === null || arrayField === void 0 ? void 0 : arrayField.form;
205
+ if (!form || !dataKey) return undefined;
206
+ try {
207
+ var _arrayField$value$ind, _arrayField$value, _arrayField$value$ind2;
208
+ var index = (_arrayField$value$ind = (_arrayField$value = arrayField.value) === null || _arrayField$value === void 0 || (_arrayField$value$ind2 = _arrayField$value.indexOf) === null || _arrayField$value$ind2 === void 0 ? void 0 : _arrayField$value$ind2.call(_arrayField$value, record)) !== null && _arrayField$value$ind !== void 0 ? _arrayField$value$ind : -1;
209
+ // 与真字段一致:path 是数据路径(不含 void 容器),address 含 void 容器;表达式里 getValuesIn($self.path...) 靠前者
210
+ var path = arrayField.path.concat(index).concat(dataKey);
211
+ var address = arrayField.address.concat(index).concat(dataKey);
212
+ var self = {
213
+ path: path,
214
+ address: address,
215
+ index: index,
216
+ form: form,
217
+ parent: arrayField,
218
+ get value() {
219
+ return readByFieldPath(record, dataKey);
220
+ },
221
+ query: function query(pattern) {
222
+ return form.query(pattern);
223
+ }
224
+ };
225
+ var result = Schema.shallowCompile(own, lazyMerge(scope !== null && scope !== void 0 ? scope : {}, {
226
+ $form: form,
227
+ $values: form.values,
228
+ $self: self,
229
+ $record: record,
230
+ $index: index
231
+ }));
232
+ return CELL_PATTERNS.has(result) ? result : undefined;
233
+ } catch (_unused) {
234
+ return undefined;
235
+ }
236
+ };
237
+
186
238
  /**
187
239
  * 懒挂载单元格渲染器(可编辑列)。
188
240
  *
@@ -212,6 +264,7 @@ var LazyAgField = function LazyAgField(params) {
212
264
  // hook 必须在下面的条件 return 之前调用
213
265
  var _theme$useToken = theme.useToken(),
214
266
  token = _theme$useToken.token;
267
+ var scope = useExpressionScope();
215
268
  var key = "".concat(node === null || node === void 0 ? void 0 : node.id, ":").concat(colDef === null || colDef === void 0 ? void 0 : colDef.field);
216
269
  var activated = (record === null || record === void 0 ? void 0 : record._isNew) === true || (context === null || context === void 0 || (_context$activeCells = context.activeCells) === null || _context$activeCells === void 0 || (_context$activeCells$ = _context$activeCells.has) === null || _context$activeCells$ === void 0 ? void 0 : _context$activeCells$.call(_context$activeCells, key)) === true;
217
270
  if (activated) {
@@ -238,7 +291,9 @@ var LazyAgField = function LazyAgField(params) {
238
291
  fieldSchema: fieldSchema
239
292
  }) : liveValue == null ? '' : String(liveValue);
240
293
  // 纯文本占满单元格,点击交给 AG-Grid onCellClicked 激活;样式尽量贴近 Editable 只读态避免点开跳动
241
- if (text === '') {
294
+ // 只读态(readPretty/disabled/readOnly)的空格不出编辑提示,留空与只读快路径一致
295
+ var pattern = text === '' ? resolveLazyCellPattern(field, record, dataKey, fieldSchema, scope) : undefined;
296
+ if (text === '' && (pattern == null || pattern === 'editable')) {
242
297
  // 空值:出淡灰 placeholder,让用户看得出这格能填(颜色取 antd 输入框 placeholder 的 token,自动跟随暗色主题)
243
298
  return /*#__PURE__*/React.createElement("span", {
244
299
  className: "ag-array-table-lazy-placeholder",
@@ -361,6 +416,8 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
361
416
  sort = columnProps.sort,
362
417
  sortIndex = columnProps.sortIndex,
363
418
  forceAgField = columnProps.forceAgField,
419
+ headerGroup = columnProps.headerGroup,
420
+ defaultHide = columnProps.defaultHide,
364
421
  safeColumnProps = _objectWithoutProperties(columnProps, _excluded);
365
422
  var base = _objectSpread(_objectSpread({}, safeColumnProps), {}, {
366
423
  // 保留 width 作为列的初始宽度
@@ -368,7 +425,15 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
368
425
  //@ts-ignore
369
426
  headerName: columnProps.headerName || columnProps.title,
370
427
  field: name
371
- });
428
+ }, defaultHide === true ? {
429
+ initialHide: true
430
+ } : {});
431
+
432
+ // 记下分组名再输出列定义;真正合并成列组在 index.tsx 交给 AG-Grid 之前(groupColumnDefs)做,
433
+ // 这里产出的仍是扁平列定义。@author nokecy
434
+ var emit = function emit(colDef) {
435
+ return buf.concat(markHeaderGroup(colDef, headerGroup));
436
+ };
372
437
 
373
438
  // 三分流渲染策略:@author nokecy
374
439
  // ① 只读纯文本(永不可编辑):只读列 + 有格式化器 -> valueFormatter,不挂 Formily 树。
@@ -404,7 +469,7 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
404
469
  // 读 AG-Grid 缓存值不刷新 → 反应式只读渲染。整表 readPretty(明细/详情页,数据 setValues 整体加载、
405
470
  // 行引用整体替换、AG-Grid 自然刷新)仍走更廉价的静态 valueFormatter 快路径。@author nokecy
406
471
  if (arrayPattern !== 'readPretty') {
407
- return buf.concat(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
472
+ return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
408
473
  valueGetter: valueGetter
409
474
  } : {}), {}, {
410
475
  cellRenderer: LazyReadOnlyText,
@@ -415,7 +480,7 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
415
480
  }
416
481
  }));
417
482
  }
418
- return buf.concat(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
483
+ return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
419
484
  valueGetter: valueGetter
420
485
  } : {}), {}, {
421
486
  // 显式清掉可能从 safeColumnProps 漏带的 cellRenderer(AG-Grid 中 renderer 优先级高于 formatter)
@@ -431,7 +496,7 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
431
496
 
432
497
  // ② 可编辑懒挂载(排除单击直控的 Switch/Checkbox:须 eager 出真控件)
433
498
  if (!readOnly && formatter && !hasReactions && !forceEager && !isInlineToggle && canFastPath) {
434
- return buf.concat(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
499
+ return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
435
500
  valueGetter: valueGetter
436
501
  } : {}), {}, {
437
502
  cellRenderer: LazyAgField,
@@ -448,7 +513,7 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
448
513
  }
449
514
 
450
515
  // ③ 兜底全树
451
- return buf.concat(_objectSpread(_objectSpread({}, base), {}, {
516
+ return emit(_objectSpread(_objectSpread({}, base), {}, {
452
517
  cellRendererParams: {
453
518
  dataSource: dataSource,
454
519
  schema: schema,