Skip to content
Snippets Groups Projects
Commit df9dfdc8 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

download button should download selected map

parent b237ee24
No related branches found
No related tags found
2 merge requests!374Merge 18.1.0,!355Resolve "downloading a submap downloads the main map (pdmap.uni.lu)"
Pipeline #99574 passed
minerva-front (18.0.8) stable; urgency=medium minerva-front (18.0.8) stable; urgency=medium
* Bug fix: data overlay removal did not work (#333) * Bug fix: data overlay removal did not work (#333)
* Bug fix: submap download did not download selected map (#337)
-- Piotr Gawron <piotr.gawron@uni.lu> Fri, 13 Dec 2024 13:00:00 +0200 -- Piotr Gawron <piotr.gawron@uni.lu> Fri, 13 Dec 2024 13:00:00 +0200
......
...@@ -87,7 +87,7 @@ const renderComponent = (initialStoreState: InitialStoreState = {}): { store: St ...@@ -87,7 +87,7 @@ const renderComponent = (initialStoreState: InitialStoreState = {}): { store: St
return ( return (
render( render(
<Wrapper> <Wrapper>
<DownloadSubmap /> <DownloadSubmap modelId={VALID_MODEL_ID} />
</Wrapper>, </Wrapper>,
), ),
{ {
...@@ -136,7 +136,7 @@ describe('DownloadSubmap - component', () => { ...@@ -136,7 +136,7 @@ describe('DownloadSubmap - component', () => {
const list = screen.getByTestId('download-submap-list'); const list = screen.getByTestId('download-submap-list');
const validHrefs = CONFIGURATION_FORMATS_MOCK.map(({ handler }) => const validHrefs = CONFIGURATION_FORMATS_MOCK.map(({ handler }) =>
getSubmapDownloadUrl({ handler }), getSubmapDownloadUrl({ handler, modelId: VALID_MODEL_ID }),
); );
const validNames = CONFIGURATION_FORMATS_TYPES_MOCK; const validNames = CONFIGURATION_FORMATS_TYPES_MOCK;
const allAnchors = [...list.getElementsByTagName('a')]; const allAnchors = [...list.getElementsByTagName('a')];
......
...@@ -9,7 +9,11 @@ import { downloadFileFromUrl } from '@/redux/export/export.utils'; ...@@ -9,7 +9,11 @@ import { downloadFileFromUrl } from '@/redux/export/export.utils';
import { SUBMAP_DOWNLOAD_HANDLERS_NAMES } from './DownloadSubmap.constants'; import { SUBMAP_DOWNLOAD_HANDLERS_NAMES } from './DownloadSubmap.constants';
import { useGetSubmapDownloadUrl } from './utils/useGetSubmapDownloadUrl'; import { useGetSubmapDownloadUrl } from './utils/useGetSubmapDownloadUrl';
export const DownloadSubmap = (): React.ReactNode => { interface DownloadSubmapProps {
modelId: number;
}
export const DownloadSubmap = ({ modelId }: DownloadSubmapProps): React.ReactNode => {
const formatsHandlers = useSelector(formatsHandlersSelector); const formatsHandlers = useSelector(formatsHandlersSelector);
const formatsHandlersItems = Object.entries(formatsHandlers); const formatsHandlersItems = Object.entries(formatsHandlers);
const getSubmapDownloadUrl = useGetSubmapDownloadUrl(); const getSubmapDownloadUrl = useGetSubmapDownloadUrl();
...@@ -24,7 +28,7 @@ export const DownloadSubmap = (): React.ReactNode => { ...@@ -24,7 +28,7 @@ export const DownloadSubmap = (): React.ReactNode => {
return function () { return function () {
closeMenu(); closeMenu();
setIsDownloading(true); setIsDownloading(true);
downloadFileFromUrl(getSubmapDownloadUrl({ handler })).finally(function () { downloadFileFromUrl(getSubmapDownloadUrl({ handler, modelId })).finally(function () {
setIsDownloading(false); setIsDownloading(false);
}); });
}; };
......
...@@ -91,7 +91,7 @@ describe('useGetSubmapDownloadUrl - hook', () => { ...@@ -91,7 +91,7 @@ describe('useGetSubmapDownloadUrl - hook', () => {
result: { current: getSubmapDownloadUrl }, result: { current: getSubmapDownloadUrl },
} = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper }); } = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper });
expect(getSubmapDownloadUrl({ handler })).toBe(''); expect(getSubmapDownloadUrl({ handler, modelId: 0 })).toBe('');
}); });
}); });
...@@ -109,7 +109,7 @@ describe('useGetSubmapDownloadUrl - hook', () => { ...@@ -109,7 +109,7 @@ describe('useGetSubmapDownloadUrl - hook', () => {
result: { current: getSubmapDownloadUrl }, result: { current: getSubmapDownloadUrl },
} = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper }); } = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper });
expect(getSubmapDownloadUrl({ handler: VALID_HANDLER })).toBe( expect(getSubmapDownloadUrl({ handler: VALID_HANDLER, modelId: 5052 })).toBe(
`${BASE_API_URL}/projects/${PROJECT_ID}/models/5052:downloadModel?backgroundOverlayId=53&handlerClass=lcsb.mapviewer.wikipathway.GpmlParser&zoomLevel=9`, `${BASE_API_URL}/projects/${PROJECT_ID}/models/5052:downloadModel?backgroundOverlayId=53&handlerClass=lcsb.mapviewer.wikipathway.GpmlParser&zoomLevel=9`,
); );
}); });
......
import { BASE_API_URL, PROJECT_ID } from '@/constants'; import { BASE_API_URL, PROJECT_ID } from '@/constants';
import { currentBackgroundSelector } from '@/redux/backgrounds/background.selectors'; import { currentBackgroundSelector } from '@/redux/backgrounds/background.selectors';
import { mapDataSizeSelector } from '@/redux/map/map.selectors'; import { mapDataSizeSelector } from '@/redux/map/map.selectors';
import { currentModelSelector } from '@/redux/models/models.selectors';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
export type GetSubmapDownloadUrl = ({ handler }: { handler: string }) => string; export type GetSubmapDownloadUrl = ({
handler,
modelId,
}: {
handler: string;
modelId: number;
}) => string;
export const useGetSubmapDownloadUrl = (): GetSubmapDownloadUrl => { export const useGetSubmapDownloadUrl = (): GetSubmapDownloadUrl => {
const model = useSelector(currentModelSelector);
const background = useSelector(currentBackgroundSelector); const background = useSelector(currentBackgroundSelector);
const mapSize = useSelector(mapDataSizeSelector); const mapSize = useSelector(mapDataSizeSelector);
const getSubmapDownloadUrl: GetSubmapDownloadUrl = ({ handler }) => { const getSubmapDownloadUrl: GetSubmapDownloadUrl = ({ handler, modelId }) => {
const allParamsValid = [model?.idObject, background?.id, mapSize.maxZoom, handler].reduce( const allParamsValid = [modelId, background?.id, mapSize.maxZoom, handler].reduce(
(a, b) => Boolean(a) && Boolean(b), (a, b) => Boolean(a) && Boolean(b),
true, true,
); );
...@@ -20,7 +24,7 @@ export const useGetSubmapDownloadUrl = (): GetSubmapDownloadUrl => { ...@@ -20,7 +24,7 @@ export const useGetSubmapDownloadUrl = (): GetSubmapDownloadUrl => {
return ''; return '';
} }
return `${BASE_API_URL}/projects/${PROJECT_ID}/models/${model?.idObject}:downloadModel?backgroundOverlayId=${background?.id}&handlerClass=${handler}&zoomLevel=${mapSize.maxZoom}`; return `${BASE_API_URL}/projects/${PROJECT_ID}/models/${modelId}:downloadModel?backgroundOverlayId=${background?.id}&handlerClass=${handler}&zoomLevel=${mapSize.maxZoom}`;
}; };
return getSubmapDownloadUrl; return getSubmapDownloadUrl;
......
...@@ -2,15 +2,16 @@ import { IconButton } from '@/shared/IconButton'; ...@@ -2,15 +2,16 @@ import { IconButton } from '@/shared/IconButton';
import { DownloadSubmap } from './DownloadSubmap'; import { DownloadSubmap } from './DownloadSubmap';
interface SubmapItemProps { interface SubmapItemProps {
modelId: number;
modelName: string; modelName: string;
onOpenClick: () => void; onOpenClick: () => void;
} }
export const SubmpamItem = ({ modelName, onOpenClick }: SubmapItemProps): JSX.Element => ( export const SubmpamItem = ({ modelName, onOpenClick, modelId }: SubmapItemProps): JSX.Element => (
<div className="flex flex-row flex-nowrap items-center justify-between border-b py-6"> <div className="flex flex-row flex-nowrap items-center justify-between border-b py-6">
{modelName} {modelName}
<div className="flex flex-row flex-nowrap items-center"> <div className="flex flex-row flex-nowrap items-center">
<DownloadSubmap /> <DownloadSubmap modelId={modelId} />
<IconButton <IconButton
icon="chevron-right" icon="chevron-right"
className="h-6 w-6 bg-white-pearl" className="h-6 w-6 bg-white-pearl"
......
...@@ -36,6 +36,7 @@ export const SubmapsDrawer = (): JSX.Element => { ...@@ -36,6 +36,7 @@ export const SubmapsDrawer = (): JSX.Element => {
{models.map(model => ( {models.map(model => (
<SubmpamItem <SubmpamItem
key={model.idObject} key={model.idObject}
modelId={model.idObject}
modelName={model.name} modelName={model.name}
onOpenClick={(): void => onSubmapOpenClick(model)} onOpenClick={(): void => onSubmapOpenClick(model)}
/> />
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment