Skip to content

Commit b77c10e

Browse files
committed
feat: Add filter count when a field is selected in selection modal h2oai#1689
1 parent a0151cd commit b77c10e

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

ui/src/table.tsx

+19-13
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ type ContextualMenuProps = {
189189
col: WaveColumn
190190
listProps: Fluent.IContextualMenuListProps
191191
selectedFilters: Dict<S[]> | null
192-
setFiltersInBulk: (colKey: S, filters: S[]) => void
192+
setFiltersInBulk: (colKey: S, filters: S[]) => void
193193
}
194194

195195
type FooterProps = {
@@ -291,6 +291,7 @@ const
291291
ContextualMenu = ({ onFilterChange, col, listProps, selectedFilters, setFiltersInBulk }: ContextualMenuProps) => {
292292
const
293293
isFilterChecked = (data: S, key: S) => !!selectedFilters && selectedFilters[data]?.includes(key),
294+
[selectedFiltersCount, setSelectedFiltersCount] = React.useState(0), // Step 1
294295
[menuFilters, setMenuFilters] = React.useState(col.cellType?.tag
295296
? Array.from(listProps.items.reduce((_filters, { key, text, data }) => {
296297
key.split(',').forEach(key => _filters.set(key, { key, text, data, checked: isFilterChecked(data, key) }))
@@ -301,18 +302,28 @@ const
301302
selectAll = () => {
302303
setMenuFilters(menuFilters.map(i => ({ ...i, checked: true })))
303304
setFiltersInBulk(col.key, menuFilters.map(f => f.key))
305+
setSelectedFiltersCount(menuFilters.length)
304306
},
305307
deselectAll = () => {
306308
setMenuFilters(menuFilters.map(i => ({ ...i, checked: false })))
307309
setFiltersInBulk(col.key, [])
310+
setSelectedFiltersCount(0)
308311
},
309312
getOnFilterChangeHandler = (data: S, key: S) => (_ev?: React.FormEvent<HTMLInputElement | HTMLElement>, checked?: B) => {
310313
setMenuFilters(filters => filters.map(f => f.key === key ? ({ ...f, checked }) : f))
311314
onFilterChange(data, key, checked)
315+
setSelectedFiltersCount( // Step 2
316+
checked
317+
? selectedFiltersCount + 1
318+
: selectedFiltersCount - 1
319+
)
312320
}
313321

314322
return (
315323
<div style={{ padding: 10 }}>
324+
<Fluent.Text variant='mediumPlus' styles={{ root: { paddingTop: 10, paddingBottom: 10, fontWeight: 'bold' } }} block>
325+
{`(${selectedFiltersCount} selected)`}
326+
</Fluent.Text>
316327
<Fluent.Text variant='mediumPlus' styles={{ root: { paddingTop: 10, paddingBottom: 10, fontWeight: 'bold' } }} block>Show only</Fluent.Text>
317328
<Fluent.Text variant='small'>
318329
<Fluent.Link onClick={selectAll}>Select All</Fluent.Link> | <Fluent.Link onClick={deselectAll}>Deselect All</Fluent.Link>
@@ -334,7 +345,7 @@ const
334345
},
335346
DataTable = React.forwardRef(({ model: m, onFilterChange, items, filteredItems, selection, selectedFilters, isMultiple, isSingle, groups, expandedRefs, onSortChange, setFiltersInBulk }: DataTable, ref) => {
336347
const
337-
[colContextMenuList, setColContextMenuList] = React.useState<Fluent.IContextualMenuProps | null>(null),
348+
[colContextMenuList, setColContextMenuList] = React.useState<Fluent.IContextualMenuProps | null>(null),
338349
onRenderMenuList = React.useCallback((col: WaveColumn) => (listProps?: Fluent.IContextualMenuListProps) => {
339350
return listProps ?
340351
<ContextualMenu
@@ -373,7 +384,8 @@ const
373384
return col
374385
}))
375386
}
376-
}, [onColumnContextMenu, onSortChange]),
387+
}
388+
, [onColumnContextMenu, onSortChange]),
377389
tableToWaveColumn = React.useCallback((c: TableColumn): WaveColumn => {
378390
const
379391
minWidth = c.min_width
@@ -578,9 +590,6 @@ const
578590
onRenderItemColumn={onRenderItemColumn}
579591
onRenderDetailsHeader={onRenderDetailsHeader}
580592
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'
584593
/>
585594
{colContextMenuList && <Fluent.ContextualMenu {...colContextMenuList} />}
586595
</>
@@ -931,11 +940,6 @@ export const
931940
const selectedItemKeys = selection.getSelection().map(item => item.key as S)
932941
wave.args[m.name] = selectedItemKeys
933942
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)
939943
}
940944
}), [m.name, m.events]),
941945
computeHeight = () => {
@@ -975,17 +979,19 @@ export const
975979
}, [m.pagination, m.events, m.name, filter, search, currentSort, initGroups])
976980

977981
React.useEffect(() => {
978-
skipNextEventEmit.current = true
979982
wave.args[m.name] = []
980983
if (isSingle && m.value) {
984+
skipNextEventEmit.current = true
981985
selection.setKeySelected(m.value, true, false)
986+
skipNextEventEmit.current = false
982987
wave.args[m.name] = [m.value]
983988
}
984989
else if (isMultiple && m.values) {
990+
skipNextEventEmit.current = true
985991
m.values.forEach(v => selection.setKeySelected(v, true, false))
992+
skipNextEventEmit.current = false
986993
wave.args[m.name] = m.values
987994
}
988-
skipNextEventEmit.current = false
989995
// eslint-disable-next-line react-hooks/exhaustive-deps
990996
}, [])
991997

0 commit comments

Comments
 (0)