diff --git a/apps/web-antd/src/views/system/user/dept-tree.vue b/apps/web-antd/src/views/system/user/dept-tree.vue
index 130c3fcd..67adb3be 100644
--- a/apps/web-antd/src/views/system/user/dept-tree.vue
+++ b/apps/web-antd/src/views/system/user/dept-tree.vue
@@ -3,10 +3,12 @@ import type { PropType } from 'vue';
import type { DeptTree } from '#/api/system/user/model';
-import { onMounted, ref } from 'vue';
+import { computed, onMounted, ref } from 'vue';
+
+import { listToTree, treeToList } from '@vben/utils';
import { SyncOutlined } from '@antdv-next/icons';
-import { Empty, InputSearch, Skeleton, Tree } from 'antdv-next';
+import { Empty, Input, Skeleton, SpaceCompact, Tree } from 'antdv-next';
import { getDeptTree } from '#/api/system/user';
@@ -66,6 +68,23 @@ async function loadTree() {
showTreeSkeleton.value = false;
}
+const deptTreeComputed = computed(() => {
+ if (!searchValue.value) {
+ return deptTreeArray.value;
+ }
+ const toTree = treeToList(deptTreeArray.value, {
+ id: 'id',
+ pid: 'parentId',
+ });
+ const filteredTree = toTree.filter((item: DeptTree) =>
+ item.label.toUpperCase().includes(searchValue.value.toUpperCase()),
+ );
+ return listToTree(filteredTree, {
+ id: 'id',
+ pid: 'parentId',
+ });
+});
+
async function handleReload() {
await loadTree();
emit('reload');
@@ -90,33 +109,38 @@ onMounted(loadTree);
v-if="showSearch"
class="sticky left-0 top-0 z-100 bg-background p-[8px]"
>
-