@nokecy/qc-ui 1.1.41 → 1.1.43

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 (41) hide show
  1. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +84 -36
  2. package/dist/cjs/ag-grid-plus/interface.d.ts +17 -1
  3. package/dist/cjs/ag-grid-plus/queryForm/queryForm.js +1 -1
  4. package/dist/cjs/ag-grid-plus/shared/NoRowsOverlay.d.ts +22 -0
  5. package/dist/cjs/ag-grid-plus/shared/NoRowsOverlay.js +41 -0
  6. package/dist/cjs/ag-grid-plus/utils/columnProcessors.d.ts +16 -0
  7. package/dist/cjs/ag-grid-plus/utils/columnProcessors.js +26 -0
  8. package/dist/cjs/ag-grid-plus/utils/constants.d.ts +6 -0
  9. package/dist/cjs/ag-grid-plus/utils/constants.js +7 -1
  10. package/dist/cjs/ag-grid-plus/utils/emptyState.d.ts +42 -0
  11. package/dist/cjs/ag-grid-plus/utils/emptyState.js +75 -0
  12. package/dist/cjs/array-table/utils.d.ts +12 -1
  13. package/dist/cjs/array-table/utils.js +51 -1
  14. package/dist/cjs/deleteConfirm/index.d.ts +19 -2
  15. package/dist/cjs/deleteConfirm/index.js +34 -14
  16. package/dist/cjs/dialogSelect/index.js +23 -9
  17. package/dist/cjs/fullScreenAlert/index.d.ts +11 -0
  18. package/dist/cjs/fullScreenAlert/index.js +10 -3
  19. package/dist/cjs/fullScreenAlert/index.less +31 -0
  20. package/dist/esm/ag-grid-plus/ag-gridPlus.js +84 -36
  21. package/dist/esm/ag-grid-plus/interface.d.ts +17 -1
  22. package/dist/esm/ag-grid-plus/queryForm/queryForm.js +1 -1
  23. package/dist/esm/ag-grid-plus/shared/NoRowsOverlay.d.ts +22 -0
  24. package/dist/esm/ag-grid-plus/shared/NoRowsOverlay.js +35 -0
  25. package/dist/esm/ag-grid-plus/utils/columnProcessors.d.ts +16 -0
  26. package/dist/esm/ag-grid-plus/utils/columnProcessors.js +25 -0
  27. package/dist/esm/ag-grid-plus/utils/constants.d.ts +6 -0
  28. package/dist/esm/ag-grid-plus/utils/constants.js +7 -1
  29. package/dist/esm/ag-grid-plus/utils/emptyState.d.ts +42 -0
  30. package/dist/esm/ag-grid-plus/utils/emptyState.js +66 -0
  31. package/dist/esm/array-table/utils.d.ts +12 -1
  32. package/dist/esm/array-table/utils.js +51 -1
  33. package/dist/esm/deleteConfirm/index.d.ts +19 -2
  34. package/dist/esm/deleteConfirm/index.js +34 -14
  35. package/dist/esm/dialogSelect/index.js +23 -9
  36. package/dist/esm/fullScreenAlert/index.d.ts +11 -0
  37. package/dist/esm/fullScreenAlert/index.js +11 -4
  38. package/dist/esm/fullScreenAlert/index.less +31 -0
  39. package/dist/umd/qc-ui.min.css +1 -1
  40. package/dist/umd/qc-ui.min.js +1 -1
  41. package/package.json +1 -1
@@ -16,6 +16,7 @@ var _toolBar = _interopRequireDefault(require("./toolBar"));
16
16
  var _settingItem = _interopRequireDefault(require("./settingItem"));
17
17
  var _icons = require("@ant-design/icons");
18
18
  var _utils = require("./utils");
19
+ var _columnProcessors = require("./utils/columnProcessors");
19
20
  var _AdvancedQueryBuilder = _interopRequireDefault(require("./queryForm/AdvancedQueryBuilder"));
20
21
  var _uuid = require("uuid");
21
22
  var _setting = _interopRequireDefault(require("./setting"));
@@ -23,6 +24,9 @@ var _2 = require(".");
23
24
  var _useRowId2 = require("./hooks/useRowId");
24
25
  var _lodash = _interopRequireWildcard(require("lodash"));
25
26
  var _customGroupCellRenderer = _interopRequireDefault(require("./_utils/customGroupCellRenderer"));
27
+ var _NoRowsOverlay = _interopRequireDefault(require("./shared/NoRowsOverlay"));
28
+ var _constants = require("./utils/constants");
29
+ var _emptyState = require("./utils/emptyState");
26
30
  var _processColumnGroups = _interopRequireDefault(require("./_utils/processColumnGroups"));
27
31
  var _processFormColumnState = _interopRequireDefault(require("./_utils/processFormColumnState"));
28
32
  var _antdV = require("@formily/antd-v5");
@@ -32,7 +36,6 @@ var _queryFormContext = require("./context/queryFormContext");
32
36
  var _useSchemeManager = require("./context/useSchemeManager");
33
37
  var _useSchemeDataFlow = require("./context/useSchemeDataFlow");
34
38
  var _schemeDataMigration = require("./shared/utils/schemeDataMigration");
35
- var _sanitize = require("./utils/sanitize");
36
39
  var _aggregation = require("./utils/aggregation");
37
40
  var _queryFormDerivation = require("./utils/queryFormDerivation");
38
41
  var _rowSelection = require("./utils/rowSelection");
@@ -40,7 +43,7 @@ var _requestParams = require("./utils/requestParams");
40
43
  var _errors = require("./errors");
41
44
  var _logger = require("./utils/logger");
42
45
  var _entityExtensionColumns = require("./utils/entityExtensionColumns");
43
- var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "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"];
44
47
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
45
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); }
46
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; }
@@ -103,6 +106,9 @@ function AgGridPlus(props) {
103
106
  overlayNoRowsTemplateText = props.overlayNoRowsTemplateText,
104
107
  queryDefaultRows = props.queryDefaultRows,
105
108
  onSelectedRowsChange = props.onSelectedRowsChange,
109
+ emptyState = props.emptyState,
110
+ _props$accessible = props.accessible,
111
+ accessible = _props$accessible === void 0 ? true : _props$accessible,
106
112
  _props$enableClickSel = props.enableClickSelection,
107
113
  enableClickSelection = _props$enableClickSel === void 0 ? true : _props$enableClickSel,
108
114
  propsRowSelection = props.rowSelection,
@@ -149,35 +155,44 @@ function AgGridPlus(props) {
149
155
  _useState6 = _slicedToArray(_useState5, 2),
150
156
  loading = _useState6[0],
151
157
  setLoading = _useState6[1];
152
- var _useState7 = (0, _react.useState)(),
158
+ // 空态四分需要的两个事实:这次请求是不是失败了、用户有没有施加筛选。@author nokecy
159
+ var _useState7 = (0, _react.useState)(null),
153
160
  _useState8 = _slicedToArray(_useState7, 2),
154
- columnState = _useState8[0],
155
- setColumnState = _useState8[1];
156
- var _useState9 = (0, _react.useState)({}),
161
+ loadError = _useState8[0],
162
+ setLoadError = _useState8[1];
163
+ var _useState9 = (0, _react.useState)(false),
157
164
  _useState10 = _slicedToArray(_useState9, 2),
158
- columnCellClass = _useState10[0],
159
- setColumnCellClass = _useState10[1];
160
- var _useState11 = (0, _react.useState)([]),
165
+ filtered = _useState10[0],
166
+ setFiltered = _useState10[1];
167
+ var _useState11 = (0, _react.useState)(),
161
168
  _useState12 = _slicedToArray(_useState11, 2),
162
- rowData = _useState12[0],
163
- setRowData = _useState12[1];
169
+ columnState = _useState12[0],
170
+ setColumnState = _useState12[1];
164
171
  var _useState13 = (0, _react.useState)({}),
165
172
  _useState14 = _slicedToArray(_useState13, 2),
166
- queryFilter = _useState14[0],
167
- setQueryFilter = _useState14[1];
168
- var _useState15 = (0, _react.useState)(),
173
+ columnCellClass = _useState14[0],
174
+ setColumnCellClass = _useState14[1];
175
+ var _useState15 = (0, _react.useState)([]),
169
176
  _useState16 = _slicedToArray(_useState15, 2),
170
- sortColumn = _useState16[0],
171
- setSortColumn = _useState16[1];
177
+ rowData = _useState16[0],
178
+ setRowData = _useState16[1];
179
+ var _useState17 = (0, _react.useState)({}),
180
+ _useState18 = _slicedToArray(_useState17, 2),
181
+ queryFilter = _useState18[0],
182
+ setQueryFilter = _useState18[1];
183
+ var _useState19 = (0, _react.useState)(),
184
+ _useState20 = _slicedToArray(_useState19, 2),
185
+ sortColumn = _useState20[0],
186
+ setSortColumn = _useState20[1];
172
187
  // 初始化分页参数,支持外部传入的pageSize
173
- var _useState17 = (0, _react.useState)({
188
+ var _useState21 = (0, _react.useState)({
174
189
  pageSize: props.pageSize !== undefined ? props.pageSize : props.hidePagination ? 10000 : 200,
175
190
  current: 1,
176
191
  total: dataSource ? dataSource.length : 0
177
192
  }),
178
- _useState18 = _slicedToArray(_useState17, 2),
179
- pagination = _useState18[0],
180
- setPagination = _useState18[1];
193
+ _useState22 = _slicedToArray(_useState21, 2),
194
+ pagination = _useState22[0],
195
+ setPagination = _useState22[1];
181
196
 
182
197
  // ============ 方案管理 - 使用集中式 Context ============
183
198
  var _useGridSchemes = (0, _useSchemeManager.useGridSchemes)(),
@@ -196,16 +211,16 @@ function AgGridPlus(props) {
196
211
  getColumnSchemes = _useGridSchemes.getColumnSchemes,
197
212
  getQuerySchemes = _useGridSchemes.getQuerySchemes,
198
213
  getCurrentScheme = _useGridSchemes.getCurrentScheme;
199
- var _useState19 = (0, _react.useState)([]),
200
- _useState20 = _slicedToArray(_useState19, 2),
201
- queryItemsOrder = _useState20[0],
202
- setQueryItemsOrder = _useState20[1];
214
+ var _useState23 = (0, _react.useState)([]),
215
+ _useState24 = _slicedToArray(_useState23, 2),
216
+ queryItemsOrder = _useState24[0],
217
+ setQueryItemsOrder = _useState24[1];
203
218
 
204
219
  // 高级查询状态
205
- var _useState21 = (0, _react.useState)(false),
206
- _useState22 = _slicedToArray(_useState21, 2),
207
- advancedPopoverOpen = _useState22[0],
208
- setAdvancedPopoverOpen = _useState22[1];
220
+ var _useState25 = (0, _react.useState)(false),
221
+ _useState26 = _slicedToArray(_useState25, 2),
222
+ advancedPopoverOpen = _useState26[0],
223
+ setAdvancedPopoverOpen = _useState26[1];
209
224
  var createEmptyRuleGroup = function createEmptyRuleGroup() {
210
225
  return {
211
226
  id: (0, _uuid.v4)(),
@@ -213,10 +228,10 @@ function AgGridPlus(props) {
213
228
  children: []
214
229
  };
215
230
  };
216
- var _useState23 = (0, _react.useState)(createEmptyRuleGroup),
217
- _useState24 = _slicedToArray(_useState23, 2),
218
- advancedQueryRules = _useState24[0],
219
- setAdvancedQueryRules = _useState24[1];
231
+ var _useState27 = (0, _react.useState)(createEmptyRuleGroup),
232
+ _useState28 = _slicedToArray(_useState27, 2),
233
+ advancedQueryRules = _useState28[0],
234
+ setAdvancedQueryRules = _useState28[1];
220
235
 
221
236
  /**
222
237
  * 【P1 架构优化】使用单向数据流架构
@@ -476,7 +491,7 @@ function AgGridPlus(props) {
476
491
  });
477
492
  return match ? match.label : params.value;
478
493
  };
479
- return _objectSpread(_objectSpread(_objectSpread({}, dataType), col), {}, {
494
+ return _objectSpread(_objectSpread(_objectSpread({}, (0, _columnProcessors.toColumnType)(dataType)), col), {}, {
480
495
  cellRenderer: function cellRenderer(params) {
481
496
  var match = valueEnum.find(function (item) {
482
497
  return item.value == params.value;
@@ -536,7 +551,7 @@ function AgGridPlus(props) {
536
551
  cellRenderer: cellRenderer
537
552
  });
538
553
  }
539
- return _objectSpread(_objectSpread(_objectSpread({}, dataType), col), {}, {
554
+ return _objectSpread(_objectSpread(_objectSpread({}, (0, _columnProcessors.toColumnType)(dataType)), col), {}, {
540
555
  customCellRenderer: col.cellRenderer,
541
556
  cellRenderer: cellRenderer
542
557
  });
@@ -697,6 +712,8 @@ function AgGridPlus(props) {
697
712
  try {
698
713
  // 处理高级查询模式 / 简单模式的过滤字符串构建
699
714
  var filter = (0, _requestParams.buildFilterString)(queryFilter, allColDefsRef.current);
715
+ // 空结果要不要说「换个筛选条件试试」,取决于用户这次到底有没有筛。@author nokecy
716
+ setFiltered((0, _emptyState.hasEffectiveFilter)(filter, queryFilter));
700
717
  var params = _objectSpread(_objectSpread({
701
718
  filter: filter
702
719
  }, stableGridParams), {}, {
@@ -734,6 +751,7 @@ function AgGridPlus(props) {
734
751
  });
735
752
  });
736
753
  setLoading(false);
754
+ setLoadError(null);
737
755
  _logger.logger.info('数据请求成功', {
738
756
  rowCount: rowCount
739
757
  });
@@ -796,6 +814,9 @@ function AgGridPlus(props) {
796
814
  originalError: error
797
815
  }, error);
798
816
 
817
+ // 失败必须留痕:不留痕的话表格只会显示「没有找到数据」,把接口故障说成没数据。@author nokecy
818
+ setLoadError(gridError);
819
+
799
820
  // 记录错误
800
821
  _logger.logger.error('数据请求失败', gridError.getDetails());
801
822
 
@@ -815,6 +836,7 @@ function AgGridPlus(props) {
815
836
  queryFilter: queryFilter,
816
837
  allColDefs: allColDefsRef.current
817
838
  }, error instanceof Error ? error : undefined);
839
+ setLoadError(gridError);
818
840
  _logger.logger.error('数据请求处理失败', gridError.getDetails());
819
841
  _antd.message.error(gridError.getUserMessage());
820
842
  if (onErrorRef.current) {
@@ -895,6 +917,27 @@ function AgGridPlus(props) {
895
917
  onRequest(stableQueryFilter);
896
918
  }
897
919
  }, [onRequest, stableQueryFilter]);
920
+
921
+ // 空态四分:加载失败 / 无权限 / 筛选无结果 / 无数据,各说各的,失败那支还给出「重试」。
922
+ // 以前四种情况共用一句「没有找到数据,试试调整筛选条件吧!」,接口挂了也这么说,
923
+ // 用户按提示去调筛选,越调越没有。@author nokecy
924
+ var noRowsOverlayParams = (0, _react.useMemo)(function () {
925
+ return {
926
+ branch: (0, _emptyState.resolveEmptyBranch)({
927
+ hasError: !!loadError,
928
+ accessible: accessible,
929
+ filtered: filtered
930
+ }),
931
+ text: (0, _emptyState.resolveEmptyText)({
932
+ hasError: !!loadError,
933
+ accessible: accessible,
934
+ filtered: filtered,
935
+ override: overlayNoRowsTemplateText,
936
+ texts: emptyState
937
+ }),
938
+ onRetry: onRefresh
939
+ };
940
+ }, [loadError, accessible, filtered, overlayNoRowsTemplateText, emptyState, onRefresh]);
898
941
  (0, _react.useEffect)(function () {
899
942
  gridRef.current = {
900
943
  onRefresh: onRefresh
@@ -1336,7 +1379,12 @@ function AgGridPlus(props) {
1336
1379
  ensureDomOrder: true,
1337
1380
  columnHoverHighlight: true
1338
1381
  },
1339
- overlayNoRowsTemplate: (0, _sanitize.createSafeHtmlTemplate)(overlayNoRowsTemplateText || '没有找到数据,试试调整筛选条件吧!'),
1382
+ noRowsOverlayComponent: _NoRowsOverlay.default,
1383
+ noRowsOverlayComponentParams: noRowsOverlayParams
1384
+ // 加载中不显示空态:外层 Spin 已经在转,再叠一句「暂无数据」会让用户
1385
+ // 以为真的没数据(冒烟截图里这两者确实同时出现过)。@author nokecy
1386
+ ,
1387
+ suppressNoRowsOverlay: loading,
1340
1388
  enableRangeSelection: true,
1341
1389
  suppressCopyRowsToClipboard: true,
1342
1390
  autoGroupColumnDef: autoGroupColumnDef
@@ -1416,7 +1464,7 @@ function AgGridPlus(props) {
1416
1464
  showTotal: function showTotal(total, range) {
1417
1465
  return "\u7B2C ".concat(range[0], "-").concat(range[1], " \u6761/\u603B\u5171 ").concat(total, " \u6761");
1418
1466
  },
1419
- pageSizeOptions: props.pageSizeOptions || [10, 20, 50, 100, 200, 500, 1000, 10000],
1467
+ pageSizeOptions: props.pageSizeOptions || _constants.DEFAULT_PAGE_SIZE_OPTIONS,
1420
1468
  hideOnSinglePage: false,
1421
1469
  showQuickJumper: false
1422
1470
  })))))));
@@ -2,6 +2,7 @@ import { GridApi, ColDef, ColGroupDef } from "ag-grid-community";
2
2
  import { AgGridReactProps } from "ag-grid-react";
3
3
  import React, { CSSProperties, ReactNode } from "react";
4
4
  import type { GridPlusError } from "./errors";
5
+ import type { EmptyStateTexts } from "./utils/emptyState";
5
6
  interface GridRef {
6
7
  onRefresh: () => void;
7
8
  }
@@ -42,9 +43,24 @@ interface GridProps extends AgGridReactProps {
42
43
  */
43
44
  gridColumnState?: any[];
44
45
  /**
45
- * 列表空数据文字提示
46
+ * 列表空数据文字提示。
47
+ * 传了它就一律用它(最高优先级),保持既有调用点行为不变;
48
+ * 想按「无数据 / 筛选无结果 / 无权限 / 加载失败」分别给文案,用 `emptyState`。
46
49
  */
47
50
  overlayNoRowsTemplateText?: string;
51
+ /**
52
+ * 空态四分文案覆盖:{ noData, noResult, noPermission, error }。
53
+ * 不传就用内置默认:加载失败说加载失败并给「重试」,没筛选就说「暂无数据」,
54
+ * 不再一律引导用户去调筛选条件。
55
+ * @author nokecy
56
+ */
57
+ emptyState?: EmptyStateTexts;
58
+ /**
59
+ * 当前用户是否有权查看该列表。传 false 时空态说「没有权限」而不是「暂无数据」,
60
+ * 免得用户以为是数据还没录进来。
61
+ * @author nokecy
62
+ */
63
+ accessible?: boolean;
48
64
  /**
49
65
  * 查询Form默认展示行数
50
66
  */
@@ -83,7 +83,7 @@ var QueryForm = (0, _react.observer)(function (props) {
83
83
 
84
84
  var renderActions = function renderActions() {
85
85
  return /*#__PURE__*/_react2.default.createElement(_react2.Fragment, null, /*#__PURE__*/_react2.default.createElement(_antdV.Submit, {
86
- type: "default",
86
+ type: "primary",
87
87
  icon: /*#__PURE__*/_react2.default.createElement(_icons.SearchOutlined, null)
88
88
  }, "\u67E5\u8BE2"), /*#__PURE__*/_react2.default.createElement(_antd.Button, {
89
89
  icon: /*#__PURE__*/_react2.default.createElement(_icons.ClearOutlined, null),
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import type { EmptyStateBranch } from '../utils/emptyState';
3
+ /**
4
+ * 表格空态浮层。
5
+ *
6
+ * 换掉原来的 `overlayNoRowsTemplate` 纯 HTML 模板:模板只能放一句话,
7
+ * 于是「接口挂了」和「这条数据确实没有」共用了同一句
8
+ * 「没有找到数据,试试调整筛选条件吧!」,把用户往错误的方向引。
9
+ * 用 React 浮层才放得下「重试」这样的出路。
10
+ *
11
+ * @author nokecy
12
+ */
13
+ export interface NoRowsOverlayParams {
14
+ /** 当前该走哪一支:加载失败 / 无权限 / 筛选无结果 / 无数据 */
15
+ branch?: EmptyStateBranch;
16
+ /** 该支的文案 */
17
+ text?: string;
18
+ /** 加载失败时的重试入口 */
19
+ onRetry?: () => void;
20
+ }
21
+ declare const NoRowsOverlay: React.FC<NoRowsOverlayParams>;
22
+ export default NoRowsOverlay;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _antd = require("antd");
8
+ var _react = _interopRequireDefault(require("react"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ /**
11
+ * 表格空态浮层。
12
+ *
13
+ * 换掉原来的 `overlayNoRowsTemplate` 纯 HTML 模板:模板只能放一句话,
14
+ * 于是「接口挂了」和「这条数据确实没有」共用了同一句
15
+ * 「没有找到数据,试试调整筛选条件吧!」,把用户往错误的方向引。
16
+ * 用 React 浮层才放得下「重试」这样的出路。
17
+ *
18
+ * @author nokecy
19
+ */
20
+
21
+ var NoRowsOverlay = function NoRowsOverlay(_ref) {
22
+ var branch = _ref.branch,
23
+ text = _ref.text,
24
+ onRetry = _ref.onRetry;
25
+ return /*#__PURE__*/_react.default.createElement("div", {
26
+ style: {
27
+ display: 'flex',
28
+ flexDirection: 'column',
29
+ alignItems: 'center',
30
+ gap: 8
31
+ }
32
+ }, /*#__PURE__*/_react.default.createElement(_antd.Empty, {
33
+ image: _antd.Empty.PRESENTED_IMAGE_SIMPLE,
34
+ description: text
35
+ }), branch === 'error' && onRetry ? /*#__PURE__*/_react.default.createElement(_antd.Button, {
36
+ size: "small",
37
+ danger: true,
38
+ onClick: onRetry
39
+ }, "\u91CD\u8BD5") : null);
40
+ };
41
+ var _default = exports.default = NoRowsOverlay;
@@ -49,6 +49,22 @@ export declare function handleGridPlusColumnState(columnState: ExtendedColumnSta
49
49
  * @returns 数据类型推断结果
50
50
  */
51
51
  export declare function inferDataType(data: any, colName: string, valueEnum?: ValueEnumItem[]): DataTypeInference | undefined;
52
+ /**
53
+ * 把「推断出的数据类型」翻译成列定义片段。
54
+ *
55
+ * dataType.type 是数据类型(number/string/...),不是 AG Grid 的列类型(columnTypes)。
56
+ * 早先是把整个 dataType 摊进 colDef,等于给列设了 type:"number"——而注册的 columnTypes 里
57
+ * 根本没有叫 number 的类型,这个字段一直没生效。
58
+ *
59
+ * 数量型数值列真正该有的是右对齐:位数对齐了才能一眼比大小。只有 calculateType 为真
60
+ * (可求和的数量型)才右对齐;用 valueEnum 表示分类的数值列(状态码之类)不动。
61
+ *
62
+ * @author nokecy
63
+ */
64
+ export declare function toColumnType(dataType?: DataTypeInference): {
65
+ calculateType?: any;
66
+ type?: string;
67
+ };
52
68
  /**
53
69
  * 处理枚举列定义
54
70
  *
@@ -11,6 +11,7 @@ exports.handleGridPlusColumnState = handleGridPlusColumnState;
11
11
  exports.inferDataType = inferDataType;
12
12
  exports.processEllipsisColumn = processEllipsisColumn;
13
13
  exports.processEnumColumn = processEnumColumn;
14
+ exports.toColumnType = toColumnType;
14
15
  var _react = _interopRequireDefault(require("react"));
15
16
  var _antd = require("antd");
16
17
  var _antdV = require("@formily/antd-v5");
@@ -96,6 +97,31 @@ function inferDataType(data, colName, valueEnum) {
96
97
  return undefined;
97
98
  }
98
99
 
100
+ /**
101
+ * 把「推断出的数据类型」翻译成列定义片段。
102
+ *
103
+ * dataType.type 是数据类型(number/string/...),不是 AG Grid 的列类型(columnTypes)。
104
+ * 早先是把整个 dataType 摊进 colDef,等于给列设了 type:"number"——而注册的 columnTypes 里
105
+ * 根本没有叫 number 的类型,这个字段一直没生效。
106
+ *
107
+ * 数量型数值列真正该有的是右对齐:位数对齐了才能一眼比大小。只有 calculateType 为真
108
+ * (可求和的数量型)才右对齐;用 valueEnum 表示分类的数值列(状态码之类)不动。
109
+ *
110
+ * @author nokecy
111
+ */
112
+ function toColumnType(dataType) {
113
+ if (!dataType) return {};
114
+ if (dataType.type === 'number' && dataType.calculateType) {
115
+ return {
116
+ calculateType: dataType.calculateType,
117
+ type: 'rightAligned'
118
+ };
119
+ }
120
+ return {
121
+ calculateType: dataType.calculateType
122
+ };
123
+ }
124
+
99
125
  /**
100
126
  * 处理枚举列定义
101
127
  *
@@ -14,6 +14,12 @@ export declare const DEFAULT_SEARCH_SORT_ORDER = 999;
14
14
  /**
15
15
  * 默认分页大小选项
16
16
  */
17
+ /**
18
+ * 一次取 10000 行会让车间那台低配 PC 直接卡死,而且没有哪个岗位需要一屏翻一万行——
19
+ * 要全量数据应该走导出。上限收到 1000。
20
+ * 不分页场景另有 DEFAULT_PAGE_SIZE_WHEN_HIDDEN,不受这里影响。
21
+ * @author nokecy
22
+ */
17
23
  export declare const DEFAULT_PAGE_SIZE_OPTIONS: number[];
18
24
  /**
19
25
  * 默认分页大小
@@ -23,7 +23,13 @@ var DEFAULT_SEARCH_SORT_ORDER = exports.DEFAULT_SEARCH_SORT_ORDER = 999;
23
23
  /**
24
24
  * 默认分页大小选项
25
25
  */
26
- var DEFAULT_PAGE_SIZE_OPTIONS = exports.DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100, 200, 500, 1000, 10000];
26
+ /**
27
+ * 一次取 10000 行会让车间那台低配 PC 直接卡死,而且没有哪个岗位需要一屏翻一万行——
28
+ * 要全量数据应该走导出。上限收到 1000。
29
+ * 不分页场景另有 DEFAULT_PAGE_SIZE_WHEN_HIDDEN,不受这里影响。
30
+ * @author nokecy
31
+ */
32
+ var DEFAULT_PAGE_SIZE_OPTIONS = exports.DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100, 200, 500, 1000];
27
33
 
28
34
  /**
29
35
  * 默认分页大小
@@ -0,0 +1,42 @@
1
+ import type { QueryFilterState } from '../types';
2
+ /**
3
+ * 表格空态四分。
4
+ *
5
+ * 原来空态的全部表达能力是一个字符串,兜底文案是「没有找到数据,试试调整筛选条件吧!」——
6
+ * 请求失败时显示的也是这一句。在 MES 这类业务里,「这条数据确实没有」和「接口挂了」
7
+ * 导向完全相反的动作(去补录 vs 去叫 IT),用同一句话回答,还主动把用户往筛选条件上引,
8
+ * 是一次系统性的假阴性。
9
+ *
10
+ * 这里把空态拆成四支:加载失败 / 无权限 / 筛选无结果 / 无数据,逻辑写成纯函数便于单测。
11
+ *
12
+ * @author nokecy
13
+ */
14
+ export type EmptyStateBranch = 'error' | 'noPermission' | 'noResult' | 'noData';
15
+ /** 四支文案,按支覆盖。不传的支走默认。 */
16
+ export type EmptyStateTexts = Partial<Record<EmptyStateBranch, string>>;
17
+ export declare const DEFAULT_EMPTY_TEXTS: Record<EmptyStateBranch, string>;
18
+ /**
19
+ * 判断本次请求是否带着生效筛选。
20
+ * 只有它为真,空结果才该说「换个筛选条件试试」;否则说「暂无数据」。
21
+ *
22
+ * @param filterString buildFilterString 的产物,涵盖简单查询与高级查询
23
+ * @param queryFilter 查询表单当前值,用于兜住 filterString 尚未覆盖的场景
24
+ */
25
+ export declare function hasEffectiveFilter(filterString?: string, queryFilter?: QueryFilterState | null): boolean;
26
+ /** 选出当前该走哪一支。优先级:加载失败 > 无权限 > 筛选无结果 > 无数据。 */
27
+ export declare function resolveEmptyBranch(state: {
28
+ hasError?: boolean;
29
+ accessible?: boolean;
30
+ filtered?: boolean;
31
+ }): EmptyStateBranch;
32
+ /**
33
+ * 算出最终要显示的空态文案。
34
+ * `override` 是调用方原来就在用的 `overlayNoRowsTemplateText`,保持最高优先级,向后兼容。
35
+ */
36
+ export declare function resolveEmptyText(state: {
37
+ hasError?: boolean;
38
+ accessible?: boolean;
39
+ filtered?: boolean;
40
+ override?: string;
41
+ texts?: EmptyStateTexts;
42
+ }): string;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_EMPTY_TEXTS = void 0;
7
+ exports.hasEffectiveFilter = hasEffectiveFilter;
8
+ exports.resolveEmptyBranch = resolveEmptyBranch;
9
+ exports.resolveEmptyText = resolveEmptyText;
10
+ 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); }
11
+ /**
12
+ * 表格空态四分。
13
+ *
14
+ * 原来空态的全部表达能力是一个字符串,兜底文案是「没有找到数据,试试调整筛选条件吧!」——
15
+ * 请求失败时显示的也是这一句。在 MES 这类业务里,「这条数据确实没有」和「接口挂了」
16
+ * 导向完全相反的动作(去补录 vs 去叫 IT),用同一句话回答,还主动把用户往筛选条件上引,
17
+ * 是一次系统性的假阴性。
18
+ *
19
+ * 这里把空态拆成四支:加载失败 / 无权限 / 筛选无结果 / 无数据,逻辑写成纯函数便于单测。
20
+ *
21
+ * @author nokecy
22
+ */
23
+
24
+ /** 四支文案,按支覆盖。不传的支走默认。 */
25
+
26
+ var DEFAULT_EMPTY_TEXTS = exports.DEFAULT_EMPTY_TEXTS = {
27
+ error: '数据加载失败,请点上方「重试」',
28
+ noPermission: '没有查看该数据的权限,请联系系统管理员',
29
+ noResult: '没有符合当前筛选条件的数据,试试放宽或清空筛选条件',
30
+ noData: '暂无数据'
31
+ };
32
+ var isBlank = function isBlank(value) {
33
+ if (value === undefined || value === null || value === '') return true;
34
+ if (Array.isArray(value)) return value.length === 0;
35
+ return false;
36
+ };
37
+
38
+ /**
39
+ * 判断本次请求是否带着生效筛选。
40
+ * 只有它为真,空结果才该说「换个筛选条件试试」;否则说「暂无数据」。
41
+ *
42
+ * @param filterString buildFilterString 的产物,涵盖简单查询与高级查询
43
+ * @param queryFilter 查询表单当前值,用于兜住 filterString 尚未覆盖的场景
44
+ */
45
+ function hasEffectiveFilter(filterString, queryFilter) {
46
+ if (typeof filterString === 'string' && filterString.trim() !== '') return true;
47
+ if (!queryFilter || _typeof(queryFilter) !== 'object') return false;
48
+ var anyFilter = queryFilter;
49
+ if (anyFilter.__advancedMode__) {
50
+ var _anyFilter$__rules__$, _anyFilter$__rules__;
51
+ return ((_anyFilter$__rules__$ = (_anyFilter$__rules__ = anyFilter.__rules__) === null || _anyFilter$__rules__ === void 0 || (_anyFilter$__rules__ = _anyFilter$__rules__.children) === null || _anyFilter$__rules__ === void 0 ? void 0 : _anyFilter$__rules__.length) !== null && _anyFilter$__rules__$ !== void 0 ? _anyFilter$__rules__$ : 0) > 0;
52
+ }
53
+ return Object.values(anyFilter).some(function (value) {
54
+ return !isBlank(value);
55
+ });
56
+ }
57
+
58
+ /** 选出当前该走哪一支。优先级:加载失败 > 无权限 > 筛选无结果 > 无数据。 */
59
+ function resolveEmptyBranch(state) {
60
+ if (state.hasError) return 'error';
61
+ if (state.accessible === false) return 'noPermission';
62
+ if (state.filtered) return 'noResult';
63
+ return 'noData';
64
+ }
65
+
66
+ /**
67
+ * 算出最终要显示的空态文案。
68
+ * `override` 是调用方原来就在用的 `overlayNoRowsTemplateText`,保持最高优先级,向后兼容。
69
+ */
70
+ function resolveEmptyText(state) {
71
+ var _state$texts$branch, _state$texts;
72
+ if (state.override) return state.override;
73
+ var branch = resolveEmptyBranch(state);
74
+ return (_state$texts$branch = (_state$texts = state.texts) === null || _state$texts === void 0 ? void 0 : _state$texts[branch]) !== null && _state$texts$branch !== void 0 ? _state$texts$branch : DEFAULT_EMPTY_TEXTS[branch];
75
+ }
@@ -20,6 +20,17 @@ declare const useArrayTableActions: () => ObservableColumnSource[];
20
20
  * 校验安全:未碰过的存量格本就是 readPretty、本就不参与校验,不挂树校验语义零变化。@author nokecy
21
21
  */
22
22
  declare const LazyAgField: (params: any) => React.JSX.Element;
23
+ /**
24
+ * 反应式只读文本渲染器(列级 readPretty 在「可编辑表」里的展示列)。
25
+ *
26
+ * 只读纯文本快路径(valueFormatter)经 AG-Grid 缓存 params.value 取值,setValuesIn 程序化原地改值
27
+ * 不会刷新该格 → 自动带出的外码/描述等只读展示列空白。本渲染器 Observer 读可观察 record[dataKey],
28
+ * 保持 readPretty 纯文本观感(不挂 Formily 树、不可点编辑),但能跟随 setValuesIn 即时刷新。
29
+ *
30
+ * 仅用于「可编辑表的列级 readPretty 展示列」;「整表 readPretty」(明细/详情页,数据经 setValues 整体
31
+ * 加载,行引用整体替换→AG-Grid 自然刷新)仍走更廉价的静态 valueFormatter 快路径。@author nokecy
32
+ */
33
+ declare const LazyReadOnlyText: (params: any) => React.JSX.Element;
23
34
  declare const buildArrayTableColumns: (dataSource: any[], field: ArrayField, sources: ObservableColumnSource[]) => AgGridReactProps['columnDefs'];
24
35
  declare const useAddition: () => React.JSX.Element | null;
25
- export { isColumnComponent, useArrayTableSources, useArrayTableActions, buildArrayTableColumns, useAddition, LazyAgField };
36
+ export { isColumnComponent, useArrayTableSources, useArrayTableActions, buildArrayTableColumns, useAddition, LazyAgField, LazyReadOnlyText };