@nokecy/qc-ui 1.1.72 → 1.1.74

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 (47) hide show
  1. package/dist/cjs/adapters/pagedApiAdapter.d.ts +2 -0
  2. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +5 -3
  3. package/dist/cjs/ag-grid-plus/interface.d.ts +6 -0
  4. package/dist/cjs/ag-grid-plus/utils/aggregation.d.ts +6 -5
  5. package/dist/cjs/ag-grid-plus/utils/aggregation.js +60 -50
  6. package/dist/cjs/ag-grid-plus/utils/columnProcessors.d.ts +2 -1
  7. package/dist/cjs/ag-grid-plus/utils/columnProcessors.js +5 -2
  8. package/dist/cjs/ag-grid-plus/utils/valueEnumColor.d.ts +17 -0
  9. package/dist/cjs/ag-grid-plus/utils/valueEnumColor.js +99 -0
  10. package/dist/cjs/dialogSelect/index.d.ts +29 -0
  11. package/dist/cjs/dialogSelect/index.js +152 -103
  12. package/dist/cjs/dialogSelect/index.less +39 -0
  13. package/dist/cjs/draggableModal/index.js +12 -8
  14. package/dist/cjs/index.d.ts +5 -0
  15. package/dist/cjs/index.js +123 -1
  16. package/dist/cjs/toolBar/index.d.ts +1 -0
  17. package/dist/cjs/toolBar/index.js +44 -10
  18. package/dist/cjs/toolBar/index.less +25 -7
  19. package/dist/cjs/utils/businessDecimal.d.ts +11 -0
  20. package/dist/cjs/utils/businessDecimal.js +53 -0
  21. package/dist/cjs/utils/contrast.d.ts +40 -0
  22. package/dist/cjs/utils/contrast.js +153 -0
  23. package/dist/esm/adapters/pagedApiAdapter.d.ts +2 -0
  24. package/dist/esm/ag-grid-plus/ag-gridPlus.js +5 -3
  25. package/dist/esm/ag-grid-plus/interface.d.ts +6 -0
  26. package/dist/esm/ag-grid-plus/utils/aggregation.d.ts +6 -5
  27. package/dist/esm/ag-grid-plus/utils/aggregation.js +60 -47
  28. package/dist/esm/ag-grid-plus/utils/columnProcessors.d.ts +2 -1
  29. package/dist/esm/ag-grid-plus/utils/columnProcessors.js +5 -2
  30. package/dist/esm/ag-grid-plus/utils/valueEnumColor.d.ts +17 -0
  31. package/dist/esm/ag-grid-plus/utils/valueEnumColor.js +95 -0
  32. package/dist/esm/dialogSelect/index.d.ts +29 -0
  33. package/dist/esm/dialogSelect/index.js +155 -105
  34. package/dist/esm/dialogSelect/index.less +39 -0
  35. package/dist/esm/draggableModal/index.js +12 -8
  36. package/dist/esm/index.d.ts +5 -0
  37. package/dist/esm/index.js +3 -0
  38. package/dist/esm/toolBar/index.d.ts +1 -0
  39. package/dist/esm/toolBar/index.js +43 -10
  40. package/dist/esm/toolBar/index.less +25 -7
  41. package/dist/esm/utils/businessDecimal.d.ts +11 -0
  42. package/dist/esm/utils/businessDecimal.js +47 -0
  43. package/dist/esm/utils/contrast.d.ts +40 -0
  44. package/dist/esm/utils/contrast.js +141 -0
  45. package/dist/umd/qc-ui.min.css +1 -1
  46. package/dist/umd/qc-ui.min.js +1 -1
  47. package/package.json +2 -1
@@ -13,6 +13,8 @@ export interface GenericPagedQuery {
13
13
  filter?: string;
14
14
  /** 排序表达式,如 "name asc"。 */
15
15
  sorter?: string;
16
+ /** 表格请求的原始筛选对象(请求函数的第三个参数);需要把它放进后端请求体的适配器才读取。 */
17
+ record?: any;
16
18
  }
17
19
  /** 分页 API 适配器。 */
18
20
  export interface PagedApiAdapter {
@@ -43,7 +43,7 @@ var _requestParams = require("./utils/requestParams");
43
43
  var _errors = require("./errors");
44
44
  var _logger = require("./utils/logger");
45
45
  var _entityExtensionColumns = require("./utils/entityExtensionColumns");
46
- var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "emptyState", "accessible", "enableClickSelection", "rowSelection", "useNativeTreeFilter", "entityType"];
46
+ var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "emptyState", "accessible", "enableClickSelection", "rowSelection", "useNativeTreeFilter", "entityType", "valueEnumContrast"];
47
47
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
48
  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); }
49
49
  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; }
@@ -117,6 +117,8 @@ function AgGridPlus(props) {
117
117
  _props$useNativeTreeF = props.useNativeTreeFilter,
118
118
  useNativeTreeFilter = _props$useNativeTreeF === void 0 ? false : _props$useNativeTreeF,
119
119
  entityType = props.entityType,
120
+ _props$valueEnumContr = props.valueEnumContrast,
121
+ valueEnumContrast = _props$valueEnumContr === void 0 ? false : _props$valueEnumContr,
120
122
  rest = _objectWithoutProperties(props, _excluded);
121
123
  var _useGridPlusColumnSta = (0, _2.useGridPlusColumnState)(),
122
124
  onSaveColumnState = _useGridPlusColumnSta.onSaveColumnState,
@@ -470,7 +472,7 @@ function AgGridPlus(props) {
470
472
  if (col.valueEnum && Array.isArray(col.valueEnum)) {
471
473
  // 枚举列渲染只走一处实现,见 columnProcessors.processEnumColumn
472
474
  // (命中上色、未命中交给 col.enumFallbackRenderer,都没配则回原始码)
473
- return (0, _columnProcessors.processEnumColumn)(col, dataType);
475
+ return (0, _columnProcessors.processEnumColumn)(col, dataType, valueEnumContrast ? token.colorBgContainer : undefined);
474
476
  }
475
477
  if (col.type || typeof col.cellRenderer == "string") {
476
478
  return (0, _columnProcessors.mergeInferredColumnType)(col, dataType);
@@ -576,7 +578,7 @@ function AgGridPlus(props) {
576
578
  });
577
579
  }
578
580
  return cols;
579
- }, [_react.default.Children.count(children), props.columnDefs, extensibleColumns, gridKey, entityType, hostEntityExtensions, typeInferenceRow]);
581
+ }, [_react.default.Children.count(children), props.columnDefs, extensibleColumns, gridKey, entityType, hostEntityExtensions, typeInferenceRow, valueEnumContrast ? token.colorBgContainer : undefined]);
580
582
 
581
583
  // 稳定化 gridParams 和 sortColumn 的引用(深比较,内容不变即复用旧引用)
582
584
  var stableGridParams = useDeepCompareStable(gridParams);
@@ -7,6 +7,12 @@ interface GridRef {
7
7
  onRefresh: () => void;
8
8
  }
9
9
  interface GridProps extends AgGridReactProps {
10
+ /**
11
+ * 为 true 时,`valueEnum[].color` 按当前主题底色自动收成够读(WCAG 正文 4.5:1)的 CSS 色:
12
+ * 语义档名(success/warning…)与预设名(cyan/pink…)换成真实色值,过浅的 hex 压暗(深色主题则提亮),
13
+ * 缺省色写成 `inherit`。默认 false:color 按 CSS 原样输出,保持既有行为。@author nokecy
14
+ */
15
+ valueEnumContrast?: boolean;
10
16
  hideTool?: boolean;
11
17
  style?: CSSProperties;
12
18
  params?: any;
@@ -5,7 +5,7 @@
5
5
  export interface CalculationColumnConfig {
6
6
  field: string;
7
7
  calculateType: 'sum' | 'avg' | 'standardDeviation';
8
- transactionAmount: number;
8
+ transactionAmount?: number;
9
9
  formatWithCommas?: boolean;
10
10
  cellRenderer?: any;
11
11
  }
@@ -18,9 +18,10 @@ export interface CalculationColumnDefinition {
18
18
  }
19
19
  /** 分组表头只是展示结构;原生固定合计行要读取所有叶子数值列。@author nokecy */
20
20
  export declare const getCalculationColumns: (columns: CalculationColumnDefinition[]) => CalculationColumnConfig[];
21
+ /** 精确数值字符串参与汇总;空值、非法文本及非有限数字跳过。@author nokecy */
21
22
  export declare const isValidNumber: (value: any) => boolean;
22
- export declare const sumField: (field: string, data: any[]) => number;
23
- export declare const avgField: (field: string, data: any[]) => number;
24
- export declare const stdDevField: (field: string, data: any[]) => number;
25
- export declare const formatWithCommas: (value: number) => string;
23
+ export declare const sumField: (field: string, data: any[]) => number | string;
24
+ export declare const avgField: (field: string, data: any[]) => number | string;
25
+ export declare const stdDevField: (field: string, data: any[]) => number | string;
26
+ export declare const formatWithCommas: (value: number | string, places?: number) => string;
26
27
  export declare const computeAggregationRow: (calcColFields: CalculationColumnConfig[], data: any[]) => any[];
@@ -1,13 +1,17 @@
1
1
  "use strict";
2
2
 
3
- 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); }
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.sumField = exports.stdDevField = exports.isValidNumber = exports.getCalculationColumns = exports.formatWithCommas = exports.computeAggregationRow = exports.avgField = void 0;
8
- var _lodash = _interopRequireWildcard(require("lodash"));
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
- 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; }
7
+ var _lodash = require("lodash");
8
+ var _businessDecimal = require("../../utils/businessDecimal");
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; }
11
15
  /**
12
16
  * AG-Grid 底部汇总聚合纯函数(从 ag-gridPlus.tsx 抽出,行为原样)。
13
17
  * @author nokecy
@@ -16,63 +20,68 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
16
20
  /** 分组表头只是展示结构;原生固定合计行要读取所有叶子数值列。@author nokecy */
17
21
  var getCalculationColumns = exports.getCalculationColumns = function getCalculationColumns(columns) {
18
22
  return columns.flatMap(function (column) {
19
- var _column$transactionAm;
20
23
  if (column.children) return getCalculationColumns(column.children);
21
24
  if (!column.field || !column.calculateType) return [];
22
25
  return [{
23
26
  field: column.field,
24
27
  calculateType: column.calculateType,
25
- transactionAmount: (_column$transactionAm = column.transactionAmount) !== null && _column$transactionAm !== void 0 ? _column$transactionAm : 2,
28
+ transactionAmount: column.transactionAmount,
26
29
  formatWithCommas: column.formatWithCommas
27
30
  }];
28
31
  });
29
32
  };
33
+
34
+ /** 精确数值字符串参与汇总;空值、非法文本及非有限数字跳过。@author nokecy */
30
35
  var isValidNumber = exports.isValidNumber = function isValidNumber(value) {
31
- return typeof value === 'number' && !isNaN(value);
36
+ return typeof value === 'number' && Number.isFinite(value) || typeof value === 'string' && /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(value);
32
37
  };
33
- var sumField = exports.sumField = function sumField(field, data) {
34
- return _lodash.default.sumBy(data, function (cur) {
35
- if (cur && isValidNumber(cur[field])) {
36
- return cur[field];
37
- }
38
- return 0;
38
+ var valuesOf = function valuesOf(field, data) {
39
+ return data.filter(function (row) {
40
+ return row && isValidNumber(row[field]);
41
+ }).map(function (row) {
42
+ return row[field];
39
43
  });
40
44
  };
45
+ var resultOf = function resultOf(value, values) {
46
+ return values.some(function (value) {
47
+ return typeof value === 'string';
48
+ }) ? value.toFixed() : value.toNumber();
49
+ };
50
+ var sumField = exports.sumField = function sumField(field, data) {
51
+ var values = valuesOf(field, data);
52
+ return resultOf(values.reduce(function (sum, value) {
53
+ return sum.plus(value);
54
+ }, new _businessDecimal.BusinessDecimal(0)), values);
55
+ };
41
56
  var avgField = exports.avgField = function avgField(field, data) {
42
- // 分子分母口径统一为「有效数字」,避免除零得 NaN
43
- var validValues = data.filter(function (cur) {
44
- return cur && isValidNumber(cur[field]);
45
- });
46
- if (validValues.length === 0) return 0;
47
- var sum = _lodash.default.sumBy(validValues, function (cur) {
48
- return cur[field];
49
- });
50
- return sum / validValues.length;
57
+ var values = valuesOf(field, data);
58
+ return values.length ? resultOf(new _businessDecimal.BusinessDecimal(sumField(field, data)).div(values.length), values) : 0;
51
59
  };
52
-
53
- // 注:现存口径小瑕疵——mean 的分母用有效值数,sumField 对全部行求和(无效计 0);
54
- // variance 遍历全部行且判定用 !== undefined/null(非 isValidNumber)。首刀只保持原行为,不修正。
55
60
  var stdDevField = exports.stdDevField = function stdDevField(field, data) {
56
- var validValues = data.filter(function (cur) {
57
- return isValidNumber(cur[field]);
58
- });
59
- var count = validValues.length;
60
- if (count === 0) return 0;
61
- var mean = sumField(field, data) / count;
62
- var variance = _lodash.default.sumBy(data, function (cur) {
63
- if (cur && cur[field] !== undefined && cur[field] !== null) {
64
- var diff = cur[field] - mean;
65
- return diff * diff;
66
- }
67
- return 0;
68
- }) / count;
69
- return Math.sqrt(variance);
61
+ var values = valuesOf(field, data);
62
+ if (!values.length) return 0;
63
+ var mean = new _businessDecimal.BusinessDecimal(sumField(field, data)).div(values.length);
64
+ var variance = values.reduce(function (sum, value) {
65
+ return sum.plus(new _businessDecimal.BusinessDecimal(value).minus(mean).pow(2));
66
+ }, new _businessDecimal.BusinessDecimal(0)).div(values.length);
67
+ return resultOf(variance.sqrt(), values);
70
68
  };
71
69
  var formatWithCommas = exports.formatWithCommas = function formatWithCommas(value) {
72
- return (value / 1).toLocaleString(undefined, {
73
- minimumFractionDigits: 2,
74
- maximumFractionDigits: 2
75
- });
70
+ var places = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
71
+ var _Exact$toFixed$split = new _businessDecimal.BusinessDecimal(value).toFixed(places).split('.'),
72
+ _Exact$toFixed$split2 = _slicedToArray(_Exact$toFixed$split, 2),
73
+ whole = _Exact$toFixed$split2[0],
74
+ fraction = _Exact$toFixed$split2[1];
75
+ return whole.replace(/\B(?=(\d{3})+(?!\d))/g, ',') + (fraction === undefined ? '' : '.' + fraction);
76
+ };
77
+ var roundedResult = function roundedResult(value, places) {
78
+ return typeof value === 'string' ? new _businessDecimal.BusinessDecimal(value).toDecimalPlaces(places).toFixed() : new _businessDecimal.BusinessDecimal(value).toDecimalPlaces(places).toNumber();
79
+ };
80
+
81
+ /** 精确接口默认保留十位小数;数值型兼容原有两位规则。@author nokecy */
82
+ var precisionOf = function precisionOf(column, value) {
83
+ var _column$transactionAm;
84
+ return (_column$transactionAm = column.transactionAmount) !== null && _column$transactionAm !== void 0 ? _column$transactionAm : typeof value === 'string' ? 10 : 2;
76
85
  };
77
86
 
78
87
  // sum 求和 / avg 平均值 / standardDeviation 标准差
@@ -86,21 +95,22 @@ var computeAggregationRow = exports.computeAggregationRow = function computeAggr
86
95
  switch (i.calculateType) {
87
96
  case 'sum':
88
97
  {
89
- var sumPrecision = typeof i.transactionAmount === 'number' ? i.transactionAmount : 2;
90
- var sumValue = Number(sumField(i.field, data).toFixed(sumPrecision));
91
- calculateData[i.field] = i.formatWithCommas ? formatWithCommas(sumValue) : sumValue;
98
+ var total = sumField(i.field, data);
99
+ var sumPrecision = precisionOf(i, total);
100
+ var sumValue = roundedResult(total, sumPrecision);
101
+ calculateData[i.field] = i.formatWithCommas ? formatWithCommas(sumValue, sumPrecision) : sumValue;
92
102
  break;
93
103
  }
94
104
  case 'avg':
95
105
  {
96
- var avgPrecision = typeof i.transactionAmount === 'number' ? i.transactionAmount : 2;
97
- calculateData[i.field] = Number(avgField(i.field, data).toFixed(avgPrecision));
106
+ var average = avgField(i.field, data);
107
+ calculateData[i.field] = roundedResult(average, precisionOf(i, average));
98
108
  break;
99
109
  }
100
110
  case 'standardDeviation':
101
111
  {
102
- var stdPrecision = typeof i.transactionAmount === 'number' ? i.transactionAmount : 2;
103
- calculateData[i.field] = Number(stdDevField(i.field, data).toFixed(stdPrecision));
112
+ var deviation = stdDevField(i.field, data);
113
+ calculateData[i.field] = roundedResult(deviation, precisionOf(i, deviation));
104
114
  break;
105
115
  }
106
116
  default:
@@ -83,10 +83,11 @@ export declare function mergeInferredColumnType<T extends object>(column: T, dat
83
83
  *
84
84
  * @param col 原始列定义
85
85
  * @param dataType 数据类型(决定是否右对齐,见 {@link toColumnType})
86
+ * @param background 单元格底色(hex)。传入则把枚举颜色压/提到够读的对比度;不传则 color 原样输出
86
87
  * @returns 处理后的列定义
87
88
  * @author nokecy
88
89
  */
89
- export declare function processEnumColumn(col: any, dataType?: DataTypeInference): ColDef;
90
+ export declare function processEnumColumn(col: any, dataType?: DataTypeInference, background?: string): ColDef;
90
91
  /**
91
92
  * 处理省略列定义
92
93
  *
@@ -18,6 +18,7 @@ var _antd = require("antd");
18
18
  var _antdV = require("@formily/antd-v5");
19
19
  var _lodash = require("lodash");
20
20
  var _constants = require("./constants");
21
+ var _valueEnumColor = require("./valueEnumColor");
21
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
23
  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); }
23
24
  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; }
@@ -145,10 +146,11 @@ function mergeInferredColumnType(column, dataType) {
145
146
  *
146
147
  * @param col 原始列定义
147
148
  * @param dataType 数据类型(决定是否右对齐,见 {@link toColumnType})
149
+ * @param background 单元格底色(hex)。传入则把枚举颜色压/提到够读的对比度;不传则 color 原样输出
148
150
  * @returns 处理后的列定义
149
151
  * @author nokecy
150
152
  */
151
- function processEnumColumn(col, dataType) {
153
+ function processEnumColumn(col, dataType, background) {
152
154
  var _defaultItems$0$value, _defaultItems$;
153
155
  var valueEnum = col === null || col === void 0 ? void 0 : col.valueEnum;
154
156
  if (!valueEnum || !Array.isArray(valueEnum)) {
@@ -181,7 +183,8 @@ function processEnumColumn(col, dataType) {
181
183
  // 没配颜色的枚举项曾经默认成 '#ffffff'——白底白字,那一列直接看不见。
182
184
  // 消费端为此在 global.less 里加了一整套 [style*="color: white"] → 紫色 的覆盖来擦屁股,
183
185
  // 顺带把别的颜色也一起改了。这里改成 inherit,跟着单元格的正文色走。@author nokecy
184
- var color = match.color || 'inherit';
186
+ // 传了 background 才启用对比度适配(AgGridPlus 的 valueEnumContrast);否则 color 按 CSS 原样输出。@author nokecy
187
+ var color = background ? (0, _valueEnumColor.toGridTextColor)(match.color, background) : match.color || 'inherit';
185
188
  return /*#__PURE__*/_react.default.createElement("span", {
186
189
  style: {
187
190
  color: color,
@@ -0,0 +1,17 @@
1
+ /** antd Tag 语义档名。 */
2
+ export type SemanticPreset = 'default' | 'processing' | 'success' | 'warning' | 'error';
3
+ /** 语义档名 → 表格文字色(白底实测 ≥4.5:1)。 */
4
+ export declare const semanticTextColors: Record<SemanticPreset, string>;
5
+ /**
6
+ * 把任意 valueEnum.color 收成表格可用的 CSS 色。
7
+ *
8
+ * @param color 枚举项上的 color(语义档、预设名、hex 或缺省)
9
+ * @param background 单元格底色(hex);不传按白底。深色底提亮、浅色底压暗
10
+ */
11
+ export declare const toGridTextColor: (color?: string, background?: string) => string;
12
+ /** 把枚举转成 `valueEnum` 可用的副本(color 一定是当前底色可读的 CSS 色值),不修改源数组。 */
13
+ export declare const gridValueEnum: <T extends {
14
+ color?: string | undefined;
15
+ }>(items: readonly T[], background?: string) => (T & {
16
+ color: string;
17
+ })[];
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.toGridTextColor = exports.semanticTextColors = exports.gridValueEnum = void 0;
7
+ var _contrast = require("../../utils/contrast");
8
+ 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); }
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
+ * `valueEnum.color` 的表格文字色适配。
15
+ *
16
+ * 同一份状态/类别枚举有两个消费方,对 `color` 的要求不同:
17
+ * - antd `<Tag color>` 接受语义档名(`'success'` / `'warning'` …)和预设色名(`'cyan'`);
18
+ * - AgGridPlus 的 `valueEnum` 把 `color` 直接当 **CSS color** 渲染表格文字。
19
+ *
20
+ * 直接透传会让这几类取值在表格里「字看不见」:语义档名与预设名不是合法 CSS
21
+ * (`'cyan'` 是 `#00ffff`,`'default'` 根本不合法);hex 太浅(`#d9d9d9` 白底 1.3:1、`#52c41a` 2.3:1)。
22
+ * 这里把任意 color 收成当前底色上够读(WCAG 正文 4.5:1)的 CSS 色,缺省/无法解析写成 `inherit`,
23
+ * 跟随单元格正文色。已经够读的 hex 原样返回,所以重复调用是幂等的。
24
+ *
25
+ * 语义档色值经 `contrastRatio` 实测:白底均 ≥4.5:1(green-7/orange-7 只有 3.4~3.6:1,不能想当然)。
26
+ *
27
+ * @author nokecy
28
+ */
29
+ /** antd Tag 语义档名。 */
30
+
31
+ var WHITE = '#ffffff';
32
+
33
+ /** 语义档名 → 表格文字色(白底实测 ≥4.5:1)。 */
34
+ var semanticTextColors = exports.semanticTextColors = {
35
+ default: '#595959',
36
+ processing: '#0958d9',
37
+ success: '#237804',
38
+ warning: '#ad4e00',
39
+ error: '#cf1322'
40
+ };
41
+
42
+ /** antd Tag 预设名 / 常见 CSS 色名 → 起始 hex,再交给对比度压色。 */
43
+ var namedColorHex = {
44
+ cyan: '#00ffff',
45
+ aqua: '#00ffff',
46
+ geekblue: '#2f54eb',
47
+ blue: '#0000ff',
48
+ orange: '#ffa500',
49
+ gold: '#ffd700',
50
+ lime: '#00ff00',
51
+ volcano: '#fa541c',
52
+ magenta: '#ff00ff',
53
+ fuchsia: '#ff00ff',
54
+ purple: '#800080',
55
+ red: '#ff0000',
56
+ green: '#008000',
57
+ pink: '#ffc0cb',
58
+ yellow: '#ffff00',
59
+ white: '#ffffff',
60
+ silver: '#c0c0c0'
61
+ };
62
+ var parseHex = function parseHex(color) {
63
+ var raw = color.trim();
64
+ if (!/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(raw)) return undefined;
65
+ return raw.length === 4 ? "#".concat(raw[1]).concat(raw[1]).concat(raw[2]).concat(raw[2]).concat(raw[3]).concat(raw[3]).toLowerCase() : raw.toLowerCase();
66
+ };
67
+
68
+ /** 底色是否为深色表面。 */
69
+ var isDarkSurface = function isDarkSurface(background) {
70
+ return (0, _contrast.relativeLuminance)(background) < 0.18;
71
+ };
72
+
73
+ /**
74
+ * 把任意 valueEnum.color 收成表格可用的 CSS 色。
75
+ *
76
+ * @param color 枚举项上的 color(语义档、预设名、hex 或缺省)
77
+ * @param background 单元格底色(hex);不传按白底。深色底提亮、浅色底压暗
78
+ */
79
+ var toGridTextColor = exports.toGridTextColor = function toGridTextColor(color, background) {
80
+ if (!color) return 'inherit';
81
+ var hex = semanticTextColors[color] || namedColorHex[color.toLowerCase()] || parseHex(color);
82
+ if (!hex) return 'inherit';
83
+ var surface = background && parseHex(background) ? background : WHITE;
84
+ if (isDarkSurface(surface)) return (0, _contrast.lightenUntilContrast)(hex, {
85
+ against: surface
86
+ });
87
+ return (0, _contrast.contrastRatio)(hex, surface) >= 4.5 ? hex : (0, _contrast.darkenUntilContrast)(hex, {
88
+ against: surface
89
+ });
90
+ };
91
+
92
+ /** 把枚举转成 `valueEnum` 可用的副本(color 一定是当前底色可读的 CSS 色值),不修改源数组。 */
93
+ var gridValueEnum = exports.gridValueEnum = function gridValueEnum(items, background) {
94
+ return items.map(function (item) {
95
+ return _objectSpread(_objectSpread({}, item), {}, {
96
+ color: toGridTextColor(item.color, background)
97
+ });
98
+ });
99
+ };
@@ -2,7 +2,11 @@ import { SelectProps } from 'antd/lib/select';
2
2
  import React from 'react';
3
3
  import { ColDef, ColGroupDef } from 'ag-grid-community';
4
4
  import type { PagedApiAdapter } from '../adapters';
5
+ import './index.less';
6
+ /** 选择窗口的行选择模式。 */
7
+ type DialogSelectionMode = 'single' | 'multiple';
5
8
  interface IDialogSelectProps extends SelectProps<any> {
9
+ /** 隐藏选择窗口入口(输入框内的后缀图标),只保留输入与下拉。 */
6
10
  hideBtn?: boolean;
7
11
  request?: any;
8
12
  columnDefs?: (ColDef | ColGroupDef)[] | null;
@@ -13,6 +17,31 @@ interface IDialogSelectProps extends SelectProps<any> {
13
17
  useAutoComplete?: boolean;
14
18
  /** 分页 API 适配器(默认 ABP)。@author nokecy */
15
19
  pagedApiAdapter?: PagedApiAdapter;
20
+ /** 选择窗口宽度,默认 960。 */
21
+ modalWidth?: number | string;
22
+ /** 选择窗口层级,默认 9999(高于抽屉、其他弹窗)。 */
23
+ dialogZIndex?: number;
24
+ /** 选择窗口中的行选择模式;缺省按 `mode` 推断,外层 Select 仍可保持单值。 */
25
+ dialogMode?: DialogSelectionMode;
26
+ /** 选择窗口表格的初始分页大小;不影响外层 Select。 */
27
+ dialogPageSize?: number;
28
+ /** 选择窗口表格可选分页大小。 */
29
+ dialogPageSizeOptions?: number[];
30
+ /** 选择窗口表格的列方案标识。 */
31
+ dialogGridKey?: string;
32
+ /** 已由业务限定范围的本地候选;传入后不再请求接口,表格直接筛选完整候选集且不分页。 */
33
+ dialogDataSource?: any[];
34
+ /** 业务限制下不可带入的行;单击、确认和双击共用该条件。 */
35
+ dialogIsRowSelectable?: (row: any) => boolean;
36
+ /** 自定义选择窗口内容;确认时回传所选行。传入后不再渲染内置的表格窗口。 */
37
+ dialogRenderer?: (context: {
38
+ open: boolean;
39
+ mode: DialogSelectionMode;
40
+ onCancel: () => void;
41
+ onConfirm: (rows: any[]) => void;
42
+ }) => React.ReactNode;
43
+ /** 选择窗口里使用的表格组件,默认 `AgGridPlus`;宿主可注入自己封装过的表格基座。 */
44
+ gridComponent?: React.ComponentType<any>;
16
45
  }
17
46
  declare const DialogSelect: (props: IDialogSelectProps) => React.JSX.Element;
18
47
  export { IDialogSelectProps };