@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.
- package/CHANGELOG.md +13 -0
- package/dist/core.css +1 -0
- package/dist/index.cjs +61 -0
- package/dist/index.js +50858 -0
- package/dist/types/core/index.d.ts +6 -0
- package/dist/types/core/src/BaseTable/helpers.d.ts +9 -0
- package/dist/types/core/src/BaseTable/index.d.ts +190 -0
- package/dist/types/core/src/BaseTable/registry.d.ts +9 -0
- package/dist/types/core/src/BaseTable/renderers/AreaCascader.d.ts +5 -0
- package/dist/types/core/src/BaseTable/renderers/AutoComplete.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/Button.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/Cascader.d.ts +5 -0
- package/dist/types/core/src/BaseTable/renderers/Checkbox.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/CheckboxGroup.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/DatePicker.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/Input.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/InputGroup.d.ts +5 -0
- package/dist/types/core/src/BaseTable/renderers/InputNumber.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/InputPassword.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/RadioGroup.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/Select.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/SselectPage.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/Switch.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/TreeSelect.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/Upload.d.ts +4 -0
- package/dist/types/core/src/BaseTable/renderers/index.d.ts +24 -0
- package/dist/types/core/src/BaseTable/state.d.ts +19 -0
- package/dist/types/core/src/BaseTable/types.d.ts +391 -0
- package/dist/types/core/src/BaseTable/utils.d.ts +8 -0
- package/dist/types/core/src/index.d.ts +2 -0
- package/index.css +2 -0
- package/index.ts +21 -0
- package/package.json +39 -3
- package/src/BaseTable/helpers.tsx +91 -0
- package/src/BaseTable/index.vue +881 -0
- package/src/BaseTable/registry.ts +20 -0
- package/src/BaseTable/renderers/AreaCascader.tsx +64 -0
- package/src/BaseTable/renderers/AutoComplete.tsx +101 -0
- package/src/BaseTable/renderers/Button.tsx +62 -0
- package/src/BaseTable/renderers/Cascader.tsx +45 -0
- package/src/BaseTable/renderers/Checkbox.tsx +65 -0
- package/src/BaseTable/renderers/CheckboxGroup.tsx +57 -0
- package/src/BaseTable/renderers/DatePicker.tsx +83 -0
- package/src/BaseTable/renderers/Input.tsx +140 -0
- package/src/BaseTable/renderers/InputGroup.tsx +115 -0
- package/src/BaseTable/renderers/InputNumber.tsx +205 -0
- package/src/BaseTable/renderers/InputPassword.tsx +81 -0
- package/src/BaseTable/renderers/RadioGroup.tsx +63 -0
- package/src/BaseTable/renderers/Select.tsx +96 -0
- package/src/BaseTable/renderers/SselectPage.tsx +107 -0
- package/src/BaseTable/renderers/Switch.tsx +60 -0
- package/src/BaseTable/renderers/TreeSelect.tsx +81 -0
- package/src/BaseTable/renderers/Upload.tsx +92 -0
- package/src/BaseTable/renderers/index.ts +67 -0
- package/src/BaseTable/state.ts +37 -0
- package/src/BaseTable/types.ts +507 -0
- package/src/BaseTable/utils.tsx +144 -0
- package/src/index.ts +3 -0
- 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
|
+
}
|