@antsoo-lib/core 2.0.5 → 3.0.1

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 (43) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/core.css +1 -1
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.js +6 -5
  5. package/dist/types/BaseSearch/index.d.ts +1 -1
  6. package/dist/types/BaseTable/index.d.ts +4 -480
  7. package/dist/types/Form/CoreForm.d.ts +82 -0
  8. package/dist/types/SSelectPage/index.d.ts +102 -0
  9. package/package.json +5 -5
  10. package/src/BaseSearch/index.vue +371 -371
  11. package/src/BaseTable/index.vue +910 -910
  12. package/src/Form/CoreForm.vue +782 -782
  13. package/src/Form/types.ts +86 -86
  14. package/src/SSelectPage/index.vue +607 -607
  15. package/src/index.ts +17 -17
  16. package/src/render/AreaCascader.tsx +64 -64
  17. package/src/render/AutoComplete.tsx +101 -101
  18. package/src/render/Button.tsx +62 -62
  19. package/src/render/Cascader.tsx +45 -45
  20. package/src/render/Checkbox.tsx +65 -65
  21. package/src/render/CheckboxGroup.tsx +57 -57
  22. package/src/render/Custom.tsx +19 -19
  23. package/src/render/DatePicker.tsx +83 -83
  24. package/src/render/Input.tsx +140 -140
  25. package/src/render/InputGroup.tsx +115 -115
  26. package/src/render/InputNumber.tsx +205 -205
  27. package/src/render/InputPassword.tsx +81 -81
  28. package/src/render/InputRange.tsx +154 -154
  29. package/src/render/RadioGroup.tsx +63 -63
  30. package/src/render/Select.tsx +96 -96
  31. package/src/render/SselectPage.tsx +107 -107
  32. package/src/render/Switch.tsx +60 -60
  33. package/src/render/Tree.tsx +136 -136
  34. package/src/render/TreeSelect.tsx +81 -81
  35. package/src/render/Upload.tsx +91 -91
  36. package/src/render/helper.tsx +221 -221
  37. package/src/render/index.ts +108 -108
  38. package/src/render/registry.ts +20 -20
  39. package/src/render/state.ts +37 -37
  40. package/src/render/types.ts +567 -567
  41. package/src/utils/attrMapping.ts +106 -106
  42. package/vite.config.ts +61 -61
  43. package/.turbo/turbo-build.log +0 -40
@@ -1,567 +1,567 @@
1
- import type {
2
- ButtonProps,
3
- CascaderProps,
4
- CheckboxGroupProps,
5
- CheckboxProps,
6
- ColProps,
7
- DatePickerProps,
8
- InputNumberProps,
9
- InputProps,
10
- RadioGroupProps,
11
- RowProps,
12
- SelectProps,
13
- SwitchProps,
14
- TreeProps,
15
- TreeSelectProps,
16
- UploadProps,
17
- } from '@antsoo-lib/components'
18
- import type { AnyObject, VoidFunction } from '@antsoo-lib/shared'
19
-
20
- import type { VNode } from 'vue'
21
-
22
- import type { CustomToolbarItem } from './Custom'
23
- import type { ToolbarState } from './state'
24
-
25
- // 事件处理函数类型定义
26
- export type ToolbarEventHandler = VoidFunction
27
-
28
- // 基础事件接口
29
- export interface BaseEvents {
30
- [key: string]: ToolbarEventHandler | undefined
31
- }
32
-
33
- export interface BaseToolbarItem {
34
- key?: string
35
- label?: string
36
- permission?: string
37
- beforeCreate?: boolean | ((toolbarState: ToolbarState) => boolean)
38
- disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean)
39
- props?: Record<string, any>
40
- events?: BaseEvents
41
- }
42
-
43
- // 按钮工具栏项目
44
- export interface ButtonToolbarItem extends BaseToolbarItem {
45
- type: 'button'
46
- props?: Partial<ButtonProps> & { loading?: boolean; disabled?: boolean }
47
- events?: BaseEvents & {
48
- onClick?: (
49
- loadingControl: { setLoading: (loading: boolean) => void; getLoading: () => boolean },
50
- allValues: AnyObject,
51
- toolbarState: ToolbarState,
52
- ...args: any[]
53
- ) => void
54
- }
55
- }
56
-
57
- // 插槽配置接口
58
- export interface SlotConfig {
59
- // 插槽内容可以是组件配置或渲染函数
60
- content?:
61
- | {
62
- component: any // 组件
63
- key: string // 主表字段
64
- props?: AnyObject // 组件属性
65
- events?: Record<string, VoidFunction> // 组件事件
66
- options?: Array<{ label: string; value: any }> // 选项数据(用于select等)
67
- }
68
- | ((toolbarState: ToolbarState) => VNode)
69
- }
70
-
71
- // 输入框工具栏项目
72
- export interface InputToolbarItem extends BaseToolbarItem {
73
- type: 'input'
74
- props?: Partial<InputProps> & { value?: string; autoFocus?: boolean }
75
- events?: BaseEvents & {
76
- 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
77
- onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void
78
- onFocus?: VoidFunction
79
- onFocusCapture?: VoidFunction
80
- onBlur?: VoidFunction
81
- onBlurCapture?: VoidFunction
82
- }
83
- textarea?: boolean
84
- // 插槽配置
85
- slots?: {
86
- addonBefore?: SlotConfig
87
- addonAfter?: SlotConfig
88
- prefix?: SlotConfig
89
- suffix?: SlotConfig
90
- }
91
- }
92
-
93
- // 单选框工具栏项目
94
- export interface RadioGroupToolbarItem extends BaseToolbarItem {
95
- type: 'radioGroup'
96
- props?: Partial<RadioGroupProps> & { value?: any }
97
- events?: BaseEvents & {
98
- 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
99
- onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void
100
- }
101
- }
102
-
103
- // 复选框工具栏项目
104
- export interface CheckboxToolbarItem extends BaseToolbarItem {
105
- type: 'checkbox'
106
- props?: Partial<CheckboxProps> & { checked?: boolean; value?: boolean }
107
- events?: BaseEvents & {
108
- 'onUpdate:checked'?: (
109
- checked: boolean,
110
- allValues: AnyObject,
111
- toolbarState: ToolbarState,
112
- ) => void
113
- onChange?: (event: any, allValues: AnyObject, toolbarState: ToolbarState) => void
114
- 'onUpdate:value'?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void
115
- }
116
- label?: string // 复选框后面显示的文案
117
- }
118
-
119
- // 开关工具栏项目
120
- export interface SwitchToolbarItem extends BaseToolbarItem {
121
- type: 'switch'
122
- props?: Partial<SwitchProps> & { checked?: boolean }
123
- events?: BaseEvents & {
124
- 'onUpdate:checked'?: (
125
- checked: boolean,
126
- allValues: AnyObject,
127
- toolbarState: ToolbarState,
128
- ) => void
129
- onChange?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void
130
- }
131
- }
132
-
133
- // 复选框组工具栏项目
134
- export interface CheckboxGroupToolbarItem extends BaseToolbarItem {
135
- type: 'checkboxGroup'
136
- props?: Partial<CheckboxGroupProps> & { value?: any[] }
137
- events?: BaseEvents & {
138
- 'onUpdate:value'?: (value: any[], allValues: AnyObject, toolbarState: ToolbarState) => void
139
- onChange?: (checkedValues: any[], allValues: AnyObject, toolbarState: ToolbarState) => void
140
- }
141
- }
142
-
143
- // 日期选择器工具栏项目
144
- export interface DatePickerToolbarItem extends BaseToolbarItem {
145
- type: 'datePicker'
146
- props?: Partial<DatePickerProps> & { value?: any; autoFocus?: boolean }
147
- events?: BaseEvents & {
148
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
149
- onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
150
- onFocus?: VoidFunction
151
- }
152
- range?: boolean
153
- }
154
-
155
- export interface SelectToolbarItem extends BaseToolbarItem {
156
- type: 'select'
157
- props?: Partial<SelectProps> & {
158
- value?: any
159
- options?: any[] | ((values: AnyObject) => any[])
160
- }
161
- events?: BaseEvents & {
162
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
163
- onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
164
- }
165
- }
166
-
167
- // 级联选择器工具栏项目
168
- export interface CascaderToolbarItem extends BaseToolbarItem {
169
- type: 'cascader'
170
- props?: Partial<CascaderProps> & { value?: any }
171
- events?: BaseEvents & {
172
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
173
- onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
174
- }
175
- }
176
-
177
- // 地区级联选择器属性定义
178
- export interface AreaCascaderProps {
179
- value?: any[]
180
- placeholder?: string
181
- disabled?: boolean
182
- allowClear?: boolean
183
- [key: string]: any
184
- }
185
-
186
- // 地区级联选择器工具栏项目
187
- export interface AreaCascaderToolbarItem extends BaseToolbarItem {
188
- type: 'areaCascader'
189
- props?: AreaCascaderProps
190
- attr?: Record<string, any>
191
- events?: BaseEvents & {
192
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
193
- selectedArea?: (area: any, allValues: AnyObject, toolbarState: ToolbarState) => void
194
- }
195
- }
196
-
197
- // 树选择器工具栏项目
198
- export interface TreeSelectToolbarItem extends BaseToolbarItem {
199
- type: 'treeSelect'
200
- props?: Partial<TreeSelectProps> & {
201
- value?: any
202
- options?: any[] | ((values: AnyObject) => any[])
203
- }
204
- events?: BaseEvents & {
205
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
206
- onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
207
- }
208
- }
209
-
210
- export interface TreeToolbarItem extends BaseToolbarItem {
211
- type: 'tree'
212
- props?: Partial<TreeProps> & {
213
- checkedKeys?: any[]
214
- expandedKeys?: any[]
215
- }
216
- events?: BaseEvents & {
217
- 'onUpdate:checkedKeys'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
218
- 'onUpdate:expandedKeys'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
219
- onCheck?: (value: any, info: any, allValues: AnyObject, toolbarState: ToolbarState) => void
220
- onExpand?: (value: any, info: any, allValues: AnyObject, toolbarState: ToolbarState) => void
221
- onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
222
- }
223
- }
224
-
225
- export interface InputRangeToolbarItem extends BaseToolbarItem {
226
- type: 'inputRange'
227
- props?: {
228
- startProps?: Record<string, unknown>
229
- endProps?: Record<string, unknown>
230
- separator?: string
231
- startPlaceholder?: string
232
- endPlaceholder?: string
233
- style?: AnyObject
234
- className?: string
235
- allowClear?: boolean
236
- }
237
- attr?: string[]
238
- events?: BaseEvents & {
239
- 'onUpdate:value'?: (
240
- value: [string, string],
241
- allValues: AnyObject,
242
- toolbarState: ToolbarState,
243
- ) => void
244
- onChange?: (value: [string, string], allValues: AnyObject, toolbarState: ToolbarState) => void
245
- onStartChange?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
246
- onEndChange?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
247
- }
248
- }
249
-
250
- export interface InputNumberToolbarItem extends BaseToolbarItem {
251
- type: 'inputNumber'
252
- props?: Partial<InputNumberProps> & {
253
- value?: any
254
- autoFocus?: boolean
255
- xmoney?: boolean
256
- xprice?: boolean
257
- xweight?: boolean
258
- xtaxrate?: boolean
259
- xnumber?: boolean
260
- }
261
- events?: BaseEvents & {
262
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
263
- onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
264
- onStep?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
265
- onFocus?: VoidFunction
266
- onFocusCapture?: VoidFunction
267
- onBlur?: VoidFunction
268
- onBlurCapture?: VoidFunction
269
- }
270
- slots?: {
271
- addonBefore?: SlotConfig
272
- addonAfter?: SlotConfig
273
- prefix?: SlotConfig
274
- suffix?: SlotConfig
275
- }
276
- }
277
-
278
- export interface InputPasswordToolbarItem extends BaseToolbarItem {
279
- type: 'inputPassword'
280
- props?: Partial<InputProps> & { value?: string }
281
- events?: BaseEvents & {
282
- 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
283
- onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void
284
- }
285
- textarea?: boolean
286
- // 插槽配置
287
- slots?: {
288
- addonBefore?: SlotConfig
289
- addonAfter?: SlotConfig
290
- prefix?: SlotConfig
291
- suffix?: SlotConfig
292
- }
293
- }
294
-
295
- export interface UploadToolbarItem extends BaseToolbarItem {
296
- type: 'upload'
297
- props?: Partial<UploadProps> & {
298
- value?: any[]
299
- // 基础属性
300
- placeholder?: string
301
- allowClear?: boolean
302
- disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean)
303
- multiple?: boolean
304
- maxCount?: number
305
- listType?: 'text' | 'picture' | 'picture-card'
306
-
307
- // 接口配置
308
- api?: {
309
- url: string
310
- method?: 'GET' | 'POST'
311
- headers?: Record<string, string>
312
- }
313
-
314
- // 额外参数配置
315
- extraParams?: AnyObject | ((allValues: AnyObject, toolbarState: ToolbarState) => AnyObject)
316
-
317
- // 数据映射配置
318
- dataMapping?: {
319
- list?: string // 文件列表字段路径
320
- url?: string // 文件URL字段
321
- name?: string // 文件名字段
322
- status?: string // 文件状态字段
323
- }
324
-
325
- // UI 配置
326
- buttonText?: string // 上传按钮文本,默认为"点击上传"
327
- placeholderSrc?: string // picture-card 模式下的占位符图片地址
328
- placeholderAlt?: string // 占位符图片的 alt 属性
329
- placeholderClass?: string // 占位符图片的 CSS 类名
330
- placeholderStyle?: AnyObject // 占位符图片的内联样式
331
-
332
- // 其他配置
333
- transformData?: (data: any) => any
334
- beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean>
335
- onPreview?: (file: any) => void
336
- onRemove?: (file: any) => boolean | Promise<boolean>
337
- }
338
-
339
- // 文件类型限制配置
340
- passage?: 'image' | 'pdf' | 'word' | 'excel' | 'video' | 'audio' | string
341
-
342
- events?: BaseEvents & {
343
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
344
- onChange?: (info: any, allValues: AnyObject, toolbarState: ToolbarState) => void
345
- onSuccess?: (response: any, file: any, allValues: AnyObject, toolbarState: ToolbarState) => void
346
- onError?: (error: any, file: any, allValues: AnyObject, toolbarState: ToolbarState) => void
347
- }
348
- }
349
-
350
- // SselectPage 属性定义
351
- export interface SselectPageProps {
352
- value?: any
353
- placeholder?: string
354
- allowClear?: boolean
355
- showSearch?: boolean
356
- disabled?: boolean
357
- maxTagCount?: number | 'responsive'
358
- size?: 'large' | 'middle' | 'small'
359
- mode?: 'multiple' | 'tags'
360
- params?: AnyObject
361
- api: {
362
- url: string
363
- method?: 'GET' | 'POST'
364
- headers?: Record<string, string>
365
- params?: AnyObject
366
- data?: AnyObject
367
- request?: (config: {
368
- method?: 'GET' | 'POST'
369
- url: string
370
- headers?: Record<string, string>
371
- params?: AnyObject
372
- data?: AnyObject
373
- }) => Promise<any>
374
- }
375
- dataMapping?: {
376
- list?: string
377
- total?: string
378
- value?: string
379
- label?: string
380
- }
381
- pagination?: boolean
382
- paginationConfig?: {
383
- pageField?: string
384
- pageSizeField?: string
385
- searchField?: string
386
- searchContains?: string
387
- }
388
- pageSize?: number
389
- searchDelay?: number
390
- extraParams?: AnyObject | ((allValues: AnyObject, toolbarState: ToolbarState) => AnyObject)
391
- transformData?: (data: any) => any
392
- autoLoad?: boolean
393
- autoFocus?: boolean
394
- attr?: Record<string, string>
395
- [key: string]: any
396
- }
397
-
398
- export interface SselectPageToolbarItem extends BaseToolbarItem {
399
- type: 'sselectPage'
400
- props?: SselectPageProps & {
401
- disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean)
402
- }
403
- events?: BaseEvents & {
404
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
405
- onChange?: (
406
- value: any,
407
- option: any,
408
- allOptions: any,
409
- allValues: AnyObject,
410
- toolbarState: ToolbarState,
411
- ) => void
412
- onSearch?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
413
- onClear?: (allValues: AnyObject, toolbarState: ToolbarState) => void
414
- }
415
- }
416
-
417
- export interface AutoCompleteProps {
418
- value?: any
419
- options?: any[]
420
- placeholder?: string
421
- disabled?: boolean
422
- allowClear?: boolean
423
- [key: string]: any
424
- }
425
-
426
- export interface AutoCompleteToolbarItem extends BaseToolbarItem {
427
- type: 'autoComplete'
428
- props?: AutoCompleteProps
429
- events?: BaseEvents & {
430
- 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
431
- onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
432
- onSelect?: (value: any, option: any, allValues: AnyObject, toolbarState: ToolbarState) => void
433
- onSearch?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
434
- }
435
- }
436
-
437
- // ------------------------------
438
- // Input.Group 渲染器配置定义
439
- // ------------------------------
440
- export type InputGroupSize = 'large' | 'middle' | 'small' | 'default'
441
- export interface InputGroupPropsLike {
442
- size?: InputGroupSize
443
- compact?: boolean
444
- prefixCls?: string
445
- }
446
-
447
- // 允许在工具栏中直接使用预设描述项(xtype)
448
- export type PresetXtype = 'add' | 'edit' | 'dels' | 'export' | 'print' | 'files'
449
-
450
- export interface FilesCategoryOption {
451
- label: string
452
- value: string
453
- [key: string]: any
454
- }
455
-
456
- export interface FilesPresetConfig {
457
- title?: string
458
- // 单据类型:决定附件归属(UploadPopup 内部请求依赖该字段)
459
- billtypeCode: string | ((row: AnyObject) => string)
460
- // 分类下拉:UploadPopup 打开后默认选第一个,并按 category 拉历史列表
461
- categoryOptions: FilesCategoryOption[] | ((row: AnyObject) => FilesCategoryOption[])
462
- // objId 从行对象取值的字段名,默认 id
463
- objIdKey?: string
464
- accept?: string
465
- passage?: 'image' | 'pdf' | 'word' | 'excel' | 'video' | 'audio' | string
466
- maxFileSizeMB?: number
467
- maxCount?: number
468
- // 上传成功后是否刷新表格(由 SearchTable.openFilesPopup 控制)
469
- refreshOnSuccess?: boolean
470
- }
471
-
472
- export interface PresetBaseToolbarItem extends BaseToolbarItem {
473
- xtype: PresetXtype
474
- permission?: string
475
- label?: string
476
- events?: any
477
- props?: any
478
- }
479
-
480
- export interface PresetDelsToolbarItem extends PresetBaseToolbarItem {
481
- xtype: 'dels'
482
- api?: {
483
- url?: string
484
- method?: 'get' | 'post'
485
- useParams?: boolean
486
- }
487
- }
488
-
489
- export interface PresetExportToolbarItem extends PresetBaseToolbarItem {
490
- xtype: 'export'
491
- filename?: string
492
- }
493
-
494
- export interface PresetFilesToolbarItem extends PresetBaseToolbarItem {
495
- xtype: 'files'
496
- // 附件预设配置:由 SearchTable 内置 UploadPopup 消费
497
- files: FilesPresetConfig
498
- }
499
-
500
- export type PresetToolbarItem =
501
- | PresetDelsToolbarItem
502
- | PresetExportToolbarItem
503
- | PresetFilesToolbarItem
504
-
505
- // Renderable items (those with a 'type' property)
506
- export type RenderableToolbarItem =
507
- | ButtonToolbarItem
508
- | InputToolbarItem
509
- | RadioGroupToolbarItem
510
- | CheckboxToolbarItem
511
- | SwitchToolbarItem
512
- | CheckboxGroupToolbarItem
513
- | DatePickerToolbarItem
514
- | UploadToolbarItem
515
- | InputNumberToolbarItem
516
- | SelectToolbarItem
517
- | TreeToolbarItem
518
- | TreeSelectToolbarItem
519
- | InputPasswordToolbarItem
520
- | SselectPageToolbarItem
521
- | AutoCompleteToolbarItem
522
- | InputGroupToolbarItem
523
- | CascaderToolbarItem
524
- | AreaCascaderToolbarItem
525
- | InputRangeToolbarItem
526
- | CustomToolbarItem
527
-
528
- export type ToolbarItem = RenderableToolbarItem | PresetToolbarItem
529
-
530
- export type InputGroupChild = RenderableToolbarItem & {
531
- // 当使用 Row 布局时的列宽设置
532
- span?: number // 24 栅格系统
533
- flex?: string // 可选:flex 布局
534
- class?: string
535
- style?: AnyObject
536
- }
537
-
538
- export interface InputGroupToolbarItem extends BaseToolbarItem {
539
- [x: string]: any
540
- type: 'inputGroup'
541
- props?: Partial<InputGroupPropsLike>
542
- // 布局控制:compact(紧凑)/ row(栅格)/ none(默认)
543
- layout?: {
544
- type?: 'compact' | 'row' | 'none'
545
- rowProps?: Partial<RowProps>
546
- // 针对每个子项的列设置(仅当 type=row 时生效)
547
- cols?: Array<Partial<ColProps> & { span?: number }>
548
- }
549
- children: InputGroupChild[]
550
- }
551
-
552
- // 工具栏配置类型
553
- export interface ToolbarConfig {
554
- items: ToolbarItem[]
555
- }
556
-
557
- export type {
558
- ButtonProps,
559
- DatePickerProps,
560
- InputNumberProps,
561
- InputProps,
562
- RadioGroupProps,
563
- SelectProps,
564
- SwitchProps,
565
- TreeSelectProps,
566
- UploadProps,
567
- }
1
+ import type {
2
+ ButtonProps,
3
+ CascaderProps,
4
+ CheckboxGroupProps,
5
+ CheckboxProps,
6
+ ColProps,
7
+ DatePickerProps,
8
+ InputNumberProps,
9
+ InputProps,
10
+ RadioGroupProps,
11
+ RowProps,
12
+ SelectProps,
13
+ SwitchProps,
14
+ TreeProps,
15
+ TreeSelectProps,
16
+ UploadProps,
17
+ } from '@antsoo-lib/components'
18
+ import type { AnyObject, VoidFunction } from '@antsoo-lib/shared'
19
+
20
+ import type { VNode } from 'vue'
21
+
22
+ import type { CustomToolbarItem } from './Custom'
23
+ import type { ToolbarState } from './state'
24
+
25
+ // 事件处理函数类型定义
26
+ export type ToolbarEventHandler = VoidFunction
27
+
28
+ // 基础事件接口
29
+ export interface BaseEvents {
30
+ [key: string]: ToolbarEventHandler | undefined
31
+ }
32
+
33
+ export interface BaseToolbarItem {
34
+ key?: string
35
+ label?: string
36
+ permission?: string
37
+ beforeCreate?: boolean | ((toolbarState: ToolbarState) => boolean)
38
+ disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean)
39
+ props?: Record<string, any>
40
+ events?: BaseEvents
41
+ }
42
+
43
+ // 按钮工具栏项目
44
+ export interface ButtonToolbarItem extends BaseToolbarItem {
45
+ type: 'button'
46
+ props?: Partial<ButtonProps> & { loading?: boolean; disabled?: boolean }
47
+ events?: BaseEvents & {
48
+ onClick?: (
49
+ loadingControl: { setLoading: (loading: boolean) => void; getLoading: () => boolean },
50
+ allValues: AnyObject,
51
+ toolbarState: ToolbarState,
52
+ ...args: any[]
53
+ ) => void
54
+ }
55
+ }
56
+
57
+ // 插槽配置接口
58
+ export interface SlotConfig {
59
+ // 插槽内容可以是组件配置或渲染函数
60
+ content?:
61
+ | {
62
+ component: any // 组件
63
+ key: string // 主表字段
64
+ props?: AnyObject // 组件属性
65
+ events?: Record<string, VoidFunction> // 组件事件
66
+ options?: Array<{ label: string; value: any }> // 选项数据(用于select等)
67
+ }
68
+ | ((toolbarState: ToolbarState) => VNode)
69
+ }
70
+
71
+ // 输入框工具栏项目
72
+ export interface InputToolbarItem extends BaseToolbarItem {
73
+ type: 'input'
74
+ props?: Partial<InputProps> & { value?: string; autoFocus?: boolean }
75
+ events?: BaseEvents & {
76
+ 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
77
+ onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void
78
+ onFocus?: VoidFunction
79
+ onFocusCapture?: VoidFunction
80
+ onBlur?: VoidFunction
81
+ onBlurCapture?: VoidFunction
82
+ }
83
+ textarea?: boolean
84
+ // 插槽配置
85
+ slots?: {
86
+ addonBefore?: SlotConfig
87
+ addonAfter?: SlotConfig
88
+ prefix?: SlotConfig
89
+ suffix?: SlotConfig
90
+ }
91
+ }
92
+
93
+ // 单选框工具栏项目
94
+ export interface RadioGroupToolbarItem extends BaseToolbarItem {
95
+ type: 'radioGroup'
96
+ props?: Partial<RadioGroupProps> & { value?: any }
97
+ events?: BaseEvents & {
98
+ 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
99
+ onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void
100
+ }
101
+ }
102
+
103
+ // 复选框工具栏项目
104
+ export interface CheckboxToolbarItem extends BaseToolbarItem {
105
+ type: 'checkbox'
106
+ props?: Partial<CheckboxProps> & { checked?: boolean; value?: boolean }
107
+ events?: BaseEvents & {
108
+ 'onUpdate:checked'?: (
109
+ checked: boolean,
110
+ allValues: AnyObject,
111
+ toolbarState: ToolbarState,
112
+ ) => void
113
+ onChange?: (event: any, allValues: AnyObject, toolbarState: ToolbarState) => void
114
+ 'onUpdate:value'?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void
115
+ }
116
+ label?: string // 复选框后面显示的文案
117
+ }
118
+
119
+ // 开关工具栏项目
120
+ export interface SwitchToolbarItem extends BaseToolbarItem {
121
+ type: 'switch'
122
+ props?: Partial<SwitchProps> & { checked?: boolean }
123
+ events?: BaseEvents & {
124
+ 'onUpdate:checked'?: (
125
+ checked: boolean,
126
+ allValues: AnyObject,
127
+ toolbarState: ToolbarState,
128
+ ) => void
129
+ onChange?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void
130
+ }
131
+ }
132
+
133
+ // 复选框组工具栏项目
134
+ export interface CheckboxGroupToolbarItem extends BaseToolbarItem {
135
+ type: 'checkboxGroup'
136
+ props?: Partial<CheckboxGroupProps> & { value?: any[] }
137
+ events?: BaseEvents & {
138
+ 'onUpdate:value'?: (value: any[], allValues: AnyObject, toolbarState: ToolbarState) => void
139
+ onChange?: (checkedValues: any[], allValues: AnyObject, toolbarState: ToolbarState) => void
140
+ }
141
+ }
142
+
143
+ // 日期选择器工具栏项目
144
+ export interface DatePickerToolbarItem extends BaseToolbarItem {
145
+ type: 'datePicker'
146
+ props?: Partial<DatePickerProps> & { value?: any; autoFocus?: boolean }
147
+ events?: BaseEvents & {
148
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
149
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
150
+ onFocus?: VoidFunction
151
+ }
152
+ range?: boolean
153
+ }
154
+
155
+ export interface SelectToolbarItem extends BaseToolbarItem {
156
+ type: 'select'
157
+ props?: Partial<SelectProps> & {
158
+ value?: any
159
+ options?: any[] | ((values: AnyObject) => any[])
160
+ }
161
+ events?: BaseEvents & {
162
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
163
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
164
+ }
165
+ }
166
+
167
+ // 级联选择器工具栏项目
168
+ export interface CascaderToolbarItem extends BaseToolbarItem {
169
+ type: 'cascader'
170
+ props?: Partial<CascaderProps> & { value?: any }
171
+ events?: BaseEvents & {
172
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
173
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
174
+ }
175
+ }
176
+
177
+ // 地区级联选择器属性定义
178
+ export interface AreaCascaderProps {
179
+ value?: any[]
180
+ placeholder?: string
181
+ disabled?: boolean
182
+ allowClear?: boolean
183
+ [key: string]: any
184
+ }
185
+
186
+ // 地区级联选择器工具栏项目
187
+ export interface AreaCascaderToolbarItem extends BaseToolbarItem {
188
+ type: 'areaCascader'
189
+ props?: AreaCascaderProps
190
+ attr?: Record<string, any>
191
+ events?: BaseEvents & {
192
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
193
+ selectedArea?: (area: any, allValues: AnyObject, toolbarState: ToolbarState) => void
194
+ }
195
+ }
196
+
197
+ // 树选择器工具栏项目
198
+ export interface TreeSelectToolbarItem extends BaseToolbarItem {
199
+ type: 'treeSelect'
200
+ props?: Partial<TreeSelectProps> & {
201
+ value?: any
202
+ options?: any[] | ((values: AnyObject) => any[])
203
+ }
204
+ events?: BaseEvents & {
205
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
206
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
207
+ }
208
+ }
209
+
210
+ export interface TreeToolbarItem extends BaseToolbarItem {
211
+ type: 'tree'
212
+ props?: Partial<TreeProps> & {
213
+ checkedKeys?: any[]
214
+ expandedKeys?: any[]
215
+ }
216
+ events?: BaseEvents & {
217
+ 'onUpdate:checkedKeys'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
218
+ 'onUpdate:expandedKeys'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
219
+ onCheck?: (value: any, info: any, allValues: AnyObject, toolbarState: ToolbarState) => void
220
+ onExpand?: (value: any, info: any, allValues: AnyObject, toolbarState: ToolbarState) => void
221
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
222
+ }
223
+ }
224
+
225
+ export interface InputRangeToolbarItem extends BaseToolbarItem {
226
+ type: 'inputRange'
227
+ props?: {
228
+ startProps?: Record<string, unknown>
229
+ endProps?: Record<string, unknown>
230
+ separator?: string
231
+ startPlaceholder?: string
232
+ endPlaceholder?: string
233
+ style?: AnyObject
234
+ className?: string
235
+ allowClear?: boolean
236
+ }
237
+ attr?: string[]
238
+ events?: BaseEvents & {
239
+ 'onUpdate:value'?: (
240
+ value: [string, string],
241
+ allValues: AnyObject,
242
+ toolbarState: ToolbarState,
243
+ ) => void
244
+ onChange?: (value: [string, string], allValues: AnyObject, toolbarState: ToolbarState) => void
245
+ onStartChange?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
246
+ onEndChange?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
247
+ }
248
+ }
249
+
250
+ export interface InputNumberToolbarItem extends BaseToolbarItem {
251
+ type: 'inputNumber'
252
+ props?: Partial<InputNumberProps> & {
253
+ value?: any
254
+ autoFocus?: boolean
255
+ xmoney?: boolean
256
+ xprice?: boolean
257
+ xweight?: boolean
258
+ xtaxrate?: boolean
259
+ xnumber?: boolean
260
+ }
261
+ events?: BaseEvents & {
262
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
263
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
264
+ onStep?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
265
+ onFocus?: VoidFunction
266
+ onFocusCapture?: VoidFunction
267
+ onBlur?: VoidFunction
268
+ onBlurCapture?: VoidFunction
269
+ }
270
+ slots?: {
271
+ addonBefore?: SlotConfig
272
+ addonAfter?: SlotConfig
273
+ prefix?: SlotConfig
274
+ suffix?: SlotConfig
275
+ }
276
+ }
277
+
278
+ export interface InputPasswordToolbarItem extends BaseToolbarItem {
279
+ type: 'inputPassword'
280
+ props?: Partial<InputProps> & { value?: string }
281
+ events?: BaseEvents & {
282
+ 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
283
+ onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void
284
+ }
285
+ textarea?: boolean
286
+ // 插槽配置
287
+ slots?: {
288
+ addonBefore?: SlotConfig
289
+ addonAfter?: SlotConfig
290
+ prefix?: SlotConfig
291
+ suffix?: SlotConfig
292
+ }
293
+ }
294
+
295
+ export interface UploadToolbarItem extends BaseToolbarItem {
296
+ type: 'upload'
297
+ props?: Partial<UploadProps> & {
298
+ value?: any[]
299
+ // 基础属性
300
+ placeholder?: string
301
+ allowClear?: boolean
302
+ disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean)
303
+ multiple?: boolean
304
+ maxCount?: number
305
+ listType?: 'text' | 'picture' | 'picture-card'
306
+
307
+ // 接口配置
308
+ api?: {
309
+ url: string
310
+ method?: 'GET' | 'POST'
311
+ headers?: Record<string, string>
312
+ }
313
+
314
+ // 额外参数配置
315
+ extraParams?: AnyObject | ((allValues: AnyObject, toolbarState: ToolbarState) => AnyObject)
316
+
317
+ // 数据映射配置
318
+ dataMapping?: {
319
+ list?: string // 文件列表字段路径
320
+ url?: string // 文件URL字段
321
+ name?: string // 文件名字段
322
+ status?: string // 文件状态字段
323
+ }
324
+
325
+ // UI 配置
326
+ buttonText?: string // 上传按钮文本,默认为"点击上传"
327
+ placeholderSrc?: string // picture-card 模式下的占位符图片地址
328
+ placeholderAlt?: string // 占位符图片的 alt 属性
329
+ placeholderClass?: string // 占位符图片的 CSS 类名
330
+ placeholderStyle?: AnyObject // 占位符图片的内联样式
331
+
332
+ // 其他配置
333
+ transformData?: (data: any) => any
334
+ beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean>
335
+ onPreview?: (file: any) => void
336
+ onRemove?: (file: any) => boolean | Promise<boolean>
337
+ }
338
+
339
+ // 文件类型限制配置
340
+ passage?: 'image' | 'pdf' | 'word' | 'excel' | 'video' | 'audio' | string
341
+
342
+ events?: BaseEvents & {
343
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
344
+ onChange?: (info: any, allValues: AnyObject, toolbarState: ToolbarState) => void
345
+ onSuccess?: (response: any, file: any, allValues: AnyObject, toolbarState: ToolbarState) => void
346
+ onError?: (error: any, file: any, allValues: AnyObject, toolbarState: ToolbarState) => void
347
+ }
348
+ }
349
+
350
+ // SselectPage 属性定义
351
+ export interface SselectPageProps {
352
+ value?: any
353
+ placeholder?: string
354
+ allowClear?: boolean
355
+ showSearch?: boolean
356
+ disabled?: boolean
357
+ maxTagCount?: number | 'responsive'
358
+ size?: 'large' | 'middle' | 'small'
359
+ mode?: 'multiple' | 'tags'
360
+ params?: AnyObject
361
+ api: {
362
+ url: string
363
+ method?: 'GET' | 'POST'
364
+ headers?: Record<string, string>
365
+ params?: AnyObject
366
+ data?: AnyObject
367
+ request?: (config: {
368
+ method?: 'GET' | 'POST'
369
+ url: string
370
+ headers?: Record<string, string>
371
+ params?: AnyObject
372
+ data?: AnyObject
373
+ }) => Promise<any>
374
+ }
375
+ dataMapping?: {
376
+ list?: string
377
+ total?: string
378
+ value?: string
379
+ label?: string
380
+ }
381
+ pagination?: boolean
382
+ paginationConfig?: {
383
+ pageField?: string
384
+ pageSizeField?: string
385
+ searchField?: string
386
+ searchContains?: string
387
+ }
388
+ pageSize?: number
389
+ searchDelay?: number
390
+ extraParams?: AnyObject | ((allValues: AnyObject, toolbarState: ToolbarState) => AnyObject)
391
+ transformData?: (data: any) => any
392
+ autoLoad?: boolean
393
+ autoFocus?: boolean
394
+ attr?: Record<string, string>
395
+ [key: string]: any
396
+ }
397
+
398
+ export interface SselectPageToolbarItem extends BaseToolbarItem {
399
+ type: 'sselectPage'
400
+ props?: SselectPageProps & {
401
+ disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean)
402
+ }
403
+ events?: BaseEvents & {
404
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
405
+ onChange?: (
406
+ value: any,
407
+ option: any,
408
+ allOptions: any,
409
+ allValues: AnyObject,
410
+ toolbarState: ToolbarState,
411
+ ) => void
412
+ onSearch?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
413
+ onClear?: (allValues: AnyObject, toolbarState: ToolbarState) => void
414
+ }
415
+ }
416
+
417
+ export interface AutoCompleteProps {
418
+ value?: any
419
+ options?: any[]
420
+ placeholder?: string
421
+ disabled?: boolean
422
+ allowClear?: boolean
423
+ [key: string]: any
424
+ }
425
+
426
+ export interface AutoCompleteToolbarItem extends BaseToolbarItem {
427
+ type: 'autoComplete'
428
+ props?: AutoCompleteProps
429
+ events?: BaseEvents & {
430
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
431
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void
432
+ onSelect?: (value: any, option: any, allValues: AnyObject, toolbarState: ToolbarState) => void
433
+ onSearch?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void
434
+ }
435
+ }
436
+
437
+ // ------------------------------
438
+ // Input.Group 渲染器配置定义
439
+ // ------------------------------
440
+ export type InputGroupSize = 'large' | 'middle' | 'small' | 'default'
441
+ export interface InputGroupPropsLike {
442
+ size?: InputGroupSize
443
+ compact?: boolean
444
+ prefixCls?: string
445
+ }
446
+
447
+ // 允许在工具栏中直接使用预设描述项(xtype)
448
+ export type PresetXtype = 'add' | 'edit' | 'dels' | 'export' | 'print' | 'files'
449
+
450
+ export interface FilesCategoryOption {
451
+ label: string
452
+ value: string
453
+ [key: string]: any
454
+ }
455
+
456
+ export interface FilesPresetConfig {
457
+ title?: string
458
+ // 单据类型:决定附件归属(UploadPopup 内部请求依赖该字段)
459
+ billtypeCode: string | ((row: AnyObject) => string)
460
+ // 分类下拉:UploadPopup 打开后默认选第一个,并按 category 拉历史列表
461
+ categoryOptions: FilesCategoryOption[] | ((row: AnyObject) => FilesCategoryOption[])
462
+ // objId 从行对象取值的字段名,默认 id
463
+ objIdKey?: string
464
+ accept?: string
465
+ passage?: 'image' | 'pdf' | 'word' | 'excel' | 'video' | 'audio' | string
466
+ maxFileSizeMB?: number
467
+ maxCount?: number
468
+ // 上传成功后是否刷新表格(由 SearchTable.openFilesPopup 控制)
469
+ refreshOnSuccess?: boolean
470
+ }
471
+
472
+ export interface PresetBaseToolbarItem extends BaseToolbarItem {
473
+ xtype: PresetXtype
474
+ permission?: string
475
+ label?: string
476
+ events?: any
477
+ props?: any
478
+ }
479
+
480
+ export interface PresetDelsToolbarItem extends PresetBaseToolbarItem {
481
+ xtype: 'dels'
482
+ api?: {
483
+ url?: string
484
+ method?: 'get' | 'post'
485
+ useParams?: boolean
486
+ }
487
+ }
488
+
489
+ export interface PresetExportToolbarItem extends PresetBaseToolbarItem {
490
+ xtype: 'export'
491
+ filename?: string
492
+ }
493
+
494
+ export interface PresetFilesToolbarItem extends PresetBaseToolbarItem {
495
+ xtype: 'files'
496
+ // 附件预设配置:由 SearchTable 内置 UploadPopup 消费
497
+ files: FilesPresetConfig
498
+ }
499
+
500
+ export type PresetToolbarItem =
501
+ | PresetDelsToolbarItem
502
+ | PresetExportToolbarItem
503
+ | PresetFilesToolbarItem
504
+
505
+ // Renderable items (those with a 'type' property)
506
+ export type RenderableToolbarItem =
507
+ | ButtonToolbarItem
508
+ | InputToolbarItem
509
+ | RadioGroupToolbarItem
510
+ | CheckboxToolbarItem
511
+ | SwitchToolbarItem
512
+ | CheckboxGroupToolbarItem
513
+ | DatePickerToolbarItem
514
+ | UploadToolbarItem
515
+ | InputNumberToolbarItem
516
+ | SelectToolbarItem
517
+ | TreeToolbarItem
518
+ | TreeSelectToolbarItem
519
+ | InputPasswordToolbarItem
520
+ | SselectPageToolbarItem
521
+ | AutoCompleteToolbarItem
522
+ | InputGroupToolbarItem
523
+ | CascaderToolbarItem
524
+ | AreaCascaderToolbarItem
525
+ | InputRangeToolbarItem
526
+ | CustomToolbarItem
527
+
528
+ export type ToolbarItem = RenderableToolbarItem | PresetToolbarItem
529
+
530
+ export type InputGroupChild = RenderableToolbarItem & {
531
+ // 当使用 Row 布局时的列宽设置
532
+ span?: number // 24 栅格系统
533
+ flex?: string // 可选:flex 布局
534
+ class?: string
535
+ style?: AnyObject
536
+ }
537
+
538
+ export interface InputGroupToolbarItem extends BaseToolbarItem {
539
+ [x: string]: any
540
+ type: 'inputGroup'
541
+ props?: Partial<InputGroupPropsLike>
542
+ // 布局控制:compact(紧凑)/ row(栅格)/ none(默认)
543
+ layout?: {
544
+ type?: 'compact' | 'row' | 'none'
545
+ rowProps?: Partial<RowProps>
546
+ // 针对每个子项的列设置(仅当 type=row 时生效)
547
+ cols?: Array<Partial<ColProps> & { span?: number }>
548
+ }
549
+ children: InputGroupChild[]
550
+ }
551
+
552
+ // 工具栏配置类型
553
+ export interface ToolbarConfig {
554
+ items: ToolbarItem[]
555
+ }
556
+
557
+ export type {
558
+ ButtonProps,
559
+ DatePickerProps,
560
+ InputNumberProps,
561
+ InputProps,
562
+ RadioGroupProps,
563
+ SelectProps,
564
+ SwitchProps,
565
+ TreeSelectProps,
566
+ UploadProps,
567
+ }