@nokecy/qc-ui 1.1.56 → 1.1.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +16 -21
  2. package/dist/cjs/ag-grid-plus/index.less +4 -4
  3. package/dist/cjs/ag-grid-plus/setting/ColumnConfigTable.js +2 -1
  4. package/dist/cjs/ag-grid-plus/setting/ColumnSetting.js +2 -1
  5. package/dist/cjs/ag-grid-plus/setting/QuerySchemeManager.js +3 -2
  6. package/dist/cjs/ag-grid-plus/theme.d.ts +5 -0
  7. package/dist/cjs/ag-grid-plus/theme.js +33 -1
  8. package/dist/cjs/ag-grid-plus/toolBar/index.js +2 -6
  9. package/dist/cjs/ag-grid-plus/toolBar/style.js +28 -5
  10. package/dist/cjs/ag-grid-plus/utils/aggregation.d.ts +9 -0
  11. package/dist/cjs/ag-grid-plus/utils/aggregation.js +15 -1
  12. package/dist/cjs/ag-grid-plus/utils/columnProcessors.d.ts +4 -2
  13. package/dist/cjs/ag-grid-plus/utils/columnProcessors.js +14 -7
  14. package/dist/cjs/array-table/index.js +2 -1
  15. package/dist/cjs/array-table/preview.js +2 -1
  16. package/dist/cjs/array-table/theme.d.ts +2 -10
  17. package/dist/cjs/array-table/theme.js +18 -18
  18. package/dist/esm/ag-grid-plus/ag-gridPlus.js +19 -24
  19. package/dist/esm/ag-grid-plus/index.less +4 -4
  20. package/dist/esm/ag-grid-plus/setting/ColumnConfigTable.js +3 -2
  21. package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +3 -2
  22. package/dist/esm/ag-grid-plus/setting/QuerySchemeManager.js +4 -3
  23. package/dist/esm/ag-grid-plus/theme.d.ts +5 -0
  24. package/dist/esm/ag-grid-plus/theme.js +32 -1
  25. package/dist/esm/ag-grid-plus/toolBar/index.js +2 -6
  26. package/dist/esm/ag-grid-plus/toolBar/style.js +28 -5
  27. package/dist/esm/ag-grid-plus/utils/aggregation.d.ts +9 -0
  28. package/dist/esm/ag-grid-plus/utils/aggregation.js +14 -0
  29. package/dist/esm/ag-grid-plus/utils/columnProcessors.d.ts +4 -2
  30. package/dist/esm/ag-grid-plus/utils/columnProcessors.js +13 -7
  31. package/dist/esm/array-table/index.js +2 -1
  32. package/dist/esm/array-table/preview.js +2 -1
  33. package/dist/esm/array-table/theme.d.ts +2 -10
  34. package/dist/esm/array-table/theme.js +17 -18
  35. package/dist/umd/qc-ui.min.css +1 -1
  36. package/dist/umd/qc-ui.min.js +1 -1
  37. package/package.json +1 -1
@@ -86,6 +86,7 @@ function useDeepCompareStable(value) {
86
86
  return ref.current;
87
87
  }
88
88
  function AgGridPlus(props) {
89
+ var gridTheme = (0, _theme.useAgGridTheme)();
89
90
  var style = props.style,
90
91
  loadingProps = props.loading,
91
92
  gridParams = props.params,
@@ -440,11 +441,10 @@ function AgGridPlus(props) {
440
441
  // 辅助函数: 获取数据类型
441
442
  var getDataType = function getDataType(data, colName, valueEnum) {
442
443
  if (typeof data[colName] === 'number') {
443
- // 如果有枚举值,说明是分类数据,不进行计算;否则默认求和
444
- var shouldCalculate = !valueEnum || valueEnum.length === 0;
444
+ // 数值只用于列对齐;底部合计必须由 calculateType 显式声明。@author nokecy
445
445
  return {
446
446
  type: "number",
447
- calculateType: shouldCalculate ? "sum" : false
447
+ calculateType: valueEnum !== null && valueEnum !== void 0 && valueEnum.length ? false : undefined
448
448
  };
449
449
  }
450
450
  return undefined;
@@ -472,11 +472,11 @@ function AgGridPlus(props) {
472
472
  return (0, _columnProcessors.processEnumColumn)(col, dataType);
473
473
  }
474
474
  if (col.type || typeof col.cellRenderer == "string") {
475
- return _objectSpread({}, col);
475
+ return (0, _columnProcessors.mergeInferredColumnType)(col, dataType);
476
476
  }
477
477
  //@ts-ignore
478
478
  if (col !== null && col !== void 0 && col.ellipsis) {
479
- return _objectSpread(_objectSpread({}, col), {}, {
479
+ return _objectSpread(_objectSpread({}, (0, _columnProcessors.mergeInferredColumnType)(col, dataType)), {}, {
480
480
  cellRenderer: function cellRenderer(_ref) {
481
481
  var value = _ref.value;
482
482
  return /*#__PURE__*/_react.default.createElement(Text, {
@@ -493,12 +493,12 @@ function AgGridPlus(props) {
493
493
  });
494
494
  }
495
495
  if (col.cellRenderer) {
496
- return _objectSpread(_objectSpread({}, col), {}, {
496
+ return _objectSpread(_objectSpread({}, (0, _columnProcessors.mergeInferredColumnType)(col, dataType)), {}, {
497
497
  customCellRenderer: col.cellRenderer,
498
498
  cellRenderer: cellRenderer
499
499
  });
500
500
  }
501
- return _objectSpread(_objectSpread(_objectSpread({}, (0, _columnProcessors.toColumnType)(dataType)), col), {}, {
501
+ return _objectSpread(_objectSpread({}, (0, _columnProcessors.mergeInferredColumnType)(col, dataType)), {}, {
502
502
  customCellRenderer: col.cellRenderer,
503
503
  cellRenderer: cellRenderer
504
504
  });
@@ -948,6 +948,7 @@ function AgGridPlus(props) {
948
948
  }
949
949
  };
950
950
  var calculateSum = (0, _react.useCallback)(function () {
951
+ if (props.pinnedBottomRowData !== undefined) return;
951
952
  var displayedData = [];
952
953
  if (apiRef.current) {
953
954
  apiRef.current.forEachNodeAfterFilter(function (node) {
@@ -959,22 +960,16 @@ function AgGridPlus(props) {
959
960
  (_apiRef$current4 = apiRef.current) === null || _apiRef$current4 === void 0 || _apiRef$current4.setGridOption('pinnedBottomRowData', undefined);
960
961
  return;
961
962
  }
962
- var calcColFields = allColDefs.filter(function (col) {
963
- return col.calculateType;
964
- }).map(function (col) {
965
- return {
966
- field: col.field,
967
- calculateType: col.calculateType,
968
- transactionAmount: col.transactionAmount || 2,
969
- formatWithCommas: col.formatWithCommas
970
- };
971
- });
963
+ var calcColFields = (0, _aggregation.getCalculationColumns)(allColDefs);
972
964
  if (calcColFields.length > 0) {
973
965
  var _apiRef$current5;
974
966
  var calculatedValues = (0, _aggregation.computeAggregationRow)(calcColFields, displayedData);
975
967
  (_apiRef$current5 = apiRef.current) === null || _apiRef$current5 === void 0 || _apiRef$current5.setGridOption('pinnedBottomRowData', calculatedValues);
968
+ } else {
969
+ var _apiRef$current6;
970
+ (_apiRef$current6 = apiRef.current) === null || _apiRef$current6 === void 0 || _apiRef$current6.setGridOption('pinnedBottomRowData', undefined);
976
971
  }
977
- }, [allColDefs]);
972
+ }, [allColDefs, props.pinnedBottomRowData]);
978
973
  var onFilterChanged = function onFilterChanged(event) {
979
974
  calculateSum();
980
975
  };
@@ -1320,7 +1315,7 @@ function AgGridPlus(props) {
1320
1315
  }
1321
1316
  }, /*#__PURE__*/_react.default.createElement(_icons.FilterOutlined, null)))) : null].filter(Boolean)
1322
1317
  }), /*#__PURE__*/_react.default.createElement(_agGridReact.AgGridReact, _extends({
1323
- theme: _theme.agGridTheme
1318
+ theme: gridTheme
1324
1319
  }, rest, {
1325
1320
  localeText: _locale.localeText,
1326
1321
  gridOptions: {
@@ -1368,8 +1363,8 @@ function AgGridPlus(props) {
1368
1363
  },
1369
1364
  onDragStopped: function onDragStopped(e) {
1370
1365
  if (apiRef.current) {
1371
- var _apiRef$current6;
1372
- var _columnState = (_apiRef$current6 = apiRef.current) === null || _apiRef$current6 === void 0 ? void 0 : _apiRef$current6.getColumnState();
1366
+ var _apiRef$current7;
1367
+ var _columnState = (_apiRef$current7 = apiRef.current) === null || _apiRef$current7 === void 0 ? void 0 : _apiRef$current7.getColumnState();
1373
1368
  setColumnState(_columnState);
1374
1369
 
1375
1370
  // onColumnStateChanged && onColumnStateChanged(columnState)
@@ -28,12 +28,12 @@
28
28
  }
29
29
 
30
30
  .ag-root-wrapper-body .ag-center-cols-viewport .ag-center-cols-container .ag-checkbox .ag-checkbox-input-wrapper {
31
- width: 18px !important;
32
- height: 18px !important;
31
+ width: 16px !important;
32
+ height: 16px !important;
33
33
  }
34
34
  .ag-root-wrapper-body .ag-header-viewport .ag-checkbox .ag-checkbox-input-wrapper {
35
- width: 18px !important;
36
- height: 18px !important;
35
+ width: 16px !important;
36
+ height: 16px !important;
37
37
  }
38
38
 
39
39
  // 列内容对齐方式样式
@@ -244,6 +244,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
244
244
  simple = _ref2$simple === void 0 ? false : _ref2$simple,
245
245
  _ref2$scrollY = _ref2.scrollY,
246
246
  scrollY = _ref2$scrollY === void 0 ? 480 : _ref2$scrollY;
247
+ var gridTheme = (0, _theme.useAgGridTheme)();
247
248
  var _useState = (0, _react.useState)(items),
248
249
  _useState2 = _slicedToArray(_useState, 2),
249
250
  localItems = _useState2[0],
@@ -712,7 +713,7 @@ var ColumnConfigTable = function ColumnConfigTable(_ref2) {
712
713
  height: scrollY
713
714
  }
714
715
  }, /*#__PURE__*/_react.default.createElement(_agGridReact.AgGridReact, {
715
- theme: _theme.agGridTheme,
716
+ theme: gridTheme,
716
717
  rowData: visibleItems,
717
718
  columnDefs: columnDefs,
718
719
  getRowId: function getRowId(params) {
@@ -57,6 +57,7 @@ var ColumnSetting = function ColumnSetting(_ref) {
57
57
  visible = _ref.visible,
58
58
  onClose = _ref.onClose,
59
59
  onSaveColumnState = _ref.onSaveColumnState;
60
+ var gridTheme = (0, _theme.useAgGridTheme)();
60
61
  // 使用新的集中式方案管理 API(包含状态数据和操作方法)
61
62
  var _useGridSchemes = (0, _useSchemeManager.useGridSchemes)(),
62
63
  columnSchemes = _useGridSchemes.columnSchemes,
@@ -1254,7 +1255,7 @@ var ColumnSetting = function ColumnSetting(_ref) {
1254
1255
  marginTop: 100
1255
1256
  }
1256
1257
  }) : /*#__PURE__*/_react.default.createElement(_agGridReact.AgGridReact, {
1257
- theme: _theme.agGridTheme,
1258
+ theme: gridTheme,
1258
1259
  localeText: _locale.localeText,
1259
1260
  rowData: filteredSchemes,
1260
1261
  columnDefs: schemeColumnDefs,
@@ -58,6 +58,7 @@ var QuerySchemeManager = function QuerySchemeManager(_ref) {
58
58
  var gridKey = _ref.gridKey,
59
59
  visible = _ref.visible,
60
60
  onClose = _ref.onClose;
61
+ var gridTheme = (0, _theme.useAgGridTheme)();
61
62
  // 获取方案管理 API
62
63
  var _useGridSchemes = (0, _useSchemeManager.useGridSchemes)(),
63
64
  querySchemes = _useGridSchemes.querySchemes,
@@ -761,7 +762,7 @@ var QuerySchemeManager = function QuerySchemeManager(_ref) {
761
762
  }
762
763
  }, /*#__PURE__*/_react.default.createElement(_agGridReact.AgGridReact, {
763
764
  ref: queryGridRef,
764
- theme: _theme.agGridTheme,
765
+ theme: gridTheme,
765
766
  rowData: queryItemsData,
766
767
  columnDefs: queryColumnDefs,
767
768
  defaultColDef: {
@@ -809,7 +810,7 @@ var QuerySchemeManager = function QuerySchemeManager(_ref) {
809
810
  }
810
811
  }, /*#__PURE__*/_react.default.createElement(_agGridReact.AgGridReact, {
811
812
  ref: schemeGridRef,
812
- theme: _theme.agGridTheme,
813
+ theme: gridTheme,
813
814
  rowData: schemes,
814
815
  columnDefs: schemeColumnDefs,
815
816
  defaultColDef: {
@@ -3,3 +3,8 @@
3
3
  * 使用 themeQuartz API 替代 CSS 变量方式
4
4
  */
5
5
  export declare const agGridTheme: import("ag-grid-community").Theme<import("ag-grid-community").ThemeDefaultParams>;
6
+ /**
7
+ * 根据当前 Ant Design ConfigProvider 主题生成 AgGrid 主题色。
8
+ * 复选框、行选中和悬停等强调状态与 antd 主色同步。@author nokecy
9
+ */
10
+ export declare function useAgGridTheme(): import("ag-grid-community").Theme<import("ag-grid-community").ThemeDefaultParams>;
@@ -4,7 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.agGridTheme = void 0;
7
+ exports.useAgGridTheme = useAgGridTheme;
7
8
  var _agGridCommunity = require("ag-grid-community");
9
+ var _antd = require("antd");
10
+ var _react = require("react");
8
11
  /**
9
12
  * AG-Grid v33 主题配置
10
13
  * 使用 themeQuartz API 替代 CSS 变量方式
@@ -75,4 +78,33 @@ var agGridTheme = exports.agGridTheme = _agGridCommunity.themeQuartz.withParams(
75
78
  // 侧边栏配置
76
79
  sideBarPanelWidth: 250,
77
80
  spacing: 6
78
- });
81
+ });
82
+
83
+ /**
84
+ * 根据当前 Ant Design ConfigProvider 主题生成 AgGrid 主题色。
85
+ * 复选框、行选中和悬停等强调状态与 antd 主色同步。@author nokecy
86
+ */
87
+ function useAgGridTheme() {
88
+ var _antdTheme$useToken = _antd.theme.useToken(),
89
+ token = _antdTheme$useToken.token;
90
+ return (0, _react.useMemo)(function () {
91
+ return agGridTheme.withParams({
92
+ accentColor: token.colorPrimary,
93
+ rowHoverColor: token.colorPrimaryBg,
94
+ selectedRowBackgroundColor: token.colorPrimaryBgHover,
95
+ columnHoverColor: token.colorPrimaryBg,
96
+ rangeSelectionBorderColor: token.colorPrimary,
97
+ rangeSelectionBackgroundColor: token.colorPrimaryBgHover,
98
+ focusShadow: "0 0 0 3px ".concat(token.colorPrimaryBg),
99
+ checkboxUncheckedBackgroundColor: token.colorBgContainer,
100
+ checkboxUncheckedBorderColor: token.colorBorder,
101
+ checkboxCheckedBackgroundColor: token.colorPrimary,
102
+ checkboxCheckedBorderColor: token.colorPrimary,
103
+ checkboxCheckedShapeColor: token.colorWhite,
104
+ checkboxIndeterminateBackgroundColor: token.colorPrimary,
105
+ checkboxIndeterminateBorderColor: token.colorPrimary,
106
+ checkboxIndeterminateShapeColor: token.colorWhite,
107
+ toggleButtonOnBackgroundColor: token.colorPrimary
108
+ });
109
+ }, [token.colorBgContainer, token.colorBorder, token.colorPrimary, token.colorPrimaryBg, token.colorPrimaryBgHover, token.colorWhite]);
110
+ }
@@ -84,11 +84,7 @@ var ListToolBar = function ListToolBar(_ref) {
84
84
  return null;
85
85
  }
86
86
  return /*#__PURE__*/_react.default.createElement("div", {
87
- style: {
88
- display: 'flex',
89
- alignItems: 'center',
90
- gap: 8
91
- }
87
+ className: "".concat(prefixCls, "-actions ").concat(hashId)
92
88
  }, actions.map(function (action, index) {
93
89
  if (! /*#__PURE__*/_react.default.isValidElement(action)) {
94
90
  // eslint-disable-next-line react/no-array-index-key
@@ -101,7 +97,7 @@ var ListToolBar = function ListToolBar(_ref) {
101
97
  key: index
102
98
  }, action === null || action === void 0 ? void 0 : action.props));
103
99
  }));
104
- }, [actions]);
100
+ }, [actions, hashId, prefixCls]);
105
101
  var hasRight = (0, _react.useMemo)(function () {
106
102
  return hasTitle || actionDom || (settings === null || settings === void 0 ? void 0 : settings.length);
107
103
  }, [actionDom, hasTitle, settings === null || settings === void 0 ? void 0 : settings.length]);
@@ -17,6 +17,8 @@ var genProListStyle = function genProListStyle(token) {
17
17
  "&-container": {
18
18
  display: "flex",
19
19
  justifyContent: "space-between",
20
+ alignItems: "center",
21
+ minWidth: 0,
20
22
  paddingBlock: 8,
21
23
  //token.padding,
22
24
  paddingInline: 0,
@@ -54,29 +56,47 @@ var genProListStyle = function genProListStyle(token) {
54
56
  },
55
57
  "&-left": _defineProperty(_defineProperty({
56
58
  display: "flex",
57
- flexWrap: "wrap",
59
+ flexWrap: "nowrap",
58
60
  alignItems: "center",
59
61
  gap: token.marginXS,
60
62
  justifyContent: "flex-start",
61
- maxWidth: "calc(100% - 200px)",
62
- flex: 1
63
+ minWidth: 0,
64
+ flex: "0 1 auto"
63
65
  }, "".concat(token.antCls, "-tabs"), {
64
66
  width: "100%"
65
67
  }), "&-has-tabs", {
66
68
  overflow: "hidden"
67
69
  }),
68
70
  "&-right": {
69
- flex: 1,
71
+ flex: "1 1 0",
72
+ minWidth: 0,
70
73
  display: "flex",
71
- flexWrap: "wrap",
74
+ flexWrap: "nowrap",
75
+ alignItems: "center",
72
76
  justifyContent: "flex-end",
73
77
  gap: token.marginXS
74
78
  },
79
+ // @author nokecy:按钮单行呈现,空间不足时只在操作区内滚动,不撑开页面。
80
+ "&-actions": {
81
+ display: "flex",
82
+ alignItems: "center",
83
+ gap: token.marginXS,
84
+ minWidth: 0,
85
+ flex: "0 1 auto",
86
+ overflowX: "auto",
87
+ overflowY: "hidden",
88
+ scrollbarWidth: "none",
89
+ whiteSpace: "nowrap",
90
+ "&::-webkit-scrollbar": {
91
+ display: "none"
92
+ }
93
+ },
75
94
  "&-extra-line": {
76
95
  marginBlockEnd: token.margin
77
96
  },
78
97
  "&-setting-items": {
79
98
  display: "flex",
99
+ flex: "0 0 auto",
80
100
  gap: token.marginXS,
81
101
  lineHeight: "32px",
82
102
  alignItems: "center"
@@ -127,6 +147,9 @@ var genProListStyle = function genProListStyle(token) {
127
147
  "&-left": {
128
148
  marginBlockEnd: "8px",
129
149
  maxWidth: "100%"
150
+ },
151
+ "&-right": {
152
+ width: "100%"
130
153
  }
131
154
  })));
132
155
  };
@@ -9,6 +9,15 @@ export interface CalculationColumnConfig {
9
9
  formatWithCommas?: boolean;
10
10
  cellRenderer?: any;
11
11
  }
12
+ export interface CalculationColumnDefinition {
13
+ field?: string;
14
+ calculateType?: CalculationColumnConfig['calculateType'] | false;
15
+ transactionAmount?: number;
16
+ formatWithCommas?: boolean;
17
+ children?: CalculationColumnDefinition[];
18
+ }
19
+ /** 分组表头只是展示结构;原生固定合计行要读取所有叶子数值列。@author nokecy */
20
+ export declare const getCalculationColumns: (columns: CalculationColumnDefinition[]) => CalculationColumnConfig[];
12
21
  export declare const isValidNumber: (value: any) => boolean;
13
22
  export declare const sumField: (field: string, data: any[]) => number;
14
23
  export declare const avgField: (field: string, data: any[]) => number;
@@ -4,7 +4,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.sumField = exports.stdDevField = exports.isValidNumber = exports.formatWithCommas = exports.computeAggregationRow = exports.avgField = void 0;
7
+ exports.sumField = exports.stdDevField = exports.isValidNumber = exports.getCalculationColumns = exports.formatWithCommas = exports.computeAggregationRow = exports.avgField = void 0;
8
8
  var _lodash = _interopRequireWildcard(require("lodash"));
9
9
  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); }
10
10
  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; }
@@ -13,6 +13,20 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
13
13
  * @author nokecy
14
14
  */
15
15
 
16
+ /** 分组表头只是展示结构;原生固定合计行要读取所有叶子数值列。@author nokecy */
17
+ var getCalculationColumns = exports.getCalculationColumns = function getCalculationColumns(columns) {
18
+ return columns.flatMap(function (column) {
19
+ var _column$transactionAm;
20
+ if (column.children) return getCalculationColumns(column.children);
21
+ if (!column.field || !column.calculateType) return [];
22
+ return [{
23
+ field: column.field,
24
+ calculateType: column.calculateType,
25
+ transactionAmount: (_column$transactionAm = column.transactionAmount) !== null && _column$transactionAm !== void 0 ? _column$transactionAm : 2,
26
+ formatWithCommas: column.formatWithCommas
27
+ }];
28
+ });
29
+ };
16
30
  var isValidNumber = exports.isValidNumber = function isValidNumber(value) {
17
31
  return typeof value === 'number' && !isNaN(value);
18
32
  };
@@ -56,8 +56,8 @@ export declare function inferDataType(data: any, colName: string, valueEnum?: Va
56
56
  * 早先是把整个 dataType 摊进 colDef,等于给列设了 type:"number"——而注册的 columnTypes 里
57
57
  * 根本没有叫 number 的类型,这个字段一直没生效。
58
58
  *
59
- * 数量型数值列真正该有的是右对齐:位数对齐了才能一眼比大小。只有 calculateType 为真
60
- * (可求和的数量型)才右对齐;用 valueEnum 表示分类的数值列(状态码之类)不动。
59
+ * 普通数值列右对齐;合计另由 calculateType 显式控制。
60
+ * 用 valueEnum 表示分类的数值列(状态码之类)不动。
61
61
  *
62
62
  * @author nokecy
63
63
  */
@@ -65,6 +65,8 @@ export declare function toColumnType(dataType?: DataTypeInference): {
65
65
  calculateType?: any;
66
66
  type?: string;
67
67
  };
68
+ /** 显式列类型只控制显示方式,不遮蔽数值对齐或显式合计配置。@author nokecy */
69
+ export declare function mergeInferredColumnType<T extends object>(column: T, dataType?: DataTypeInference): T & ReturnType<typeof toColumnType>;
68
70
  /**
69
71
  * 处理枚举列定义 —— **枚举列渲染的唯一实现**。
70
72
  *
@@ -9,6 +9,7 @@ exports.createCellRenderer = createCellRenderer;
9
9
  exports.filterHiddenColumns = filterHiddenColumns;
10
10
  exports.handleGridPlusColumnState = handleGridPlusColumnState;
11
11
  exports.inferDataType = inferDataType;
12
+ exports.mergeInferredColumnType = mergeInferredColumnType;
12
13
  exports.processEllipsisColumn = processEllipsisColumn;
13
14
  exports.processEnumColumn = processEnumColumn;
14
15
  exports.toColumnType = toColumnType;
@@ -75,11 +76,10 @@ function handleGridPlusColumnState(columnState) {
75
76
  function inferDataType(data, colName, valueEnum) {
76
77
  var value = data[colName];
77
78
  if (typeof value === 'number') {
78
- // 如果有枚举值,说明是分类数据,不进行计算
79
- var shouldCalculate = !valueEnum || valueEnum.length === 0;
79
+ // 数值只决定对齐;合计必须由列定义显式声明。@author nokecy
80
80
  return {
81
81
  type: 'number',
82
- calculateType: shouldCalculate ? 'sum' : false
82
+ calculateType: valueEnum !== null && valueEnum !== void 0 && valueEnum.length ? false : undefined
83
83
  };
84
84
  }
85
85
  if (typeof value === 'boolean') {
@@ -104,17 +104,19 @@ function inferDataType(data, colName, valueEnum) {
104
104
  * 早先是把整个 dataType 摊进 colDef,等于给列设了 type:"number"——而注册的 columnTypes 里
105
105
  * 根本没有叫 number 的类型,这个字段一直没生效。
106
106
  *
107
- * 数量型数值列真正该有的是右对齐:位数对齐了才能一眼比大小。只有 calculateType 为真
108
- * (可求和的数量型)才右对齐;用 valueEnum 表示分类的数值列(状态码之类)不动。
107
+ * 普通数值列右对齐;合计另由 calculateType 显式控制。
108
+ * 用 valueEnum 表示分类的数值列(状态码之类)不动。
109
109
  *
110
110
  * @author nokecy
111
111
  */
112
112
  function toColumnType(dataType) {
113
113
  if (!dataType) return {};
114
- if (dataType.type === 'number' && dataType.calculateType) {
115
- return {
114
+ if (dataType.type === 'number' && dataType.calculateType !== false) {
115
+ return dataType.calculateType ? {
116
116
  calculateType: dataType.calculateType,
117
117
  type: 'rightAligned'
118
+ } : {
119
+ type: 'rightAligned'
118
120
  };
119
121
  }
120
122
  return {
@@ -122,6 +124,11 @@ function toColumnType(dataType) {
122
124
  };
123
125
  }
124
126
 
127
+ /** 显式列类型只控制显示方式,不遮蔽数值对齐或显式合计配置。@author nokecy */
128
+ function mergeInferredColumnType(column, dataType) {
129
+ return _objectSpread(_objectSpread({}, toColumnType(dataType)), column);
130
+ }
131
+
125
132
  /**
126
133
  * 处理枚举列定义 —— **枚举列渲染的唯一实现**。
127
134
  *
@@ -40,6 +40,7 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
40
40
  var _addition$props;
41
41
  var height = props.height,
42
42
  gridKey = props.gridKey;
43
+ var arrayTableTheme = (0, _theme.useArrayTableTheme)(true);
43
44
 
44
45
  // 【新增】运行时验证 gridKey
45
46
  if (!gridKey) {
@@ -330,7 +331,7 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
330
331
  minHeight: 0
331
332
  }
332
333
  }, /*#__PURE__*/_react.default.createElement(_agGridReact.AgGridReact, {
333
- theme: _theme.arrayTableTheme,
334
+ theme: arrayTableTheme,
334
335
  context: gridContext,
335
336
  onGridReady: function onGridReady(params) {
336
337
  params.api.hidePopupMenu();
@@ -13,6 +13,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
13
13
  //@ts-ignore
14
14
  var ArrayTable = function ArrayTable(props) {
15
15
  var height = props.height;
16
+ var arrayTablePreviewTheme = (0, _theme.useArrayTableTheme)();
16
17
  var field = (0, _react2.useField)();
17
18
  var dataSource = Array.isArray(field.value) ? field.value.slice() : [];
18
19
  var sources = (0, _utils.useArrayTableSources)();
@@ -32,7 +33,7 @@ var ArrayTable = function ArrayTable(props) {
32
33
  },
33
34
  hideTool: true,
34
35
  search: false,
35
- theme: _theme.arrayTablePreviewTheme,
36
+ theme: arrayTablePreviewTheme,
36
37
  rowHeight: _theme.ARRAY_TABLE_ROW_HEIGHT,
37
38
  pagination: false,
38
39
  columnDefs: columns,
@@ -4,13 +4,5 @@
4
4
  * 只设网格选项会让文字的行盒仍是主题默认行高(29.6-3=26.6px),顶在 37px 的格子上方(偏上约 4.5px)。
5
5
  */
6
6
  export declare const ARRAY_TABLE_ROW_HEIGHT = 38;
7
- /** 阅读态主题:共用主题 + 行高 + 单元格居中 */
8
- export declare const arrayTablePreviewTheme: import("ag-grid-community").Theme<import("ag-grid-community").CoreParams & import("ag-grid-community").ButtonStyleParams & import("ag-grid-community").CheckboxStyleParams & import("ag-grid-community").TabStyleParams & import("ag-grid-community").InputStyleParams & {}>;
9
- /**
10
- * 编辑态主题:在阅读态主题上去掉单元格聚焦/选区视觉(行内编辑更干净)。
11
- * focusShadow -> 聚焦光环
12
- * rangeSelectionBorder -> 单格点击形成的 1×1 选区蓝边
13
- * rangeSelectionBackground -> 选区淡蓝填充
14
- * 仅去视觉,不动焦点功能——键盘导航/点击进编辑仍依赖 cell focus。
15
- */
16
- export declare const arrayTableTheme: import("ag-grid-community").Theme<import("ag-grid-community").CoreParams & import("ag-grid-community").ButtonStyleParams & import("ag-grid-community").CheckboxStyleParams & import("ag-grid-community").TabStyleParams & import("ag-grid-community").InputStyleParams & {}>;
7
+ /** 根据当前 antd 主题生成编辑态或阅读态明细表格主题。@author nokecy */
8
+ export declare function useArrayTableTheme(editable?: boolean): import("ag-grid-community").Theme<import("ag-grid-community").CoreParams & import("ag-grid-community").ButtonStyleParams & import("ag-grid-community").CheckboxStyleParams & import("ag-grid-community").TabStyleParams & import("ag-grid-community").InputStyleParams & {}>;
@@ -3,8 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.arrayTableTheme = exports.arrayTablePreviewTheme = exports.ARRAY_TABLE_ROW_HEIGHT = void 0;
6
+ exports.ARRAY_TABLE_ROW_HEIGHT = void 0;
7
+ exports.useArrayTableTheme = useArrayTableTheme;
7
8
  var _agGridCommunity = require("ag-grid-community");
9
+ var _react = require("react");
8
10
  var _theme = require("../ag-grid-plus/theme");
9
11
  /**
10
12
  * ArrayTable(明细表格)的 AG-Grid 主题:编辑态(index.tsx)与阅读态(preview.tsx)共用。
@@ -31,20 +33,18 @@ var arrayTableCellFit = (0, _agGridCommunity.createPart)({
31
33
  css: "\n .ag-cell .ag-cell-wrapper { height: 100%; }\n .ag-cell .ant-formily-item { margin-bottom: 0; }\n .ag-cell .ant-formily-item-help { position: absolute; }\n "
32
34
  });
33
35
 
34
- /** 阅读态主题:共用主题 + 行高 + 单元格居中 */
35
- var arrayTablePreviewTheme = exports.arrayTablePreviewTheme = _theme.agGridTheme.withParams({
36
- rowHeight: ARRAY_TABLE_ROW_HEIGHT
37
- }).withPart(arrayTableCellFit);
38
-
39
- /**
40
- * 编辑态主题:在阅读态主题上去掉单元格聚焦/选区视觉(行内编辑更干净)。
41
- * focusShadow -> 聚焦光环
42
- * rangeSelectionBorder -> 单格点击形成的 1×1 选区蓝边
43
- * rangeSelectionBackground -> 选区淡蓝填充
44
- * 仅去视觉,不动焦点功能——键盘导航/点击进编辑仍依赖 cell focus。
45
- */
46
- var arrayTableTheme = exports.arrayTableTheme = arrayTablePreviewTheme.withParams({
47
- focusShadow: 'none',
48
- rangeSelectionBorderColor: 'transparent',
49
- rangeSelectionBackgroundColor: 'transparent'
50
- });
36
+ /** 根据当前 antd 主题生成编辑态或阅读态明细表格主题。@author nokecy */
37
+ function useArrayTableTheme() {
38
+ var editable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
39
+ var agGridTheme = (0, _theme.useAgGridTheme)();
40
+ return (0, _react.useMemo)(function () {
41
+ var previewTheme = agGridTheme.withParams({
42
+ rowHeight: ARRAY_TABLE_ROW_HEIGHT
43
+ }).withPart(arrayTableCellFit);
44
+ return editable ? previewTheme.withParams({
45
+ focusShadow: 'none',
46
+ rangeSelectionBorderColor: 'transparent',
47
+ rangeSelectionBackgroundColor: 'transparent'
48
+ }) : previewTheme;
49
+ }, [agGridTheme, editable]);
50
+ }