From bdf83ec627f4d5d49bb6a04b5663e0ddb63b4be0 Mon Sep 17 00:00:00 2001 From: Colin Diesh Date: Sun, 31 Dec 2023 10:07:00 -0500 Subject: [PATCH] Fix metadata facet filters being blank (#4154) --- .../components/faceted/FacetFilter.tsx | 13 ++++----- .../components/faceted/FacetFilters.tsx | 27 ++++++++++--------- .../components/faceted/FacetedSelector.tsx | 22 +++------------ .../components/faceted/util.ts | 13 +++++++++ .../facetedModel.ts | 12 ++++----- .../HierarchicalTrackSelectorWidget/model.ts | 11 ++++++++ 6 files changed, 52 insertions(+), 46 deletions(-) create mode 100644 plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.tsx b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.tsx index b37a70e153..211a2ae584 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.tsx +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilter.tsx @@ -55,25 +55,22 @@ function ExpandButton({ const FacetFilter = observer(function ({ column, vals, - width, model, }: { column: { field: string } vals: [string, number][] - width: number model: HierarchicalTrackSelectorModel }) { const { classes } = useStyles() const [visible, setVisible] = useState(true) const { faceted } = model const { filters } = faceted + const { field } = column return ( - -
- {column.field} - model.faceted.setFilter(column.field, [])} - /> + +
+ {field} + faceted.setFilter(field, [])} /> setVisible(!visible)} />
{visible ? ( diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.tsx b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.tsx index 86b83bca82..17bb2cbcc5 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.tsx +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.tsx @@ -1,17 +1,18 @@ import React from 'react' +import { observer } from 'mobx-react' + +// locals import FacetFilter from './FacetFilter' import { HierarchicalTrackSelectorModel } from '../../model' -import { observer } from 'mobx-react' +import { Row, getRowStr } from './util' const FacetFilters = observer(function ({ rows, columns, - width, model, }: { - rows: Record[] + rows: Row[] columns: { field: string }[] - width: number model: HierarchicalTrackSelectorModel }) { const { faceted } = model @@ -41,7 +42,7 @@ const FacetFilters = observer(function ({ for (const facet of ret) { const elt = uniqs.get(facet)! for (const row of currentRows) { - const key = `${row[facet] || ''}` + const key = getRowStr(facet, row) const val = elt.get(key) // we don't allow filtering on empty yet if (key) { @@ -55,19 +56,19 @@ const FacetFilters = observer(function ({ const filter = filters.get(facet)?.length ? new Set(filters.get(facet)) : undefined - currentRows = currentRows.filter(row => { - return filter !== undefined ? filter.has(row[facet] as string) : true - }) + + currentRows = currentRows.filter(row => + filter !== undefined ? filter.has(getRowStr(facet, row)) : true, + ) } return (
- {facets.map(column => ( + {facets.map(c => ( ))} diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.tsx b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.tsx index 5db4da25bc..8dcbbb5815 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.tsx +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.tsx @@ -46,7 +46,7 @@ const FacetedSelector = observer(function FacetedSelector({ model: HierarchicalTrackSelectorModel }) { const { classes } = useStyles() - const { view, selection, faceted } = model + const { view, selection, shownTrackIds, faceted } = model const { rows, panelWidth, @@ -61,7 +61,6 @@ const FacetedSelector = observer(function FacetedSelector({ } = faceted const { pluginManager } = getEnv(model) const { ref, scrollLeft } = useResizeBar() - const tracks = view.tracks as AnyConfigurationModel[] const widthsDebounced = useDebounce(widths, 200) const columns = [ @@ -102,10 +101,6 @@ const FacetedSelector = observer(function FacetedSelector({ })), ] - const shownTrackIds = new Set( - tracks.map(t => t.configuration.trackId as string), - ) - return ( <> @@ -197,19 +192,8 @@ const FacetedSelector = observer(function FacetedSelector({ onDrag={dist => faceted.setPanelWidth(panelWidth - dist)} className={classes.resizeHandle} /> -
- +
+
) : null} diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts new file mode 100644 index 0000000000..49c388cc7c --- /dev/null +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts @@ -0,0 +1,13 @@ +export interface Row { + id: string + metadata?: Record + [key: string]: unknown +} + +export function getRowStr(facet: string, row: Row) { + return `${ + (facet.startsWith('metadata.') + ? row.metadata?.[facet.replace('metadata.', '')] + : row[facet]) || '' + }` +} diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts index 68b3cf4463..8e8bf99d3e 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts @@ -12,6 +12,7 @@ import { } from '@jbrowse/core/util' import { autorun, observable } from 'mobx' import { getRootKeys, findNonSparseKeys } from './facetedUtil' +import { getRowStr } from './components/faceted/util' const nonMetadataKeys = ['category', 'adapter', 'description'] as const @@ -119,12 +120,9 @@ export function facetedStateTreeF() { get rows() { const session = getSession(self) const { allTrackConfigurations, filterText } = self - // metadata is spread onto the object for easier access and sorting - // by the mui data grid (it's unable to sort by nested objects) return allTrackConfigurations .filter(conf => matches(filterText, conf, session)) .map(track => { - const metadata = readConfObject(track, 'metadata') return { id: track.trackId as string, conf: track, @@ -132,7 +130,10 @@ export function facetedStateTreeF() { category: readConfObject(track, 'category')?.join(', ') as string, adapter: readConfObject(track, 'adapter')?.type as string, description: readConfObject(track, 'description') as string, - metadata, + metadata: readConfObject(track, 'metadata') as Record< + string, + unknown + >, } as const }) }, @@ -181,8 +182,7 @@ export function facetedStateTreeF() { .filter(f => f[1].length > 0) .map(([key, val]) => [key, new Set(val)] as const) return self.rows.filter(row => - // @ts-expect-error - arrFilters.every(([key, val]) => val.has(row[key])), + arrFilters.every(([key, val]) => val.has(getRowStr(key, row))), ) }, })) diff --git a/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts b/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts index 67c33d74d6..57d26bbef0 100644 --- a/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts +++ b/plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts @@ -92,6 +92,17 @@ export default function stateTreeFactory(pluginManager: PluginManager) { favoritesCounter: 0, })) .views(self => ({ + /** + * #getter + */ + get shownTrackIds() { + return new Set( + self.view?.tracks?.map( + (t: { configuration: { trackId: string } }) => + t.configuration.trackId, + ), + ) + }, /** * #getter */