diff --git a/packages/vuetify/src/components/VDataTable/VDataTable.sass b/packages/vuetify/src/components/VDataTable/VDataTable.sass index 7f9b6d87b98..64a9d0a7d4a 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTable.sass +++ b/packages/vuetify/src/components/VDataTable/VDataTable.sass @@ -164,3 +164,6 @@ &-active color: $data-table-header-mobile-chip-icon-color-active + +.v-data-table__mask + background: rgb(var(--v-theme-on-surface-variant)) diff --git a/packages/vuetify/src/components/VDataTable/VDataTable.tsx b/packages/vuetify/src/components/VDataTable/VDataTable.tsx index b7e3b5763ac..b3db17dfff0 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTable.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTable.tsx @@ -147,7 +147,7 @@ export const VDataTable = genericComponent( const { items } = useDataTableItems(props, columns) const search = toRef(props, 'search') - const { filteredItems } = useFilter(props, items, search, { + const { filteredItems, getMatches } = useFilter(props, items, search, { transform: item => item.columns, customKeyFilter: filterFunctions, }) @@ -262,6 +262,7 @@ export const VDataTable = genericComponent( { ...attrs } { ...dataTableRowsProps } items={ paginatedItems.value } + getMatches={ getMatches } v-slots={ slots } /> )} diff --git a/packages/vuetify/src/components/VDataTable/VDataTableRow.tsx b/packages/vuetify/src/components/VDataTable/VDataTableRow.tsx index bfe3b48dad1..d56ce6fb4f1 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableRow.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableRow.tsx @@ -9,6 +9,7 @@ import { useHeaders } from './composables/headers' import { useSelection } from './composables/select' import { useSort } from './composables/sort' import { makeDisplayProps, useDisplay } from '@/composables/display' +import { highlightResult } from '@/composables/filter' // Utilities import { toDisplayString, withModifiers } from 'vue' @@ -34,6 +35,7 @@ export const makeVDataTableRowProps = propsFactory({ index: Number, item: Object as PropType, cellProps: [Object, Function] as PropType>, + getMatches: Function, onClick: EventProp<[MouseEvent]>(), onContextmenu: EventProp<[MouseEvent]>(), onDblclick: EventProp<[MouseEvent]>(), @@ -162,7 +164,13 @@ export const VDataTableRow = genericComponent( ) } - const displayValue = toDisplayString(slotProps.value) + const displayValue = props.getMatches + ? highlightResult( + 'v-data-table', + toDisplayString(slotProps.value), + props.getMatches(item)?.[column.key!] + ) + : toDisplayString(slotProps.value) return !mobile.value ? displayValue : ( <> diff --git a/packages/vuetify/src/components/VDataTable/VDataTableRows.tsx b/packages/vuetify/src/components/VDataTable/VDataTableRows.tsx index cd61f72b968..dd03c9cffef 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableRows.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableRows.tsx @@ -47,6 +47,7 @@ export const makeVDataTableRowsProps = propsFactory({ }, rowProps: [Object, Function] as PropType>, cellProps: [Object, Function] as PropType>, + getMatches: Function, ...makeDisplayProps(), }, 'VDataTableRows') @@ -164,6 +165,7 @@ export const VDataTableRows = genericComponent( { slots.item ? slots.item(itemSlotProps) : ( )} diff --git a/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx b/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx index 4cf93b331f7..9fd4f83bf33 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx @@ -104,7 +104,7 @@ export const VDataTableVirtual = genericComponent item.columns, customKeyFilter: filterFunctions, }) @@ -231,6 +231,7 @@ export const VDataTableVirtual = genericComponent {{ ...slots, @@ -247,6 +248,7 @@ export const VDataTableVirtual = genericComponent ) diff --git a/packages/vuetify/src/composables/filter.tsx b/packages/vuetify/src/composables/filter.tsx index 32193fc3a80..ff62b05896c 100644 --- a/packages/vuetify/src/composables/filter.tsx +++ b/packages/vuetify/src/composables/filter.tsx @@ -197,7 +197,9 @@ export function useFilter ( results.forEach(({ index, matches }) => { const item = originalItems[index] _filteredItems.push(item) - _filteredMatches.set(item.value, matches) + if (item.value !== undefined) { + _filteredMatches.set(item.value, matches) + } }) filteredItems.value = _filteredItems filteredMatches.value = _filteredMatches