@nokecy/qc-ui 1.1.42 → 1.1.44
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.
- package/dist/cjs/ag-grid-plus/ag-gridPlus.js +84 -36
- package/dist/cjs/ag-grid-plus/interface.d.ts +17 -1
- package/dist/cjs/ag-grid-plus/queryForm/queryForm.js +1 -1
- package/dist/cjs/ag-grid-plus/shared/NoRowsOverlay.d.ts +22 -0
- package/dist/cjs/ag-grid-plus/shared/NoRowsOverlay.js +41 -0
- package/dist/cjs/ag-grid-plus/utils/columnProcessors.d.ts +16 -0
- package/dist/cjs/ag-grid-plus/utils/columnProcessors.js +26 -0
- package/dist/cjs/ag-grid-plus/utils/constants.d.ts +6 -0
- package/dist/cjs/ag-grid-plus/utils/constants.js +7 -1
- package/dist/cjs/ag-grid-plus/utils/emptyState.d.ts +42 -0
- package/dist/cjs/ag-grid-plus/utils/emptyState.js +75 -0
- package/dist/cjs/dashboard/widget/selector/filterWidgets.d.ts +27 -0
- package/dist/cjs/dashboard/widget/selector/filterWidgets.js +53 -0
- package/dist/cjs/dashboard/widget/selector/index.js +2 -21
- package/dist/cjs/deleteConfirm/index.d.ts +19 -2
- package/dist/cjs/deleteConfirm/index.js +34 -14
- package/dist/cjs/dialogSelect/index.js +23 -9
- package/dist/cjs/fullScreenAlert/index.d.ts +11 -0
- package/dist/cjs/fullScreenAlert/index.js +10 -3
- package/dist/cjs/fullScreenAlert/index.less +31 -0
- package/dist/cjs/toolBar/index.js +0 -3
- package/dist/esm/ag-grid-plus/ag-gridPlus.js +84 -36
- package/dist/esm/ag-grid-plus/interface.d.ts +17 -1
- package/dist/esm/ag-grid-plus/queryForm/queryForm.js +1 -1
- package/dist/esm/ag-grid-plus/shared/NoRowsOverlay.d.ts +22 -0
- package/dist/esm/ag-grid-plus/shared/NoRowsOverlay.js +35 -0
- package/dist/esm/ag-grid-plus/utils/columnProcessors.d.ts +16 -0
- package/dist/esm/ag-grid-plus/utils/columnProcessors.js +25 -0
- package/dist/esm/ag-grid-plus/utils/constants.d.ts +6 -0
- package/dist/esm/ag-grid-plus/utils/constants.js +7 -1
- package/dist/esm/ag-grid-plus/utils/emptyState.d.ts +42 -0
- package/dist/esm/ag-grid-plus/utils/emptyState.js +66 -0
- package/dist/esm/dashboard/widget/selector/filterWidgets.d.ts +27 -0
- package/dist/esm/dashboard/widget/selector/filterWidgets.js +47 -0
- package/dist/esm/dashboard/widget/selector/index.js +3 -22
- package/dist/esm/deleteConfirm/index.d.ts +19 -2
- package/dist/esm/deleteConfirm/index.js +34 -14
- package/dist/esm/dialogSelect/index.js +23 -9
- package/dist/esm/fullScreenAlert/index.d.ts +11 -0
- package/dist/esm/fullScreenAlert/index.js +11 -4
- package/dist/esm/fullScreenAlert/index.less +31 -0
- package/dist/esm/toolBar/index.js +0 -3
- package/dist/umd/qc-ui.min.css +1 -1
- package/dist/umd/qc-ui.min.js +1 -1
- 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
|
-
|
|
158
|
+
// 空态四分需要的两个事实:这次请求是不是失败了、用户有没有施加筛选。@author nokecy
|
|
159
|
+
var _useState7 = (0, _react.useState)(null),
|
|
153
160
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
159
|
-
|
|
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
|
-
|
|
163
|
-
|
|
169
|
+
columnState = _useState12[0],
|
|
170
|
+
setColumnState = _useState12[1];
|
|
164
171
|
var _useState13 = (0, _react.useState)({}),
|
|
165
172
|
_useState14 = _slicedToArray(_useState13, 2),
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
171
|
-
|
|
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
|
|
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
|
-
|
|
179
|
-
pagination =
|
|
180
|
-
setPagination =
|
|
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
|
|
200
|
-
|
|
201
|
-
queryItemsOrder =
|
|
202
|
-
setQueryItemsOrder =
|
|
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
|
|
206
|
-
|
|
207
|
-
advancedPopoverOpen =
|
|
208
|
-
setAdvancedPopoverOpen =
|
|
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
|
|
217
|
-
|
|
218
|
-
advancedQueryRules =
|
|
219
|
-
setAdvancedQueryRules =
|
|
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
|
-
|
|
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 ||
|
|
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: "
|
|
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
|
-
|
|
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
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 部件选择器的筛选与计数。
|
|
3
|
+
*
|
|
4
|
+
* 单独抽出来是因为这里踩过一次:布局里存着当前部署已经没有的部件时
|
|
5
|
+
* (按客户启用的模块清单不同,某个部件这次就是不发),原来的写法会抛 TypeError,
|
|
6
|
+
* 整个选择器打不开——而用户唯一能看到的现象是「点了没反应」。
|
|
7
|
+
*
|
|
8
|
+
* @author nokecy
|
|
9
|
+
*/
|
|
10
|
+
export type WidgetMeta = {
|
|
11
|
+
name?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
tags?: string[];
|
|
14
|
+
visible?: boolean;
|
|
15
|
+
length?: number;
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
};
|
|
18
|
+
export type LayoutItem = {
|
|
19
|
+
i: string;
|
|
20
|
+
[key: string]: any;
|
|
21
|
+
};
|
|
22
|
+
/** 出参一定带上 visible 与 length,调用方不必再判空。 */
|
|
23
|
+
export type FilteredWidget = WidgetMeta & {
|
|
24
|
+
visible: boolean;
|
|
25
|
+
length: number;
|
|
26
|
+
};
|
|
27
|
+
export declare const filterWidgets: (widgets: Record<string, WidgetMeta> | undefined | null, currentLayout: LayoutItem[] | undefined | null, keywords?: string, activeMenuKey?: string) => Record<string, FilteredWidget>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.filterWidgets = void 0;
|
|
7
|
+
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
/**
|
|
10
|
+
* 部件选择器的筛选与计数。
|
|
11
|
+
*
|
|
12
|
+
* 单独抽出来是因为这里踩过一次:布局里存着当前部署已经没有的部件时
|
|
13
|
+
* (按客户启用的模块清单不同,某个部件这次就是不发),原来的写法会抛 TypeError,
|
|
14
|
+
* 整个选择器打不开——而用户唯一能看到的现象是「点了没反应」。
|
|
15
|
+
*
|
|
16
|
+
* @author nokecy
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** 出参一定带上 visible 与 length,调用方不必再判空。 */
|
|
20
|
+
|
|
21
|
+
var filterWidgets = exports.filterWidgets = function filterWidgets(widgets, currentLayout) {
|
|
22
|
+
var keywords = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
|
|
23
|
+
var activeMenuKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';
|
|
24
|
+
var finData = (0, _cloneDeep.default)(widgets || {});
|
|
25
|
+
var keyword = (keywords || '').toLowerCase();
|
|
26
|
+
Object.keys(finData).forEach(function (key) {
|
|
27
|
+
var widget = finData[key];
|
|
28
|
+
widget.length = 0;
|
|
29
|
+
widget.visible = true;
|
|
30
|
+
|
|
31
|
+
// 菜单切换:部件没声明 tags 时按「不属于任何分类」处理,不该因此抛错
|
|
32
|
+
if (activeMenuKey && (widget.tags || []).indexOf(activeMenuKey) < 0) {
|
|
33
|
+
widget.visible = false;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 查询:名称与描述任一命中即保留;两者都可能没写
|
|
37
|
+
var name = (widget.name || '').toLowerCase();
|
|
38
|
+
var description = (widget.description || '').toLowerCase();
|
|
39
|
+
if (name.indexOf(keyword) < 0 && description.indexOf(keyword) < 0) {
|
|
40
|
+
widget.visible = false;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// 已添加次数。布局里可能存着当前部署没有的部件,跳过即可。
|
|
45
|
+
(currentLayout || []).forEach(function (item) {
|
|
46
|
+
var _item$i;
|
|
47
|
+
var key = String((_item$i = item === null || item === void 0 ? void 0 : item.i) !== null && _item$i !== void 0 ? _item$i : '').split('-')[0];
|
|
48
|
+
var widget = finData[key];
|
|
49
|
+
if (!widget) return;
|
|
50
|
+
widget.length = widget.length ? widget.length + 1 : 1;
|
|
51
|
+
});
|
|
52
|
+
return finData;
|
|
53
|
+
};
|