|
29 | 29 | <el-input |
30 | 30 | v-if="searchType === 'name'" |
31 | 31 | v-model="searchForm.name" |
32 | | - @change="searchHandle" |
33 | 32 | :placeholder="$t('common.searchBar.placeholder')" |
34 | 33 | style="width: 220px" |
35 | 34 | clearable |
36 | 35 | /> |
37 | 36 | <el-select |
38 | 37 | v-else-if="searchType === 'permission'" |
39 | 38 | v-model="searchForm.permission" |
40 | | - @change="searchHandle" |
41 | 39 | filterable |
42 | 40 | clearable |
43 | 41 | multiple |
|
55 | 53 | <app-table |
56 | 54 | ref="multipleTableRef" |
57 | 55 | class="mt-16" |
58 | | - :data="props.data" |
| 56 | + :data="filteredData" |
59 | 57 | @selection-change="handleSelectionChange" |
60 | 58 | :maxTableHeight="260" |
61 | 59 | :row-key="(row: any) => row.id" |
@@ -158,7 +156,28 @@ const props = defineProps<{ |
158 | 156 | }>() |
159 | 157 | const emit = defineEmits(['submitPermissions']) |
160 | 158 |
|
161 | | -const defaultExpandKeys = computed(() => (props.data?.length > 0 ? [props.data[0]?.id] : [])) |
| 159 | +const defaultExpandKeys = computed(() => { |
| 160 | + const searchName = searchForm.value.name || '' |
| 161 | + const searchPermissions = searchForm.value.permission ?? [] |
| 162 | + if (!searchName && (!searchPermissions || searchPermissions.length === 0)) { |
| 163 | + return (props.data?.length > 0 ? [props.data[0]?.id] : []) |
| 164 | + } |
| 165 | + const expandIds: string[] = [] |
| 166 | + // 传入过滤后的数据 |
| 167 | + const collectExpandIds = (nodes: any[]) => { |
| 168 | + nodes.forEach( |
| 169 | + node => { |
| 170 | + if (node.children && node.children.length > 0) { |
| 171 | + expandIds.push(node.id) |
| 172 | + collectExpandIds(node.children) |
| 173 | + } |
| 174 | + }) |
| 175 | + } |
| 176 | + collectExpandIds(filteredData.value) |
| 177 | + return expandIds |
| 178 | +} |
| 179 | + ) |
| 180 | +
|
162 | 181 | const permissionOptionMap = computed(() => { |
163 | 182 | return { |
164 | 183 | rootFolder: getPermissionOptions(true, true), |
@@ -240,12 +259,61 @@ const search_type_change = () => { |
240 | 259 | searchForm.value = { name: '', permission: undefined } |
241 | 260 | } |
242 | 261 |
|
243 | | -function searchHandle() { |
| 262 | +const paginationConfig = reactive({ |
| 263 | + current_page: 1, |
| 264 | + page_size: 20, |
| 265 | + total: 0, |
| 266 | +}) |
| 267 | +
|
| 268 | +function handleSizeChange() { |
| 269 | + paginationConfig.current_page = 1 |
244 | 270 | if (props.getData) { |
245 | 271 | props.getData() |
246 | 272 | } |
247 | 273 | } |
248 | 274 |
|
| 275 | +const filterTreeData = () => { |
| 276 | + const searchName = searchForm.value.name || '' |
| 277 | + const searchPermissions = searchForm.value.permission ?? [] |
| 278 | +
|
| 279 | + if (!searchName && (!searchPermissions || searchPermissions.length === 0)) { |
| 280 | + return props.data |
| 281 | + } |
| 282 | +
|
| 283 | + const filterNodes = (treeData: any[], name: string, permissions: any[]): any[] => { |
| 284 | + if (!treeData || treeData.length === 0) return [] |
| 285 | +
|
| 286 | + const result: any[] = [] |
| 287 | +
|
| 288 | + for (const node of treeData) { |
| 289 | + const cloneNode = { ...node } |
| 290 | +
|
| 291 | + let isMatch = false |
| 292 | + if (searchType.value === 'name') { |
| 293 | + isMatch = node.name.toLowerCase().includes(name.toLowerCase()) |
| 294 | + } else if (searchType.value === 'permission') { |
| 295 | + isMatch = node.permission && permissions.includes(node.permission) |
| 296 | + } |
| 297 | +
|
| 298 | + let filteredChildren: any[] = [] |
| 299 | + if (node.children && node.children.length > 0) { |
| 300 | + filteredChildren = filterNodes(node.children, name, permissions) |
| 301 | + } |
| 302 | + if (isMatch || filteredChildren.length > 0) { |
| 303 | + cloneNode.children = filteredChildren |
| 304 | + result.push(cloneNode) |
| 305 | + } |
| 306 | + } |
| 307 | + return result |
| 308 | + } |
| 309 | + return filterNodes(props.data, searchName, searchPermissions) |
| 310 | +} |
| 311 | +
|
| 312 | +const filteredData = computed(() => { |
| 313 | + return filterTreeData() |
| 314 | +}) |
| 315 | +
|
| 316 | +
|
249 | 317 | const multipleSelection = ref<any[]>([]) |
250 | 318 |
|
251 | 319 | const handleSelectionChange = (val: any[]) => { |
|
0 commit comments