@antsoo-lib/core 0.0.0 → 1.0.0

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 (59) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/core.css +1 -0
  3. package/dist/index.cjs +61 -0
  4. package/dist/index.js +50858 -0
  5. package/dist/types/core/index.d.ts +6 -0
  6. package/dist/types/core/src/BaseTable/helpers.d.ts +9 -0
  7. package/dist/types/core/src/BaseTable/index.d.ts +190 -0
  8. package/dist/types/core/src/BaseTable/registry.d.ts +9 -0
  9. package/dist/types/core/src/BaseTable/renderers/AreaCascader.d.ts +5 -0
  10. package/dist/types/core/src/BaseTable/renderers/AutoComplete.d.ts +4 -0
  11. package/dist/types/core/src/BaseTable/renderers/Button.d.ts +4 -0
  12. package/dist/types/core/src/BaseTable/renderers/Cascader.d.ts +5 -0
  13. package/dist/types/core/src/BaseTable/renderers/Checkbox.d.ts +4 -0
  14. package/dist/types/core/src/BaseTable/renderers/CheckboxGroup.d.ts +4 -0
  15. package/dist/types/core/src/BaseTable/renderers/DatePicker.d.ts +4 -0
  16. package/dist/types/core/src/BaseTable/renderers/Input.d.ts +4 -0
  17. package/dist/types/core/src/BaseTable/renderers/InputGroup.d.ts +5 -0
  18. package/dist/types/core/src/BaseTable/renderers/InputNumber.d.ts +4 -0
  19. package/dist/types/core/src/BaseTable/renderers/InputPassword.d.ts +4 -0
  20. package/dist/types/core/src/BaseTable/renderers/RadioGroup.d.ts +4 -0
  21. package/dist/types/core/src/BaseTable/renderers/Select.d.ts +4 -0
  22. package/dist/types/core/src/BaseTable/renderers/SselectPage.d.ts +4 -0
  23. package/dist/types/core/src/BaseTable/renderers/Switch.d.ts +4 -0
  24. package/dist/types/core/src/BaseTable/renderers/TreeSelect.d.ts +4 -0
  25. package/dist/types/core/src/BaseTable/renderers/Upload.d.ts +4 -0
  26. package/dist/types/core/src/BaseTable/renderers/index.d.ts +24 -0
  27. package/dist/types/core/src/BaseTable/state.d.ts +19 -0
  28. package/dist/types/core/src/BaseTable/types.d.ts +391 -0
  29. package/dist/types/core/src/BaseTable/utils.d.ts +8 -0
  30. package/dist/types/core/src/index.d.ts +2 -0
  31. package/index.css +2 -0
  32. package/index.ts +21 -0
  33. package/package.json +39 -3
  34. package/src/BaseTable/helpers.tsx +91 -0
  35. package/src/BaseTable/index.vue +881 -0
  36. package/src/BaseTable/registry.ts +20 -0
  37. package/src/BaseTable/renderers/AreaCascader.tsx +64 -0
  38. package/src/BaseTable/renderers/AutoComplete.tsx +101 -0
  39. package/src/BaseTable/renderers/Button.tsx +62 -0
  40. package/src/BaseTable/renderers/Cascader.tsx +45 -0
  41. package/src/BaseTable/renderers/Checkbox.tsx +65 -0
  42. package/src/BaseTable/renderers/CheckboxGroup.tsx +57 -0
  43. package/src/BaseTable/renderers/DatePicker.tsx +83 -0
  44. package/src/BaseTable/renderers/Input.tsx +140 -0
  45. package/src/BaseTable/renderers/InputGroup.tsx +115 -0
  46. package/src/BaseTable/renderers/InputNumber.tsx +205 -0
  47. package/src/BaseTable/renderers/InputPassword.tsx +81 -0
  48. package/src/BaseTable/renderers/RadioGroup.tsx +63 -0
  49. package/src/BaseTable/renderers/Select.tsx +96 -0
  50. package/src/BaseTable/renderers/SselectPage.tsx +107 -0
  51. package/src/BaseTable/renderers/Switch.tsx +60 -0
  52. package/src/BaseTable/renderers/TreeSelect.tsx +81 -0
  53. package/src/BaseTable/renderers/Upload.tsx +92 -0
  54. package/src/BaseTable/renderers/index.ts +67 -0
  55. package/src/BaseTable/state.ts +37 -0
  56. package/src/BaseTable/types.ts +507 -0
  57. package/src/BaseTable/utils.tsx +144 -0
  58. package/src/index.ts +3 -0
  59. package/vite.config.ts +48 -0
@@ -0,0 +1,391 @@
1
+ import { ButtonProps, CascaderProps, CheckboxGroupProps, CheckboxProps, ColProps, DatePickerProps, InputNumberProps, InputProps, RadioGroupProps, RowProps, SelectProps, SwitchProps, TreeSelectProps, UploadProps } from '../../packages/components/index.ts';
2
+ import { AnyObject, VoidFunction } from '../../packages/shared/index.ts';
3
+ import { VNode } from 'vue';
4
+ import { ToolbarState } from './state';
5
+ export type ToolbarEventHandler = VoidFunction;
6
+ export interface BaseEvents {
7
+ [key: string]: ToolbarEventHandler | undefined;
8
+ }
9
+ export interface BaseToolbarItem {
10
+ key?: string;
11
+ label?: string;
12
+ permission?: string;
13
+ beforeCreate?: boolean | ((toolbarState: ToolbarState) => boolean);
14
+ disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean);
15
+ props?: Record<string, any>;
16
+ events?: BaseEvents;
17
+ }
18
+ export interface ButtonToolbarItem extends BaseToolbarItem {
19
+ type: 'button';
20
+ props?: Partial<ButtonProps> & {
21
+ loading?: boolean;
22
+ disabled?: boolean;
23
+ };
24
+ events?: BaseEvents & {
25
+ onClick?: (loadingControl: {
26
+ setLoading: (loading: boolean) => void;
27
+ getLoading: () => boolean;
28
+ }, allValues: AnyObject, toolbarState: ToolbarState, ...args: any[]) => void;
29
+ };
30
+ }
31
+ export interface SlotConfig {
32
+ content?: {
33
+ component: any;
34
+ key: string;
35
+ props?: AnyObject;
36
+ events?: Record<string, VoidFunction>;
37
+ options?: Array<{
38
+ label: string;
39
+ value: any;
40
+ }>;
41
+ } | ((toolbarState: ToolbarState) => VNode);
42
+ }
43
+ export interface InputToolbarItem extends BaseToolbarItem {
44
+ type: 'input';
45
+ props?: Partial<InputProps> & {
46
+ value?: string;
47
+ autoFocus?: boolean;
48
+ };
49
+ events?: BaseEvents & {
50
+ 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void;
51
+ onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void;
52
+ onFocus?: VoidFunction;
53
+ onFocusCapture?: VoidFunction;
54
+ onBlur?: VoidFunction;
55
+ onBlurCapture?: VoidFunction;
56
+ };
57
+ textarea?: boolean;
58
+ slots?: {
59
+ addonBefore?: SlotConfig;
60
+ addonAfter?: SlotConfig;
61
+ prefix?: SlotConfig;
62
+ suffix?: SlotConfig;
63
+ };
64
+ }
65
+ export interface RadioGroupToolbarItem extends BaseToolbarItem {
66
+ type: 'radioGroup';
67
+ props?: Partial<RadioGroupProps> & {
68
+ value?: any;
69
+ };
70
+ events?: BaseEvents & {
71
+ 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void;
72
+ onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void;
73
+ };
74
+ }
75
+ export interface CheckboxToolbarItem extends BaseToolbarItem {
76
+ type: 'checkbox';
77
+ props?: Partial<CheckboxProps> & {
78
+ checked?: boolean;
79
+ value?: boolean;
80
+ };
81
+ events?: BaseEvents & {
82
+ 'onUpdate:checked'?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void;
83
+ onChange?: (event: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
84
+ 'onUpdate:value'?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void;
85
+ };
86
+ label?: string;
87
+ }
88
+ export interface SwitchToolbarItem extends BaseToolbarItem {
89
+ type: 'switch';
90
+ props?: Partial<SwitchProps> & {
91
+ checked?: boolean;
92
+ };
93
+ events?: BaseEvents & {
94
+ 'onUpdate:checked'?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void;
95
+ onChange?: (checked: boolean, allValues: AnyObject, toolbarState: ToolbarState) => void;
96
+ };
97
+ }
98
+ export interface CheckboxGroupToolbarItem extends BaseToolbarItem {
99
+ type: 'checkboxGroup';
100
+ props?: Partial<CheckboxGroupProps> & {
101
+ value?: any[];
102
+ };
103
+ events?: BaseEvents & {
104
+ 'onUpdate:value'?: (value: any[], allValues: AnyObject, toolbarState: ToolbarState) => void;
105
+ onChange?: (checkedValues: any[], allValues: AnyObject, toolbarState: ToolbarState) => void;
106
+ };
107
+ }
108
+ export interface DatePickerToolbarItem extends BaseToolbarItem {
109
+ type: 'datePicker';
110
+ props?: Partial<DatePickerProps> & {
111
+ value?: any;
112
+ autoFocus?: boolean;
113
+ };
114
+ events?: BaseEvents & {
115
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
116
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
117
+ onFocus?: VoidFunction;
118
+ };
119
+ range?: boolean;
120
+ }
121
+ export interface SelectToolbarItem extends BaseToolbarItem {
122
+ type: 'select';
123
+ props?: Partial<SelectProps> & {
124
+ value?: any;
125
+ options?: any[] | ((values: AnyObject) => any[]);
126
+ };
127
+ events?: BaseEvents & {
128
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
129
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
130
+ };
131
+ }
132
+ export interface CascaderToolbarItem extends BaseToolbarItem {
133
+ type: 'cascader';
134
+ props?: Partial<CascaderProps> & {
135
+ value?: any;
136
+ };
137
+ events?: BaseEvents & {
138
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
139
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
140
+ };
141
+ }
142
+ export interface AreaCascaderProps {
143
+ value?: any[];
144
+ placeholder?: string;
145
+ disabled?: boolean;
146
+ allowClear?: boolean;
147
+ [key: string]: any;
148
+ }
149
+ export interface AreaCascaderToolbarItem extends BaseToolbarItem {
150
+ type: 'areaCascader';
151
+ props?: AreaCascaderProps;
152
+ attr?: Record<string, any>;
153
+ events?: BaseEvents & {
154
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
155
+ selectedArea?: (area: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
156
+ };
157
+ }
158
+ export interface TreeSelectToolbarItem extends BaseToolbarItem {
159
+ type: 'treeSelect';
160
+ props?: Partial<TreeSelectProps> & {
161
+ value?: any;
162
+ options?: any[] | ((values: AnyObject) => any[]);
163
+ };
164
+ events?: BaseEvents & {
165
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
166
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
167
+ };
168
+ }
169
+ export interface InputNumberToolbarItem extends BaseToolbarItem {
170
+ type: 'inputNumber';
171
+ props?: Partial<InputNumberProps> & {
172
+ value?: any;
173
+ autoFocus?: boolean;
174
+ xmoney?: boolean;
175
+ xprice?: boolean;
176
+ xweight?: boolean;
177
+ xtaxrate?: boolean;
178
+ xnumber?: boolean;
179
+ };
180
+ events?: BaseEvents & {
181
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
182
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
183
+ onStep?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
184
+ onFocus?: VoidFunction;
185
+ onFocusCapture?: VoidFunction;
186
+ onBlur?: VoidFunction;
187
+ onBlurCapture?: VoidFunction;
188
+ };
189
+ slots?: {
190
+ addonBefore?: SlotConfig;
191
+ addonAfter?: SlotConfig;
192
+ prefix?: SlotConfig;
193
+ suffix?: SlotConfig;
194
+ };
195
+ }
196
+ export interface InputPasswordToolbarItem extends BaseToolbarItem {
197
+ type: 'inputPassword';
198
+ props?: Partial<InputProps> & {
199
+ value?: string;
200
+ };
201
+ events?: BaseEvents & {
202
+ 'onUpdate:value'?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void;
203
+ onChange?: (event: Event, allValues: AnyObject, toolbarState: ToolbarState) => void;
204
+ };
205
+ textarea?: boolean;
206
+ slots?: {
207
+ addonBefore?: SlotConfig;
208
+ addonAfter?: SlotConfig;
209
+ prefix?: SlotConfig;
210
+ suffix?: SlotConfig;
211
+ };
212
+ }
213
+ export interface UploadToolbarItem extends BaseToolbarItem {
214
+ type: 'upload';
215
+ props?: Partial<UploadProps> & {
216
+ value?: any[];
217
+ placeholder?: string;
218
+ allowClear?: boolean;
219
+ disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean);
220
+ multiple?: boolean;
221
+ maxCount?: number;
222
+ listType?: 'text' | 'picture' | 'picture-card';
223
+ api?: {
224
+ url: string;
225
+ method?: 'GET' | 'POST';
226
+ headers?: Record<string, string>;
227
+ };
228
+ extraParams?: AnyObject | ((allValues: AnyObject, toolbarState: ToolbarState) => AnyObject);
229
+ dataMapping?: {
230
+ list?: string;
231
+ url?: string;
232
+ name?: string;
233
+ status?: string;
234
+ };
235
+ buttonText?: string;
236
+ placeholderSrc?: string;
237
+ placeholderAlt?: string;
238
+ placeholderClass?: string;
239
+ placeholderStyle?: AnyObject;
240
+ transformData?: (data: any) => any;
241
+ beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean>;
242
+ onPreview?: (file: any) => void;
243
+ onRemove?: (file: any) => boolean | Promise<boolean>;
244
+ };
245
+ passage?: 'image' | 'pdf' | 'word' | 'excel' | 'video' | 'audio' | string;
246
+ events?: BaseEvents & {
247
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
248
+ onChange?: (info: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
249
+ onSuccess?: (response: any, file: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
250
+ onError?: (error: any, file: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
251
+ };
252
+ }
253
+ export interface SselectPageProps {
254
+ value?: any;
255
+ placeholder?: string;
256
+ allowClear?: boolean;
257
+ showSearch?: boolean;
258
+ disabled?: boolean;
259
+ maxTagCount?: number;
260
+ size?: 'large' | 'middle' | 'small';
261
+ mode?: 'multiple' | 'tags';
262
+ api: {
263
+ url: string;
264
+ method?: 'GET' | 'POST';
265
+ headers?: Record<string, string>;
266
+ params?: AnyObject;
267
+ data?: AnyObject;
268
+ };
269
+ dataMapping?: {
270
+ list?: string;
271
+ total?: string;
272
+ value?: string;
273
+ label?: string;
274
+ };
275
+ pagination?: boolean;
276
+ paginationConfig?: {
277
+ pageField?: string;
278
+ pageSizeField?: string;
279
+ searchField?: string;
280
+ searchContains?: string;
281
+ };
282
+ pageSize?: number;
283
+ searchDelay?: number;
284
+ extraParams?: AnyObject | ((allValues: AnyObject, toolbarState: ToolbarState) => AnyObject);
285
+ transformData?: (data: any) => any;
286
+ autoLoad?: boolean;
287
+ autoFocus?: boolean;
288
+ [key: string]: any;
289
+ }
290
+ export interface SselectPageToolbarItem extends BaseToolbarItem {
291
+ type: 'sselectPage';
292
+ props?: SselectPageProps & {
293
+ disabled?: boolean | ((allValues: AnyObject, toolbarState: ToolbarState) => boolean);
294
+ };
295
+ events?: BaseEvents & {
296
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
297
+ onChange?: (value: any, option: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
298
+ onSearch?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void;
299
+ onClear?: (allValues: AnyObject, toolbarState: ToolbarState) => void;
300
+ };
301
+ }
302
+ export interface AutoCompleteProps {
303
+ value?: any;
304
+ options?: any[];
305
+ placeholder?: string;
306
+ disabled?: boolean;
307
+ allowClear?: boolean;
308
+ [key: string]: any;
309
+ }
310
+ export interface AutoCompleteToolbarItem extends BaseToolbarItem {
311
+ type: 'autoComplete';
312
+ props?: AutoCompleteProps;
313
+ events?: BaseEvents & {
314
+ 'onUpdate:value'?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
315
+ onChange?: (value: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
316
+ onSelect?: (value: any, option: any, allValues: AnyObject, toolbarState: ToolbarState) => void;
317
+ onSearch?: (value: string, allValues: AnyObject, toolbarState: ToolbarState) => void;
318
+ };
319
+ }
320
+ export type InputGroupSize = 'large' | 'middle' | 'small' | 'default';
321
+ export interface InputGroupPropsLike {
322
+ size?: InputGroupSize;
323
+ compact?: boolean;
324
+ prefixCls?: string;
325
+ }
326
+ export type PresetXtype = 'add' | 'edit' | 'dels' | 'export' | 'print' | 'files';
327
+ export interface FilesCategoryOption {
328
+ label: string;
329
+ value: string;
330
+ [key: string]: any;
331
+ }
332
+ export interface FilesPresetConfig {
333
+ title?: string;
334
+ billtypeCode: string | ((row: AnyObject) => string);
335
+ categoryOptions: FilesCategoryOption[] | ((row: AnyObject) => FilesCategoryOption[]);
336
+ objIdKey?: string;
337
+ accept?: string;
338
+ passage?: 'image' | 'pdf' | 'word' | 'excel' | 'video' | 'audio' | string;
339
+ maxFileSizeMB?: number;
340
+ maxCount?: number;
341
+ refreshOnSuccess?: boolean;
342
+ }
343
+ export interface PresetBaseToolbarItem extends BaseToolbarItem {
344
+ xtype: PresetXtype;
345
+ permission?: string;
346
+ label?: string;
347
+ events?: any;
348
+ props?: any;
349
+ }
350
+ export interface PresetDelsToolbarItem extends PresetBaseToolbarItem {
351
+ xtype: 'dels';
352
+ api?: {
353
+ url?: string;
354
+ method?: 'get' | 'post';
355
+ useParams?: boolean;
356
+ };
357
+ }
358
+ export interface PresetExportToolbarItem extends PresetBaseToolbarItem {
359
+ xtype: 'export';
360
+ filename?: string;
361
+ }
362
+ export interface PresetFilesToolbarItem extends PresetBaseToolbarItem {
363
+ xtype: 'files';
364
+ files: FilesPresetConfig;
365
+ }
366
+ export type PresetToolbarItem = PresetDelsToolbarItem | PresetExportToolbarItem | PresetFilesToolbarItem;
367
+ export type RenderableToolbarItem = ButtonToolbarItem | InputToolbarItem | RadioGroupToolbarItem | CheckboxToolbarItem | SwitchToolbarItem | CheckboxGroupToolbarItem | DatePickerToolbarItem | UploadToolbarItem | InputNumberToolbarItem | SelectToolbarItem | TreeSelectToolbarItem | InputPasswordToolbarItem | SselectPageToolbarItem | AutoCompleteToolbarItem | InputGroupToolbarItem | CascaderToolbarItem | AreaCascaderToolbarItem;
368
+ export type ToolbarItem = RenderableToolbarItem | PresetToolbarItem;
369
+ export type InputGroupChild = RenderableToolbarItem & {
370
+ span?: number;
371
+ flex?: string;
372
+ class?: string;
373
+ style?: AnyObject;
374
+ };
375
+ export interface InputGroupToolbarItem extends BaseToolbarItem {
376
+ [x: string]: any;
377
+ type: 'inputGroup';
378
+ props?: Partial<InputGroupPropsLike>;
379
+ layout?: {
380
+ type?: 'compact' | 'row' | 'none';
381
+ rowProps?: Partial<RowProps>;
382
+ cols?: Array<Partial<ColProps> & {
383
+ span?: number;
384
+ }>;
385
+ };
386
+ children: InputGroupChild[];
387
+ }
388
+ export interface ToolbarConfig {
389
+ items: ToolbarItem[];
390
+ }
391
+ export type { ButtonProps, DatePickerProps, InputNumberProps, InputProps, RadioGroupProps, SelectProps, SwitchProps, TreeSelectProps, UploadProps, };
@@ -0,0 +1,8 @@
1
+ import { VNode } from 'vue';
2
+ import { registerBaseTableComponents } from './registry';
3
+ import { useToolbarState, ToolbarState } from './state';
4
+ import { ToolbarConfig } from './types';
5
+ export declare function renderToolbar(config: ToolbarConfig, toolbarState: ToolbarState, count: number | (() => number), permissions?: string[]): VNode[];
6
+ export { registerBaseTableComponents, ToolbarState, useToolbarState };
7
+ export * from './types';
8
+ export * from './renderers';
@@ -0,0 +1,2 @@
1
+ import { default as BaseTable } from './BaseTable/index';
2
+ export { BaseTable };
package/index.css ADDED
@@ -0,0 +1,2 @@
1
+ @import 'vxe-pc-ui/lib/style.css';
2
+ @import 'vxe-table/lib/style.css';
package/index.ts CHANGED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Akaza Core
3
+ */
4
+ import VxeUI from 'vxe-pc-ui'
5
+ import VxeTable from 'vxe-table'
6
+
7
+ import type { App } from 'vue'
8
+
9
+ import './index.css'
10
+ import { BaseTable } from './src'
11
+
12
+ export const version = '0.0.0'
13
+
14
+ export * from 'xe-utils'
15
+
16
+ export const CoreTable = {
17
+ install(app: App) {
18
+ app.component('BaseTable', BaseTable)
19
+ app.use(VxeUI).use(VxeTable)
20
+ },
21
+ }
package/package.json CHANGED
@@ -1,9 +1,45 @@
1
1
  {
2
2
  "name": "@antsoo-lib/core",
3
- "version": "0.0.0",
3
+ "type": "module",
4
+ "version": "1.0.0",
4
5
  "private": false,
6
+ "license": "MIT",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/types/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.cjs"
12
+ },
13
+ "./style.css": "./dist/core.css"
14
+ },
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/types/index.d.ts",
5
18
  "publishConfig": {
6
- "access": "public"
19
+ "access": "public",
20
+ "registry": "https://registry.npmjs.com/"
21
+ },
22
+ "peerDependencies": {
23
+ "lodash-es": "^4.17.21",
24
+ "vue": "^3.3.4",
25
+ "@antsoo-lib/components": "0.1.0",
26
+ "@antsoo-lib/shared": "0.0.1",
27
+ "@antsoo-lib/utils": "0.1.0",
28
+ "@antsoo-lib/icons": "0.1.0"
29
+ },
30
+ "dependencies": {
31
+ "vxe-pc-ui": "^4.12.31",
32
+ "vxe-table": "^4.17.48",
33
+ "xe-utils": "^4.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@ant-design/icons-svg": "^4.4.2",
37
+ "@types/lodash-es": "^4.17.12",
38
+ "lodash-es": "^4.17.21"
7
39
  },
8
- "license": "MIT"
40
+ "scripts": {
41
+ "dev": "vite build --watch",
42
+ "build": "vite build",
43
+ "preview": "vite preview"
44
+ }
9
45
  }
@@ -0,0 +1,91 @@
1
+ import { Select } from '@antsoo-lib/components'
2
+ import type { VoidFunction } from '@antsoo-lib/shared'
3
+
4
+ import { markRaw, nextTick } from 'vue'
5
+ import type { VNode } from 'vue'
6
+
7
+ import type { ToolbarState } from './state'
8
+ import type { InputGroupToolbarItem, SlotConfig } from './types'
9
+
10
+ // 渲染插槽内容的辅助函数
11
+ export function renderSlotContent(
12
+ slotConfig: SlotConfig,
13
+ toolbarState: ToolbarState,
14
+ ): VNode | undefined {
15
+ if (!slotConfig?.content) return undefined
16
+
17
+ // 如果是函数,直接调用
18
+ if (typeof slotConfig.content === 'function') {
19
+ return slotConfig.content(toolbarState)
20
+ }
21
+
22
+ // 如果是组件配置对象
23
+ const { component, key, props = {}, events = {}, options = [] } = slotConfig.content
24
+ const allValues = toolbarState.getAllValues()
25
+
26
+ // 处理事件,注入工具栏状态
27
+ const processedEvents: Record<string, VoidFunction> = {}
28
+ Object.entries(events).forEach(([eventName, handler]) => {
29
+ if (eventName === 'onChange') {
30
+ // 对于 onChange 事件,使用 nextTick 确保在下一个 tick 中执行外部处理函数
31
+ processedEvents[eventName] = (...args: any[]) => {
32
+ nextTick(() => {
33
+ handler(...args, allValues, toolbarState)
34
+ })
35
+ }
36
+ } else {
37
+ // 其他事件保持原有逻辑
38
+ processedEvents[eventName] = (...args: any[]) => {
39
+ handler(...args, allValues, toolbarState)
40
+ }
41
+ }
42
+ })
43
+
44
+ const value = allValues[key]
45
+
46
+ // 如果是Select组件且有options,添加选项子节点
47
+ if (component === Select && options.length > 0) {
48
+ const Comp = markRaw(component)
49
+ return (
50
+ <Comp value={value ?? ''} {...props} {...processedEvents}>
51
+ {options.map((option: any) => (
52
+ <Select.Option key={option.value} value={option.value}>
53
+ {option.label}
54
+ </Select.Option>
55
+ ))}
56
+ </Comp>
57
+ )
58
+ }
59
+
60
+ // 普通组件渲染
61
+ const Comp = markRaw(component)
62
+ return <Comp value={value ?? ''} {...props} {...processedEvents} />
63
+ }
64
+
65
+ export function validateInputGroupConfig(cfg: InputGroupToolbarItem): {
66
+ valid: boolean
67
+ errors?: string[]
68
+ } {
69
+ const errors: string[] = []
70
+ if (!cfg) errors.push('inputGroup config is required')
71
+ if (cfg.type !== 'inputGroup') errors.push("type must be 'inputGroup'")
72
+ if (!Array.isArray(cfg.children) || cfg.children.length === 0)
73
+ errors.push('children must be a non-empty array')
74
+ // 校验子项 key 唯一性
75
+ const keys = (cfg.children || []).map((c) => c.key).filter(Boolean) as string[]
76
+ const dup = keys.filter((k, i) => keys.indexOf(k) !== i)
77
+ if (dup.length) errors.push(`duplicate child keys: ${Array.from(new Set(dup)).join(',')}`)
78
+ return { valid: errors.length === 0, errors: errors.length ? errors : undefined }
79
+ }
80
+
81
+ // InputNumber 的焦点态只用于“显示逻辑(失焦补零)”,不属于业务值:
82
+ // - 不写入 ToolbarState,避免污染 getAllValues() 及其下游(按钮事件、联动禁用、外部 expose、deep watch 等)
83
+ // - 采用 WeakMap:当 ToolbarState 实例被销毁且无引用时,对应缓存可被 GC 自动回收
84
+ const inputNumberFocusState = new WeakMap<ToolbarState, Map<string, boolean>>()
85
+ export function getInputNumberFocusState(toolbarState: ToolbarState) {
86
+ const existing = inputNumberFocusState.get(toolbarState)
87
+ if (existing) return existing
88
+ const next = new Map<string, boolean>()
89
+ inputNumberFocusState.set(toolbarState, next)
90
+ return next
91
+ }