diff --git a/packages/vuetify/src/components/VTreeview/VTreeview.tsx b/packages/vuetify/src/components/VTreeview/VTreeview.tsx index d9d5c42f193..8606c0d2c72 100644 --- a/packages/vuetify/src/components/VTreeview/VTreeview.tsx +++ b/packages/vuetify/src/components/VTreeview/VTreeview.tsx @@ -8,7 +8,7 @@ import { makeFilterProps, useFilter } from '@/composables/filter' import { useProxiedModel } from '@/composables/proxiedModel' // Utilities -import { computed, provide, ref, toRaw, toRef } from 'vue' +import { computed, provide, ref, toRaw, toRef, watch } from 'vue' import { genericComponent, omit, propsFactory, useRender } from '@/util' // Types @@ -103,6 +103,23 @@ export const VTreeview = genericComponent( })) }) + watch(filteredItems, val => { + if (!search.value) return + const getPath = vListRef.value?.getPath + if (!getPath) return + const filteredItemsAncestors = val.flatMap(item => { + const itemVal = props.returnObject ? item.raw : item.props.value + return getPath(itemVal).slice(0, -1) + }) + const newOpened = new Set([ + ...opened.value, + ...filteredItemsAncestors, + ]) + if (opened.value.length !== newOpened.size) { + emit('update:opened', [...newOpened]) + } + }) + function getChildren (id: unknown) { const arr: unknown[] = [] const queue = ((vListRef.value?.children.get(id) ?? []).slice())