@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
@@ -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,35 @@
1
+ import { Button, Empty } from 'antd';
2
+ import React from 'react';
3
+
4
+ /**
5
+ * 表格空态浮层。
6
+ *
7
+ * 换掉原来的 `overlayNoRowsTemplate` 纯 HTML 模板:模板只能放一句话,
8
+ * 于是「接口挂了」和「这条数据确实没有」共用了同一句
9
+ * 「没有找到数据,试试调整筛选条件吧!」,把用户往错误的方向引。
10
+ * 用 React 浮层才放得下「重试」这样的出路。
11
+ *
12
+ * @author nokecy
13
+ */
14
+
15
+ var NoRowsOverlay = function NoRowsOverlay(_ref) {
16
+ var branch = _ref.branch,
17
+ text = _ref.text,
18
+ onRetry = _ref.onRetry;
19
+ return /*#__PURE__*/React.createElement("div", {
20
+ style: {
21
+ display: 'flex',
22
+ flexDirection: 'column',
23
+ alignItems: 'center',
24
+ gap: 8
25
+ }
26
+ }, /*#__PURE__*/React.createElement(Empty, {
27
+ image: Empty.PRESENTED_IMAGE_SIMPLE,
28
+ description: text
29
+ }), branch === 'error' && onRetry ? /*#__PURE__*/React.createElement(Button, {
30
+ size: "small",
31
+ danger: true,
32
+ onClick: onRetry
33
+ }, "\u91CD\u8BD5") : null);
34
+ };
35
+ export 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
  *
@@ -82,6 +82,31 @@ export function inferDataType(data, colName, valueEnum) {
82
82
  return undefined;
83
83
  }
84
84
 
85
+ /**
86
+ * 把「推断出的数据类型」翻译成列定义片段。
87
+ *
88
+ * dataType.type 是数据类型(number/string/...),不是 AG Grid 的列类型(columnTypes)。
89
+ * 早先是把整个 dataType 摊进 colDef,等于给列设了 type:"number"——而注册的 columnTypes 里
90
+ * 根本没有叫 number 的类型,这个字段一直没生效。
91
+ *
92
+ * 数量型数值列真正该有的是右对齐:位数对齐了才能一眼比大小。只有 calculateType 为真
93
+ * (可求和的数量型)才右对齐;用 valueEnum 表示分类的数值列(状态码之类)不动。
94
+ *
95
+ * @author nokecy
96
+ */
97
+ export function toColumnType(dataType) {
98
+ if (!dataType) return {};
99
+ if (dataType.type === 'number' && dataType.calculateType) {
100
+ return {
101
+ calculateType: dataType.calculateType,
102
+ type: 'rightAligned'
103
+ };
104
+ }
105
+ return {
106
+ calculateType: dataType.calculateType
107
+ };
108
+ }
109
+
85
110
  /**
86
111
  * 处理枚举列定义
87
112
  *
@@ -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
  * 默认分页大小
@@ -17,7 +17,13 @@ export var DEFAULT_SEARCH_SORT_ORDER = 999;
17
17
  /**
18
18
  * 默认分页大小选项
19
19
  */
20
- export var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100, 200, 500, 1000, 10000];
20
+ /**
21
+ * 一次取 10000 行会让车间那台低配 PC 直接卡死,而且没有哪个岗位需要一屏翻一万行——
22
+ * 要全量数据应该走导出。上限收到 1000。
23
+ * 不分页场景另有 DEFAULT_PAGE_SIZE_WHEN_HIDDEN,不受这里影响。
24
+ * @author nokecy
25
+ */
26
+ export var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100, 200, 500, 1000];
21
27
 
22
28
  /**
23
29
  * 默认分页大小
@@ -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,66 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ /**
3
+ * 表格空态四分。
4
+ *
5
+ * 原来空态的全部表达能力是一个字符串,兜底文案是「没有找到数据,试试调整筛选条件吧!」——
6
+ * 请求失败时显示的也是这一句。在 MES 这类业务里,「这条数据确实没有」和「接口挂了」
7
+ * 导向完全相反的动作(去补录 vs 去叫 IT),用同一句话回答,还主动把用户往筛选条件上引,
8
+ * 是一次系统性的假阴性。
9
+ *
10
+ * 这里把空态拆成四支:加载失败 / 无权限 / 筛选无结果 / 无数据,逻辑写成纯函数便于单测。
11
+ *
12
+ * @author nokecy
13
+ */
14
+
15
+ /** 四支文案,按支覆盖。不传的支走默认。 */
16
+
17
+ export var DEFAULT_EMPTY_TEXTS = {
18
+ error: '数据加载失败,请点上方「重试」',
19
+ noPermission: '没有查看该数据的权限,请联系系统管理员',
20
+ noResult: '没有符合当前筛选条件的数据,试试放宽或清空筛选条件',
21
+ noData: '暂无数据'
22
+ };
23
+ var isBlank = function isBlank(value) {
24
+ if (value === undefined || value === null || value === '') return true;
25
+ if (Array.isArray(value)) return value.length === 0;
26
+ return false;
27
+ };
28
+
29
+ /**
30
+ * 判断本次请求是否带着生效筛选。
31
+ * 只有它为真,空结果才该说「换个筛选条件试试」;否则说「暂无数据」。
32
+ *
33
+ * @param filterString buildFilterString 的产物,涵盖简单查询与高级查询
34
+ * @param queryFilter 查询表单当前值,用于兜住 filterString 尚未覆盖的场景
35
+ */
36
+ export function hasEffectiveFilter(filterString, queryFilter) {
37
+ if (typeof filterString === 'string' && filterString.trim() !== '') return true;
38
+ if (!queryFilter || _typeof(queryFilter) !== 'object') return false;
39
+ var anyFilter = queryFilter;
40
+ if (anyFilter.__advancedMode__) {
41
+ var _anyFilter$__rules__$, _anyFilter$__rules__;
42
+ 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;
43
+ }
44
+ return Object.values(anyFilter).some(function (value) {
45
+ return !isBlank(value);
46
+ });
47
+ }
48
+
49
+ /** 选出当前该走哪一支。优先级:加载失败 > 无权限 > 筛选无结果 > 无数据。 */
50
+ export function resolveEmptyBranch(state) {
51
+ if (state.hasError) return 'error';
52
+ if (state.accessible === false) return 'noPermission';
53
+ if (state.filtered) return 'noResult';
54
+ return 'noData';
55
+ }
56
+
57
+ /**
58
+ * 算出最终要显示的空态文案。
59
+ * `override` 是调用方原来就在用的 `overlayNoRowsTemplateText`,保持最高优先级,向后兼容。
60
+ */
61
+ export function resolveEmptyText(state) {
62
+ var _state$texts$branch, _state$texts;
63
+ if (state.override) return state.override;
64
+ var branch = resolveEmptyBranch(state);
65
+ 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];
66
+ }
@@ -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 };
@@ -197,6 +197,41 @@ var LazyAgField = function LazyAgField(params) {
197
197
  });
198
198
  };
199
199
 
200
+ /**
201
+ * 反应式只读文本渲染器(列级 readPretty 在「可编辑表」里的展示列)。
202
+ *
203
+ * 只读纯文本快路径(valueFormatter)经 AG-Grid 缓存 params.value 取值,setValuesIn 程序化原地改值
204
+ * 不会刷新该格 → 自动带出的外码/描述等只读展示列空白。本渲染器 Observer 读可观察 record[dataKey],
205
+ * 保持 readPretty 纯文本观感(不挂 Formily 树、不可点编辑),但能跟随 setValuesIn 即时刷新。
206
+ *
207
+ * 仅用于「可编辑表的列级 readPretty 展示列」;「整表 readPretty」(明细/详情页,数据经 setValues 整体
208
+ * 加载,行引用整体替换→AG-Grid 自然刷新)仍走更廉价的静态 valueFormatter 快路径。@author nokecy
209
+ */
210
+ var LazyReadOnlyText = function LazyReadOnlyText(params) {
211
+ var _fieldSchema$name2;
212
+ var value = params.value,
213
+ record = params.data,
214
+ colDef = params.colDef,
215
+ formatter = params.formatter,
216
+ columnProps = params.columnProps,
217
+ fieldSchema = params.fieldSchema;
218
+ var dataKey = (_fieldSchema$name2 = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.name) !== null && _fieldSchema$name2 !== void 0 ? _fieldSchema$name2 : colDef === null || colDef === void 0 ? void 0 : colDef.field;
219
+ return /*#__PURE__*/React.createElement(Observer, null, function () {
220
+ var liveValue = dataKey != null && record ? record[dataKey] : value;
221
+ var text = formatter ? formatter(liveValue, {
222
+ columnProps: columnProps,
223
+ fieldSchema: fieldSchema
224
+ }) : liveValue == null ? '' : String(liveValue);
225
+ return /*#__PURE__*/React.createElement("span", {
226
+ className: "ag-array-table-readonly-text",
227
+ style: {
228
+ display: 'inline-block',
229
+ width: '100%'
230
+ }
231
+ }, text);
232
+ });
233
+ };
234
+
200
235
  // 在 Column 的子 schema 里递归找到内层数据字段(可读 x-component / x-pattern / x-reactions / enum) @author nokecy
201
236
  var findDataFieldSchema = function findDataFieldSchema(columnSchema, name) {
202
237
  if (!columnSchema || !columnSchema.properties) return null;
@@ -299,6 +334,21 @@ var buildArrayTableColumns = function buildArrayTableColumns(dataSource, field,
299
334
 
300
335
  // ① 只读纯文本
301
336
  if (readOnly && formatter) {
337
+ // 列级 readPretty 在「可编辑表」里是展示列(值可能被 setValuesIn 自动带出),静态 valueFormatter
338
+ // 读 AG-Grid 缓存值不刷新 → 反应式只读渲染。整表 readPretty(明细/详情页,数据 setValues 整体加载、
339
+ // 行引用整体替换、AG-Grid 自然刷新)仍走更廉价的静态 valueFormatter 快路径。@author nokecy
340
+ if (arrayPattern !== 'readPretty') {
341
+ return buf.concat(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
342
+ valueGetter: valueGetter
343
+ } : {}), {}, {
344
+ cellRenderer: LazyReadOnlyText,
345
+ cellRendererParams: {
346
+ formatter: formatter,
347
+ columnProps: columnProps,
348
+ fieldSchema: dataField
349
+ }
350
+ }));
351
+ }
302
352
  return buf.concat(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
303
353
  valueGetter: valueGetter
304
354
  } : {}), {}, {
@@ -354,4 +404,4 @@ var useAddition = function useAddition() {
354
404
  return addition;
355
405
  }, null);
356
406
  };
357
- export { isColumnComponent, useArrayTableSources, useArrayTableActions, buildArrayTableColumns, useAddition, LazyAgField };
407
+ export { isColumnComponent, useArrayTableSources, useArrayTableActions, buildArrayTableColumns, useAddition, LazyAgField, LazyReadOnlyText };
@@ -4,8 +4,25 @@ export interface DeleteConfirmProps {
4
4
  title?: React.ReactNode;
5
5
  /** 确认框内容,不提供时会使用默认内容 */
6
6
  content?: React.ReactNode;
7
- /** 确认回调函数 */
8
- onConfirm: () => Promise<any>;
7
+ /**
8
+ * 确认回调。
9
+ * 会收到触发按钮的原始点击事件;返回 Promise 时等待其完成,返回普通值时立即关闭。
10
+ */
11
+ onConfirm: (event?: React.MouseEvent<HTMLElement>) => Promise<any> | any;
12
+ /**
13
+ * 主按钮文案。不传就用 antd 默认的「确定」。
14
+ * 本组件在业务里被当成通用危险操作确认用,除删除外还有「重置密码」「取消审核」等场景,
15
+ * 所以这里不写死「删除」;确实是删除时由调用方显式传 okText="删除"。
16
+ * @author nokecy
17
+ */
18
+ okText?: string;
19
+ /**
20
+ * 主按钮是否用危险色,默认 true。
21
+ * 破坏性动作的主按钮不能跟着品牌主色走——「删除」和「编辑」长得一样,点错就是丢数据。
22
+ * 少数非破坏性场景(如「确定下载?」)显式传 danger={false}。
23
+ * @author nokecy
24
+ */
25
+ danger?: boolean;
9
26
  /** 子组件(触发按钮) */
10
27
  children: React.ReactNode;
11
28
  }
@@ -1,3 +1,9 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1
7
  import React from "react";
2
8
  import { Modal } from "antd";
3
9
  import { ExclamationCircleFilled } from "@ant-design/icons";
@@ -24,31 +30,45 @@ var DeleteConfirm = function DeleteConfirm(props) {
24
30
  var onConfirm = props.onConfirm,
25
31
  title = props.title,
26
32
  content = props.content,
33
+ okText = props.okText,
34
+ _props$danger = props.danger,
35
+ danger = _props$danger === void 0 ? true : _props$danger,
27
36
  children = props.children;
28
- var showPromiseConfirm = function showPromiseConfirm() {
37
+ var showPromiseConfirm = function showPromiseConfirm(event) {
29
38
  // 智能转换 title:支持字符串、ReactNode 或使用默认值
30
39
  var titleText = title || '确认操作';
31
40
 
32
- // 如果没有提供 content,生成默认内容
33
- // 只有当 title 是字符串时才拼接,否则使用通用提示
34
- var defaultContent = typeof title === 'string' ? "\u5371\u9669\u64CD\u4F5C,\u4E3A\u9632\u6B62\u8BEF\u89E6\u53D1,".concat(title) : '危险操作,为防止误触发,请确认操作';
35
- var contentText = content || defaultContent;
36
- confirm({
41
+ // 正文要说清动的是哪条、几条,这只有调用方知道,所以 content 交给调用方。
42
+ // 不传时的兜底只承诺「不可撤销」:原来的默认正文是把 title 拼进去,
43
+ // 拼出来是一句病句,而且始终没告诉用户动的是哪条数据。@author nokecy
44
+ var contentText = content || '该操作不可撤销,请确认后继续。';
45
+ confirm(_objectSpread(_objectSpread({
37
46
  title: titleText,
38
47
  icon: /*#__PURE__*/React.createElement(ExclamationCircleFilled, null),
39
48
  content: contentText,
49
+ okButtonProps: {
50
+ danger: danger
51
+ }
52
+ }, okText ? {
53
+ okText: okText
54
+ } : {}), {}, {
40
55
  onOk: function onOk() {
41
56
  return new Promise(function (resolve, reject) {
42
- onConfirm().then(resolve).catch(function (error) {
43
- console.error('Oops errors!', error);
44
- reject();
45
- });
57
+ // 回调既可能返回 Promise(异步删除),也可能是同步的普通值,两种都要接住。
58
+ var result = onConfirm(event);
59
+ if (result && typeof result.then === 'function') {
60
+ result.then(resolve).catch(function (error) {
61
+ console.error('Oops errors!', error);
62
+ reject();
63
+ });
64
+ } else {
65
+ resolve(result);
66
+ }
46
67
  }).catch(function () {
47
- return void 0;
68
+ return undefined;
48
69
  });
49
- },
50
- onCancel: function onCancel() {}
51
- });
70
+ }
71
+ }));
52
72
  };
53
73
  return /*#__PURE__*/React.createElement("span", {
54
74
  onClick: showPromiseConfirm
@@ -1,8 +1,8 @@
1
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
1
  var _excluded = ["request", "columnDefs", "value", "labelField", "valueField", "onChangeItem"];
3
2
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
4
3
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
5
4
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
+ 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); }
6
6
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
7
7
  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; }
8
8
  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; }
@@ -133,22 +133,36 @@ var DialogSelect = function DialogSelect(props) {
133
133
  onGridReady: function onGridReady(gridReadEvent) {
134
134
  setGridApi(gridReadEvent.api);
135
135
  },
136
+ onFirstDataRendered: function onFirstDataRendered(_ref) {
137
+ var api = _ref.api;
138
+ // 多选时重开弹窗要把已经选中的行勾回来,否则用户会以为之前的选择丢了。
139
+ // 放在首屏数据渲染完成时做:弹窗是 destroyOnClose,打开的那一刻表格还没有数据。@author nokecy
140
+ if (!Array.isArray(state) || state.length === 0) return;
141
+ var key = valueField !== null && valueField !== void 0 ? valueField : 'id';
142
+ var selected = state.map(function (it) {
143
+ return it && _typeof(it) === 'object' ? it.value : it;
144
+ });
145
+ api.forEachNode(function (node) {
146
+ if (node.data && selected.includes(node.data[key])) {
147
+ node.setSelected(true);
148
+ }
149
+ });
150
+ },
136
151
  search: (columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.filter(function (i) {
137
152
  return !i.hideInSearch;
138
153
  }).length) !== 0,
139
154
  onSelectionChanged: onSelectionChanged,
140
155
  rowSelection: props.mode === 'multiple' ? props.mode : 'single',
141
- onRowDoubleClicked: function onRowDoubleClicked(_ref) {
142
- var data = _ref.data;
156
+ onRowDoubleClicked: function onRowDoubleClicked(_ref2) {
157
+ var data = _ref2.data;
143
158
  setFalse();
144
159
  setState(getValue([data]));
145
- if (onChangeItem) onChangeItem(props.mode === 'multiple' ? [data] : {
146
- label: data.name,
147
- value: data.code
148
- });
160
+ // 回传完整数据行:原来这里硬编码成 { label: data.name, value: data.code },
161
+ // 与「确定」按钮走的 handleOk 口径不一致,且对没有 name/code 字段的实体直接取到 undefined。@author nokecy
162
+ if (onChangeItem) onChangeItem(props.mode === 'multiple' ? [data] : data);
149
163
  },
150
164
  request: ( /*#__PURE__*/function () {
151
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, _, record) {
165
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, _, record) {
152
166
  var _props$pagedApiAdapte;
153
167
  var adapter, data, requestData;
154
168
  return _regeneratorRuntime().wrap(function _callee$(_context) {
@@ -178,7 +192,7 @@ var DialogSelect = function DialogSelect(props) {
178
192
  }, _callee);
179
193
  }));
180
194
  return function (_x, _x2, _x3) {
181
- return _ref2.apply(this, arguments);
195
+ return _ref3.apply(this, arguments);
182
196
  };
183
197
  }()),
184
198
  columnDefs: columnDefs
@@ -9,6 +9,17 @@ export interface FullScreenAlertProps {
9
9
  onChange?: (active: boolean) => void;
10
10
  /** 自动关闭时间(毫秒),默认3000ms */
11
11
  duration?: number;
12
+ /**
13
+ * 中央提示语。不传时按 type 给「成功」/「失败」。
14
+ * @author nokecy
15
+ */
16
+ message?: React.ReactNode;
17
+ /**
18
+ * 是否显示中央的图标与文字,默认 true。
19
+ * 只靠边框颜色区分成功与失败,对色觉障碍者等于零反馈;这一层是给状态加的第二种编码。
20
+ * @author nokecy
21
+ */
22
+ showIcon?: boolean;
12
23
  /** 其他 HTML div 属性 */
13
24
  [key: string]: any;
14
25
  }
@@ -1,4 +1,4 @@
1
- var _excluded = ["active", "type", "onChange", "duration"];
1
+ var _excluded = ["active", "type", "onChange", "duration", "message", "showIcon"];
2
2
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
3
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
4
  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."); }
@@ -8,7 +8,8 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
8
8
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
9
9
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
10
10
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
11
- import React, { useState, useRef, useEffect } from 'react';
11
+ import { CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons';
12
+ import React, { useEffect, useRef, useState } from 'react';
12
13
  import "./index.less";
13
14
  /**
14
15
  * FullScreenAlert 全屏闪烁警告组件
@@ -32,6 +33,9 @@ var FullScreenAlert = function FullScreenAlert(props) {
32
33
  onChange = props.onChange,
33
34
  _props$duration = props.duration,
34
35
  duration = _props$duration === void 0 ? 3000 : _props$duration,
36
+ message = props.message,
37
+ _props$showIcon = props.showIcon,
38
+ showIcon = _props$showIcon === void 0 ? true : _props$showIcon,
35
39
  restProps = _objectWithoutProperties(props, _excluded);
36
40
  var timerRef = useRef();
37
41
  var _useState = useState(activeProps),
@@ -66,8 +70,11 @@ var FullScreenAlert = function FullScreenAlert(props) {
66
70
  return null;
67
71
  }
68
72
  var className = ['alertOverlay', 'alert-active', type === 'error' ? 'errorOverlay' : 'successOverlay'].join(' ');
69
- return /*#__PURE__*/React.createElement("div", _extends({
73
+ var isError = type === 'error';
74
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", _extends({
70
75
  className: className
71
- }, restProps), /*#__PURE__*/React.createElement("div", null));
76
+ }, restProps), /*#__PURE__*/React.createElement("div", null)), showIcon ? /*#__PURE__*/React.createElement("div", {
77
+ className: "alertBadge ".concat(isError ? 'alertBadge-error' : 'alertBadge-success')
78
+ }, isError ? /*#__PURE__*/React.createElement(CloseCircleFilled, null) : /*#__PURE__*/React.createElement(CheckCircleFilled, null), /*#__PURE__*/React.createElement("span", null, message !== null && message !== void 0 ? message : isError ? '失败' : '成功')) : null);
72
79
  };
73
80
  export default FullScreenAlert;
@@ -131,3 +131,34 @@
131
131
  opacity: 0;
132
132
  }
133
133
  }
134
+
135
+ /* 中央状态徽标:给成功/失败加上颜色之外的第二种编码(图标 + 文字)。
136
+ 只靠绿边框/红边框区分,对色觉障碍者等于没有反馈;车间侧光屏上也常常看不出色差。
137
+ 放在闪烁层之外,所以它不跟着 blink 一起忽明忽暗。@author nokecy */
138
+ .alertBadge {
139
+ position: absolute;
140
+ top: 50%;
141
+ left: 50%;
142
+ z-index: 2;
143
+ display: flex;
144
+ flex-direction: column;
145
+ align-items: center;
146
+ gap: 12px;
147
+ font-size: 28px;
148
+ font-weight: 700;
149
+ text-shadow: 0 1px 2px rgb(255 255 255 / 80%);
150
+ transform: translate(-50%, -50%);
151
+ pointer-events: none;
152
+
153
+ .anticon {
154
+ font-size: 128px;
155
+ }
156
+ }
157
+
158
+ .alertBadge-success {
159
+ color: green;
160
+ }
161
+
162
+ .alertBadge-error {
163
+ color: red;
164
+ }