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

Merge remote-tracking branch 'origin/main' into merge-18.1.0

parents 90ff3924 4589635b
No related branches found
No related tags found
1 merge request!374Merge 18.1.0
Pipeline #100564 passed
Showing
with 64 additions and 20 deletions
......@@ -55,6 +55,7 @@ jest:
- npm run test:ci
only:
- development
- main
- merge_requests
- tags
artifacts:
......@@ -83,6 +84,7 @@ build:deb:
only:
- tags
- development
- main
before_script:
- apt-get update
- DEBIAN_FRONTEND=noninteractive apt-get install -y dh-make build-essential lintian devscripts xsltproc fakeroot xsltproc docbook-xsl curl gnupg git zip
......
......@@ -15,7 +15,10 @@ minerva-front (19.0.0~alpha.0) stable; urgency=medium
-- Piotr Gawron <piotr.gawron@uni.lu> Fri, 18 Oct 2024 13:00:00 +0200
minerva-front (18.0.8) stable; urgency=medium
* Small improvement: support for links that should be opened immediately
(#342)
* 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
......
......@@ -2,10 +2,11 @@
// const root = 'https://scimap.lcsb.uni.lu';
const root = 'https://lux1.atcomp.pl';
// const root = 'http://localhost:8080';
window.config = {
BASE_API_URL: `${root}/minerva/api`,
BASE_NEW_API_URL: `${root}/minerva/new_api/`,
BASE_MAP_IMAGES_URL: `${root}/`,
BASE_MAP_IMAGES_URL: `${root}`,
DEFAULT_PROJECT_ID: 'sample',
ADMIN_PANEL_URL: `${root}/minerva/admin.xhtml`,
};
......@@ -34,6 +34,8 @@ describe('BioEntitiesPinsList - component ', () => {
Boolean(bioEntity.fullName),
);
expect(screen.getAllByTestId('bio-entity-name')).toHaveLength(bioEntitiesWithFullName.length);
if (bioEntitiesWithFullName.length > 0) {
expect(screen.getAllByTestId('bio-entity-name')).toHaveLength(bioEntitiesWithFullName.length);
}
});
});
import { FIRST_ARRAY_ELEMENT } from '@/constants/common';
import { FIRST_ARRAY_ELEMENT, ZERO } from '@/constants/common';
import { bioEntitiesContentFixture } from '@/models/fixtures/bioEntityContentsFixture';
import { MODELS_MOCK } from '@/models/mocks/modelsMock';
import { INITIAL_STORE_STATE_MOCK } from '@/redux/root/root.fixtures';
......@@ -110,7 +110,9 @@ describe('BioEntitiesAccordion - component', () => {
expect(screen.getByText(`Content (${countAll})`)).toBeInTheDocument();
expect(screen.getByText(`Core PD map (${countCore})`)).toBeInTheDocument();
expect(screen.getByText(`Histamine signaling (${countHistamine})`)).toBeInTheDocument();
if (countHistamine > ZERO) {
expect(screen.getByText(`Histamine signaling (${countHistamine})`)).toBeInTheDocument();
}
expect(screen.getByText(`PRKN substrates (${countPrkn})`)).toBeInTheDocument();
});
......
......@@ -27,7 +27,10 @@ const CHEMICALS_PIN = {
};
const PIN_NUMBER = 10;
const BIO_ENTITY = bioEntitiesContentFixture[0].bioEntity;
const BIO_ENTITY = {
...bioEntitiesContentFixture[0].bioEntity,
model: 5053,
};
const INITIAL_STORE_STATE: InitialStoreState = {
models: MODELS_DATA_MOCK_WITH_MAIN_MAP,
......
......@@ -88,7 +88,7 @@ const renderComponent = (initialStoreState: InitialStoreState = {}): { store: St
return (
render(
<Wrapper>
<DownloadSubmap />
<DownloadSubmap modelId={VALID_MODEL_ID} />
</Wrapper>,
),
{
......@@ -137,7 +137,7 @@ describe('DownloadSubmap - component', () => {
const list = screen.getByTestId('download-submap-list');
const validHrefs = CONFIGURATION_FORMATS_MOCK.map(({ handler }) =>
getSubmapDownloadUrl({ handler }),
getSubmapDownloadUrl({ handler, modelId: VALID_MODEL_ID }),
);
const validNames = CONFIGURATION_FORMATS_TYPES_MOCK;
const allAnchors = [...list.getElementsByTagName('a')];
......
......@@ -10,7 +10,11 @@ import { Icon } from '@/shared/Icon';
import { SUBMAP_DOWNLOAD_HANDLERS_NAMES } from './DownloadSubmap.constants';
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 formatsHandlersItems = Object.entries(formatsHandlers);
const getSubmapDownloadUrl = useGetSubmapDownloadUrl();
......@@ -25,7 +29,7 @@ export const DownloadSubmap = (): React.ReactNode => {
return () => {
closeMenu();
setIsDownloading(true);
downloadFileFromUrl(getSubmapDownloadUrl({ handler })).finally(() => {
downloadFileFromUrl(getSubmapDownloadUrl({ handler, modelId })).finally(function () {
setIsDownloading(false);
});
};
......
......@@ -92,7 +92,7 @@ describe('useGetSubmapDownloadUrl - hook', () => {
result: { current: getSubmapDownloadUrl },
} = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper });
expect(getSubmapDownloadUrl({ handler })).toBe('');
expect(getSubmapDownloadUrl({ handler, modelId: 0 })).toBe('');
});
});
......@@ -110,7 +110,7 @@ describe('useGetSubmapDownloadUrl - hook', () => {
result: { current: getSubmapDownloadUrl },
} = renderHook(() => useGetSubmapDownloadUrl(), { wrapper: Wrapper });
expect(getSubmapDownloadUrl({ handler: VALID_HANDLER })).toBe(
expect(getSubmapDownloadUrl({ handler: VALID_HANDLER, modelId: HISTAMINE_MAP_ID })).toBe(
`${BASE_API_URL}/projects/${PROJECT_ID}/models/${HISTAMINE_MAP_ID}:downloadModel?backgroundOverlayId=53&handlerClass=lcsb.mapviewer.wikipathway.GpmlParser&zoomLevel=9`,
);
});
......
import { BASE_API_URL, PROJECT_ID } from '@/constants';
import { currentBackgroundSelector } from '@/redux/backgrounds/background.selectors';
import { mapDataSizeSelector } from '@/redux/map/map.selectors';
import { currentModelSelector } from '@/redux/models/models.selectors';
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 => {
const model = useSelector(currentModelSelector);
const background = useSelector(currentBackgroundSelector);
const mapSize = useSelector(mapDataSizeSelector);
const getSubmapDownloadUrl: GetSubmapDownloadUrl = ({ handler }) => {
const allParamsValid = [model?.id, background?.id, mapSize.maxZoom, handler].reduce(
const getSubmapDownloadUrl: GetSubmapDownloadUrl = ({ handler, modelId }) => {
const allParamsValid = [modelId, background?.id, mapSize.maxZoom, handler].reduce(
(a, b) => Boolean(a) && Boolean(b),
true,
);
......@@ -20,7 +24,7 @@ export const useGetSubmapDownloadUrl = (): GetSubmapDownloadUrl => {
return '';
}
return `${BASE_API_URL}/projects/${PROJECT_ID}/models/${model?.id}: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;
......
......@@ -2,15 +2,16 @@ import { Button } from '@/shared/Button';
import { DownloadSubmap } from './DownloadSubmap';
interface SubmapItemProps {
modelId: number;
modelName: string;
onOpenClick: () => void;
}
export const SubmapItem = ({ modelName, onOpenClick }: SubmapItemProps): JSX.Element => (
export const SubmapItem = ({ modelName, onOpenClick, modelId }: SubmapItemProps): JSX.Element => (
<div className="flex flex-row flex-nowrap items-center justify-between py-2">
{modelName}
<div className="flex flex-row flex-nowrap items-center">
<DownloadSubmap />
<DownloadSubmap modelId={modelId} />
<Button
variantStyles="secondary"
className="h-6"
......
......@@ -36,6 +36,7 @@ export const SubmapsDrawer = (): JSX.Element => {
{models.map(model => (
<SubmapItem
key={model.id}
modelId={model.id}
modelName={model.name}
onOpenClick={(): void => onSubmapOpenClick(model)}
/>
......
......@@ -6,6 +6,8 @@ import { PluginsEventBus } from '@/services/pluginsManager/pluginsEventBus';
import { clearBioEntities } from '@/redux/bioEntity/bioEntity.slice';
import { Point } from '@/types/map';
import { getMultiBioEntityByIds } from '@/redux/bioEntity/thunks/getMultiBioEntity';
import { handleOpenImmediateLink } from '@/components/Map/MapViewer/utils/listeners/mapSingleClick/handleOpenImmediateLink';
import { ZERO } from '@/constants/common';
import { findClosestBioEntityPoint } from './findClosestBioEntityPoint';
type SearchConfig = {
......@@ -40,12 +42,13 @@ export const handleAliasResults =
dispatch(clearBioEntities());
return;
}
handleOpenImmediateLink(bioEntities[ZERO]);
}
dispatch(selectTab(`${id}`));
dispatch(openBioEntityDrawerById(id));
PluginsEventBus.dispatchEvent('onSearch', {
type: 'bioEntity',
searchValues: [closestSearchResult],
......
import { BioEntity } from '@/types/models';
import { showToast } from '@/utils/showToast';
export const handleOpenImmediateLink = (bioEntity: BioEntity): void => {
const link = bioEntity.immediateLink;
if (link !== null) {
const tab = window.open(link, '_blank');
if (tab) {
tab.focus();
} else {
showToast({
type: 'error',
message: `Browser prevented minerva from opening link: <a href="${link}" target="_blank">${link}</a>`,
});
}
}
};
......@@ -12,6 +12,7 @@ import { submodelSchema } from './submodelSchema';
export const bioEntitySchema = z.object({
id: z.union([z.number().int().positive(), z.string()]),
immediateLink: z.string().nullable(),
name: z.string(),
elementId: z.string(),
model: z.number(),
......
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