Skip to content

Commit 7b08ddf

Browse files
fix: organism name filter not working in annotations and tomograms tabs (#1960)
* fix: organism name filter not working in annotations and tomograms tabs Fixes organism name filtering in deposition data grouping hook by: - Adding selectedOrganismNames from filter state to hook logic - Implementing filtered organism count calculation when filters are active - Updating organism data generation to respect selected organism filters Resolves GitHub issue #1959 * extract util
1 parent 122ff61 commit 7b08ddf

File tree

1 file changed

+46
-6
lines changed

1 file changed

+46
-6
lines changed

frontend/packages/data-portal/app/hooks/useDepositionGroupedData.ts

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,10 @@ export function useDepositionGroupedData(
4242
const [type] = useActiveDepositionDataType()
4343
const { enabled = true } = options
4444

45-
// Get selected dataset IDs from filter state
45+
// Get selected dataset IDs and organism names from filter state
4646
const {
4747
ids: { datasets: selectedDatasetIds },
48+
sampleAndExperimentConditions: { organismNames: selectedOrganismNames },
4849
} = useFilter()
4950

5051
const { fetchRunCounts = true, onError, onLoadingChange } = options
@@ -180,13 +181,19 @@ export function useDepositionGroupedData(
180181

181182
// Calculate filtered counts after filtering
182183
const filteredDatasetCount = filteredDatasets.length
183-
const filteredOrganismCount = [
184+
185+
const allFilteredOrganismNames = [
184186
...new Set(
185187
filteredDatasets
186188
.map((dataset) => dataset.organismName)
187189
.filter(isDefined),
188190
),
189-
].length
191+
]
192+
193+
const filteredOrganismCount = filterOrganismsBySelection(
194+
allFilteredOrganismNames,
195+
selectedOrganismNames,
196+
).length
190197

191198
// Transform datasets with count data
192199
const datasetsWithCounts: DatasetWithCounts[] = filteredDatasets.map(
@@ -204,11 +211,22 @@ export function useDepositionGroupedData(
204211
datasets: datasetsWithCounts,
205212
organismCounts,
206213
groupBy,
214+
selectedOrganismNames,
207215
})
208216

217+
// Filter organism counts based on organism filters when in organism grouping mode
218+
const filteredOrganismCounts =
219+
groupBy === GroupByOption.Organism && selectedOrganismNames.length > 0
220+
? Object.fromEntries(
221+
Object.entries(organismCounts).filter(([organismName]) =>
222+
selectedOrganismNames.includes(organismName),
223+
),
224+
)
225+
: organismCounts
226+
209227
// Consolidate all count data
210228
const counts: DepositionCounts = {
211-
organisms: organismCounts,
229+
organisms: filteredOrganismCounts,
212230
annotations: annotationCounts,
213231
tomograms: tomogramCounts,
214232
runs: runCounts,
@@ -237,36 +255,58 @@ export function useDepositionGroupedData(
237255
runCountsQuery.data,
238256
groupBy,
239257
selectedDatasetIds,
258+
selectedOrganismNames,
240259
])
241260

242261
return result
243262
}
244263

264+
/**
265+
* Helper function to filter organism names based on selected organism names
266+
*/
267+
function filterOrganismsBySelection(
268+
organismNames: string[],
269+
selectedOrganismNames: string[],
270+
): string[] {
271+
return selectedOrganismNames.length > 0
272+
? organismNames.filter((name) => selectedOrganismNames.includes(name))
273+
: organismNames
274+
}
275+
245276
/**
246277
* Helper function to generate organism data based on grouping configuration
247278
*/
248279
function generateOrganismData({
249280
datasets,
250281
organismCounts,
251282
groupBy,
283+
selectedOrganismNames,
252284
}: {
253285
datasets: DatasetWithCounts[]
254286
organismCounts: Record<string, number>
255287
groupBy: GroupByOption
288+
selectedOrganismNames: string[]
256289
}): OrganismData[] {
257290
// Only generate organism data for organism-grouped views
258291
if (groupBy !== GroupByOption.Organism) {
259292
return []
260293
}
261294

262295
// Extract unique organisms from datasets
263-
const organismNames = [
296+
const allOrganismNames = [
264297
...new Set(
265298
datasets.map((dataset) => dataset.organismName).filter(isDefined),
266299
),
267300
].sort()
268301

269-
return organismNames.map((name) => {
302+
// Filter organisms based on selected organism names
303+
// If no organism filters are active, return all organisms
304+
const filteredOrganismNames = filterOrganismsBySelection(
305+
allOrganismNames,
306+
selectedOrganismNames,
307+
)
308+
309+
return filteredOrganismNames.map((name) => {
270310
// Count datasets containing this organism
271311
const datasetCount = datasets.filter(
272312
(dataset) => dataset.organismName === name,

0 commit comments

Comments
 (0)