@@ -1329,6 +1329,11 @@ const DBSearchPageFiltersComponent = ({
13291329 ) ;
13301330 } , [ filterState , source , parentSpanIdExpr ] ) ;
13311331
1332+ const { grouped, nonGrouped } = useMemo (
1333+ ( ) => groupFacetsByBaseName ( shownFacets ) ,
1334+ [ shownFacets ] ,
1335+ ) ;
1336+
13321337 return (
13331338 < Box className = { classes . filtersPanel } style = { { width : `${ size } %` } } >
13341339 < div className = { resizeStyles . resizeHandle } onMouseDown = { startResize } />
@@ -1480,135 +1485,127 @@ const DBSearchPageFiltersComponent = ({
14801485 )
14811486 ) }
14821487 { /* Show facets even when loading to ensure pinned filters are visible while loading */ }
1483- { ( ( ) => {
1484- const { grouped, nonGrouped } = groupFacetsByBaseName ( shownFacets ) ;
1485-
1486- return (
1487- < >
1488- { /* Render grouped facets as nested filter groups */ }
1489- { grouped . map ( group => (
1490- < NestedFilterGroup
1491- key = { group . key }
1492- data-testid = { `nested-filter-group-${ group . key } ` }
1493- name = { group . key }
1494- childFilters = { group . children }
1495- selectedValues = { group . children . reduce (
1496- ( acc , child ) => {
1497- acc [ child . key ] = filterState [ child . key ]
1498- ? filterState [ child . key ]
1499- : { included : new Set ( ) , excluded : new Set ( ) } ;
1500- return acc ;
1501- } ,
1502- { } as Record <
1503- string ,
1504- {
1505- included : Set < string | boolean > ;
1506- excluded : Set < string | boolean > ;
1507- }
1508- > ,
1509- ) }
1510- onChange = { ( key , value ) => {
1511- setFilterValue ( key , value ) ;
1512- } }
1513- onClearClick = { key => clearFilter ( key ) }
1514- onOnlyClick = { ( key , value ) => {
1515- setFilterValue ( key , value , 'only' ) ;
1516- } }
1517- onExcludeClick = { ( key , value ) => {
1518- setFilterValue ( key , value , 'exclude' ) ;
1519- } }
1520- onPinClick = { ( key , value ) => toggleFilterPin ( key , value ) }
1521- isPinned = { ( key , value ) => isFilterPinned ( key , value ) }
1522- onFieldPinClick = { key => toggleFieldPin ( key ) }
1523- isFieldPinned = { key => isFieldPinned ( key ) }
1524- onColumnToggle = { onColumnToggle }
1525- displayedColumns = { displayedColumns }
1526- onLoadMore = { loadMoreFilterValuesForKey }
1527- loadMoreLoading = { group . children . reduce (
1528- ( acc , child ) => {
1529- acc [ child . key ] = loadMoreLoadingKeys . has ( child . key ) ;
1530- return acc ;
1531- } ,
1532- { } as Record < string , boolean > ,
1533- ) }
1534- hasLoadedMore = { group . children . reduce (
1535- ( acc , child ) => {
1536- acc [ child . key ] = Boolean ( extraFacets [ child . key ] ) ;
1537- return acc ;
1538- } ,
1539- { } as Record < string , boolean > ,
1540- ) }
1541- isDefaultExpanded = {
1542- // open by default if has selected values or pinned children
1543- group . children . some (
1544- child =>
1545- ( filterState [ child . key ] &&
1546- ( filterState [ child . key ] . included . size > 0 ||
1547- filterState [ child . key ] . excluded . size > 0 ) ) ||
1548- isFieldPinned ( child . key ) ,
1549- )
1550- }
1551- chartConfig = { chartConfig }
1552- isLive = { isLive }
1553- />
1554- ) ) }
1555-
1556- { /* Render non-grouped facets as regular filter groups */ }
1557- { nonGrouped . map ( facet => (
1558- < FilterGroup
1559- key = { facet . key }
1560- data-testid = { `filter-group-${ facet . key } ` }
1561- name = { cleanedFacetName ( facet . key ) }
1562- options = { facet . value . map ( value => ( {
1563- value,
1564- label : value . toString ( ) ,
1565- } ) ) }
1566- optionsLoading = { isFacetsLoading }
1567- selectedValues = {
1568- filterState [ facet . key ]
1569- ? filterState [ facet . key ]
1570- : { included : new Set ( ) , excluded : new Set ( ) }
1571- }
1572- onChange = { value => {
1573- setFilterValue ( facet . key , value ) ;
1574- } }
1575- onClearClick = { ( ) => clearFilter ( facet . key ) }
1576- onOnlyClick = { value => {
1577- setFilterValue ( facet . key , value , 'only' ) ;
1578- } }
1579- onExcludeClick = { value => {
1580- setFilterValue ( facet . key , value , 'exclude' ) ;
1581- } }
1582- onPinClick = { value => toggleFilterPin ( facet . key , value ) }
1583- isPinned = { value => isFilterPinned ( facet . key , value ) }
1584- onFieldPinClick = { ( ) => toggleFieldPin ( facet . key ) }
1585- isFieldPinned = { isFieldPinned ( facet . key ) }
1586- onColumnToggle = {
1587- onColumnToggle
1588- ? ( ) => onColumnToggle ( facet . key )
1589- : undefined
1590- }
1591- isColumnDisplayed = { displayedColumns ?. includes ( facet . key ) }
1592- onLoadMore = { loadMoreFilterValuesForKey }
1593- loadMoreLoading = { loadMoreLoadingKeys . has ( facet . key ) }
1594- hasLoadedMore = { Boolean ( extraFacets [ facet . key ] ) }
1595- isDefaultExpanded = {
1596- // open by default if PK, or has selected values
1597- isFieldPrimary ( tableMetadata , facet . key ) ||
1598- isFieldPinned ( facet . key ) ||
1599- ( filterState [ facet . key ] &&
1600- ( filterState [ facet . key ] . included . size > 0 ||
1601- filterState [ facet . key ] . excluded . size > 0 ||
1602- filterState [ facet . key ] . range != null ) )
1488+ < >
1489+ { /* Render grouped facets as nested filter groups */ }
1490+ { grouped . map ( group => (
1491+ < NestedFilterGroup
1492+ key = { group . key }
1493+ data-testid = { `nested-filter-group-${ group . key } ` }
1494+ name = { group . key }
1495+ childFilters = { group . children }
1496+ selectedValues = { group . children . reduce (
1497+ ( acc , child ) => {
1498+ acc [ child . key ] = filterState [ child . key ]
1499+ ? filterState [ child . key ]
1500+ : { included : new Set ( ) , excluded : new Set ( ) } ;
1501+ return acc ;
1502+ } ,
1503+ { } as Record <
1504+ string ,
1505+ {
1506+ included : Set < string | boolean > ;
1507+ excluded : Set < string | boolean > ;
16031508 }
1604- chartConfig = { chartConfig }
1605- isLive = { isLive }
1606- onRangeChange = { range => setFilterRange ( facet . key , range ) }
1607- />
1608- ) ) }
1609- </ >
1610- ) ;
1611- } ) ( ) }
1509+ > ,
1510+ ) }
1511+ onChange = { ( key , value ) => {
1512+ setFilterValue ( key , value ) ;
1513+ } }
1514+ onClearClick = { key => clearFilter ( key ) }
1515+ onOnlyClick = { ( key , value ) => {
1516+ setFilterValue ( key , value , 'only' ) ;
1517+ } }
1518+ onExcludeClick = { ( key , value ) => {
1519+ setFilterValue ( key , value , 'exclude' ) ;
1520+ } }
1521+ onPinClick = { ( key , value ) => toggleFilterPin ( key , value ) }
1522+ isPinned = { ( key , value ) => isFilterPinned ( key , value ) }
1523+ onFieldPinClick = { key => toggleFieldPin ( key ) }
1524+ isFieldPinned = { key => isFieldPinned ( key ) }
1525+ onColumnToggle = { onColumnToggle }
1526+ displayedColumns = { displayedColumns }
1527+ onLoadMore = { loadMoreFilterValuesForKey }
1528+ loadMoreLoading = { group . children . reduce (
1529+ ( acc , child ) => {
1530+ acc [ child . key ] = loadMoreLoadingKeys . has ( child . key ) ;
1531+ return acc ;
1532+ } ,
1533+ { } as Record < string , boolean > ,
1534+ ) }
1535+ hasLoadedMore = { group . children . reduce (
1536+ ( acc , child ) => {
1537+ acc [ child . key ] = Boolean ( extraFacets [ child . key ] ) ;
1538+ return acc ;
1539+ } ,
1540+ { } as Record < string , boolean > ,
1541+ ) }
1542+ isDefaultExpanded = {
1543+ // open by default if has selected values or pinned children
1544+ group . children . some (
1545+ child =>
1546+ ( filterState [ child . key ] &&
1547+ ( filterState [ child . key ] . included . size > 0 ||
1548+ filterState [ child . key ] . excluded . size > 0 ) ) ||
1549+ isFieldPinned ( child . key ) ,
1550+ )
1551+ }
1552+ chartConfig = { chartConfig }
1553+ isLive = { isLive }
1554+ />
1555+ ) ) }
1556+
1557+ { /* Render non-grouped facets as regular filter groups */ }
1558+ { nonGrouped . map ( facet => (
1559+ < FilterGroup
1560+ key = { facet . key }
1561+ data-testid = { `filter-group-${ facet . key } ` }
1562+ name = { cleanedFacetName ( facet . key ) }
1563+ options = { facet . value . map ( value => ( {
1564+ value,
1565+ label : value . toString ( ) ,
1566+ } ) ) }
1567+ optionsLoading = { isFacetsLoading }
1568+ selectedValues = {
1569+ filterState [ facet . key ]
1570+ ? filterState [ facet . key ]
1571+ : { included : new Set ( ) , excluded : new Set ( ) }
1572+ }
1573+ onChange = { value => {
1574+ setFilterValue ( facet . key , value ) ;
1575+ } }
1576+ onClearClick = { ( ) => clearFilter ( facet . key ) }
1577+ onOnlyClick = { value => {
1578+ setFilterValue ( facet . key , value , 'only' ) ;
1579+ } }
1580+ onExcludeClick = { value => {
1581+ setFilterValue ( facet . key , value , 'exclude' ) ;
1582+ } }
1583+ onPinClick = { value => toggleFilterPin ( facet . key , value ) }
1584+ isPinned = { value => isFilterPinned ( facet . key , value ) }
1585+ onFieldPinClick = { ( ) => toggleFieldPin ( facet . key ) }
1586+ isFieldPinned = { isFieldPinned ( facet . key ) }
1587+ onColumnToggle = {
1588+ onColumnToggle ? ( ) => onColumnToggle ( facet . key ) : undefined
1589+ }
1590+ isColumnDisplayed = { displayedColumns ?. includes ( facet . key ) }
1591+ onLoadMore = { loadMoreFilterValuesForKey }
1592+ loadMoreLoading = { loadMoreLoadingKeys . has ( facet . key ) }
1593+ hasLoadedMore = { Boolean ( extraFacets [ facet . key ] ) }
1594+ isDefaultExpanded = {
1595+ // open by default if PK, or has selected values
1596+ isFieldPrimary ( tableMetadata , facet . key ) ||
1597+ isFieldPinned ( facet . key ) ||
1598+ ( filterState [ facet . key ] &&
1599+ ( filterState [ facet . key ] . included . size > 0 ||
1600+ filterState [ facet . key ] . excluded . size > 0 ||
1601+ filterState [ facet . key ] . range != null ) )
1602+ }
1603+ chartConfig = { chartConfig }
1604+ isLive = { isLive }
1605+ onRangeChange = { range => setFilterRange ( facet . key , range ) }
1606+ />
1607+ ) ) }
1608+ </ >
16121609
16131610 < Button
16141611 variant = "secondary"
0 commit comments