diff --git a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts index c554b6287..c938aff1b 100644 --- a/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts +++ b/app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders.ts @@ -43,6 +43,7 @@ import React from "react"; import { ANVIL_CMG_CATEGORY_KEY, ANVIL_CMG_CATEGORY_LABEL, + DATASET_RESPONSE, } from "../../../../../site-config/anvil-cmg/category"; import { ROUTE_EXPORT_TO_TERRA, @@ -462,20 +463,19 @@ export const buildDRSURI = ( /** * Build props for ExportCurrentQuery component. - * @param _ - Void. + * @param datasetsResponse - Response model returned from datasets API. * @param viewContext - View context. * @returns model to be used as props for the ExportCurrentQuery component. */ export const buildExportCurrentQuery = ( - _: Void, - viewContext: ViewContext + datasetsResponse: DatasetsResponse, + viewContext: ViewContext ): React.ComponentProps => { - const { - fileManifestState: { filters, isFacetsLoading }, - } = viewContext; return { - isLoading: isFacetsLoading, - queries: getExportCurrentQueries(filters), + isLoading: viewContext.fileManifestState.isFacetsLoading, + queries: getExportCurrentQueries( + getExportCurrentQuerySelectedFilters(datasetsResponse, viewContext) + ), }; }; @@ -974,6 +974,19 @@ function getDatasetStatusBadge( }; } +/** + * Returns dataset ID from the given datasets response. + * @param datasetsResponse - Response model return from datasets API. + * @returns dataset ID. + */ +export function getDatasetId(datasetsResponse: DatasetsResponse): string { + return processEntityValue( + datasetsResponse.datasets, + "dataset_id", + LABEL.NONE + ); +} + /** * Returns dataset title from the given datasets response. * @param datasetsResponse - Response model return from datasets API. @@ -997,6 +1010,44 @@ export function getExportCurrentQueries(filters: Filters): CurrentQuery[] { return filters.map((filter) => mapCurrentQuery(filter, categoryKeyLabel)); } +/** + * Returns the export current query selected filters for the given file manifest state. + * @param datasetsResponse - Response model return from datasets API. + * @param viewContext - View context. + * @returns export current query selected filters. + */ +export function getExportCurrentQuerySelectedFilters( + datasetsResponse: DatasetsResponse, + viewContext: ViewContext +): Filters { + if (DATASET_RESPONSE.DATASETS in datasetsResponse) { + return getExportEntityCurrentQuerySelectedFilters( + datasetsResponse, + viewContext + ); + } + return viewContext.fileManifestState.filters; +} + +/** + * Returns the export entity current query selected filters for the given file manifest state. + * Dataset ID is filtered out from the current filters query, and dataset title is added. + * @param datasetsResponse - Response model return from datasets API. + * @param viewContext - View context. + * @returns export entity current query selected filters. + */ +export function getExportEntityCurrentQuerySelectedFilters( + datasetsResponse: DatasetsResponse, + viewContext: ViewContext +): Filters { + const filters = viewContext.fileManifestState.filters.filter(filterDatasetId); + const datasetTitleFilter: SelectedFilter = { + categoryKey: ANVIL_CMG_CATEGORY_KEY.DATASET_TITLE, + value: [getDatasetTitle(datasetsResponse)], + }; + return [datasetTitleFilter, ...filters]; +} + /** * Returns the export entity filters for the given datasets response. * @param datasetsResponse - Response model return from datasets API. @@ -1005,8 +1056,8 @@ export function getExportCurrentQueries(filters: Filters): CurrentQuery[] { function getExportEntityFilters(datasetsResponse: DatasetsResponse): Filters { return [ { - categoryKey: ANVIL_CMG_CATEGORY_KEY.DATASET_TITLE, - value: [getDatasetTitle(datasetsResponse)], + categoryKey: ANVIL_CMG_CATEGORY_KEY.DATASET_ID, + value: [getDatasetId(datasetsResponse)], }, ]; } @@ -1147,6 +1198,15 @@ function getFormFacets(fileManifestState: FileManifestState): FormFacet { }; } +/** + * Boolean to filter out any selected filters that have dataset ID as the category key. + * @param filter - Selected filter. + * @returns true if the filter category key is not dataset ID. + */ +function filterDatasetId(filter: SelectedFilter): boolean { + return filter.categoryKey !== ANVIL_CMG_CATEGORY_KEY.DATASET_ID; +} + /** * Returns true if the response is accessible, or when the response is ready. * @param datasetsResponse - Response model return from datasets API. diff --git a/site-config/anvil-cmg/category.ts b/site-config/anvil-cmg/category.ts index 300d8724f..e6d6d57e2 100644 --- a/site-config/anvil-cmg/category.ts +++ b/site-config/anvil-cmg/category.ts @@ -10,7 +10,7 @@ export const ANVIL_CMG_CATEGORY_KEY = { BIOSAMPLE_TYPE: "biosample_type", DATASET_ACCESSIBLE: "datasets.accessible", DATASET_CONSENT_GROUP: "datasets.consent_group", - DATASET_ID: "dataset_id", + DATASET_ID: "datasets.dataset_id", DATASET_REGISTERED_ID: "datasets.registered_identifier", DATASET_TITLE: "datasets.title", DIAGNOSE_DISEASE: "diagnoses.disease", @@ -55,3 +55,7 @@ export const ANVIL_CMG_CATEGORY_LABEL = { LIBRARY_ID: "Library Id", PREP_MATERIAL_NAME: "Library Preparation", }; + +export const DATASET_RESPONSE = { + DATASETS: "datasets", +};