Skip to content
Snippets Groups Projects
Commit 228d5bac authored by Adrian Orłów's avatar Adrian Orłów
Browse files

feat: plugin methods center/zoom/overview-image

parent 1bfc48af
No related branches found
No related tags found
2 merge requests!223reset the pin numbers before search results are fetch (so the results will be...,!146feat: plugin methods center/zoom/overview-image
Pipeline #87056 passed
import { projectOverviewImagesSelector } from '@/redux/project/project.selectors';
import { store } from '@/redux/store';
import { OverviewImageView } from '@/types/models';
export const getOverviewImages = (): OverviewImageView[] => {
const { getState } = store;
const overviewImages = projectOverviewImagesSelector(getState());
return overviewImages;
};
import { closeModal } from '@/redux/modal/modal.slice';
import { INITIAL_STORE_STATE_MOCK } from '@/redux/root/root.fixtures';
import { RootState, store } from '@/redux/store';
import { hideOverviewImageModal } from './hideOverviewImageModal';
jest.mock('../../../redux/store');
describe('hideOverviewImageModal - util', () => {
const getStateSpy = jest.spyOn(store, 'getState');
beforeEach(() => {
jest.resetAllMocks();
});
describe('when opened modal is overview image', () => {
const dispatchSpy = jest.spyOn(store, 'dispatch');
beforeEach(() => {
getStateSpy.mockImplementation(
() =>
({
...INITIAL_STORE_STATE_MOCK,
modal: {
...INITIAL_STORE_STATE_MOCK.modal,
modalName: 'overview-images',
},
}) as RootState,
);
});
it('should close modal', () => {
hideOverviewImageModal();
expect(dispatchSpy).toHaveBeenCalledWith(closeModal());
});
});
describe('when opened modal is NOT overview image', () => {
const dispatchSpy = jest.spyOn(store, 'dispatch');
beforeEach(() => {
getStateSpy.mockImplementation(
() =>
({
...INITIAL_STORE_STATE_MOCK,
modal: {
...INITIAL_STORE_STATE_MOCK.modal,
modalName: 'login',
},
}) as RootState,
);
});
it('should not close modal', () => {
hideOverviewImageModal();
expect(dispatchSpy).not.toHaveBeenCalledWith(closeModal());
});
});
});
import { modalSelector } from '@/redux/modal/modal.selector';
import { closeModal } from '@/redux/modal/modal.slice';
import { store } from '@/redux/store';
export const hideOverviewImageModal = (): void => {
const { getState, dispatch } = store;
const { modalName } = modalSelector(getState());
if (modalName !== 'overview-images') {
return;
}
dispatch(closeModal());
};
import { OVERVIEW_IMAGE_ERRORS } from '@/constants/errors';
import { setOverviewImageId } from '@/redux/modal/modal.slice';
import { PROJECT_OVERVIEW_IMAGE_MOCK } from '@/redux/project/project.mock';
import { INITIAL_STORE_STATE_MOCK } from '@/redux/root/root.fixtures';
import { RootState, store } from '@/redux/store';
import { selectOverviewImage } from './selectOverviewImage';
jest.mock('../../../redux/store');
describe('selectOverviewImage - plugin method', () => {
const dispatchSpy = jest.spyOn(store, 'dispatch');
const getStateSpy = jest.spyOn(store, 'getState');
describe('when image id is valid', () => {
beforeEach(() => {
getStateSpy.mockImplementation(
() =>
({
...INITIAL_STORE_STATE_MOCK,
project: {
...INITIAL_STORE_STATE_MOCK.project,
data: {
...INITIAL_STORE_STATE_MOCK.project.data,
overviewImageViews: [PROJECT_OVERVIEW_IMAGE_MOCK],
},
},
}) as RootState,
);
});
it('should dispatch action set overview image', () => {
selectOverviewImage(PROJECT_OVERVIEW_IMAGE_MOCK.idObject);
expect(dispatchSpy).toHaveBeenCalledWith(
setOverviewImageId(PROJECT_OVERVIEW_IMAGE_MOCK.idObject),
);
});
});
describe('when image id is NOT valid', () => {
beforeEach(() => {
getStateSpy.mockImplementation(
() =>
({
...INITIAL_STORE_STATE_MOCK,
project: {
...INITIAL_STORE_STATE_MOCK.project,
data: {
...INITIAL_STORE_STATE_MOCK.project.data,
overviewImageViews: [],
},
},
}) as RootState,
);
});
it('should throw error', () => {
expect(() => selectOverviewImage(PROJECT_OVERVIEW_IMAGE_MOCK.idObject)).toThrow(
OVERVIEW_IMAGE_ERRORS.IMAGE_ID_IS_INVALID,
);
});
});
});
import { OVERVIEW_IMAGE_ERRORS } from '@/constants/errors';
import { setOverviewImageId } from '@/redux/modal/modal.slice';
import { projectOverviewImagesSelector } from '@/redux/project/project.selectors';
import { store } from '@/redux/store';
export const selectOverviewImage = (imageId: number): void => {
const { dispatch, getState } = store;
const overviewImages = projectOverviewImagesSelector(getState());
const foundOverviewImage = overviewImages.find(o => o.idObject === imageId);
const isImageIdValid = Boolean(foundOverviewImage);
if (!isImageIdValid) {
throw new Error(OVERVIEW_IMAGE_ERRORS.IMAGE_ID_IS_INVALID);
}
dispatch(setOverviewImageId(imageId));
};
import { OVERVIEW_IMAGE_ERRORS } from '@/constants/errors';
import { openOverviewImagesModalById } from '@/redux/modal/modal.slice';
import { PROJECT_OVERVIEW_IMAGE_MOCK } from '@/redux/project/project.mock';
import { INITIAL_STORE_STATE_MOCK } from '@/redux/root/root.fixtures';
import { RootState, store } from '@/redux/store';
import { showOverviewImageModal } from './showOverviewImageModal';
jest.mock('../../../redux/store');
describe('showOverviewImageModal - plugin method', () => {
const dispatchSpy = jest.spyOn(store, 'dispatch');
const getStateSpy = jest.spyOn(store, 'getState');
beforeEach(() => {
jest.resetAllMocks();
});
describe('when image id is not provided', () => {
const defaultImageId = 23332;
beforeEach(() => {
getStateSpy.mockImplementation(
() =>
({
...INITIAL_STORE_STATE_MOCK,
project: {
...INITIAL_STORE_STATE_MOCK.project,
data: {
...INITIAL_STORE_STATE_MOCK.project.data,
overviewImageViews: [
PROJECT_OVERVIEW_IMAGE_MOCK,
{
...PROJECT_OVERVIEW_IMAGE_MOCK,
idObject: defaultImageId,
},
],
topOverviewImage: {
...PROJECT_OVERVIEW_IMAGE_MOCK,
idObject: defaultImageId,
},
},
},
}) as RootState,
);
});
it('should dispatch action set overview image with defaultImageId', () => {
showOverviewImageModal();
expect(dispatchSpy).toHaveBeenCalledWith(openOverviewImagesModalById(defaultImageId));
});
});
describe('when image id is valid', () => {
beforeEach(() => {
getStateSpy.mockImplementation(
() =>
({
...INITIAL_STORE_STATE_MOCK,
project: {
...INITIAL_STORE_STATE_MOCK.project,
data: {
...INITIAL_STORE_STATE_MOCK.project.data,
overviewImageViews: [PROJECT_OVERVIEW_IMAGE_MOCK],
topOverviewImage: PROJECT_OVERVIEW_IMAGE_MOCK,
},
},
}) as RootState,
);
});
it('should dispatch action set overview image', () => {
showOverviewImageModal(PROJECT_OVERVIEW_IMAGE_MOCK.idObject);
expect(dispatchSpy).toHaveBeenCalledWith(
openOverviewImagesModalById(PROJECT_OVERVIEW_IMAGE_MOCK.idObject),
);
});
});
describe('when image id is NOT valid', () => {
beforeEach(() => {
getStateSpy.mockImplementation(
() =>
({
...INITIAL_STORE_STATE_MOCK,
project: {
...INITIAL_STORE_STATE_MOCK.project,
data: {
...INITIAL_STORE_STATE_MOCK.project.data,
overviewImageViews: [],
topOverviewImage: PROJECT_OVERVIEW_IMAGE_MOCK,
},
},
}) as RootState,
);
});
it('should throw error', () => {
expect(() => showOverviewImageModal(PROJECT_OVERVIEW_IMAGE_MOCK.idObject)).toThrow(
OVERVIEW_IMAGE_ERRORS.IMAGE_ID_IS_INVALID,
);
});
});
});
import { OVERVIEW_IMAGE_ERRORS } from '@/constants/errors';
import { openOverviewImagesModalById } from '@/redux/modal/modal.slice';
import {
projectDefaultOverviewImageIdSelector,
projectOverviewImagesSelector,
} from '@/redux/project/project.selectors';
import { store } from '@/redux/store';
export const showOverviewImageModal = (imageId?: number): void => {
const { dispatch, getState } = store;
const overviewImages = projectOverviewImagesSelector(getState());
const defaultImageId = projectDefaultOverviewImageIdSelector(getState());
const selectedImageId = imageId || defaultImageId;
const foundOverviewImage = overviewImages.find(o => o.idObject === selectedImageId);
const isImageIdValid = Boolean(foundOverviewImage);
if (!isImageIdValid) {
throw new Error(OVERVIEW_IMAGE_ERRORS.IMAGE_ID_IS_INVALID);
}
dispatch(openOverviewImagesModalById(selectedImageId));
};
...@@ -2,18 +2,27 @@ import { PLUGINS_CONTENT_ELEMENT_ATTR_NAME, PLUGINS_CONTENT_ELEMENT_ID } from '@ ...@@ -2,18 +2,27 @@ import { PLUGINS_CONTENT_ELEMENT_ATTR_NAME, PLUGINS_CONTENT_ELEMENT_ID } from '@
import { registerPlugin } from '@/redux/plugins/plugins.thunks'; import { registerPlugin } from '@/redux/plugins/plugins.thunks';
import { store } from '@/redux/store'; import { store } from '@/redux/store';
import md5 from 'crypto-js/md5'; import md5 from 'crypto-js/md5';
import { bioEntitiesMethods } from './bioEntities';
import { getModels } from './map/models/getModels'; import { getModels } from './map/models/getModels';
import { openMap } from './map/openMap'; import { openMap } from './map/openMap';
import { bioEntitiesMethods } from './bioEntities'; import { getCenter } from './map/position/getCenter';
import { setCenter } from './map/position/setCenter';
import { triggerSearch } from './map/triggerSearch'; import { triggerSearch } from './map/triggerSearch';
import { getZoom } from './map/zoom/getZoom';
import { setZoom } from './map/zoom/setZoom';
import { getCurrentOverviewImage } from './overviewImage/getCurrentOverviewImage';
import { getOverviewImages } from './overviewImage/getOverviewImages';
import { hideOverviewImageModal } from './overviewImage/hideOverviewImageModal';
import { selectOverviewImage } from './overviewImage/selectOverviewImage';
import { showOverviewImageModal } from './overviewImage/showOverviewImageModal';
import { PluginsEventBus } from './pluginsEventBus'; import { PluginsEventBus } from './pluginsEventBus';
import { getProjectId } from './project/data/getProjectId';
import { getName } from './project/data/getName';
import { getVersion } from './project/data/getVersion';
import { getDisease } from './project/data/getDisease';
import { getOrganism } from './project/data/getOrganism';
import type { PluginsManagerType } from './pluginsManager.types'; import type { PluginsManagerType } from './pluginsManager.types';
import { configurationMapper } from './pluginsManager.utils'; import { configurationMapper } from './pluginsManager.utils';
import { getDisease } from './project/data/getDisease';
import { getName } from './project/data/getName';
import { getOrganism } from './project/data/getOrganism';
import { getProjectId } from './project/data/getProjectId';
import { getVersion } from './project/data/getVersion';
export const PluginsManager: PluginsManagerType = { export const PluginsManager: PluginsManagerType = {
hashedPlugins: {}, hashedPlugins: {},
...@@ -38,6 +47,17 @@ export const PluginsManager: PluginsManagerType = { ...@@ -38,6 +47,17 @@ export const PluginsManager: PluginsManagerType = {
}, },
openMap, openMap,
triggerSearch, triggerSearch,
getZoom,
setZoom,
getCenter,
setCenter,
},
overviewImage: {
getCurrentOverviewImage,
getOverviewImages,
hideOverviewImageModal,
selectOverviewImage,
showOverviewImageModal,
}, },
project: { project: {
data: { data: {
......
export interface PluginError {
message: string;
}
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