@nokecy/qc-ui 1.1.42 → 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.
- 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/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/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/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/umd/qc-ui.min.css +1 -1
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
+
}
|
|
@@ -4,8 +4,25 @@ export interface DeleteConfirmProps {
|
|
|
4
4
|
title?: React.ReactNode;
|
|
5
5
|
/** 确认框内容,不提供时会使用默认内容 */
|
|
6
6
|
content?: React.ReactNode;
|
|
7
|
-
/**
|
|
8
|
-
|
|
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
|
-
//
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
var contentText = content ||
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
68
|
+
return undefined;
|
|
48
69
|
});
|
|
49
|
-
}
|
|
50
|
-
|
|
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(
|
|
142
|
-
var data =
|
|
156
|
+
onRowDoubleClicked: function onRowDoubleClicked(_ref2) {
|
|
157
|
+
var data = _ref2.data;
|
|
143
158
|
setFalse();
|
|
144
159
|
setState(getValue([data]));
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
+
}
|