@nokecy/qc-ui 1.0.58 → 1.0.60
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 +2 -4
- package/dist/cjs/array-table/index.js +194 -7
- package/dist/cjs/deleteConfirm/index.d.ts +31 -0
- package/dist/cjs/deleteConfirm/index.js +64 -0
- package/dist/cjs/editable/index.js +104 -21
- package/dist/cjs/fullScreenAlert/index.d.ts +25 -4
- package/dist/cjs/fullScreenAlert/index.js +50 -17
- package/dist/cjs/generatedListPage/ConfigurableToolbar.d.ts +35 -0
- package/dist/cjs/generatedListPage/ConfigurableToolbar.js +179 -0
- package/dist/cjs/generatedListPage/GeneratedListPage.d.ts +8 -0
- package/dist/cjs/generatedListPage/GeneratedListPage.js +545 -0
- package/dist/cjs/generatedListPage/OptionsColumn.d.ts +9 -0
- package/dist/cjs/generatedListPage/OptionsColumn.js +135 -0
- package/dist/cjs/generatedListPage/PerformanceMonitor.d.ts +55 -0
- package/dist/cjs/generatedListPage/PerformanceMonitor.js +277 -0
- package/dist/cjs/generatedListPage/RequestManager.d.ts +97 -0
- package/dist/cjs/generatedListPage/RequestManager.js +404 -0
- package/dist/cjs/generatedListPage/_utils/AccessWrapper.d.ts +16 -0
- package/dist/cjs/generatedListPage/_utils/AccessWrapper.js +26 -0
- package/dist/cjs/generatedListPage/_utils/defaultHandlers.d.ts +22 -0
- package/dist/cjs/generatedListPage/_utils/defaultHandlers.js +127 -0
- package/dist/cjs/generatedListPage/index.d.ts +20 -0
- package/dist/cjs/generatedListPage/index.js +92 -0
- package/dist/cjs/generatedListPage/types.d.ts +221 -0
- package/dist/cjs/generatedListPage/types.js +5 -0
- package/dist/cjs/generatedListPage/usePermissionCheck.d.ts +66 -0
- package/dist/cjs/generatedListPage/usePermissionCheck.js +150 -0
- package/dist/cjs/generatedListPage/useRequestManager.d.ts +35 -0
- package/dist/cjs/generatedListPage/useRequestManager.js +121 -0
- package/dist/cjs/importModal/index.d.ts +21 -3
- package/dist/cjs/importModal/index.js +30 -10
- package/dist/cjs/index.d.ts +9 -1
- package/dist/cjs/index.js +21 -0
- package/dist/cjs/standardFormDialog/FormValidation.d.ts +150 -0
- package/dist/cjs/standardFormDialog/FormValidation.js +229 -0
- package/dist/cjs/standardFormDialog/PortalManager.d.ts +94 -0
- package/dist/cjs/standardFormDialog/PortalManager.js +259 -0
- package/dist/cjs/standardFormDialog/StandardFormDialog.d.ts +10 -0
- package/dist/cjs/standardFormDialog/StandardFormDialog.js +516 -0
- package/dist/cjs/standardFormDialog/index.d.ts +7 -0
- package/dist/cjs/standardFormDialog/index.js +83 -0
- package/dist/cjs/standardFormDialog/types.d.ts +107 -0
- package/dist/cjs/standardFormDialog/types.js +5 -0
- package/dist/cjs/standardFormDialog/useStandardFormSchema.d.ts +68 -0
- package/dist/cjs/standardFormDialog/useStandardFormSchema.js +197 -0
- package/dist/cjs/standardFormDialog/withStandardForm.d.ts +193 -0
- package/dist/cjs/standardFormDialog/withStandardForm.js +388 -0
- package/dist/esm/ag-grid-plus/ag-gridPlus.js +2 -4
- package/dist/esm/array-table/index.js +194 -7
- package/dist/esm/deleteConfirm/index.d.ts +31 -0
- package/dist/esm/deleteConfirm/index.js +57 -0
- package/dist/esm/editable/index.js +105 -22
- package/dist/esm/fullScreenAlert/index.d.ts +25 -4
- package/dist/esm/fullScreenAlert/index.js +50 -18
- package/dist/esm/generatedListPage/ConfigurableToolbar.d.ts +35 -0
- package/dist/esm/generatedListPage/ConfigurableToolbar.js +171 -0
- package/dist/esm/generatedListPage/GeneratedListPage.d.ts +8 -0
- package/dist/esm/generatedListPage/GeneratedListPage.js +535 -0
- package/dist/esm/generatedListPage/OptionsColumn.d.ts +9 -0
- package/dist/esm/generatedListPage/OptionsColumn.js +127 -0
- package/dist/esm/generatedListPage/PerformanceMonitor.d.ts +55 -0
- package/dist/esm/generatedListPage/PerformanceMonitor.js +272 -0
- package/dist/esm/generatedListPage/RequestManager.d.ts +97 -0
- package/dist/esm/generatedListPage/RequestManager.js +398 -0
- package/dist/esm/generatedListPage/_utils/AccessWrapper.d.ts +16 -0
- package/dist/esm/generatedListPage/_utils/AccessWrapper.js +20 -0
- package/dist/esm/generatedListPage/_utils/defaultHandlers.d.ts +22 -0
- package/dist/esm/generatedListPage/_utils/defaultHandlers.js +122 -0
- package/dist/esm/generatedListPage/index.d.ts +20 -0
- package/dist/esm/generatedListPage/index.js +26 -0
- package/dist/esm/generatedListPage/types.d.ts +221 -0
- package/dist/esm/generatedListPage/types.js +1 -0
- package/dist/esm/generatedListPage/usePermissionCheck.d.ts +66 -0
- package/dist/esm/generatedListPage/usePermissionCheck.js +145 -0
- package/dist/esm/generatedListPage/useRequestManager.d.ts +35 -0
- package/dist/esm/generatedListPage/useRequestManager.js +116 -0
- package/dist/esm/importModal/index.d.ts +21 -3
- package/dist/esm/importModal/index.js +29 -10
- package/dist/esm/index.d.ts +9 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/standardFormDialog/FormValidation.d.ts +150 -0
- package/dist/esm/standardFormDialog/FormValidation.js +223 -0
- package/dist/esm/standardFormDialog/PortalManager.d.ts +94 -0
- package/dist/esm/standardFormDialog/PortalManager.js +253 -0
- package/dist/esm/standardFormDialog/StandardFormDialog.d.ts +10 -0
- package/dist/esm/standardFormDialog/StandardFormDialog.js +508 -0
- package/dist/esm/standardFormDialog/index.d.ts +7 -0
- package/dist/esm/standardFormDialog/index.js +6 -0
- package/dist/esm/standardFormDialog/types.d.ts +107 -0
- package/dist/esm/standardFormDialog/types.js +1 -0
- package/dist/esm/standardFormDialog/useStandardFormSchema.d.ts +68 -0
- package/dist/esm/standardFormDialog/useStandardFormSchema.js +191 -0
- package/dist/esm/standardFormDialog/withStandardForm.d.ts +193 -0
- package/dist/esm/standardFormDialog/withStandardForm.js +382 -0
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { GridRef } from "../ag-grid-plus/interface";
|
|
3
|
+
import { ColDef } from "ag-grid-community";
|
|
4
|
+
import { ButtonProps } from "antd";
|
|
5
|
+
/**
|
|
6
|
+
* 权限配置接口
|
|
7
|
+
*/
|
|
8
|
+
export interface PermissionConfig {
|
|
9
|
+
/** 查看权限 */
|
|
10
|
+
view?: string;
|
|
11
|
+
/** 创建权限 */
|
|
12
|
+
create?: string;
|
|
13
|
+
/** 更新权限 */
|
|
14
|
+
update?: string;
|
|
15
|
+
/** 删除权限 */
|
|
16
|
+
delete?: string;
|
|
17
|
+
/** 导入权限 */
|
|
18
|
+
import?: string;
|
|
19
|
+
/** 导出权限 */
|
|
20
|
+
export?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 列表查询参数接口
|
|
24
|
+
*/
|
|
25
|
+
export interface ListParams {
|
|
26
|
+
/** 筛选条件 */
|
|
27
|
+
filter?: string;
|
|
28
|
+
/** 跳过数量 */
|
|
29
|
+
skipCount?: number;
|
|
30
|
+
/** 最大结果数 */
|
|
31
|
+
maxResultCount?: number;
|
|
32
|
+
/** 排序字段 */
|
|
33
|
+
sorting?: string;
|
|
34
|
+
/** 分页大小 */
|
|
35
|
+
PageSize?: number;
|
|
36
|
+
/** 跳过数量(兼容) */
|
|
37
|
+
SkipCount?: number;
|
|
38
|
+
/** 最大结果数(兼容) */
|
|
39
|
+
MaxResultCount?: number;
|
|
40
|
+
/** 排序(兼容) */
|
|
41
|
+
Sorting?: string;
|
|
42
|
+
/** 筛选(兼容) */
|
|
43
|
+
Filter?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 分页结果接口
|
|
47
|
+
*/
|
|
48
|
+
export interface PagedResult<T> {
|
|
49
|
+
/** 数据项列表 */
|
|
50
|
+
items?: T[];
|
|
51
|
+
/** 总数量 */
|
|
52
|
+
totalCount?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 删除参数接口
|
|
56
|
+
*/
|
|
57
|
+
export interface DeleteParams {
|
|
58
|
+
/** 记录ID */
|
|
59
|
+
id: string | number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 导出参数接口
|
|
63
|
+
*/
|
|
64
|
+
export interface ExportParams {
|
|
65
|
+
/** 筛选条件 */
|
|
66
|
+
filter?: string;
|
|
67
|
+
/** 其他参数 */
|
|
68
|
+
[key: string]: any;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* API配置接口
|
|
72
|
+
* @template T 数据项类型
|
|
73
|
+
*/
|
|
74
|
+
export interface ApiConfig<T = any> {
|
|
75
|
+
/** 列表查询API */
|
|
76
|
+
list: (params: ListParams) => Promise<PagedResult<T>>;
|
|
77
|
+
/** 删除API */
|
|
78
|
+
delete?: (params: DeleteParams) => Promise<void>;
|
|
79
|
+
/** 导出API */
|
|
80
|
+
export?: (params: ExportParams) => Promise<Blob>;
|
|
81
|
+
/** 获取导入模板API */
|
|
82
|
+
getImportTemplate?: () => Promise<Blob>;
|
|
83
|
+
/** 导入API */
|
|
84
|
+
import?: (file: FormData) => Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 工具栏按钮配置
|
|
88
|
+
*/
|
|
89
|
+
export interface ToolbarActionConfig {
|
|
90
|
+
/** 按钮类型 */
|
|
91
|
+
type: 'create' | 'import' | 'export' | 'downloadTemplate' | 'custom';
|
|
92
|
+
/** 权限键 */
|
|
93
|
+
permission?: string;
|
|
94
|
+
/** 按钮文本 */
|
|
95
|
+
label?: string;
|
|
96
|
+
/** 按钮属性 */
|
|
97
|
+
buttonProps?: ButtonProps;
|
|
98
|
+
/** 自定义组件(当type为custom时) */
|
|
99
|
+
component?: React.ComponentType<any>;
|
|
100
|
+
/** 组件属性 */
|
|
101
|
+
componentProps?: Record<string, any>;
|
|
102
|
+
/** 点击处理函数(当type为custom时) */
|
|
103
|
+
onClick?: () => void;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 表单对话框组件配置
|
|
107
|
+
*/
|
|
108
|
+
export interface FormDialogConfig {
|
|
109
|
+
/** 表单组件 */
|
|
110
|
+
component: React.ComponentType<any>;
|
|
111
|
+
/** 标题 */
|
|
112
|
+
title?: string;
|
|
113
|
+
/** 新建标题 */
|
|
114
|
+
createTitle?: string;
|
|
115
|
+
/** 编辑标题 */
|
|
116
|
+
editTitle?: string;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 树形数据配置
|
|
120
|
+
*/
|
|
121
|
+
export interface TreeDataConfig {
|
|
122
|
+
/** 是否为树形数据 */
|
|
123
|
+
enabled: boolean;
|
|
124
|
+
/** 获取数据路径的函数 */
|
|
125
|
+
getDataPath?: (data: any) => string[];
|
|
126
|
+
/** 父节点字段名 */
|
|
127
|
+
parentFieldName?: string;
|
|
128
|
+
/** 主键字段名 */
|
|
129
|
+
keyFieldName?: string;
|
|
130
|
+
/** 自动分组列配置 */
|
|
131
|
+
autoGroupColumnDef?: ColDef;
|
|
132
|
+
/** 默认展开层级 */
|
|
133
|
+
groupDefaultExpanded?: number;
|
|
134
|
+
/** 树形数据API - 已包含树形结构(items字段) */
|
|
135
|
+
treeApi?: () => Promise<any[]>;
|
|
136
|
+
/** 子节点字段名 */
|
|
137
|
+
childrenFieldName?: string;
|
|
138
|
+
/**
|
|
139
|
+
* 自动模式:从扁平数据构建树形结构
|
|
140
|
+
* 当设置为 true 时,将自动从 list API 的扁平数据构建树形结构
|
|
141
|
+
* 需要配合 parentFieldName 和 keyFieldName 使用
|
|
142
|
+
*/
|
|
143
|
+
autoMode?: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* 树形路径显示字段
|
|
146
|
+
* 用于构建树形路径时显示的字段名,默认使用 'name'
|
|
147
|
+
* 可以是单个字段名或字段名数组(按优先级尝试)
|
|
148
|
+
*/
|
|
149
|
+
pathDisplayField?: string | string[];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 通用列表页面配置接口
|
|
153
|
+
* @template T 数据项类型
|
|
154
|
+
*/
|
|
155
|
+
export interface GeneratedListPageConfig<T = any> {
|
|
156
|
+
/** 页面标题 */
|
|
157
|
+
title: string;
|
|
158
|
+
/** Grid Key */
|
|
159
|
+
gridKey: string;
|
|
160
|
+
/** API配置 */
|
|
161
|
+
apiConfig: ApiConfig<T>;
|
|
162
|
+
/** 权限配置 */
|
|
163
|
+
permissions: PermissionConfig;
|
|
164
|
+
/** 列定义 */
|
|
165
|
+
columnDefs: ColDef[];
|
|
166
|
+
/** 表单对话框配置 */
|
|
167
|
+
formDialog?: FormDialogConfig;
|
|
168
|
+
/** 工具栏配置 */
|
|
169
|
+
toolbarActions?: ToolbarActionConfig[];
|
|
170
|
+
/** 是否启用导入导出模板下载 */
|
|
171
|
+
enableImportExport?: boolean;
|
|
172
|
+
/** 导入配置 */
|
|
173
|
+
importConfig?: {
|
|
174
|
+
/** 标题 */
|
|
175
|
+
title?: string;
|
|
176
|
+
/** 下载模板URL */
|
|
177
|
+
downUrl?: string;
|
|
178
|
+
/** 上传URL */
|
|
179
|
+
uploadUrl?: string;
|
|
180
|
+
};
|
|
181
|
+
/** 导出文件名 */
|
|
182
|
+
exportFileName?: string;
|
|
183
|
+
/** 树形数据配置 */
|
|
184
|
+
treeConfig?: TreeDataConfig;
|
|
185
|
+
/** 自定义操作列组件 */
|
|
186
|
+
customOptionsComponent?: React.ComponentType<OptionsComponentProps<T>>;
|
|
187
|
+
/** 错误处理配置 */
|
|
188
|
+
errorConfig?: {
|
|
189
|
+
/** 是否使用统一错误处理 */
|
|
190
|
+
useErrorHandler?: boolean;
|
|
191
|
+
};
|
|
192
|
+
/** 分页配置 */
|
|
193
|
+
paginationConfig?: {
|
|
194
|
+
/** 默认页大小 */
|
|
195
|
+
defaultPageSize?: number;
|
|
196
|
+
/** 是否启用分页 */
|
|
197
|
+
enabled?: boolean;
|
|
198
|
+
};
|
|
199
|
+
/** Grid引用 */
|
|
200
|
+
gridRef?: React.RefObject<GridRef>;
|
|
201
|
+
/** 刷新回调 */
|
|
202
|
+
onRefresh?: () => void;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* 操作列组件属性接口
|
|
206
|
+
* @template T 行数据类型
|
|
207
|
+
*/
|
|
208
|
+
export interface OptionsComponentProps<T = any> {
|
|
209
|
+
/** 行数据 */
|
|
210
|
+
data: T;
|
|
211
|
+
/** 刷新函数 */
|
|
212
|
+
onRefresh: () => void;
|
|
213
|
+
/** 权限配置 */
|
|
214
|
+
permissions: PermissionConfig;
|
|
215
|
+
/** 表单对话框配置 */
|
|
216
|
+
formDialog?: FormDialogConfig;
|
|
217
|
+
/** 删除API */
|
|
218
|
+
deleteApi?: (params: DeleteParams) => Promise<void>;
|
|
219
|
+
/** 是否使用统一错误处理 */
|
|
220
|
+
useErrorHandler?: boolean;
|
|
221
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* usePermissionCheck Hook
|
|
3
|
+
*
|
|
4
|
+
* 提供统一的权限检查功能,避免重复的权限检查逻辑
|
|
5
|
+
* 适配版:支持外部传入 access 对象或使用默认的全部允许策略
|
|
6
|
+
*/
|
|
7
|
+
import { PermissionConfig } from './types';
|
|
8
|
+
interface PermissionCheckResult {
|
|
9
|
+
/** 是否有查看权限 */
|
|
10
|
+
canView: boolean;
|
|
11
|
+
/** 是否有创建权限 */
|
|
12
|
+
canCreate: boolean;
|
|
13
|
+
/** 是否有更新权限 */
|
|
14
|
+
canUpdate: boolean;
|
|
15
|
+
/** 是否有删除权限 */
|
|
16
|
+
canDelete: boolean;
|
|
17
|
+
/** 是否有导入权限 */
|
|
18
|
+
canImport: boolean;
|
|
19
|
+
/** 是否有导出权限 */
|
|
20
|
+
canExport: boolean;
|
|
21
|
+
/** 检查特定权限 */
|
|
22
|
+
hasPermission: (permission?: string) => boolean;
|
|
23
|
+
/** 检查多个权限(需要全部满足) */
|
|
24
|
+
hasAllPermissions: (...permissions: (string | undefined)[]) => boolean;
|
|
25
|
+
/** 检查多个权限(满足任一即可) */
|
|
26
|
+
hasAnyPermission: (...permissions: (string | undefined)[]) => boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 权限检查 Hook
|
|
30
|
+
* @param permissions 权限配置对象
|
|
31
|
+
* @param access 可选的 access 对象(如果不传入,默认全部允许)
|
|
32
|
+
* @returns 权限检查结果
|
|
33
|
+
*/
|
|
34
|
+
export declare function usePermissionCheck(permissions: PermissionConfig, access?: Record<string, boolean>): PermissionCheckResult;
|
|
35
|
+
/**
|
|
36
|
+
* 权限检查工具类
|
|
37
|
+
* 用于非 Hook 场景下的权限检查
|
|
38
|
+
*/
|
|
39
|
+
export declare class PermissionChecker {
|
|
40
|
+
private access;
|
|
41
|
+
constructor(access: Record<string, boolean>);
|
|
42
|
+
/**
|
|
43
|
+
* 检查单个权限
|
|
44
|
+
*/
|
|
45
|
+
hasPermission(permission?: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* 检查多个权限(需要全部满足)
|
|
48
|
+
*/
|
|
49
|
+
hasAllPermissions(...permissions: (string | undefined)[]): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* 检查多个权限(满足任一即可)
|
|
52
|
+
*/
|
|
53
|
+
hasAnyPermission(...permissions: (string | undefined)[]): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* 检查权限配置对象
|
|
56
|
+
*/
|
|
57
|
+
checkConfig(config: PermissionConfig): {
|
|
58
|
+
canView: boolean;
|
|
59
|
+
canCreate: boolean;
|
|
60
|
+
canUpdate: boolean;
|
|
61
|
+
canDelete: boolean;
|
|
62
|
+
canImport: boolean;
|
|
63
|
+
canExport: boolean;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export default usePermissionCheck;
|
|
@@ -0,0 +1,145 @@
|
|
|
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
3
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
4
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
5
|
+
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; }
|
|
6
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
7
|
+
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); }
|
|
8
|
+
/**
|
|
9
|
+
* usePermissionCheck Hook
|
|
10
|
+
*
|
|
11
|
+
* 提供统一的权限检查功能,避免重复的权限检查逻辑
|
|
12
|
+
* 适配版:支持外部传入 access 对象或使用默认的全部允许策略
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { useMemo } from 'react';
|
|
16
|
+
/**
|
|
17
|
+
* 权限检查 Hook
|
|
18
|
+
* @param permissions 权限配置对象
|
|
19
|
+
* @param access 可选的 access 对象(如果不传入,默认全部允许)
|
|
20
|
+
* @returns 权限检查结果
|
|
21
|
+
*/
|
|
22
|
+
export function usePermissionCheck(permissions, access) {
|
|
23
|
+
// 缓存权限检查结果
|
|
24
|
+
var permissionResult = useMemo(function () {
|
|
25
|
+
/**
|
|
26
|
+
* 检查单个权限
|
|
27
|
+
*/
|
|
28
|
+
var hasPermission = function hasPermission(permission) {
|
|
29
|
+
if (!permission) return true; // 未配置权限则默认有权限
|
|
30
|
+
if (!access) return true; // 未传入 access 对象,默认全部允许
|
|
31
|
+
return !!access[permission];
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 检查多个权限(需要全部满足)
|
|
36
|
+
*/
|
|
37
|
+
var hasAllPermissions = function hasAllPermissions() {
|
|
38
|
+
for (var _len = arguments.length, perms = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
39
|
+
perms[_key] = arguments[_key];
|
|
40
|
+
}
|
|
41
|
+
if (perms.length === 0) return true;
|
|
42
|
+
return perms.every(function (perm) {
|
|
43
|
+
return hasPermission(perm);
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 检查多个权限(满足任一即可)
|
|
49
|
+
*/
|
|
50
|
+
var hasAnyPermission = function hasAnyPermission() {
|
|
51
|
+
for (var _len2 = arguments.length, perms = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
52
|
+
perms[_key2] = arguments[_key2];
|
|
53
|
+
}
|
|
54
|
+
if (perms.length === 0) return true;
|
|
55
|
+
return perms.some(function (perm) {
|
|
56
|
+
return hasPermission(perm);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
canView: hasPermission(permissions.view),
|
|
61
|
+
canCreate: hasPermission(permissions.create),
|
|
62
|
+
canUpdate: hasPermission(permissions.update),
|
|
63
|
+
canDelete: hasPermission(permissions.delete),
|
|
64
|
+
canImport: hasPermission(permissions.import),
|
|
65
|
+
canExport: hasPermission(permissions.export),
|
|
66
|
+
hasPermission: hasPermission,
|
|
67
|
+
hasAllPermissions: hasAllPermissions,
|
|
68
|
+
hasAnyPermission: hasAnyPermission
|
|
69
|
+
};
|
|
70
|
+
}, [access, permissions]);
|
|
71
|
+
return permissionResult;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 权限检查工具类
|
|
76
|
+
* 用于非 Hook 场景下的权限检查
|
|
77
|
+
*/
|
|
78
|
+
export var PermissionChecker = /*#__PURE__*/function () {
|
|
79
|
+
function PermissionChecker(access) {
|
|
80
|
+
_classCallCheck(this, PermissionChecker);
|
|
81
|
+
_defineProperty(this, "access", void 0);
|
|
82
|
+
this.access = access;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 检查单个权限
|
|
87
|
+
*/
|
|
88
|
+
_createClass(PermissionChecker, [{
|
|
89
|
+
key: "hasPermission",
|
|
90
|
+
value: function hasPermission(permission) {
|
|
91
|
+
if (!permission) return true;
|
|
92
|
+
return !!this.access[permission];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 检查多个权限(需要全部满足)
|
|
97
|
+
*/
|
|
98
|
+
}, {
|
|
99
|
+
key: "hasAllPermissions",
|
|
100
|
+
value: function hasAllPermissions() {
|
|
101
|
+
var _this = this;
|
|
102
|
+
for (var _len3 = arguments.length, permissions = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
103
|
+
permissions[_key3] = arguments[_key3];
|
|
104
|
+
}
|
|
105
|
+
if (permissions.length === 0) return true;
|
|
106
|
+
return permissions.every(function (perm) {
|
|
107
|
+
return _this.hasPermission(perm);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 检查多个权限(满足任一即可)
|
|
113
|
+
*/
|
|
114
|
+
}, {
|
|
115
|
+
key: "hasAnyPermission",
|
|
116
|
+
value: function hasAnyPermission() {
|
|
117
|
+
var _this2 = this;
|
|
118
|
+
for (var _len4 = arguments.length, permissions = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
119
|
+
permissions[_key4] = arguments[_key4];
|
|
120
|
+
}
|
|
121
|
+
if (permissions.length === 0) return true;
|
|
122
|
+
return permissions.some(function (perm) {
|
|
123
|
+
return _this2.hasPermission(perm);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 检查权限配置对象
|
|
129
|
+
*/
|
|
130
|
+
}, {
|
|
131
|
+
key: "checkConfig",
|
|
132
|
+
value: function checkConfig(config) {
|
|
133
|
+
return {
|
|
134
|
+
canView: this.hasPermission(config.view),
|
|
135
|
+
canCreate: this.hasPermission(config.create),
|
|
136
|
+
canUpdate: this.hasPermission(config.update),
|
|
137
|
+
canDelete: this.hasPermission(config.delete),
|
|
138
|
+
canImport: this.hasPermission(config.import),
|
|
139
|
+
canExport: this.hasPermission(config.export)
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}]);
|
|
143
|
+
return PermissionChecker;
|
|
144
|
+
}();
|
|
145
|
+
export default usePermissionCheck;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useRequestManager Hook
|
|
3
|
+
*
|
|
4
|
+
* 为组件提供请求管理功能的 React Hook
|
|
5
|
+
*/
|
|
6
|
+
interface UseRequestManagerOptions {
|
|
7
|
+
/** 防抖延迟时间(ms) */
|
|
8
|
+
debounceDelay?: number;
|
|
9
|
+
/** 是否启用缓存 */
|
|
10
|
+
enableCache?: boolean;
|
|
11
|
+
/** 缓存有效期(ms) */
|
|
12
|
+
cacheTTL?: number;
|
|
13
|
+
/** 是否启用请求去重 */
|
|
14
|
+
enableDedup?: boolean;
|
|
15
|
+
/** 最大并发数 */
|
|
16
|
+
maxConcurrent?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 使用请求管理器的 Hook
|
|
20
|
+
*/
|
|
21
|
+
export declare function useRequestManager<T = any>(options?: UseRequestManagerOptions): {
|
|
22
|
+
request: (params: any, requestFn: (params: any, signal: AbortSignal) => Promise<T>) => Promise<T>;
|
|
23
|
+
debouncedRequest: (key: string, params: any, requestFn: (params: any, signal: AbortSignal) => Promise<T>) => Promise<T>;
|
|
24
|
+
cancelRequest: (params: any) => void;
|
|
25
|
+
cancelAllRequests: () => void;
|
|
26
|
+
clearCache: () => void;
|
|
27
|
+
cleanupCache: () => void;
|
|
28
|
+
getStats: () => {
|
|
29
|
+
cacheSize: number;
|
|
30
|
+
pendingRequests: number;
|
|
31
|
+
activeRequests: number;
|
|
32
|
+
queueSize: number;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export default useRequestManager;
|
|
@@ -0,0 +1,116 @@
|
|
|
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 _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; }
|
|
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); } }
|
|
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
|
+
/**
|
|
6
|
+
* useRequestManager Hook
|
|
7
|
+
*
|
|
8
|
+
* 为组件提供请求管理功能的 React Hook
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { useRef, useEffect, useCallback } from 'react';
|
|
12
|
+
import { RequestManager } from "./RequestManager";
|
|
13
|
+
/**
|
|
14
|
+
* 使用请求管理器的 Hook
|
|
15
|
+
*/
|
|
16
|
+
export function useRequestManager(options) {
|
|
17
|
+
var managerRef = useRef();
|
|
18
|
+
|
|
19
|
+
// 初始化请求管理器
|
|
20
|
+
if (!managerRef.current) {
|
|
21
|
+
managerRef.current = new RequestManager(options);
|
|
22
|
+
}
|
|
23
|
+
var manager = managerRef.current;
|
|
24
|
+
|
|
25
|
+
// 组件卸载时清理
|
|
26
|
+
useEffect(function () {
|
|
27
|
+
return function () {
|
|
28
|
+
manager.cleanup();
|
|
29
|
+
};
|
|
30
|
+
}, [manager]);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 执行请求
|
|
34
|
+
*/
|
|
35
|
+
var request = useCallback( /*#__PURE__*/function () {
|
|
36
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, requestFn) {
|
|
37
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
38
|
+
while (1) switch (_context.prev = _context.next) {
|
|
39
|
+
case 0:
|
|
40
|
+
return _context.abrupt("return", manager.request(params, requestFn));
|
|
41
|
+
case 1:
|
|
42
|
+
case "end":
|
|
43
|
+
return _context.stop();
|
|
44
|
+
}
|
|
45
|
+
}, _callee);
|
|
46
|
+
}));
|
|
47
|
+
return function (_x, _x2) {
|
|
48
|
+
return _ref.apply(this, arguments);
|
|
49
|
+
};
|
|
50
|
+
}(), [manager]);
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 防抖请求
|
|
54
|
+
*/
|
|
55
|
+
var debouncedRequest = useCallback( /*#__PURE__*/function () {
|
|
56
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(key, params, requestFn) {
|
|
57
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
58
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
59
|
+
case 0:
|
|
60
|
+
return _context2.abrupt("return", manager.debouncedRequest(key, params, requestFn));
|
|
61
|
+
case 1:
|
|
62
|
+
case "end":
|
|
63
|
+
return _context2.stop();
|
|
64
|
+
}
|
|
65
|
+
}, _callee2);
|
|
66
|
+
}));
|
|
67
|
+
return function (_x3, _x4, _x5) {
|
|
68
|
+
return _ref2.apply(this, arguments);
|
|
69
|
+
};
|
|
70
|
+
}(), [manager]);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 取消请求
|
|
74
|
+
*/
|
|
75
|
+
var cancelRequest = useCallback(function (params) {
|
|
76
|
+
manager.cancelRequest(params);
|
|
77
|
+
}, [manager]);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 取消所有请求
|
|
81
|
+
*/
|
|
82
|
+
var cancelAllRequests = useCallback(function () {
|
|
83
|
+
manager.cancelAllPendingRequests();
|
|
84
|
+
}, [manager]);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 清理缓存
|
|
88
|
+
*/
|
|
89
|
+
var clearCache = useCallback(function () {
|
|
90
|
+
manager.clearCache();
|
|
91
|
+
}, [manager]);
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* 清理过期缓存
|
|
95
|
+
*/
|
|
96
|
+
var cleanupCache = useCallback(function () {
|
|
97
|
+
manager.cleanupExpiredCache();
|
|
98
|
+
}, [manager]);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 获取统计信息
|
|
102
|
+
*/
|
|
103
|
+
var getStats = useCallback(function () {
|
|
104
|
+
return manager.getStats();
|
|
105
|
+
}, [manager]);
|
|
106
|
+
return {
|
|
107
|
+
request: request,
|
|
108
|
+
debouncedRequest: debouncedRequest,
|
|
109
|
+
cancelRequest: cancelRequest,
|
|
110
|
+
cancelAllRequests: cancelAllRequests,
|
|
111
|
+
clearCache: clearCache,
|
|
112
|
+
cleanupCache: cleanupCache,
|
|
113
|
+
getStats: getStats
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export default useRequestManager;
|
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
export interface ImportModalProps {
|
|
3
|
+
/** 导入成功后的回调 */
|
|
4
|
+
onAfterSubmit?: (response?: any) => void;
|
|
5
|
+
/** 模块标题(可选,默认为"数据") */
|
|
6
|
+
title?: string;
|
|
7
|
+
/** 模板下载地址(可选,不提供则不显示模板下载链接) */
|
|
8
|
+
downUrl?: string;
|
|
9
|
+
/** 上传地址(完整URL或相对路径) */
|
|
10
|
+
uploadUrl: string;
|
|
11
|
+
/** 按钮文字 */
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
/** 实体ID(可选,用于特定记录的导入) */
|
|
14
|
+
id?: string;
|
|
15
|
+
/** 下载Blob函数(可选,不提供则使用默认实现) */
|
|
16
|
+
downloadBlob?: (url: string, filename: string) => void;
|
|
17
|
+
/** 服务器地址函数(可选,不提供则直接使用uploadUrl) */
|
|
18
|
+
serverUrl?: () => string;
|
|
19
|
+
/** 按钮属性 */
|
|
20
|
+
buttonProps?: any;
|
|
21
|
+
}
|
|
2
22
|
/**
|
|
3
23
|
* 通用导入弹出框
|
|
4
|
-
* @param props
|
|
5
|
-
* @returns
|
|
6
24
|
*/
|
|
7
|
-
declare const ImportModal:
|
|
25
|
+
declare const ImportModal: React.FC<ImportModalProps>;
|
|
8
26
|
export default ImportModal;
|