@@ -189,7 +189,7 @@ type ContextualMenuProps = {
189
189
col : WaveColumn
190
190
listProps : Fluent . IContextualMenuListProps
191
191
selectedFilters : Dict < S [ ] > | null
192
- setFiltersInBulk : ( colKey : S , filters : S [ ] ) => void
192
+ setFiltersInBulk : ( colKey : S , filters : S [ ] ) => void
193
193
}
194
194
195
195
type FooterProps = {
@@ -291,6 +291,7 @@ const
291
291
ContextualMenu = ( { onFilterChange, col, listProps, selectedFilters, setFiltersInBulk } : ContextualMenuProps ) => {
292
292
const
293
293
isFilterChecked = ( data : S , key : S ) => ! ! selectedFilters && selectedFilters [ data ] ?. includes ( key ) ,
294
+ [ selectedFiltersCount , setSelectedFiltersCount ] = React . useState ( 0 ) , // Step 1
294
295
[ menuFilters , setMenuFilters ] = React . useState ( col . cellType ?. tag
295
296
? Array . from ( listProps . items . reduce ( ( _filters , { key, text, data } ) => {
296
297
key . split ( ',' ) . forEach ( key => _filters . set ( key , { key, text, data, checked : isFilterChecked ( data , key ) } ) )
@@ -301,18 +302,28 @@ const
301
302
selectAll = ( ) => {
302
303
setMenuFilters ( menuFilters . map ( i => ( { ...i , checked : true } ) ) )
303
304
setFiltersInBulk ( col . key , menuFilters . map ( f => f . key ) )
305
+ setSelectedFiltersCount ( menuFilters . length )
304
306
} ,
305
307
deselectAll = ( ) => {
306
308
setMenuFilters ( menuFilters . map ( i => ( { ...i , checked : false } ) ) )
307
309
setFiltersInBulk ( col . key , [ ] )
310
+ setSelectedFiltersCount ( 0 )
308
311
} ,
309
312
getOnFilterChangeHandler = ( data : S , key : S ) => ( _ev ?: React . FormEvent < HTMLInputElement | HTMLElement > , checked ?: B ) => {
310
313
setMenuFilters ( filters => filters . map ( f => f . key === key ? ( { ...f , checked } ) : f ) )
311
314
onFilterChange ( data , key , checked )
315
+ setSelectedFiltersCount ( // Step 2
316
+ checked
317
+ ? selectedFiltersCount + 1
318
+ : selectedFiltersCount - 1
319
+ )
312
320
}
313
321
314
322
return (
315
323
< div style = { { padding : 10 } } >
324
+ < Fluent . Text variant = 'mediumPlus' styles = { { root : { paddingTop : 10 , paddingBottom : 10 , fontWeight : 'bold' } } } block >
325
+ { `(${ selectedFiltersCount } selected)` }
326
+ </ Fluent . Text >
316
327
< Fluent . Text variant = 'mediumPlus' styles = { { root : { paddingTop : 10 , paddingBottom : 10 , fontWeight : 'bold' } } } block > Show only</ Fluent . Text >
317
328
< Fluent . Text variant = 'small' >
318
329
< Fluent . Link onClick = { selectAll } > Select All</ Fluent . Link > | < Fluent . Link onClick = { deselectAll } > Deselect All</ Fluent . Link >
@@ -334,7 +345,7 @@ const
334
345
} ,
335
346
DataTable = React . forwardRef ( ( { model : m , onFilterChange, items, filteredItems, selection, selectedFilters, isMultiple, isSingle, groups, expandedRefs, onSortChange, setFiltersInBulk } : DataTable , ref ) => {
336
347
const
337
- [ colContextMenuList , setColContextMenuList ] = React . useState < Fluent . IContextualMenuProps | null > ( null ) ,
348
+ [ colContextMenuList , setColContextMenuList ] = React . useState < Fluent . IContextualMenuProps | null > ( null ) ,
338
349
onRenderMenuList = React . useCallback ( ( col : WaveColumn ) => ( listProps ?: Fluent . IContextualMenuListProps ) => {
339
350
return listProps ?
340
351
< ContextualMenu
@@ -373,7 +384,8 @@ const
373
384
return col
374
385
} ) )
375
386
}
376
- } , [ onColumnContextMenu , onSortChange ] ) ,
387
+ }
388
+ , [ onColumnContextMenu , onSortChange ] ) ,
377
389
tableToWaveColumn = React . useCallback ( ( c : TableColumn ) : WaveColumn => {
378
390
const
379
391
minWidth = c . min_width
@@ -578,9 +590,6 @@ const
578
590
onRenderItemColumn = { onRenderItemColumn }
579
591
onRenderDetailsHeader = { onRenderDetailsHeader }
580
592
checkboxVisibility = { checkboxVisibilityMap [ m . checkbox_visibility || 'on-hover' ] }
581
- // Prevent selection from being cleared when 'items' are updated.
582
- // https://github.com/microsoft/fluentui/blob/4c1cd4bbba73bbca4411db9d01ffb486b1a90303/packages/react/src/components/DetailsList/DetailsList.base.tsx#L1032.
583
- setKey = 'wave-table-items'
584
593
/>
585
594
{ colContextMenuList && < Fluent . ContextualMenu { ...colContextMenuList } /> }
586
595
</ >
@@ -931,11 +940,6 @@ export const
931
940
const selectedItemKeys = selection . getSelection ( ) . map ( item => item . key as S )
932
941
wave . args [ m . name ] = selectedItemKeys
933
942
if ( ! skipNextEventEmit . current && m . events ?. includes ( 'select' ) ) wave . emit ( m . name , 'select' , selectedItemKeys )
934
- } ,
935
- onItemsChanged : ( ) => {
936
- // HACK: Skip emitting 'select' event on 'items' update.
937
- skipNextEventEmit . current = true
938
- setTimeout ( ( ) => skipNextEventEmit . current = false )
939
943
}
940
944
} ) , [ m . name , m . events ] ) ,
941
945
computeHeight = ( ) => {
@@ -975,17 +979,19 @@ export const
975
979
} , [ m . pagination , m . events , m . name , filter , search , currentSort , initGroups ] )
976
980
977
981
React . useEffect ( ( ) => {
978
- skipNextEventEmit . current = true
979
982
wave . args [ m . name ] = [ ]
980
983
if ( isSingle && m . value ) {
984
+ skipNextEventEmit . current = true
981
985
selection . setKeySelected ( m . value , true , false )
986
+ skipNextEventEmit . current = false
982
987
wave . args [ m . name ] = [ m . value ]
983
988
}
984
989
else if ( isMultiple && m . values ) {
990
+ skipNextEventEmit . current = true
985
991
m . values . forEach ( v => selection . setKeySelected ( v , true , false ) )
992
+ skipNextEventEmit . current = false
986
993
wave . args [ m . name ] = m . values
987
994
}
988
- skipNextEventEmit . current = false
989
995
// eslint-disable-next-line react-hooks/exhaustive-deps
990
996
} , [ ] )
991
997
0 commit comments