@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,60 @@
1
+ import { Switch } from '@antsoo-lib/components'
2
+ import type { SwitchProps } from '@antsoo-lib/components'
3
+ import type { VoidFunction } from '@antsoo-lib/shared'
4
+ import { isFunction } from '@antsoo-lib/utils'
5
+
6
+ import { markRaw } from 'vue'
7
+ import type { VNode } from 'vue'
8
+
9
+ import type { ToolbarState } from '../state'
10
+ import type { SwitchToolbarItem, ToolbarItem } from '../types'
11
+
12
+ // 开关渲染函数
13
+ export function renderSwitch(item: ToolbarItem, toolbarState: ToolbarState): VNode {
14
+ const { key, events = {} } = item
15
+ const switchItem = item as SwitchToolbarItem
16
+ const { props = {}, disabled = false } = switchItem
17
+ // SwitchProps doesn't have 'value', it uses 'checked'.
18
+ // Remove 'value' to avoid warning if passed by mistake
19
+ const { value: _ignored, ...otherProps } = props as any
20
+
21
+ const isDisabled = isFunction(disabled)
22
+ ? disabled(toolbarState.getAllValues(), toolbarState)
23
+ : disabled
24
+ const finalProps: Partial<SwitchProps> & { disabled?: boolean; checked?: boolean } = {
25
+ ...otherProps,
26
+ disabled: isDisabled,
27
+ }
28
+
29
+ // 处理事件,注入工具栏状态
30
+ const processedEvents: Record<string, VoidFunction> = {}
31
+ Object.keys(events).forEach((eventName) => {
32
+ processedEvents[eventName] = (...args: any[]) => {
33
+ // 对于开关,自动更新状态
34
+ if (eventName === 'onUpdate:checked' || eventName === 'onChange') {
35
+ const checked = args[0]?.target?.checked ?? args[0]
36
+ toolbarState.setValue(key, checked)
37
+ }
38
+
39
+ // 调用原始事件处理函数
40
+ events[eventName]?.(...args, toolbarState.getAllValues(), toolbarState)
41
+ }
42
+ })
43
+
44
+ // 如果没有设置onChange事件,添加默认的状态更新
45
+ if (!processedEvents['onUpdate:checked'] && !processedEvents.onChange) {
46
+ processedEvents['onUpdate:checked'] = (checked: boolean) => {
47
+ toolbarState.setValue(key, checked)
48
+ }
49
+ }
50
+
51
+ const Comp = markRaw(Switch)
52
+ return (
53
+ <Comp
54
+ key={key}
55
+ checked={toolbarState.getValue(key) ?? finalProps.checked ?? false}
56
+ {...finalProps}
57
+ {...processedEvents}
58
+ />
59
+ )
60
+ }
@@ -0,0 +1,81 @@
1
+ import { TreeSelect } from '@antsoo-lib/components'
2
+ import type { VoidFunction } from '@antsoo-lib/shared'
3
+ import { isFunction } from '@antsoo-lib/utils'
4
+
5
+ import { computed, markRaw } from 'vue'
6
+ import type { VNode } from 'vue'
7
+
8
+ import type { ToolbarState } from '../state'
9
+ import type { ToolbarItem, TreeSelectToolbarItem } from '../types'
10
+
11
+ // 树选择器渲染函数
12
+ export function renderTreeSelect(item: ToolbarItem, toolbarState: ToolbarState): VNode {
13
+ const treeItem = item as TreeSelectToolbarItem
14
+ const { key, events = {} } = treeItem
15
+ const processedEvents: Record<string, VoidFunction> = {}
16
+ const { props = {}, disabled = false } = treeItem
17
+
18
+ const isDisabled = isFunction(disabled)
19
+ ? disabled(toolbarState.getAllValues(), toolbarState)
20
+ : disabled
21
+
22
+ // 从props中提取treeData,避免在展开props时覆盖处理后的treeData
23
+ const { options: originalTreeData, ...otherProps } = props
24
+
25
+ // 响应式计算 treeData,增加对ref对象的处理
26
+ const computedTreeData = computed(() => {
27
+ if (isFunction(originalTreeData)) {
28
+ return originalTreeData(toolbarState.getAllValues())
29
+ }
30
+ // 处理ref对象
31
+ if (originalTreeData && typeof originalTreeData === 'object' && 'value' in originalTreeData) {
32
+ return originalTreeData.value || []
33
+ }
34
+ return originalTreeData || []
35
+ })
36
+
37
+ Object.keys(events).forEach((eventName) => {
38
+ processedEvents[eventName] = (...args: any[]) => {
39
+ // 对于树选择器,自动更新状态
40
+ if (eventName === 'onUpdate:value' || eventName === 'onChange') {
41
+ const value = args[0]
42
+ toolbarState.setValue(key, value)
43
+ }
44
+
45
+ // 调用原始事件处理函数
46
+ events[eventName]?.(...args, toolbarState.getAllValues(), toolbarState)
47
+ }
48
+ })
49
+ // 如果没有设置onChange事件,添加默认的状态更新
50
+ if (!processedEvents['onUpdate:value'] && !processedEvents.onChange) {
51
+ processedEvents['onUpdate:value'] = (value: any) => {
52
+ toolbarState.setValue(key, value)
53
+ }
54
+ }
55
+ // 计算安全的当前值
56
+ const rawVal = toolbarState.getValue(key)
57
+ const propVal = props.value
58
+ const isMulti = otherProps.multiple || otherProps.treeCheckable
59
+
60
+ const safeValue =
61
+ rawVal !== undefined && rawVal !== null
62
+ ? rawVal
63
+ : propVal !== undefined && propVal !== null
64
+ ? propVal
65
+ : isMulti
66
+ ? []
67
+ : undefined
68
+
69
+ const finalProps = { ...otherProps, disabled: isDisabled }
70
+
71
+ const Comp = markRaw(TreeSelect)
72
+ return (
73
+ <Comp
74
+ key={key}
75
+ value={safeValue}
76
+ {...finalProps}
77
+ treeData={computedTreeData.value as any[]}
78
+ {...processedEvents}
79
+ />
80
+ )
81
+ }
@@ -0,0 +1,92 @@
1
+ import type { UploadFile } from '@antsoo-lib/components'
2
+ import { isFunction } from '@antsoo-lib/utils'
3
+
4
+ import { markRaw } from 'vue'
5
+ import type { VNode } from 'vue'
6
+
7
+ import type { AnyObject } from '@/packages/shared'
8
+
9
+ import { getRegisteredComponent } from '../registry'
10
+ import type { ToolbarState } from '../state'
11
+ import type { ToolbarItem, UploadToolbarItem } from '../types'
12
+
13
+ // 上传渲染函数
14
+ export function renderUpload(item: ToolbarItem, toolbarState: ToolbarState): VNode {
15
+ const uploadItem = item as UploadToolbarItem
16
+ const { key, events = {}, passage } = uploadItem
17
+ const { props = {}, disabled = false } = uploadItem
18
+
19
+ const isDisabled = isFunction(disabled)
20
+ ? disabled(toolbarState.getAllValues(), toolbarState)
21
+ : disabled
22
+ const allValues = toolbarState.getAllValues()
23
+
24
+ const resolveExtraParams = () => {
25
+ if (!props.extraParams) return {}
26
+ return isFunction(props.extraParams)
27
+ ? props.extraParams(allValues, toolbarState)
28
+ : props.extraParams
29
+ }
30
+
31
+ const apiConfig = props.api
32
+ ? {
33
+ url: props.api.url,
34
+ method: props.api.method || 'POST',
35
+ headers: props.api.headers || {},
36
+ }
37
+ : {
38
+ url: undefined as string | undefined, // 使用组件默认全局上传地址
39
+ method: 'POST',
40
+ headers: {},
41
+ }
42
+
43
+ // 当前表单值(期望:[{ name, path }])
44
+ const currentValue = toolbarState.getValue(key) || props.value || []
45
+
46
+ // 组件触发值更新(仅写入规范化值)
47
+ const onUpdateValue = (value: UploadFile[]) => {
48
+ toolbarState.setValue(key, value)
49
+ events['onUpdate:value']?.(value, allValues, toolbarState)
50
+ }
51
+
52
+ const onChange = (info: UploadFile[]) => {
53
+ events.onChange?.(info, allValues, toolbarState)
54
+ }
55
+
56
+ const onSuccess = (response: AnyObject, file: UploadFile) => {
57
+ events.onSuccess?.(response, file, allValues, toolbarState)
58
+ }
59
+
60
+ const onError = (error: AnyObject, file: UploadFile) => {
61
+ events.onError?.(error, file, allValues, toolbarState)
62
+ }
63
+
64
+ const UploadComponent = getRegisteredComponent('Upload')
65
+ if (!UploadComponent) {
66
+ console.warn(
67
+ 'BaseTable: Upload component is not registered. Please use registerBaseTableComponents to register it.',
68
+ )
69
+ return <span style={{ color: 'red' }}>Upload component missing</span>
70
+ }
71
+
72
+ const finalProps: Record<string, any> = {
73
+ ...props,
74
+ disabled: isDisabled,
75
+ api: apiConfig,
76
+ extraParams: resolveExtraParams(),
77
+ }
78
+
79
+ const Comp = markRaw(UploadComponent) as any
80
+ return (
81
+ <Comp
82
+ key={key}
83
+ value={currentValue}
84
+ passage={passage}
85
+ props={finalProps}
86
+ onSuccess={onSuccess}
87
+ onError={onError}
88
+ onChange={onChange}
89
+ onUpdate:value={onUpdateValue}
90
+ />
91
+ )
92
+ }
@@ -0,0 +1,67 @@
1
+ import type { AnyObject } from '@antsoo-lib/shared'
2
+
3
+ import type { VNode } from 'vue'
4
+
5
+ import type { ToolbarState } from '../state'
6
+ import type { ToolbarItem } from '../types'
7
+ import { renderAreaCascader } from './AreaCascader'
8
+ import { renderAutoComplete } from './AutoComplete'
9
+ import { renderButton } from './Button'
10
+ import { renderCascader } from './Cascader'
11
+ import { renderCheckbox } from './Checkbox'
12
+ import { renderCheckboxGroup } from './CheckboxGroup'
13
+ import { renderDatePicker } from './DatePicker'
14
+ import { renderInput } from './Input'
15
+ import { renderInputGroup } from './InputGroup'
16
+ import { renderInputNumber } from './InputNumber'
17
+ import { renderInputPassword } from './InputPassword'
18
+ import { renderRadioGroup } from './RadioGroup'
19
+ import { renderSelect } from './Select'
20
+ import { renderSselectPage } from './SselectPage'
21
+ import { renderSwitch } from './Switch'
22
+ import { renderTreeSelect } from './TreeSelect'
23
+ import { renderUpload } from './Upload'
24
+
25
+ // 渲染器映射类型定义
26
+ type Renderer = (item: ToolbarItem, toolbarState: ToolbarState, formValues?: AnyObject) => VNode
27
+
28
+ // 渲染器映射
29
+ export const rendererMap: Record<string, Renderer> = {
30
+ button: renderButton,
31
+ input: renderInput,
32
+ inputGroup: renderInputGroup as Renderer,
33
+ radioGroup: renderRadioGroup,
34
+ checkbox: renderCheckbox,
35
+ switch: renderSwitch,
36
+ checkboxGroup: renderCheckboxGroup,
37
+ datePicker: renderDatePicker,
38
+ select: renderSelect,
39
+ inputNumber: renderInputNumber,
40
+ inputPassword: renderInputPassword,
41
+ upload: renderUpload,
42
+ treeSelect: renderTreeSelect,
43
+ sselectPage: renderSselectPage,
44
+ autoComplete: renderAutoComplete as Renderer,
45
+ cascader: renderCascader as Renderer,
46
+ areaCascader: renderAreaCascader as Renderer,
47
+ }
48
+
49
+ export {
50
+ renderAreaCascader,
51
+ renderAutoComplete,
52
+ renderButton,
53
+ renderCascader,
54
+ renderCheckbox,
55
+ renderCheckboxGroup,
56
+ renderDatePicker,
57
+ renderInput,
58
+ renderInputGroup,
59
+ renderInputNumber,
60
+ renderInputPassword,
61
+ renderRadioGroup,
62
+ renderSelect,
63
+ renderSselectPage,
64
+ renderSwitch,
65
+ renderTreeSelect,
66
+ renderUpload,
67
+ }
@@ -0,0 +1,37 @@
1
+ import { reactive, readonly } from 'vue'
2
+
3
+ export interface ToolbarState {
4
+ [key: string]: any
5
+ }
6
+
7
+ type ToolbarValue<T = any> = T | undefined
8
+
9
+ /**
10
+ * 工具栏状态管理组合式API
11
+ */
12
+ export function useToolbarState() {
13
+ const state = reactive<ToolbarState>({})
14
+
15
+ const setValue = (key: string, value: ToolbarValue) => {
16
+ if (!key) return
17
+ state[key] = value
18
+ }
19
+
20
+ const getValue = <T = any>(key: string): ToolbarValue<T> => {
21
+ return state[key] as T
22
+ }
23
+
24
+ const clear = () => {
25
+ Object.keys(state).forEach((key) => {
26
+ delete state[key]
27
+ })
28
+ }
29
+
30
+ return {
31
+ state: readonly(state), // 只读版本,防止直接修改
32
+ setValue,
33
+ getValue,
34
+ clear,
35
+ getAllValues: () => ({ ...state }),
36
+ }
37
+ }