1- import isEqual from 'lodash-es/isEqual' ;
21import FilterFilled from '@ant-design/icons-vue/FilterFilled' ;
32import Button from '../../../button' ;
43import Menu from '../../../menu' ;
@@ -26,6 +25,8 @@ import type { EventHandler } from '../../../_util/EventInterface';
2625import FilterSearch from './FilterSearch' ;
2726import Tree from '../../../tree' ;
2827import type { CheckboxChangeEvent } from '../../../checkbox/interface' ;
28+ import devWarning from '../../../vc-util/devWarning' ;
29+ import isEqual from '../../../vc-util/isEqual' ;
2930
3031interface FilterRestProps {
3132 confirm ?: Boolean ;
@@ -99,7 +100,7 @@ function renderFilterItems({
99100 return item ;
100101 } ) ;
101102}
102-
103+ export type TreeColumnFilterItem = ColumnFilterItem ;
103104export interface FilterDropdownProps < RecordType > {
104105 tablePrefixCls : string ;
105106 prefixCls : string ;
@@ -108,7 +109,7 @@ export interface FilterDropdownProps<RecordType> {
108109 filterState ?: FilterState < RecordType > ;
109110 filterMultiple : boolean ;
110111 filterMode ?: 'menu' | 'tree' ;
111- filterSearch ?: FilterSearchType ;
112+ filterSearch ?: FilterSearchType < ColumnFilterItem | TreeColumnFilterItem > ;
112113 columnKey : Key ;
113114 triggerFilter : ( filterState : FilterState < RecordType > ) => void ;
114115 locale : TableLocale ;
@@ -136,7 +137,29 @@ export default defineComponent<FilterDropdownProps<any>>({
136137 const contextSlots = useInjectSlots ( ) ;
137138 const filterMode = computed ( ( ) => props . filterMode ?? 'menu' ) ;
138139 const filterSearch = computed ( ( ) => props . filterSearch ?? false ) ;
139- const filterDropdownVisible = computed ( ( ) => props . column . filterDropdownVisible ) ;
140+ const filterDropdownOpen = computed (
141+ ( ) => props . column . filterDropdownOpen || props . column . filterDropdownVisible ,
142+ ) ;
143+ const onFilterDropdownOpenChange = computed (
144+ ( ) => props . column . onFilterDropdownOpenChange || props . column . onFilterDropdownVisibleChange ,
145+ ) ;
146+
147+ if ( process . env . NODE_ENV !== 'production' ) {
148+ [
149+ [ 'filterDropdownVisible' , 'filterDropdownOpen' , props . column . filterDropdownVisible ] ,
150+ [
151+ 'onFilterDropdownVisibleChange' ,
152+ 'onFilterDropdownOpenChange' ,
153+ props . column . onFilterDropdownVisibleChange ,
154+ ] ,
155+ ] . forEach ( ( [ deprecatedName , newName , prop ] ) => {
156+ devWarning (
157+ prop === undefined || prop === null ,
158+ 'Table' ,
159+ `\`${ deprecatedName } \` is deprecated. Please use \`${ newName } \` instead.` ,
160+ ) ;
161+ } ) ;
162+ }
140163 const visible = ref ( false ) ;
141164 const filtered = computed (
142165 ( ) =>
@@ -166,13 +189,11 @@ export default defineComponent<FilterDropdownProps<any>>({
166189
167190 const triggerVisible = ( newVisible : boolean ) => {
168191 visible . value = newVisible ;
169- props . column . onFilterDropdownVisibleChange ?.( newVisible ) ;
192+ onFilterDropdownOpenChange . value ?.( newVisible ) ;
170193 } ;
171194
172195 const mergedVisible = computed ( ( ) =>
173- typeof filterDropdownVisible . value === 'boolean'
174- ? filterDropdownVisible . value
175- : visible . value ,
196+ typeof filterDropdownOpen . value === 'boolean' ? filterDropdownOpen . value : visible . value ,
176197 ) ;
177198
178199 const propFilteredKeys = computed ( ( ) => props . filterState ?. filteredKeys ) ;
@@ -234,14 +255,14 @@ export default defineComponent<FilterDropdownProps<any>>({
234255 } ) ;
235256
236257 // ======================= Submit ========================
237- const internalTriggerFilter = ( keys : Key [ ] | undefined | null ) => {
258+ const internalTriggerFilter = ( keys ? : Key [ ] ) => {
238259 const { column, columnKey, filterState } = props ;
239260 const mergedKeys = keys && keys . length ? keys : null ;
240261 if ( mergedKeys === null && ( ! filterState || ! filterState . filteredKeys ) ) {
241262 return null ;
242263 }
243264
244- if ( isEqual ( mergedKeys , filterState ?. filteredKeys ) ) {
265+ if ( isEqual ( mergedKeys , filterState ?. filteredKeys , true ) ) {
245266 return null ;
246267 }
247268
@@ -318,6 +339,13 @@ export default defineComponent<FilterDropdownProps<any>>({
318339 return item ;
319340 } ) ;
320341
342+ const getFilterData = ( node : any ) : TreeColumnFilterItem => ( {
343+ ...node ,
344+ text : node . title ,
345+ value : node . key ,
346+ children : node . children ?. map ( item => getFilterData ( item ) ) || [ ] ,
347+ } ) ;
348+
321349 const treeData = computed ( ( ) => getTreeData ( { filters : props . column . filters } ) ) ;
322350 // ======================== Style ========================
323351 const dropdownMenuClass = computed ( ( ) =>
@@ -394,7 +422,12 @@ export default defineComponent<FilterDropdownProps<any>>({
394422 // onExpand={onExpandChange}
395423 filterTreeNode = {
396424 searchValue . value . trim ( )
397- ? node => searchValueMatched ( searchValue . value , node . title )
425+ ? node => {
426+ if ( typeof filterSearch . value === 'function' ) {
427+ return filterSearch . value ( searchValue . value , getFilterData ( node ) ) ;
428+ }
429+ return searchValueMatched ( searchValue . value , node . title ) ;
430+ }
398431 : undefined
399432 }
400433 />
@@ -443,6 +476,7 @@ export default defineComponent<FilterDropdownProps<any>>({
443476 return isEqual (
444477 ( props . column . defaultFilteredValue || [ ] ) . map ( key => String ( key ) ) ,
445478 selectedKeys ,
479+ true ,
446480 ) ;
447481 }
448482
@@ -464,6 +498,9 @@ export default defineComponent<FilterDropdownProps<any>>({
464498 filters : column . filters ,
465499 visible : mergedVisible . value ,
466500 column : column . __originColumn__ ,
501+ close : ( ) => {
502+ triggerVisible ( false ) ;
503+ } ,
467504 } ) ;
468505 } else if ( filterDropdownRef . value ) {
469506 dropdownContent = filterDropdownRef . value ;
@@ -512,8 +549,8 @@ export default defineComponent<FilterDropdownProps<any>>({
512549 < Dropdown
513550 overlay = { menu }
514551 trigger = { [ 'click' ] }
515- visible = { mergedVisible . value }
516- onVisibleChange = { onVisibleChange }
552+ open = { mergedVisible . value }
553+ onOpenChange = { onVisibleChange }
517554 getPopupContainer = { getPopupContainer }
518555 placement = { direction . value === 'rtl' ? 'bottomLeft' : 'bottomRight' }
519556 >
0 commit comments