@magicbe/antd-crud 0.0.54 → 0.0.56

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/README.md CHANGED
@@ -7,7 +7,10 @@
7
7
  - 快速构建完整的 CRUD 表格界面
8
8
  - 支持多种表单字段类型
9
9
  - 内置筛选、新增、编辑、删除功能
10
- - 可自定义操作按钮
10
+ - 支持主操作按钮和行操作按钮
11
+ - 支持操作钩子函数(before/handle/after)
12
+ - 支持字段动态显示/隐藏
13
+ - 支持错误弹窗配置
11
14
  - 基于 Ant Design,样式统一
12
15
 
13
16
  ## 安装
@@ -50,7 +53,6 @@ const columns: ColumnType<User>['columns'] = [
50
53
  field: {
51
54
  type: 'Input',
52
55
  rules: [{ required: true }],
53
- ...({})
54
56
  },
55
57
  add: true,
56
58
  edit: true,
@@ -76,14 +78,8 @@ const columns: ColumnType<User>['columns'] = [
76
78
  type: "Select",
77
79
  option: {
78
80
  options: [
79
- {
80
- label: "区域1",
81
- value: "1",
82
- },
83
- {
84
- label: "区域2",
85
- value: "2",
86
- },
81
+ { label: "区域1", value: "1" },
82
+ { label: "区域2", value: "2" },
87
83
  ]
88
84
  },
89
85
  rules: [{ required: true }]
@@ -99,8 +95,6 @@ const App: React.FC = () => {
99
95
  pageSize: size = 10,
100
96
  } = params;
101
97
 
102
- // 模拟API请求
103
-
104
98
  return {
105
99
  sources: [
106
100
  { id: 1, name: '张三', age: 28, address: '北京市海淀区' },
@@ -113,19 +107,16 @@ const App: React.FC = () => {
113
107
  };
114
108
 
115
109
  const add: addHandle = async (value) => {
116
- // 模拟新增操作
117
110
  console.log('add:', value);
118
111
  return Promise.resolve();
119
112
  };
120
113
 
121
114
  const edit: editHandle = async (value) => {
122
- // 模拟编辑操作
123
115
  console.log('edit:', value);
124
116
  return Promise.resolve();
125
117
  };
126
118
 
127
119
  const del: delHandle = async (value) => {
128
- // 模拟删除操作
129
120
  console.log('delete:', value);
130
121
  return Promise.resolve();
131
122
  };
@@ -137,7 +128,7 @@ const App: React.FC = () => {
137
128
  add={add}
138
129
  edit={edit}
139
130
  del={del}
140
- rowKey={"uuid"}
131
+ rowKey="id"
141
132
  />
142
133
  );
143
134
  };
@@ -156,16 +147,17 @@ export default App;
156
147
  | 属性名 | 类型 | 说明 |
157
148
  |--------|------|------|
158
149
  | columns | ColumnType[] | 表格列配置 |
159
- | getSources | (params?: GetSourceFunctionParams) => Promise<Source> | 获取数据的方法 |
160
- | add | addHandle \| addHandleMap | 新增操作方法 |
161
- | edit | editHandle \| editHandleMap | 编辑操作方法 |
162
- | del | delHandle \| Partial<HandleMap<delHandle>> | 删除操作方法 |
150
+ | getSources | (params?: GetSourceFunctionParams) => Promise\<Source\> | 获取数据的方法 |
151
+ | add | add \| addHandleMap | 新增操作方法 |
152
+ | edit | edit \| editHandleMap | 编辑操作方法 |
153
+ | del | delHandle \| Partial\<HandleMap\<delHandle\>\> | 删除操作方法 |
163
154
  | action | Action | 自定义操作按钮 |
164
- | rowSelection | RowSelectionType | 行选择类型 |
155
+ | rowSelection | RowSelectionType \| AntdTableProps['rowSelection'] | 行选择配置 |
165
156
  | pagination | false | 是否显示分页(暂仅支持false) |
166
157
  | drawer | number \| DrawerProps | 抽屉配置 |
167
158
  | pageSizeOptions | PaginationProps['pageSizeOptions'] | 每页条数选项 |
168
- | actionColumn | ColumnType<any> | 操作列配置 |
159
+ | actionColumn | ColumnType\<any\> | 操作列配置 |
160
+ | rowKey | string \| ((record: any) => string) | 行数据的唯一标识 |
169
161
 
170
162
  ### ColumnType
171
163
 
@@ -181,112 +173,325 @@ export default App;
181
173
  ### ColumnField 类型
182
174
 
183
175
  支持的表单字段类型:
184
- - Input
185
- - Input.Password
186
- - TextArea
187
- - InputNumber
188
- - Select
189
- - Cascader
190
- - TreeSelect
191
- - Checkbox
192
- - Checkbox.Group
193
- - DatePicker
194
- - DatePicker.YearPicker
195
- - DatePicker.MonthPicker
196
- - DatePicker.WeekPicker
197
- - DatePicker.TimePicker
198
- - DatePicker.RangePicker
199
- - DatePicker.QuarterPicker
200
- - TimePicker
201
- - TimePicker.RangePicker
202
- - Radio
203
- - Radio.Group
204
- - Switch
205
-
206
- ### TableContextProvider useTableContext
176
+
177
+ | 类型 | 说明 |
178
+ |------|------|
179
+ | Hidden | 隐藏字段 |
180
+ | Input | 输入框 |
181
+ | Input.Password | 密码输入框 |
182
+ | TextArea | 长文本输入框 |
183
+ | InputNumber | 数字输入框 |
184
+ | Select | 选择器 |
185
+ | Cascader | 级联选择 |
186
+ | TreeSelect | 树选择 |
187
+ | Checkbox | 多选框 |
188
+ | Checkbox.Group | 多选框组 |
189
+ | DatePicker | 日期选择框 |
190
+ | DatePicker.YearPicker | 年选择框 |
191
+ | DatePicker.MonthPicker | 月选择框 |
192
+ | DatePicker.WeekPicker | 周选择框 |
193
+ | DatePicker.TimePicker | 时间选择框 |
194
+ | DatePicker.RangePicker | 时间范围选择框 |
195
+ | DatePicker.QuarterPicker | 季度选择框 |
196
+ | TimePicker | 时间选择框 |
197
+ | TimePicker.RangePicker | 时间范围选择框 |
198
+ | Radio | 单选框 |
199
+ | Radio.Group | 单选框组 |
200
+ | Switch | 开关 |
201
+
202
+ ### ColumnField 配置
203
+
204
+ ```tsx
205
+ interface BaseColumnField<T extends string, O = any> {
206
+ type: T;
207
+ option?: O;
208
+ rules?: Rule[];
209
+ order?: number;
210
+ filter?: (values: AnyObject, form: FormInstance) => boolean;
211
+ }
212
+ ```
213
+
214
+ | 属性名 | 类型 | 说明 |
215
+ |--------|------|------|
216
+ | type | string | 字段类型 |
217
+ | option | object | 传递给组件的属性 |
218
+ | rules | Rule[] | 表单验证规则 |
219
+ | order | number | 字段排序 |
220
+ | filter | (values, form) => boolean | 动态显示/隐藏字段 |
221
+
222
+ ### Source 类型
223
+
224
+ ```tsx
225
+ type Source<RecordType = AnyObject> = {
226
+ sources: RecordType[];
227
+ total?: number;
228
+ page?: number;
229
+ size?: number;
230
+ }
231
+ ```
232
+
233
+ ### 操作方法
234
+
235
+ #### add / edit 方法
236
+
237
+ 支持两种形式:
238
+
239
+ ```tsx
240
+ type addHandle = (value: any, selection: Selection) => Promise<any>;
241
+
242
+ type addHandleMap = Partial<HandleMap<addHandle>> & {
243
+ init?: addHandleInit
244
+ };
245
+
246
+ type add = addHandle | addHandleMap;
247
+ ```
248
+
249
+ **简单形式:**
250
+
251
+ ```tsx
252
+ const add: addHandle = async (value, selection) => {
253
+ console.log(value, selection);
254
+ };
255
+ ```
256
+
257
+ **钩子形式:**
258
+
259
+ ```tsx
260
+ const add: addHandleMap = {
261
+ init: async (selection) => {
262
+ return { name: '默认值' };
263
+ },
264
+ before: async (value, selection) => {},
265
+ handle: async (value, selection) => {},
266
+ after: async (value, selection) => {},
267
+ };
268
+ ```
269
+
270
+ #### del 方法
271
+
272
+ ```tsx
273
+ type delHandle = (selection: Selection) => Promise<any>;
274
+
275
+ type del = delHandle | Partial<HandleMap<delHandle>>;
276
+ ```
277
+
278
+ ### Selection 类型
279
+
280
+ ```tsx
281
+ interface Selection<RecordType = AnyObject> {
282
+ keys?: React.Key[];
283
+ rows?: RecordType[];
284
+ }
285
+ ```
286
+
287
+ ### Action 配置
288
+
289
+ 操作按钮支持多种配置方式:
290
+
291
+ ```tsx
292
+ type Action = boolean | React.FC | React.FC[] | CustomAction;
293
+
294
+ interface CustomAction {
295
+ master?: boolean | React.FC | React.FC[] | MasterCustomActionGroup;
296
+ record?: boolean | React.FC | React.FC[] | RecordCustomActionGroup;
297
+ }
298
+
299
+ interface MasterCustomActionGroup {
300
+ add?: boolean | React.FC;
301
+ del?: boolean | React.FC;
302
+ edit?: boolean | React.FC;
303
+ }
304
+
305
+ interface RecordCustomActionGroup {
306
+ add?: boolean | React.FC;
307
+ del?: boolean | React.FC;
308
+ edit?: boolean | React.FC;
309
+ }
310
+ ```
311
+
312
+ ### 导出组件
313
+
314
+ #### TableContextProvider 和 useTableContext
207
315
 
208
316
  提供表格上下文,可用于自定义组件中获取表格状态和方法。
209
317
 
210
- ### Filter
318
+ ```tsx
319
+ import { TableContextProvider, useTableContext } from '@magicbe/antd-crud';
320
+
321
+ const CustomComponent: React.FC = () => {
322
+ const { table_ref, filter_ref, form_ref, add, edit, del } = useTableContext();
323
+
324
+ const handleRefresh = () => {
325
+ table_ref?.current?.loadRecords();
326
+ };
327
+
328
+ return <button onClick={handleRefresh}>刷新数据</button>;
329
+ };
330
+ ```
331
+
332
+ #### Filter
211
333
 
212
334
  筛选组件,可单独使用。
213
335
 
214
- ### Action
336
+ #### Action
337
+
338
+ 主操作按钮组件,提供了新增、编辑、删除等默认操作。
215
339
 
216
- 操作按钮组件,提供了新增、编辑、删除等默认操作。
340
+ 导出的子组件:
341
+ - `AppendAction` (别名: `MastAppend`) - 新增按钮
342
+ - `DeleteAction` (别名: `MastDelete`) - 删除按钮
343
+ - `EditAction` (别名: `MastEdit`) - 编辑按钮
217
344
 
218
- ### Table
345
+ #### Table
219
346
 
220
347
  表格组件,继承自 Ant Design 的 Table。
221
348
 
222
- ### CrudConfigProvider
349
+ 导出的子组件:
350
+ - `AppendAction` (别名: `RowAppend`) - 行新增按钮
351
+ - `DeleteAction` (别名: `RowDelete`) - 行删除按钮
352
+ - `EditAction` (别名: `RowEdit`) - 行编辑按钮
353
+
354
+ #### DrawerContentContextProvider 和 useDrawerContentContext
355
+
356
+ 抽屉内容上下文,用于控制抽屉的渲染位置。
357
+
358
+ ```tsx
359
+ import { DrawerContentContextProvider, useDrawerContentContext } from '@magicbe/antd-crud';
360
+ ```
361
+
362
+ #### CrudConfigProvider
223
363
 
224
364
  配置提供者,继承自 Ant Design 的 ConfigProvider。
225
365
 
366
+ ```tsx
367
+ import { CrudConfigProvider, CrudConfigContextProvider, useCrudConfigContext } from '@magicbe/antd-crud';
368
+
369
+ interface CustomConfigProviderProps {
370
+ showErrorModal?: boolean;
371
+ }
372
+
373
+ const App: React.FC = () => {
374
+ return (
375
+ <CrudConfigProvider
376
+ theme={{ token: { colorPrimary: '#1890ff' } }}
377
+ showErrorModal={false}
378
+ >
379
+ <CrudTable {...props} />
380
+ </CrudConfigProvider>
381
+ );
382
+ };
383
+ ```
384
+
385
+ ### ContentRef
386
+
387
+ 通过 ref 暴露的方法:
388
+
389
+ ```tsx
390
+ interface ContentRef<RecordType = AnyObject> {
391
+ filter_ref: React.RefObject<FilterRef>;
392
+ action_ref: React.RefObject<ActionRef>;
393
+ table_ref: React.RefObject<TableRef<RecordType>>;
394
+ form_ref: React.RefObject<FormRef>;
395
+ }
396
+
397
+ interface TableRef<RecordType = AnyObject> {
398
+ getPageData: () => { current?: number; pageSize?: number };
399
+ getRecords: () => RecordType[];
400
+ loadRecords: (params?: any) => void;
401
+ selected_keys: React.Key[];
402
+ selected_rows: RecordType[];
403
+ setSelected_keys: React.Dispatch<React.SetStateAction<React.Key[]>>;
404
+ setSelected_rows: React.Dispatch<React.SetStateAction<RecordType[]>>;
405
+ }
406
+ ```
407
+
226
408
  ## 高级用法
227
409
 
228
410
  ### 自定义操作按钮
229
411
 
230
412
  ```tsx
231
413
  <CrudTable
232
- columns={columns}
233
- getSources={getSources}
234
- action={{
235
- master: {
236
- add: true,
237
- del: true,
238
- // 自定义主操作按钮
239
- },
240
- record: {
241
- edit: true,
242
- del: true,
243
- // 自定义行操作按钮
244
- },
245
- }}
414
+ columns={columns}
415
+ getSources={getSources}
416
+ action={{
417
+ master: {
418
+ add: true,
419
+ del: true,
420
+ },
421
+ record: {
422
+ edit: true,
423
+ del: true,
424
+ },
425
+ }}
246
426
  />
247
427
  ```
248
428
 
249
- ### 使用 Context
429
+ ### 使用自定义组件
250
430
 
251
431
  ```tsx
252
- import { TableContextProvider, useTableContext } from '@magicbe/antd-crud';
253
-
254
- const CustomComponent: React.FC = () => {
255
- const { table_ref } = useTableContext();
256
-
257
- const handleRefresh = () => {
258
- table_ref.current?.loadRecords();
259
- };
260
-
261
- return (
262
- <button onClick={handleRefresh}>刷新数据</button>
263
- );
432
+ const CustomAddButton: React.FC = () => {
433
+ return <Button type="primary">自定义新增</Button>;
264
434
  };
265
435
 
266
- const App: React.FC = () => {
267
- return (
268
- <TableContextProvider {...props}>
269
- <CustomComponent />
270
- </TableContextProvider>
271
- );
272
- };
436
+ <CrudTable
437
+ action={{
438
+ master: {
439
+ add: CustomAddButton,
440
+ },
441
+ }}
442
+ />
273
443
  ```
274
444
 
275
- ### 配置主题
445
+ ### 字段动态显示
276
446
 
277
447
  ```tsx
278
- import { CrudConfigProvider } from '@magicbe/antd-crud';
448
+ const columns: ColumnType[] = [
449
+ {
450
+ title: '类型',
451
+ dataIndex: 'type',
452
+ field: {
453
+ type: 'Select',
454
+ option: {
455
+ options: [
456
+ { label: '类型A', value: 'A' },
457
+ { label: '类型B', value: 'B' },
458
+ ]
459
+ }
460
+ },
461
+ },
462
+ {
463
+ title: '类型A专属字段',
464
+ dataIndex: 'fieldA',
465
+ field: {
466
+ type: 'Input',
467
+ filter: (values, form) => values.type === 'A',
468
+ },
469
+ },
470
+ ];
471
+ ```
472
+
473
+ ### 使用 ref 控制表格
474
+
475
+ ```tsx
476
+ import { CrudTable, type ContentRef } from '@magicbe/antd-crud';
279
477
 
280
478
  const App: React.FC = () => {
281
- return (
282
- <CrudConfigProvider theme={{
283
- token: {
284
- colorPrimary: '#1890ff',
285
- },
286
- }}>
287
- <CrudTable {...props} />
288
- </CrudConfigProvider>
289
- );
479
+ const crudRef = React.useRef<ContentRef>(null);
480
+
481
+ const handleRefresh = () => {
482
+ crudRef.current?.table_ref.current?.loadRecords();
483
+ };
484
+
485
+ const getSelectedRows = () => {
486
+ return crudRef.current?.table_ref.current?.selected_rows;
487
+ };
488
+
489
+ return (
490
+ <>
491
+ <Button onClick={handleRefresh}>刷新</Button>
492
+ <CrudTable ref={crudRef} {...props} />
493
+ </>
494
+ );
290
495
  };
291
496
  ```
292
497
 
@@ -295,7 +500,8 @@ const App: React.FC = () => {
295
500
  1. 组件依赖 antd 5.22.5 及以上版本,请确保项目中 antd 版本符合要求。
296
501
  2. 目前 pagination 仅支持设置为 false,分页功能内置实现。
297
502
  3. 自定义组件时,请使用 TableContextProvider 包裹以确保能正确获取上下文。
503
+ 4. 使用 `showErrorModal` 配置可以控制是否在操作失败时显示错误弹窗。
298
504
 
299
505
  ## License
300
506
 
301
- MIT
507
+ MIT
@@ -155,7 +155,7 @@ var Table = React.forwardRef(function (_a, ref) {
155
155
  }
156
156
  }
157
157
  return nexts;
158
- }, [props.columns]);
158
+ }, [props.columns, action]);
159
159
  var pagination = useMemo(function () {
160
160
  if (_pagination_ === false)
161
161
  return false;
@@ -206,8 +206,10 @@ var Table = React.forwardRef(function (_a, ref) {
206
206
  }).finally(function () { return setLoading(false); });
207
207
  };
208
208
  var getPageData = function () { return ({ current: page, pageSize: size }); };
209
+ var getRecords = function () { return sources; };
209
210
  useImperativeHandle(ref, function () { return ({
210
211
  getPageData: getPageData,
212
+ getRecords: getRecords,
211
213
  loadRecords: loadRecords,
212
214
  selected_keys: selected_keys,
213
215
  selected_rows: selected_rows,
@@ -101,11 +101,11 @@ export interface ColumnType<RecordType = AnyObject> extends Omit<AntdColumnType<
101
101
  export type Source<RecordType = AnyObject> = {
102
102
  sources: RecordType[];
103
103
  /**数据总数 */
104
- total: number;
104
+ total?: number;
105
105
  /**当前页 */
106
- page: number;
106
+ page?: number;
107
107
  /**每页几条 */
108
- size: number;
108
+ size?: number;
109
109
  };
110
110
  export interface GetSourceFunctionParams extends Record<string, any> {
111
111
  current?: number;
@@ -179,10 +179,10 @@ export interface ContentProps<RecordType = AnyObject> extends Omit<AntdTableProp
179
179
  actionColumn?: ColumnType<any>;
180
180
  }
181
181
  /**主体暴露 */
182
- export interface ContentRef {
182
+ export interface ContentRef<RecordType = AnyObject> {
183
183
  filter_ref: React.RefObject<FilterRef>;
184
184
  action_ref: React.RefObject<ActionRef>;
185
- table_ref: React.RefObject<TableRef>;
185
+ table_ref: React.RefObject<TableRef<RecordType>>;
186
186
  form_ref: React.RefObject<FormRef>;
187
187
  }
188
188
  /**表单REF */
@@ -209,12 +209,14 @@ export type getPageData = () => ({
209
209
  pageSize?: number;
210
210
  });
211
211
  export type loadRecords = (params?: any) => void;
212
- export interface TableRef {
212
+ export type getRecords<T = AnyObject> = () => T[];
213
+ export interface TableRef<RecordType = AnyObject> {
213
214
  getPageData: getPageData;
215
+ getRecords: getRecords<RecordType>;
214
216
  loadRecords: loadRecords;
215
217
  selected_keys: React.Key[];
216
- selected_rows: AnyObject[];
218
+ selected_rows: RecordType[];
217
219
  setSelected_keys: React.Dispatch<React.SetStateAction<React.Key[]>>;
218
- setSelected_rows: React.Dispatch<React.SetStateAction<AnyObject[]>>;
220
+ setSelected_rows: React.Dispatch<React.SetStateAction<RecordType[]>>;
219
221
  }
220
222
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magicbe/antd-crud",
3
- "version": "0.0.54",
3
+ "version": "0.0.56",
4
4
  "description": "antd crud table",
5
5
  "author": "wang quan",
6
6
  "private": false,