@dt-frames/ui 1.0.12 → 1.0.16

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 (217) hide show
  1. package/es/components/curd/src/components/dialog.d.ts +27 -23
  2. package/es/components/curd/src/components/props.d.ts +6 -5
  3. package/es/components/curd/src/hooks/useCurd.d.ts +1 -0
  4. package/es/components/curd/src/types/curd.type.d.ts +4 -3
  5. package/es/components/forms/src/components/formButton.d.ts +1 -2
  6. package/es/components/forms/src/components/formIcon.d.ts +16 -11
  7. package/es/components/forms/src/hooks/helper.d.ts +2 -0
  8. package/es/components/forms/src/hooks/useFormActions.d.ts +2 -2
  9. package/es/components/forms/src/index.d.ts +2 -3
  10. package/es/components/forms/src/types/form.type.d.ts +3 -17
  11. package/es/components/index.d.ts +2 -2
  12. package/es/components/modal/src/components/modal.d.ts +2 -2
  13. package/es/components/modal/src/components/modalFooter.d.ts +10 -5
  14. package/es/components/modal/src/index.d.ts +16 -11
  15. package/es/components/modal/src/props.d.ts +2 -1
  16. package/es/components/source/src/hooks/useFetch.d.ts +1 -1
  17. package/es/components/table/src/hooks/useTable.d.ts +2 -2
  18. package/es/components/table/src/index.d.ts +3 -3
  19. package/es/components/table/src/props.d.ts +1 -2
  20. package/es/components/table/src/types/table.type.d.ts +2 -2
  21. package/es/components/tree/src/props.d.ts +8 -1
  22. package/es/components/upload/index.d.ts +1 -2
  23. package/es/components/upload/src/helper.d.ts +1 -0
  24. package/es/components/upload/src/index.d.ts +13 -9
  25. package/es/components/upload/src/props.d.ts +4 -1
  26. package/es/components/upload/src/upload.d.ts +21 -9
  27. package/es/index.js +391 -232
  28. package/es/style/components/icons/index.less +1 -1
  29. package/es/style/components/upload/index.less +3 -11
  30. package/package.json +1 -10
  31. package/vite.config.js +10 -0
  32. package/src/assets/data/icons/actions.ts +0 -427
  33. package/src/assets/data/icons/code.ts +0 -10
  34. package/src/assets/data/icons/commuticate.ts +0 -190
  35. package/src/assets/data/icons/currency.ts +0 -46
  36. package/src/assets/data/icons/devices.ts +0 -128
  37. package/src/assets/data/icons/edit.ts +0 -165
  38. package/src/assets/data/icons/file.ts +0 -104
  39. package/src/assets/data/icons/math.ts +0 -53
  40. package/src/assets/data/icons/message.ts +0 -75
  41. package/src/assets/data/icons/navigate.ts +0 -181
  42. package/src/assets/data/icons/other.ts +0 -333
  43. package/src/assets/data/icons.ts +0 -58
  44. package/src/assets/imgs/header/avatar.png +0 -0
  45. package/src/assets/imgs/logo/logo.png +0 -0
  46. package/src/assets/locales/en_US.json +0 -3
  47. package/src/assets/locales/zh_CN.json +0 -3
  48. package/src/assets/style/index.less +0 -10
  49. package/src/assets/style/reset.less +0 -17
  50. package/src/components/container/index.less +0 -85
  51. package/src/components/container/index.ts +0 -8
  52. package/src/components/container/src/bar.ts +0 -107
  53. package/src/components/container/src/lazy-container.vue +0 -9
  54. package/src/components/container/src/scroll-bar.vue +0 -117
  55. package/src/components/container/src/scroll-container.vue +0 -61
  56. package/src/components/curd/index.ts +0 -5
  57. package/src/components/curd/src/components/dialog.vue +0 -74
  58. package/src/components/curd/src/components/props.ts +0 -32
  59. package/src/components/curd/src/hooks/useCurd.tsx +0 -87
  60. package/src/components/curd/src/types/curd.type.ts +0 -31
  61. package/src/components/excel/index.ts +0 -6
  62. package/src/components/excel/src/export2Excel.ts +0 -44
  63. package/src/components/forms/index.less +0 -107
  64. package/src/components/forms/index.ts +0 -11
  65. package/src/components/forms/src/componentMap.ts +0 -46
  66. package/src/components/forms/src/components/formButton.vue +0 -150
  67. package/src/components/forms/src/components/formIcon.vue +0 -51
  68. package/src/components/forms/src/components/formInputUseDialog.vue +0 -43
  69. package/src/components/forms/src/components/formItem.vue +0 -420
  70. package/src/components/forms/src/components/radioButton.vue +0 -58
  71. package/src/components/forms/src/const/form.const.ts +0 -7
  72. package/src/components/forms/src/hooks/helper.ts +0 -70
  73. package/src/components/forms/src/hooks/useForm.ts +0 -130
  74. package/src/components/forms/src/hooks/useFormActions.ts +0 -63
  75. package/src/components/forms/src/hooks/useFormEvents.ts +0 -248
  76. package/src/components/forms/src/hooks/useFormValue.ts +0 -49
  77. package/src/components/forms/src/hooks/useFormValues.ts +0 -131
  78. package/src/components/forms/src/hooks/useLabelWidth.ts +0 -57
  79. package/src/components/forms/src/index.vue +0 -310
  80. package/src/components/forms/src/prop.ts +0 -80
  81. package/src/components/forms/src/types/form.type.ts +0 -275
  82. package/src/components/icons/index.less +0 -101
  83. package/src/components/icons/index.ts +0 -7
  84. package/src/components/icons/src/pick-icon.vue +0 -119
  85. package/src/components/icons/src/svg-icon.vue +0 -117
  86. package/src/components/iframe/index.less +0 -3
  87. package/src/components/iframe/index.ts +0 -5
  88. package/src/components/iframe/src/index.less +0 -3
  89. package/src/components/iframe/src/index.vue +0 -38
  90. package/src/components/index.ts +0 -54
  91. package/src/components/modal/index.less +0 -60
  92. package/src/components/modal/index.ts +0 -8
  93. package/src/components/modal/src/components/close-icon.vue +0 -46
  94. package/src/components/modal/src/components/modal-wrap.vue +0 -128
  95. package/src/components/modal/src/components/modal.tsx +0 -30
  96. package/src/components/modal/src/components/modalFooter.vue +0 -38
  97. package/src/components/modal/src/hooks/useDrag.ts +0 -107
  98. package/src/components/modal/src/hooks/useFullScreen.ts +0 -29
  99. package/src/components/modal/src/hooks/useModal.ts +0 -200
  100. package/src/components/modal/src/index.vue +0 -173
  101. package/src/components/modal/src/props.ts +0 -43
  102. package/src/components/modal/src/types/modal.type.ts +0 -30
  103. package/src/components/router/base-router.vue +0 -11
  104. package/src/components/router/index.ts +0 -3
  105. package/src/components/source/index.ts +0 -1
  106. package/src/components/source/src/hooks/useFetch.ts +0 -42
  107. package/src/components/source/src/hooks/usePage.ts +0 -3
  108. package/src/components/source/src/hooks/useSource.ts +0 -214
  109. package/src/components/source/src/index.ts +0 -5
  110. package/src/components/source/src/types/source.type.ts +0 -58
  111. package/src/components/source/src/types/table.type.ts +0 -8
  112. package/src/components/table/index.less +0 -179
  113. package/src/components/table/index.ts +0 -7
  114. package/src/components/table/src/components/TableActions.vue +0 -108
  115. package/src/components/table/src/components/TableHeader.vue +0 -78
  116. package/src/components/table/src/components/TableRender.vue +0 -76
  117. package/src/components/table/src/components/editable/CellComponent.ts +0 -57
  118. package/src/components/table/src/components/editable/EditTableCell.vue +0 -181
  119. package/src/components/table/src/components/editable/componentMap.ts +0 -18
  120. package/src/components/table/src/components/editable/index.ts +0 -58
  121. package/src/components/table/src/components/setting/Column.vue +0 -354
  122. package/src/components/table/src/components/setting/Download.vue +0 -55
  123. package/src/components/table/src/components/setting/Fullscreen.vue +0 -43
  124. package/src/components/table/src/components/setting/Size.vue +0 -42
  125. package/src/components/table/src/components/setting/index.vue +0 -64
  126. package/src/components/table/src/const.ts +0 -13
  127. package/src/components/table/src/hooks/useColumns.ts +0 -326
  128. package/src/components/table/src/hooks/useCustomRow.ts +0 -86
  129. package/src/components/table/src/hooks/useDataSource.ts +0 -97
  130. package/src/components/table/src/hooks/useHeaderCode.ts +0 -89
  131. package/src/components/table/src/hooks/useLoading.ts +0 -29
  132. package/src/components/table/src/hooks/usePagination.ts +0 -76
  133. package/src/components/table/src/hooks/useRowSelection.ts +0 -145
  134. package/src/components/table/src/hooks/useRows.ts +0 -30
  135. package/src/components/table/src/hooks/useTable.ts +0 -90
  136. package/src/components/table/src/hooks/useTableHeader.ts +0 -48
  137. package/src/components/table/src/hooks/useTableInstance.ts +0 -29
  138. package/src/components/table/src/hooks/useTableScroll.ts +0 -229
  139. package/src/components/table/src/index.vue +0 -212
  140. package/src/components/table/src/props.ts +0 -160
  141. package/src/components/table/src/types/table.type.ts +0 -160
  142. package/src/components/table/src/types/tableHeader.type.ts +0 -27
  143. package/src/components/tree/index.less +0 -41
  144. package/src/components/tree/index.ts +0 -5
  145. package/src/components/tree/src/components/TreeHeader.vue +0 -97
  146. package/src/components/tree/src/hooks/useTree.ts +0 -239
  147. package/src/components/tree/src/index.vue +0 -392
  148. package/src/components/tree/src/props.ts +0 -133
  149. package/src/components/tree/src/type/tree.ts +0 -105
  150. package/src/components/tree/src/utils/tree.ts +0 -73
  151. package/src/components/type.ts +0 -0
  152. package/src/components/upload/index.less +0 -43
  153. package/src/components/upload/index.ts +0 -7
  154. package/src/components/upload/src/helper.ts +0 -32
  155. package/src/components/upload/src/index.vue +0 -38
  156. package/src/components/upload/src/props.ts +0 -48
  157. package/src/components/upload/src/upload.vue +0 -166
  158. package/src/directives/icon.ts +0 -36
  159. package/src/directives/index.ts +0 -26
  160. package/src/directives/permission.ts +0 -20
  161. package/src/global.d.ts +0 -8
  162. package/src/index.ts +0 -4
  163. package/src/theme/content/index.vue +0 -37
  164. package/src/theme/feature/back-top.vue +0 -11
  165. package/src/theme/feature/index.vue +0 -7
  166. package/src/theme/footer/index.less +0 -16
  167. package/src/theme/footer/index.vue +0 -24
  168. package/src/theme/header/components/bread-crumb.vue +0 -26
  169. package/src/theme/header/components/fullscreen.vue +0 -12
  170. package/src/theme/header/components/handler.ts +0 -81
  171. package/src/theme/header/components/index.ts +0 -21
  172. package/src/theme/header/components/lang-picker.vue +0 -36
  173. package/src/theme/header/components/logo.vue +0 -35
  174. package/src/theme/header/components/menu-search.vue +0 -62
  175. package/src/theme/header/components/notify.vue +0 -22
  176. package/src/theme/header/components/setting-theme.vue +0 -123
  177. package/src/theme/header/components/theme-drawer/enum.ts +0 -12
  178. package/src/theme/header/components/theme-drawer/feature.vue +0 -75
  179. package/src/theme/header/components/theme-drawer/index.ts +0 -7
  180. package/src/theme/header/components/theme-drawer/menu-type.vue +0 -40
  181. package/src/theme/header/components/theme-drawer/select-item.vue +0 -46
  182. package/src/theme/header/components/theme-drawer/switch-item.vue +0 -39
  183. package/src/theme/header/components/theme-drawer/theme-color.vue +0 -26
  184. package/src/theme/header/components/trigger.vue +0 -14
  185. package/src/theme/header/components/user-info.vue +0 -60
  186. package/src/theme/header/const/index.ts +0 -40
  187. package/src/theme/header/helper/menu-tree.ts +0 -64
  188. package/src/theme/header/index.less +0 -442
  189. package/src/theme/header/index.ts +0 -0
  190. package/src/theme/header/index.vue +0 -96
  191. package/src/theme/header/multiple-header.vue +0 -67
  192. package/src/theme/header/set-theme.less +0 -68
  193. package/src/theme/index.ts +0 -3
  194. package/src/theme/sider/components/basic-menu/basic-menu-item.vue +0 -14
  195. package/src/theme/sider/components/basic-menu/basic-menu.vue +0 -122
  196. package/src/theme/sider/components/basic-menu/basic-sub-menu-item.vue +0 -46
  197. package/src/theme/sider/components/basic-menu/menu-item-content.vue +0 -13
  198. package/src/theme/sider/components/drag-bar.vue +0 -26
  199. package/src/theme/sider/components/layout-menu.vue +0 -132
  200. package/src/theme/sider/components/props.ts +0 -97
  201. package/src/theme/sider/components/sider-trigger.vue +0 -24
  202. package/src/theme/sider/helper/sider.ts +0 -52
  203. package/src/theme/sider/helper/split-menu.ts +0 -146
  204. package/src/theme/sider/hooks/useDragLine.ts +0 -86
  205. package/src/theme/sider/hooks/useOpenKeys.ts +0 -57
  206. package/src/theme/sider/index.less +0 -203
  207. package/src/theme/sider/index.vue +0 -88
  208. package/src/theme/tabs/components/TabContent.vue +0 -36
  209. package/src/theme/tabs/components/TabRedo.vue +0 -18
  210. package/src/theme/tabs/hooks/useMultifyTabs.ts +0 -96
  211. package/src/theme/tabs/hooks/useTabDropdown.ts +0 -89
  212. package/src/theme/tabs/index.less +0 -165
  213. package/src/theme/tabs/index.vue +0 -98
  214. package/src/theme/tabs/types/tabs.type.ts +0 -8
  215. package/src/theme/theme.less +0 -67
  216. package/src/theme/theme.vue +0 -90
  217. package/src/theme/transition.less +0 -99
@@ -1,239 +0,0 @@
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
- }
@@ -1,392 +0,0 @@
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>