@dt-frames/ui 1.0.8 → 1.0.11

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 (84) hide show
  1. package/es/components/curd/src/components/dialog.d.ts +1 -0
  2. package/es/components/forms/src/components/formIcon.d.ts +1 -1
  3. package/es/components/forms/src/types/form.type.d.ts +3 -3
  4. package/es/components/index.d.ts +3 -2
  5. package/es/components/modal/src/types/modal.type.d.ts +1 -1
  6. package/es/components/source/src/hooks/useFetch.d.ts +2 -2
  7. package/es/components/source/src/hooks/useSource.d.ts +8 -8
  8. package/es/components/source/src/types/table.type.d.ts +1 -1
  9. package/es/components/table/src/components/TableActions.d.ts +2 -2
  10. package/es/components/table/src/components/TableHeader.d.ts +2 -2
  11. package/es/components/table/src/components/editable/CellComponent.d.ts +14 -0
  12. package/es/components/table/src/components/editable/EditTableCell.d.ts +88 -0
  13. package/es/components/table/src/components/editable/componentMap.d.ts +4 -0
  14. package/es/components/table/src/components/editable/index.d.ts +9 -0
  15. package/es/components/table/src/components/setting/Download.d.ts +2 -2
  16. package/es/components/table/src/components/setting/Size.d.ts +2 -2
  17. package/es/components/table/src/index.d.ts +9 -5
  18. package/es/components/table/src/props.d.ts +1 -1
  19. package/es/components/table/src/types/table.type.d.ts +16 -0
  20. package/es/components/tree/index.d.ts +2 -0
  21. package/es/components/tree/src/hooks/useTree.d.ts +14 -0
  22. package/es/components/tree/src/props.d.ts +101 -0
  23. package/es/components/tree/src/type/tree.d.ts +85 -0
  24. package/es/components/tree/src/utils/tree.d.ts +5 -0
  25. package/es/components/upload/index.d.ts +3 -0
  26. package/es/components/upload/src/helper.d.ts +4 -0
  27. package/es/components/upload/src/index.d.ts +2788 -0
  28. package/es/components/upload/src/props.d.ts +40 -0
  29. package/es/components/upload/src/upload.d.ts +1634 -0
  30. package/es/index.js +2035 -308
  31. package/es/style/components/table/index.less +8 -2
  32. package/es/style/components/tree/index.less +41 -0
  33. package/es/style/components/upload/index.less +43 -0
  34. package/es/style/theme/header/index.less +1 -1
  35. package/es/theme/sider/components/basic-menu/basic-menu.d.ts +3 -3
  36. package/es/theme/tabs/components/TabContent.d.ts +2 -2
  37. package/package.json +2 -1
  38. package/src/components/curd/src/components/dialog.vue +4 -2
  39. package/src/components/curd/src/hooks/useCurd.tsx +1 -1
  40. package/src/components/forms/src/components/formItem.vue +15 -2
  41. package/src/components/forms/src/hooks/useFormEvents.ts +4 -3
  42. package/src/components/forms/src/hooks/useFormValues.ts +1 -1
  43. package/src/components/forms/src/types/form.type.ts +3 -3
  44. package/src/components/index.ts +9 -3
  45. package/src/components/modal/src/hooks/useModal.ts +5 -3
  46. package/src/components/modal/src/index.vue +2 -2
  47. package/src/components/modal/src/types/modal.type.ts +1 -1
  48. package/src/components/source/src/hooks/useFetch.ts +10 -6
  49. package/src/components/source/src/hooks/useSource.ts +32 -11
  50. package/src/components/source/src/types/table.type.ts +1 -1
  51. package/src/components/table/index.less +8 -2
  52. package/src/components/table/src/components/TableHeader.vue +2 -2
  53. package/src/components/table/src/components/TableRender.vue +1 -3
  54. package/src/components/table/src/components/editable/CellComponent.ts +57 -0
  55. package/src/components/table/src/components/editable/EditTableCell.vue +181 -0
  56. package/src/components/table/src/components/editable/componentMap.ts +18 -0
  57. package/src/components/table/src/components/editable/index.ts +58 -0
  58. package/src/components/table/src/hooks/useColumns.ts +15 -8
  59. package/src/components/table/src/hooks/useDataSource.ts +0 -13
  60. package/src/components/table/src/hooks/useTableHeader.ts +2 -2
  61. package/src/components/table/src/index.vue +6 -1
  62. package/src/components/table/src/props.ts +1 -1
  63. package/src/components/table/src/types/table.type.ts +28 -1
  64. package/src/components/tree/index.less +41 -0
  65. package/src/components/tree/index.ts +5 -0
  66. package/src/components/tree/src/components/TreeHeader.vue +97 -0
  67. package/src/components/tree/src/hooks/useTree.ts +239 -0
  68. package/src/components/tree/src/index.vue +392 -0
  69. package/src/components/tree/src/props.ts +133 -0
  70. package/src/components/tree/src/type/tree.ts +105 -0
  71. package/src/components/tree/src/utils/tree.ts +73 -0
  72. package/src/components/upload/index.less +43 -0
  73. package/src/components/upload/index.ts +7 -0
  74. package/src/components/upload/src/helper.ts +32 -0
  75. package/src/components/upload/src/index.vue +38 -0
  76. package/src/components/upload/src/props.ts +48 -0
  77. package/src/components/upload/src/upload.vue +166 -0
  78. package/src/theme/header/helper/menu-tree.ts +2 -2
  79. package/src/theme/header/index.less +1 -1
  80. package/src/theme/sider/helper/split-menu.ts +2 -2
  81. package/es/components/dialog/index.d.ts +0 -2
  82. package/es/components/dialog/src/hooks/useDialog.d.ts +0 -3
  83. package/src/components/dialog/index.ts +0 -5
  84. package/src/components/dialog/src/hooks/useDialog.ts +0 -85
@@ -0,0 +1,239 @@
1
+ import { TreeDataItem } from "ant-design-vue/lib/tree"
2
+ import { ComputedRef, Ref, unref } from "vue"
3
+ import { cloneDeep } from 'lodash-es'
4
+ import { FieldNames, InsertNodeParams, TreeItem, KeyType } from "../type/tree"
5
+ import { forEach } from "../utils/tree"
6
+
7
+ export function useTree(
8
+ treeDataRef: Ref<TreeDataItem[]>,
9
+ getFieldNames: ComputedRef<FieldNames>
10
+ ) {
11
+
12
+ function getAllKeys(list?: TreeDataItem[]) {
13
+ const keys: string[] = []
14
+ const treeData = list || unref(treeDataRef)
15
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
16
+
17
+ if (!childrenField || !keyField) return keys
18
+
19
+ for (let index = 0; index < treeData.length; index++) {
20
+ const node = treeData[index]
21
+ keys.push(node[keyField]!)
22
+
23
+ const children = node[childrenField]
24
+
25
+ if (children && children.length) {
26
+ keys.push(...(getAllKeys(children) as string[]))
27
+ }
28
+ }
29
+
30
+ return keys as KeyType[]
31
+ }
32
+
33
+ function getEnabledKeys(list?: TreeDataItem[]) {
34
+ const keys: string[] = []
35
+ const treeData = list || unref(treeDataRef)
36
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
37
+
38
+ if (!childrenField || !keyField) return keys
39
+
40
+ for (let index = 0; index < treeData.length; index++) {
41
+ const node = treeData[index]
42
+ node.disabled !== true && node.selectable !== false && keys.push(node[keyField]!)
43
+
44
+ const children = node[childrenField]
45
+ if (children && children.length) {
46
+ keys.push(...(getEnabledKeys(children) as string[]))
47
+ }
48
+ }
49
+
50
+ return keys as KeyType[]
51
+ }
52
+
53
+ // 获取节点的keys
54
+ function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]) {
55
+ const keys: KeyType[] = []
56
+ const treeData = list || unref(treeDataRef)
57
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
58
+
59
+ if (!childrenField || !keyField) return keys
60
+
61
+ for (let index = 0; index < treeData.length; index++) {
62
+ const node = treeData[index]
63
+ const children = node[childrenField]
64
+
65
+ if (nodeKey === node[keyField]) {
66
+ keys.push(node[keyField]!)
67
+
68
+ if (children && children.length) {
69
+ keys.push(...(getAllKeys(children) as KeyType[]))
70
+ }
71
+ } else {
72
+ if (children && children.length) {
73
+ keys.push(...getChildrenKeys(nodeKey, children))
74
+ }
75
+ }
76
+ }
77
+
78
+ return keys as KeyType[]
79
+ }
80
+
81
+
82
+ function updateNodeByKey(key: string, node: TreeDataItem, list?: TreeDataItem[]) {
83
+ if (!key) return
84
+
85
+ const treeData = list || unref(treeDataRef)
86
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
87
+
88
+ if (!childrenField || !keyField) return
89
+
90
+ for (let index = 0; index < treeData.length; index++) {
91
+ const element: any = treeData[index]
92
+ const children = element[childrenField]
93
+
94
+ if (element[keyField] === key) {
95
+ treeData[index] = { ...treeData[index], ...node }
96
+ break
97
+ } else if (children && children.length) {
98
+ updateNodeByKey(key, node, element[childrenField])
99
+ }
100
+ }
101
+
102
+ }
103
+
104
+
105
+ function filterByLevel(level = 1, list?: TreeDataItem[], currentLevel = 1) {
106
+ if (!level) return []
107
+
108
+ const res: (string | number)[] = []
109
+ const data = list || unref(treeDataRef) || []
110
+
111
+ for (let index = 0; index < data.length; index++) {
112
+ const item = data[index]
113
+
114
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
115
+ const key = keyField ? item[keyField] : ''
116
+ const children = childrenField ? item[childrenField] : []
117
+ res.push(key)
118
+
119
+ if (children && children.length && currentLevel < level) {
120
+ currentLevel += 1;
121
+ res.push(...filterByLevel(level, children, currentLevel));
122
+ }
123
+ }
124
+
125
+ return res as string[] | number[]
126
+ }
127
+
128
+ // 添加节点
129
+ function insertNodeByKey({ parentKey = null, node, push = 'push' }: InsertNodeParams) {
130
+ const treeData: any = cloneDeep(unref(treeDataRef))
131
+
132
+ if (!parentKey) {
133
+ treeData[push](node)
134
+ treeDataRef.value = treeData
135
+ return
136
+ }
137
+
138
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
139
+ if (!childrenField || !keyField) return
140
+
141
+ forEach(treeData, (treeItem) => {
142
+ if (treeItem[keyField] === parentKey) {
143
+ treeItem[childrenField] = treeItem[childrenField] || []
144
+ treeItem[childrenField][push](node)
145
+ return true
146
+ }
147
+ })
148
+ treeDataRef.value = treeData
149
+ }
150
+
151
+ // 批量添加节点
152
+ function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) {
153
+ const treeData: any = cloneDeep(unref(treeDataRef))
154
+
155
+ if (!list || list.length < 1) return
156
+
157
+ if (!parentKey) {
158
+ for (let i = 0; i < list.length; i++) {
159
+ treeData[push](list[i]);
160
+ }
161
+ } else {
162
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
163
+ if (!childrenField || !keyField) return
164
+
165
+ forEach(treeData, (treeItem) => {
166
+ if (treeItem[keyField] === parentKey) {
167
+ treeItem[childrenField] = treeItem[childrenField] || []
168
+
169
+ for (let i = 0; i < list.length; i++) {
170
+ treeItem[childrenField][push](list[i])
171
+ }
172
+
173
+ treeDataRef.value = treeData
174
+
175
+ return true
176
+ }
177
+ })
178
+ }
179
+ }
180
+
181
+ // 通过key 删除节点
182
+ function deleteNodeByKey(key: string, list?: TreeDataItem[]) {
183
+ if (!key) return
184
+
185
+ const treeData = list || unref(treeDataRef)
186
+ const { key: keyField, children: childrenField } = unref(getFieldNames)
187
+
188
+ if (!childrenField || !keyField) return
189
+
190
+ for (let index = 0; index < treeData.length; index++) {
191
+ const element: any = treeData[index]
192
+ const children = element[childrenField]
193
+
194
+ if (element[keyField] === key) {
195
+
196
+ treeData.splice(index, 1)
197
+ break
198
+
199
+ } else if (children && children.length) {
200
+
201
+ deleteNodeByKey(key, element[childrenField])
202
+
203
+ }
204
+ }
205
+ }
206
+
207
+ function getSelectedNode(key: KeyType, list?: TreeItem[], selectedNode?: TreeItem | null) {
208
+ if (!key && key !== 0) return null
209
+
210
+ const treeData = list || unref(treeDataRef)
211
+
212
+ treeData.forEach(item => {
213
+ if (selectedNode?.key || selectedNode?.key === 0) return selectedNode
214
+
215
+ if (item.key === key) {
216
+ selectedNode = item
217
+ return
218
+ }
219
+
220
+ if (item.children && item.children.length) {
221
+ selectedNode = getSelectedNode(key, item.children, selectedNode)
222
+ }
223
+ })
224
+
225
+ return selectedNode || null
226
+ }
227
+
228
+ return {
229
+ getAllKeys,
230
+ getEnabledKeys,
231
+ getChildrenKeys,
232
+ updateNodeByKey,
233
+ filterByLevel,
234
+ insertNodeByKey,
235
+ insertNodesByKey,
236
+ deleteNodeByKey,
237
+ getSelectedNode
238
+ }
239
+ }
@@ -0,0 +1,392 @@
1
+ <template>
2
+ <div class="dt-tree">
3
+ <template v-if="showTitle">
4
+ <TreeHeader
5
+ :title="title"
6
+ :toolbar="toolbar"
7
+ :search="search"
8
+ :checkable="checkable"
9
+ :searchText="searchState.searchText"
10
+ :checkAll="checkAll"
11
+ :expandAll="expandAll"
12
+ @search="handleSearch"
13
+ >
14
+ {{ extendSlots(slots) }}
15
+ </TreeHeader>
16
+ </template>
17
+
18
+ <Spin :spinning="loading" tip="加载中...">
19
+ <div v-show="!getNotFound">
20
+ <Tree
21
+ v-bind="getBindValues"
22
+ :showIcon="false"
23
+ :treeData="treeData"
24
+ ></Tree>
25
+ </div>
26
+ <Empty v-show="getNotFound"></Empty>
27
+ </Spin>
28
+ </div>
29
+ </template>
30
+
31
+ <script lang="tsx" setup>
32
+ import { computed, reactive, ref, toRaw, unref, useAttrs, useSlots as vueUseSlots, watch, watchEffect } from 'vue'
33
+ import { cloneDeep, omit, difference, get } from 'lodash-es'
34
+ import { Spin, Empty, Tree } from 'ant-design-vue'
35
+ import TreeHeader from './components/treeHeader.vue'
36
+ import { BasicProps } from './props'
37
+ import { CheckKeys, CreateContextOptions, FieldNames, TreeItem, TreeState, KeyType, TreeActionType } from './type/tree'
38
+ import { isArray, isBoolean, isFunction, Recordable, isEmpty, useSlots } from '@dt-frames/core'
39
+ import { eachTree, filter, treeToList } from './utils/tree'
40
+ import { useTree } from './hooks/useTree'
41
+
42
+ const props = defineProps( BasicProps )
43
+ const attrs = useAttrs()
44
+ const slots = vueUseSlots()
45
+
46
+ const { getSlot, extendSlots } = useSlots()
47
+
48
+ const emit = defineEmits([
49
+ 'update:expandedKeys',
50
+ 'update:selectedKeys',
51
+ 'update:value',
52
+ 'check',
53
+ 'change',
54
+ 'clickNode',
55
+ 'update:searchValue'
56
+ ])
57
+
58
+
59
+ const state = reactive<TreeState>({
60
+ checkStrictly: props.checkStrictly,
61
+ expandedKeys: props.expandedKeys || [],
62
+ selectedKeys: props.selectedKeys || [],
63
+ checkedKeys: props.checkedKeys || [],
64
+ })
65
+
66
+ const searchState = reactive({
67
+ startSearch: false,
68
+ searchText: '',
69
+ searchData: [] as TreeItem[],
70
+ })
71
+
72
+ const treeDataRef = ref<TreeItem[]>([])
73
+
74
+ const getFieldNames = computed(() => {
75
+ const { fieldNames } = props
76
+ return {
77
+ children: 'children',
78
+ title: 'title',
79
+ key: 'key',
80
+ ...(fieldNames as FieldNames)
81
+ }
82
+ })
83
+
84
+ const getTreeData = computed((): TreeItem[] => {
85
+ return searchState.startSearch ? searchState.searchData : unref(treeDataRef)
86
+ })
87
+
88
+ const getNotFound = computed((): boolean => {
89
+ return !getTreeData.value || getTreeData.value.length === 0;
90
+ })
91
+
92
+ const getIcon = (params: Recordable, icon?: string) => {
93
+ if (!icon) {
94
+ if ( props.renderIcon && isFunction( props.renderIcon ) ) {
95
+ return props.renderIcon(params)
96
+ }
97
+ }
98
+
99
+ return icon
100
+ }
101
+
102
+ const treeData = computed(() => {
103
+ const data = cloneDeep(getTreeData.value)
104
+
105
+ eachTree(data, ( item, _parent ) => {
106
+ const searchText = searchState.searchText
107
+
108
+ const { highlight } = unref(props)
109
+ const { title: titleField, key: keyField, children: childrenField } = unref(getFieldNames)
110
+
111
+ const icon = getIcon(item, item.icon)
112
+ const title = get(item, titleField)
113
+
114
+ const searchIdx = searchText ? title.indexOf(searchText) : -1
115
+ const isHighlight = searchState.startSearch && !isEmpty(searchText) && highlight && searchIdx !== -1
116
+ const highlightStyle = `color: ${isBoolean(highlight) ? '#f50' : highlight}`
117
+
118
+ const titleDom = isHighlight ? (
119
+ // 切割高亮的字
120
+ <span class="tree-content">
121
+ <span>{title.substr(0, searchIdx)}</span>
122
+ <span style={ highlightStyle }>{ searchText }</span>
123
+ <span>{ title.substr(searchIdx + (searchText as string).length) }</span>
124
+ </span>
125
+ ) : (
126
+ title
127
+ )
128
+
129
+ item[titleField] = (
130
+ <span
131
+ class="tree-title"
132
+ onClick={ handleClickNode.bind(null, item[keyField], item[childrenField], item) }
133
+ >
134
+ {slots?.title ? (
135
+ getSlot(slots, 'title', item)
136
+ ) : (
137
+ <>
138
+ {icon && <i class={ `i ${icon}`} />}
139
+ {titleDom}
140
+ <span class='tree-action'>{renderAction(item)}</span>
141
+ </>
142
+ )}
143
+ </span>
144
+ )
145
+
146
+ })
147
+
148
+ return data
149
+ })
150
+
151
+
152
+ const showTitle = computed(() => {
153
+ return true
154
+ })
155
+
156
+ const getBindValues = computed(() => {
157
+ let propsData = {
158
+ blockNode: true,
159
+ ...attrs,
160
+ ...props,
161
+ expandedKeys: state.expandedKeys,
162
+ selectedKeys: state.selectedKeys,
163
+ checkedKeys: state.checkedKeys,
164
+ checkStrictly: state.checkStrictly,
165
+ fieldNames: unref(getFieldNames),
166
+ 'onUpdate:expandedKeys': (v: KeyType[]) => {
167
+ state.expandedKeys = v;
168
+ emit('update:expandedKeys', v);
169
+ },
170
+ 'onUpdate:selectedKeys': (v: KeyType[]) => {
171
+ state.selectedKeys = v;
172
+ emit('update:selectedKeys', v);
173
+ },
174
+ onCheck: (v: CheckKeys, e) => {
175
+ let currentValue = toRaw( state.checkedKeys ) as KeyType[]
176
+
177
+ if ( isArray( currentValue ) && searchState.startSearch ) {
178
+ const { key } = unref(getFieldNames)
179
+
180
+ currentValue = difference(currentValue, getChildrenKeys(e.node.$attrs.node[key]))
181
+
182
+ if (e.checked) {
183
+ currentValue.push(e.node.$attrs.node[key]);
184
+ }
185
+
186
+ state.checkedKeys = currentValue
187
+ } else {
188
+ state.checkedKeys = v;
189
+ }
190
+
191
+ const rawVal = toRaw(state.checkedKeys)
192
+
193
+ emit('update:value', rawVal)
194
+ emit('check', rawVal, e)
195
+ }
196
+ }
197
+
198
+ return omit(propsData, 'treeData', 'class')
199
+ })
200
+
201
+ // 设置节点点击事件
202
+ function handleClickNode(key: string, children: TreeItem[], node: TreeItem) {
203
+ emit('clickNode', node)
204
+
205
+ if (!props.clickRowToExpand || !children || children.length === 0) return
206
+
207
+ if (!state.expandedKeys.includes(key)) {
208
+ setExpandedKeys([...state.expandedKeys, key])
209
+ } else {
210
+ const keys = [...state.expandedKeys]
211
+ const index = keys.findIndex((item) => item === key)
212
+ if (index !== -1) {
213
+ keys.splice(index, 1);
214
+ }
215
+
216
+ setExpandedKeys(keys)
217
+ }
218
+ }
219
+
220
+ // 渲染操作栏
221
+ function renderAction(node: TreeItem) {
222
+ const { actionList } = props
223
+ if (!actionList || actionList.length === 0) return
224
+
225
+ return actionList.map((item, index) => {
226
+ let nodeShow = true
227
+
228
+ if (isFunction(item.show)) {
229
+ nodeShow = item.show?.(node);
230
+ } else if (isBoolean(item.show)) {
231
+ nodeShow = item.show;
232
+ }
233
+
234
+ if (!nodeShow) return null
235
+
236
+ return (
237
+ <span key={index} class='tree-action'>
238
+ { item.render(node) }
239
+ </span>
240
+ )
241
+ })
242
+
243
+ }
244
+
245
+ const {
246
+ deleteNodeByKey,
247
+ insertNodeByKey,
248
+ insertNodesByKey,
249
+ filterByLevel,
250
+ updateNodeByKey,
251
+ getAllKeys,
252
+ getChildrenKeys,
253
+ getEnabledKeys,
254
+ getSelectedNode,
255
+ } = useTree( treeDataRef, getFieldNames )
256
+
257
+ // 设置实例暴露的方法
258
+ function setExpandedKeys(keys: KeyType[]) { state.expandedKeys = keys }
259
+ function getExpandedKeys() { return state.expandedKeys }
260
+
261
+ function setSelectedKeys( keys: KeyType[] ) { state.selectedKeys = keys }
262
+ function getSelectedKeys() { return state.selectedKeys }
263
+
264
+ function setCheckedKeys(keys: CheckKeys) { state.checkedKeys = keys }
265
+ function getCheckedKeys() { return state.checkedKeys }
266
+
267
+ function checkAll(checkAll: boolean) { state.checkedKeys = checkAll ? getEnabledKeys() : ([] as KeyType[]) }
268
+ function expandAll(expandAll: boolean) { state.expandedKeys = expandAll ? getAllKeys() : ([] as KeyType[]) }
269
+
270
+ function onStrictlyChange(strictly: boolean) { state.checkStrictly = strictly }
271
+
272
+ const instance: TreeActionType = {
273
+ setExpandedKeys,
274
+ getExpandedKeys,
275
+ setSelectedKeys,
276
+ getSelectedKeys,
277
+ setCheckedKeys,
278
+ getCheckedKeys,
279
+ insertNodeByKey,
280
+ insertNodesByKey,
281
+ deleteNodeByKey,
282
+ updateNodeByKey,
283
+ getSelectedNode,
284
+ checkAll,
285
+ expandAll,
286
+ onStrictlyChange,
287
+ filterByLevel: (level: number) => {
288
+ state.expandedKeys = filterByLevel(level);
289
+ },
290
+ setSearchValue: (value: string) => {
291
+ handleSearch(value);
292
+ },
293
+ getSearchValue: () => {
294
+ return searchState.searchText;
295
+ }
296
+ }
297
+
298
+ function handleSearch(searchValue: string) {
299
+ if (searchValue !== searchState.searchText) searchState.searchText = searchValue
300
+ emit('update:searchValue', searchValue)
301
+
302
+ if (!searchValue) {
303
+ searchState.startSearch = false
304
+ return
305
+ }
306
+
307
+ const { filterFn, checkable, expandOnSearch, checkOnSearch, selectedOnSearch } = unref(props)
308
+ const { title: titleField, key: keyField } = unref(getFieldNames)
309
+ const matchedKeys: string[] = []
310
+
311
+ searchState.startSearch = true
312
+
313
+ searchState.searchData = filter(
314
+ unref(treeDataRef),
315
+ (node) => {
316
+ const result = filterFn
317
+ ? filterFn(searchValue, node, unref(getFieldNames))
318
+ : node[titleField]?.includes(searchValue) ?? false
319
+
320
+ if (result) {
321
+ matchedKeys.push(node[keyField]);
322
+ }
323
+
324
+ return result;
325
+ },
326
+ unref(getFieldNames),
327
+ )
328
+
329
+ if (expandOnSearch) {
330
+ const expandKeys = treeToList(searchState.searchData).map((val) => {
331
+ return val[keyField]
332
+ })
333
+
334
+ if (expandKeys && expandKeys.length) {
335
+ setExpandedKeys(expandKeys)
336
+ }
337
+ }
338
+
339
+ if (checkOnSearch && checkable && matchedKeys.length) {
340
+ setCheckedKeys(matchedKeys)
341
+ }
342
+
343
+ if (selectedOnSearch && matchedKeys.length) {
344
+ setSelectedKeys(matchedKeys)
345
+ }
346
+ }
347
+
348
+ watch(
349
+ () => props.searchValue,
350
+ (val) => {
351
+ if (val !== searchState.searchText) {
352
+ searchState.searchText = val
353
+ }
354
+ },
355
+ { immediate: true }
356
+ )
357
+
358
+ watch(
359
+ () => props.treeData,
360
+ (val) => {
361
+ if (val) {
362
+ handleSearch(searchState.searchText)
363
+ }
364
+ }
365
+ )
366
+
367
+ watch(
368
+ () => props.value,
369
+ () => {
370
+ state.checkedKeys = toRaw(props.value || [])
371
+ },
372
+ { immediate: true }
373
+ )
374
+
375
+ watch(
376
+ () => state.checkedKeys,
377
+ () => {
378
+ const v = toRaw(state.checkedKeys)
379
+ emit('update:value', v)
380
+ emit('change', v)
381
+ }
382
+ )
383
+
384
+ watchEffect(() => { treeDataRef.value = props.treeData as TreeItem[] })
385
+ watchEffect(() => { state.expandedKeys = props.expandedKeys })
386
+ watchEffect(() => { state.selectedKeys = props.selectedKeys })
387
+ watchEffect(() => { state.checkedKeys = props.checkedKeys })
388
+ watchEffect(() => { state.checkStrictly = props.checkStrictly })
389
+
390
+ defineExpose(instance)
391
+
392
+ </script>