diff --git a/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx b/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx index 750e7e97c038140356e78a4680306d4c857fc4c2..44fd0a0b3e1ba4fc46bf9c857da5e1eef102289b 100644 --- a/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx +++ b/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx @@ -66,6 +66,8 @@ export const SearchBar = (): JSX.Element => { }; const handleSearchClick = (): void => { + if (!currentTab) return; + openSearchDrawerIfClosed(currentTab); }; diff --git a/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/ConnectedBioEntitiesList.component.test.tsx b/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/ConnectedBioEntitiesList.component.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0fe3a588ecd06ed39cb31a05821f63f31d6a3ad4 --- /dev/null +++ b/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/ConnectedBioEntitiesList.component.test.tsx @@ -0,0 +1,63 @@ +/* eslint-disable no-magic-numbers */ +import { getReduxWrapperWithStore } from '@/utils/testing/getReduxWrapperWithStore'; +import { InitialStoreState } from '@/utils/testing/getReduxStoreActionsListener'; +import { StoreType } from '@/redux/store'; +import { render, screen } from '@testing-library/react'; +import { bioEntitiesContentFixture } from '@/models/fixtures/bioEntityContentsFixture'; +import { BIOENTITY_INITIAL_STATE_MOCK } from '@/redux/bioEntity/bioEntity.mock'; +import { ConnectedBioEntitiesList } from './ConnectedBioEntitiesList.component'; + +const renderComponent = (initialStoreState: InitialStoreState = {}): { store: StoreType } => { + const { Wrapper, store } = getReduxWrapperWithStore(initialStoreState); + + return ( + render( + <Wrapper> + <ConnectedBioEntitiesList /> + </Wrapper>, + ), + { + store, + } + ); +}; + +describe('ConnectedBioEntitiesList', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('renders loading indicator when bioEntityLoading is pending', () => { + renderComponent({ + bioEntity: { + ...BIOENTITY_INITIAL_STATE_MOCK, + loading: 'pending', + }, + }); + + const loadingIndicator = screen.getByTestId('loading-indicator'); + + expect(loadingIndicator).toBeVisible(); + }); + + it('renders list of bio entities when bioEntityData is available', () => { + const bioEntityData = [bioEntitiesContentFixture[0]]; + + renderComponent({ + bioEntity: { + ...BIOENTITY_INITIAL_STATE_MOCK, + data: [ + { + searchQueryElement: '', + loading: 'succeeded', + error: { name: '', message: '' }, + data: bioEntityData, + }, + ], + }, + }); + + expect(screen.queryByTestId('loading-indicator')).not.toBeInTheDocument(); + expect(screen.queryByText(bioEntitiesContentFixture[0].bioEntity.name)).toBeVisible(); + }); +}); diff --git a/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/ConnectedBioEntitiesList.component.tsx b/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/ConnectedBioEntitiesList.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..04c02e458ed6a5413190a0b832eb399ac6ef85f2 --- /dev/null +++ b/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/ConnectedBioEntitiesList.component.tsx @@ -0,0 +1,30 @@ +import { + bioEntityDataListSelector, + bioEntityLoadingSelector, +} from '@/redux/bioEntity/bioEntity.selectors'; +import { useAppSelector } from '@/redux/hooks/useAppSelector'; +import { LoadingIndicator } from '@/shared/LoadingIndicator'; +import { BioEntitiesPinsListItem } from '../../SearchDrawerWrapper/BioEntitiesResultsList/BioEntitiesPinsList/BioEntitiesPinsListItem'; + +export const ConnectedBioEntitiesList = (): React.ReactNode => { + const bioEntityLoading = useAppSelector(bioEntityLoadingSelector); + const bioEntityData = useAppSelector(bioEntityDataListSelector); + const isPending = bioEntityLoading === 'pending'; + + if (isPending) { + return <LoadingIndicator />; + } + + return ( + <div> + {bioEntityData && + bioEntityData.map(item => ( + <BioEntitiesPinsListItem + name={item.bioEntity.name} + pin={item.bioEntity} + key={item.bioEntity.name} + /> + ))} + </div> + ); +}; diff --git a/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/index.ts b/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..beb271ba06a0417936a140296bfe6f94801d0540 --- /dev/null +++ b/src/components/Map/Drawer/ReactionDrawer/ConnectedBioEntitiesList/index.ts @@ -0,0 +1 @@ +export { ConnectedBioEntitiesList } from './ConnectedBioEntitiesList.component'; diff --git a/src/components/Map/Drawer/ReactionDrawer/ReactionDrawer.component.tsx b/src/components/Map/Drawer/ReactionDrawer/ReactionDrawer.component.tsx index 9f6a8c4c3a130a2986a2a7cb15879fa93cb6cca9..2ba8e96d0a91fd7c88bf022494114eedb3ea63ea 100644 --- a/src/components/Map/Drawer/ReactionDrawer/ReactionDrawer.component.tsx +++ b/src/components/Map/Drawer/ReactionDrawer/ReactionDrawer.component.tsx @@ -5,6 +5,7 @@ import { import { DrawerHeading } from '@/shared/DrawerHeading'; import { useSelector } from 'react-redux'; import { ReferenceGroup } from './ReferenceGroup'; +import { ConnectedBioEntitiesList } from './ConnectedBioEntitiesList'; export const ReactionDrawer = (): React.ReactNode => { const reaction = useSelector(currentDrawerReactionSelector); @@ -23,7 +24,7 @@ export const ReactionDrawer = (): React.ReactNode => { </> } /> - <div className="flex flex-col gap-6 p-6"> + <div className="flex h-[calc(100%-93px)] max-h-[calc(100%-93px)] flex-col gap-6 overflow-y-auto p-6"> <div className="text-sm font-normal"> Type: <b className="font-semibold">{reaction.type}</b> </div> @@ -32,6 +33,7 @@ export const ReactionDrawer = (): React.ReactNode => { {referencesGrouped.map(group => ( <ReferenceGroup key={group.source} group={group} /> ))} + <ConnectedBioEntitiesList /> </div> </div> ); diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.test.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.test.tsx index 5e85e6ae53922e84d030d6384dc5b5350bf43b86..bcd33a53cc7290ad6a7be91825a0ea8553796db1 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.test.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.test.tsx @@ -54,7 +54,7 @@ describe('DrugsAccordion - component', () => { }, }); - expect(screen.getByText('Chemicals (4)')).toBeInTheDocument(); + expect(screen.getByText('Small molecule targets (4)')).toBeInTheDocument(); }); it('should display loading indicator while waiting for chemicals search response', () => { renderComponent({ @@ -77,7 +77,7 @@ describe('DrugsAccordion - component', () => { }, }); - expect(screen.getByText('Chemicals (Loading...)')).toBeInTheDocument(); + expect(screen.getByText('Small molecule targets (Loading...)')).toBeInTheDocument(); }); it('should navigate user to chemical results list after clicking button', async () => { const { store } = renderComponent({ diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.tsx index 36dc7c61cab95a7f43df3f3e5c7ead3bf8f40225..4730eb40a26204be394a5633ff360dd83f829f6a 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/ChemicalsAccordion/ChemicalsAccordion.component.tsx @@ -29,7 +29,7 @@ export const ChemicalsAccordion = (): JSX.Element => { onClick={onAccordionClick} disabled={isPending || isChemicalsEmpty} > - Chemicals + Small molecule targets {isPending && ' (Loading...)'} {isSucceeded && ` (${chemicalsNumber})`} </AccordionItemButton> diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.test.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.test.tsx index dfdbab89420af6132fbc965e055ad8ae0c617181..c114185cc4130ac2dd5330b4b0752269a351aaa3 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.test.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.test.tsx @@ -47,7 +47,7 @@ describe('DrugsAccordion - component', () => { error: { name: '', message: '' }, }, }); - expect(screen.getByText('Drugs (4)')).toBeInTheDocument(); + expect(screen.getByText('Drug targets (4)')).toBeInTheDocument(); }); it('should display loading indicator while waiting for drug search response', () => { renderComponent({ @@ -64,7 +64,7 @@ describe('DrugsAccordion - component', () => { error: { name: '', message: '' }, }, }); - expect(screen.getByText('Drugs (Loading...)')).toBeInTheDocument(); + expect(screen.getByText('Drug targets (Loading...)')).toBeInTheDocument(); }); it('should navigate user to drugs results list after clicking button', async () => { const { store } = renderComponent({ diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.tsx index e92ba2bd1d565d99c5200c69bf73e70fd0820603..4dba78863a7a49917e6399a2b856bd6bde502615 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/GroupedSearchResults/DrugsAccordion/DrugsAccordion.component.tsx @@ -26,7 +26,7 @@ export const DrugsAccordion = (): JSX.Element => { onClick={onAccordionClick} disabled={isPending || isDrugsEmpty} > - Drugs + Drug targets {isPending && ' (Loading...)'} {isSucceeded && ` (${drugsNumber})`} </AccordionItemButton> diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.test.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.test.tsx index b1810ecd93fe5dbfd52efd4fdbebdcc5b211de77..280246c664c61e8c7263fd08edb4f26a8a0887c1 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.test.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.test.tsx @@ -7,7 +7,7 @@ import { getReduxWrapperWithStore, } from '@/utils/testing/getReduxWrapperWithStore'; import { render, screen } from '@testing-library/react'; -import { PinItem, PinTypeWithNone } from '../PinsList/PinsList.types'; +import { PinItem } from '../PinsList/PinsList.types'; import { AccordionsDetails } from './AccordionsDetails.component'; const DRUGS_PINS_LIST = drugsFixture.map(drug => ({ @@ -24,7 +24,6 @@ const CHEMICALS_PINS_LIST = chemicalsFixture.map(chemical => ({ const renderComponent = ( pinsList: PinItem[], - type: PinTypeWithNone, initialStoreState: InitialStoreState = {}, ): { store: StoreType } => { const { Wrapper, store } = getReduxWrapperWithStore(initialStoreState); @@ -32,7 +31,7 @@ const renderComponent = ( return ( render( <Wrapper> - <AccordionsDetails pinsList={pinsList} type={type} /> + <AccordionsDetails pinsList={pinsList} /> </Wrapper>, ), { @@ -43,21 +42,21 @@ const renderComponent = ( describe('AccordionsDetails - component', () => { it('should display name of drug', () => { - renderComponent(DRUGS_PINS_LIST, 'drugs'); + renderComponent(DRUGS_PINS_LIST); const drugName = drugsFixture[0].name; expect(screen.getByText(drugName, { exact: false })).toBeInTheDocument(); }); it('should display description of drug', () => { - renderComponent(DRUGS_PINS_LIST, 'drugs'); + renderComponent(DRUGS_PINS_LIST); const drugDescription = drugsFixture[0].description ? drugsFixture[0].description : ''; expect(screen.getByTestId('details-description').textContent).toContain(drugDescription); }); it('should display synonyms of drug', () => { - renderComponent(DRUGS_PINS_LIST, 'drugs'); + renderComponent(DRUGS_PINS_LIST); const firstDrugSynonym = drugsFixture[0].synonyms[0]; const secondDrugSynonym = drugsFixture[0].synonyms[1]; @@ -65,15 +64,8 @@ describe('AccordionsDetails - component', () => { expect(screen.getByText(firstDrugSynonym, { exact: false })).toBeInTheDocument(); expect(screen.getByText(secondDrugSynonym, { exact: false })).toBeInTheDocument(); }); - it('should display blood brain barrier for drug', () => { - renderComponent(DRUGS_PINS_LIST, 'drugs'); - - const drugAdditionalInfo = drugsFixture[0].bloodBrainBarrier; - - expect(screen.getByText(drugAdditionalInfo, { exact: false })).toBeInTheDocument(); - }); it('should display direct evidence publications for chemicals', () => { - renderComponent(CHEMICALS_PINS_LIST, 'chemicals'); + renderComponent(CHEMICALS_PINS_LIST); const chemicalsAdditionalInfo = chemicalsFixture[0].directEvidence ? chemicalsFixture[0].directEvidence diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.tsx index 6044b3cd3a8cafacde0f4b2a96bcf14b47da957b..79678e9ef36b3f7c02316afab1c69a5a746a4130 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/AccordionsDetails/AccordionsDetails.component.tsx @@ -5,9 +5,8 @@ import { AccordionItemHeading, AccordionItemPanel, } from '@/shared/Accordion'; -import { PinItem, PinTypeWithNone } from '../PinsList/PinsList.types'; +import { PinItem } from '../PinsList/PinsList.types'; import { - getAdditionalInfo, getEntityDescriptions, getEntityNames, getEntitySynonyms, @@ -15,46 +14,29 @@ import { interface AccordionsDetailsProps { pinsList: PinItem[]; - type: PinTypeWithNone; } -export const AccordionsDetails = ({ pinsList, type }: AccordionsDetailsProps): JSX.Element => { +export const AccordionsDetails = ({ pinsList }: AccordionsDetailsProps): JSX.Element => { return ( - <div data-testid="accordions-details"> + <div data-testid="accordions-details" className="mb-4"> + <div className="px-6 py-4"> + <span className="font-semibold">Name:</span> {getEntityNames(pinsList)} + </div> <Accordion allowZeroExpanded className="px-6"> <AccordionItem> <AccordionItemHeading> - <AccordionItemButton className="capitalize">{type}</AccordionItemButton> - </AccordionItemHeading> - <AccordionItemPanel>{getEntityNames(pinsList)}</AccordionItemPanel> - </AccordionItem> - <AccordionItem> - <AccordionItemHeading> - <AccordionItemButton>Description</AccordionItemButton> + <AccordionItemButton>Details</AccordionItemButton> </AccordionItemHeading> <AccordionItemPanel> - <div data-testid="details-description">{getEntityDescriptions(pinsList)}</div> + <div data-testid="details-description" className="mb-5"> + <span className="font-semibold">Description:</span> {getEntityDescriptions(pinsList)} + </div> + <div> + <span className="font-semibold">Synonyms:</span> {getEntitySynonyms(pinsList)} + </div> </AccordionItemPanel> </AccordionItem> - <AccordionItem> - <AccordionItemHeading> - <AccordionItemButton>Synonyms</AccordionItemButton> - </AccordionItemHeading> - <AccordionItemPanel>{getEntitySynonyms(pinsList)}</AccordionItemPanel> - </AccordionItem> </Accordion> - {type === 'drugs' && ( - <div className="flex justify-between px-6 py-4 text-sm font-bold"> - <div>Blood brain barrier</div> - <div>{getAdditionalInfo(pinsList, type)}</div> - </div> - )} - {type === 'chemicals' && ( - <div className="flex justify-between px-6 py-4 text-sm"> - <div className="font-bold">Direct Evidence Publications</div> - <div>{getAdditionalInfo(pinsList, type)}</div> - </div> - )} </div> ); }; diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/PinsList/PinsList.component.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/PinsList/PinsList.component.tsx index 3a734b7d7dadfa5ea848dbf04657d1e9793a9dcb..9f0b9e949d480487a32fbc560bb64fcc722e05cd 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/PinsList/PinsList.component.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/PinsList/PinsList.component.tsx @@ -21,7 +21,7 @@ export const PinsList = ({ pinsList, type }: PinsListProps): JSX.Element => { return ( <div className="h-[calc(100%-214px)] max-h-[calc(100%-214px)] overflow-auto"> - <AccordionsDetails pinsList={pinsList} type={type} /> + <AccordionsDetails pinsList={pinsList} /> <ul className="px-6 py-2" data-testid="pins-list"> {targetElements.map(({ target, element }) => ( <PinsListItem diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.test.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.test.tsx index 4601d1aa7decd26af61741f6162fcf85f504512a..0be1f6ddb98cabbae809ae7bca96b922e69660e1 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.test.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.test.tsx @@ -67,7 +67,7 @@ describe('ResultsList - component ', () => { renderComponent(INITIAL_STATE); const headingText = screen.getByTestId('drawer-heading-text'); - expect(headingText.textContent).toBe('drugs'); + expect(headingText.textContent).toBe('Drug targets'); const fristDrugName = drugsFixture[0].targets[0].name; const secondDrugName = drugsFixture[0].targets[1].name; diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.tsx index 28f99dd6d6019c02fcda5dc4885eaa601770b3a5..85d5004c284a700d271202b479acc52937714a16 100644 --- a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.tsx +++ b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.tsx @@ -4,6 +4,7 @@ import { DrawerHeadingBackwardButton } from '@/shared/DrawerHeadingBackwardButto import { useAppDispatch } from '@/redux/hooks/useAppDispatch'; import { displayGroupedSearchResults } from '@/redux/drawer/drawer.slice'; import { PinsList } from './PinsList'; +import { mapStepTypeToHeading } from './ResultsList.component.utils'; export const ResultsList = (): JSX.Element => { const dispatch = useAppDispatch(); @@ -17,9 +18,7 @@ export const ResultsList = (): JSX.Element => { return ( <div className="h-full"> <DrawerHeadingBackwardButton backwardFunction={navigateToGroupedSearchResults}> - <span className="capitalize" data-testid="drawer-heading-text"> - {stepType} - </span> + <span data-testid="drawer-heading-text">{mapStepTypeToHeading(stepType)}</span> </DrawerHeadingBackwardButton> {data && <PinsList pinsList={data} type={stepType} />} </div> diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.utils.test.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.utils.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fb28052d99947c363b6806ac8af69c8dbced1d97 --- /dev/null +++ b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.utils.test.tsx @@ -0,0 +1,33 @@ +import { mapStepTypeToHeading } from './ResultsList.component.utils'; + +describe('mapStepTypeToHeading - util', () => { + it('should return "Drug targets" for stepType "drugs"', () => { + const result = mapStepTypeToHeading('drugs'); + expect(result).toBe('Drug targets'); + }); + + it('should return "Small molecule targets" for stepType "chemicals"', () => { + const result = mapStepTypeToHeading('chemicals'); + expect(result).toBe('Small molecule targets'); + }); + + it('should return the input stepType for other values', () => { + const result = mapStepTypeToHeading('someOtherType'); + expect(result).toBe('someOtherType'); + }); + + it('should return the same string case-sensitive for stepType "drugs"', () => { + const result = mapStepTypeToHeading('Drugs'); + expect(result).toBe('Drugs'); + }); + + it('should return the same string case-sensitive for stepType "chemicals"', () => { + const result = mapStepTypeToHeading('Chemicals'); + expect(result).toBe('Chemicals'); + }); + + it('should return empty string for empty input', () => { + const result = mapStepTypeToHeading(''); + expect(result).toBe(''); + }); +}); diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.utils.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.utils.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5eb97686255688719511d00f1692334dbbf77de4 --- /dev/null +++ b/src/components/Map/Drawer/SearchDrawerWrapper/ResultsList/ResultsList.component.utils.tsx @@ -0,0 +1,10 @@ +export const mapStepTypeToHeading = (stepType: string): string => { + switch (stepType) { + case 'drugs': + return 'Drug targets'; + case 'chemicals': + return 'Small molecule targets'; + default: + return stepType; + } +}; diff --git a/src/redux/bioEntity/bioEntity.selectors.ts b/src/redux/bioEntity/bioEntity.selectors.ts index ce4bd31b28b232515501ee64a30d9f0d90e4c977..25479877fe57e2a9a3a7cdbd7ee80fc545759a49 100644 --- a/src/redux/bioEntity/bioEntity.selectors.ts +++ b/src/redux/bioEntity/bioEntity.selectors.ts @@ -27,6 +27,11 @@ export const bioEntitySelector = createSelector(rootSelector, state => state.bio export const bioEntityDataSelector = createSelector(bioEntitySelector, bioEntity => bioEntity.data); +export const bioEntityLoadingSelector = createSelector( + bioEntitySelector, + bioEntity => bioEntity.loading, +); + export const bioEntityDataListSelector = createSelector(bioEntityDataSelector, bioEntityData => bioEntityData.map(b => b.data || []).flat(), ); diff --git a/src/shared/LoadingIndicator/LoadingIndicator.component.tsx b/src/shared/LoadingIndicator/LoadingIndicator.component.tsx index 9f047575680c21cf2c0f6934e60960a5b02cb508..39a2a4139dc58b06f7a71f810502a126e71d56f0 100644 --- a/src/shared/LoadingIndicator/LoadingIndicator.component.tsx +++ b/src/shared/LoadingIndicator/LoadingIndicator.component.tsx @@ -19,5 +19,6 @@ export const LoadingIndicator = ({ height={height} width={width} className="animate-spin" + data-testid="loading-indicator" /> );