Skip to content

Commit

Permalink
#516 Next/previous arrows should be mass actions
Browse files Browse the repository at this point in the history
  • Loading branch information
Adriána Kohanová committed Jan 29, 2021
1 parent acf6726 commit 5e37e48
Show file tree
Hide file tree
Showing 12 changed files with 392 additions and 206 deletions.
84 changes: 21 additions & 63 deletions js/components/datasets/datasetMoleculeView.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ import {
addDatasetSurface,
removeDatasetSurface,
clickOnInspirations,
getDatasetMoleculeID
getDatasetMoleculeID,
moveSelectedMoleculeSettings,
getInspirationsForMol
} from './redux/dispatchActions';

import { isAnyInspirationTurnedOn, getFilteredDatasetMoleculeList } from './redux/selectors';
Expand All @@ -39,8 +41,6 @@ import { centerOnLigandByMoleculeID } from '../../reducers/ngl/dispatchActions';
import { ArrowDownward, ArrowUpward, MyLocation } from '@material-ui/icons';
import { isString } from 'lodash';
import { SvgTooltip } from '../common';
import { OBJECT_TYPE } from '../nglView/constants';
import { getRepresentationsByType } from '../nglView/generatingObjects';
import { getMolImage } from '../preview/molecule/redux/dispatchActions';
import { MOL_TYPE } from '../preview/molecule/redux/constants';

Expand Down Expand Up @@ -477,35 +477,6 @@ export const DatasetMoleculeView = memo(
return cssClass;
};

const moveSelectedMoleculeSettings = (newItemData, datasetIdOfMolecule, skipTracking) => {
if (newItemData) {
if (isLigandOn) {
let representations = getRepresentationsByType(objectsInView, data, OBJECT_TYPE.LIGAND, datasetID);
dispatch(
addDatasetLigand(stage, newItemData, colourToggle, datasetIdOfMolecule, skipTracking, representations)
);
}
if (isProteinOn) {
let representations = getRepresentationsByType(objectsInView, data, OBJECT_TYPE.PROTEIN, datasetID);
dispatch(
addDatasetHitProtein(stage, newItemData, colourToggle, datasetIdOfMolecule, skipTracking, representations)
);
}
if (isComplexOn) {
let representations = getRepresentationsByType(objectsInView, data, OBJECT_TYPE.COMPLEX, datasetID);
dispatch(
addDatasetComplex(stage, newItemData, colourToggle, datasetIdOfMolecule, skipTracking, representations)
);
}
if (isSurfaceOn) {
let representations = getRepresentationsByType(objectsInView, data, OBJECT_TYPE.SURFACE, datasetID);
dispatch(
addDatasetSurface(stage, newItemData, colourToggle, datasetIdOfMolecule, skipTracking, representations)
);
}
}
};

const scrollToElement = element => {
element.scrollIntoView({
behavior: 'auto',
Expand All @@ -514,68 +485,55 @@ export const DatasetMoleculeView = memo(
});
};

const getInspirationsForMol = (datasetId, molId) => {
let inspirations = [];

if (
allInspirations &&
allInspirations.hasOwnProperty(datasetId) &&
allInspirations[datasetId].hasOwnProperty(molId)
) {
inspirations = allInspirations[datasetId][molId];
}

return inspirations;
};

const handleClickOnDownArrow = () => {
const refNext = ref.current.nextSibling;
scrollToElement(refNext);

removeOfAllSelectedTypes(true);
removeOfAllSelectedTypesOfInspirations(true);

const nextItem = (nextItemData.hasOwnProperty('molecule') && nextItemData.molecule) || nextItemData;
const nextDatasetID = (nextItemData.hasOwnProperty('datasetID') && nextItemData.datasetID) || datasetID;
const moleculeTitleNext = nextItem && nextItem.name;

const inspirations = getInspirationsForMol(datasetID, nextItem.id);
let dataValue = { objectsInView, colourToggle, isLigandOn, isProteinOn, isComplexOn, isSurfaceOn };
dispatch(setArrowUpDown(datasetID, data, nextItem, ARROW_TYPE.DOWN, dataValue));

removeOfAllSelectedTypes(true);
removeOfAllSelectedTypesOfInspirations(true);

const inspirations = getInspirationsForMol(allInspirations, datasetID, nextItem.id);
dispatch(setInspirationMoleculeDataList(inspirations));
moveSelectedMoleculeSettings(nextItem, nextDatasetID, true);
dispatch(moveSelectedMoleculeSettings(stage, data, nextItem, nextDatasetID, datasetID, dataValue, true));
dispatch(moveSelectedMoleculeInspirationsSettings(data, nextItem, true));
dispatch(setCrossReferenceCompoundName(moleculeTitleNext));
if (setRef && ref.current) {
setRef(refNext);
}

dispatch(setArrowUpDown(data, nextItemData, ARROW_TYPE.DOWN, isLigandOn, isProteinOn, isComplexOn, isSurfaceOn));
};

const handleClickOnUpArrow = () => {
const refPrevious = ref.current.previousSibling;
scrollToElement(refPrevious);

removeOfAllSelectedTypes(true);
removeOfAllSelectedTypesOfInspirations(true);

const previousItem =
(previousItemData.hasOwnProperty('molecule') && previousItemData.molecule) || previousItemData;
const previousDatasetID =
(previousItemData.hasOwnProperty('datasetID') && previousItemData.datasetID) || datasetID;
const moleculeTitlePrev = previousItem && previousItem.name;

const inspirations = getInspirationsForMol(datasetID, previousItem.id);
let dataValue = { objectsInView, colourToggle, isLigandOn, isProteinOn, isComplexOn, isSurfaceOn };
dispatch(setArrowUpDown(datasetID, data, previousItem, ARROW_TYPE.UP, dataValue));

removeOfAllSelectedTypes(true);
removeOfAllSelectedTypesOfInspirations(true);

const inspirations = getInspirationsForMol(allInspirations, datasetID, previousItem.id);
dispatch(setInspirationMoleculeDataList(inspirations));
moveSelectedMoleculeSettings(previousItem, previousDatasetID, true);
dispatch(moveSelectedMoleculeSettings(stage, data, previousItem, previousDatasetID, datasetID, dataValue, true));

dispatch(moveSelectedMoleculeInspirationsSettings(data, previousItem, true));
dispatch(setCrossReferenceCompoundName(moleculeTitlePrev));
if (setRef && ref.current) {
setRef(refPrevious);
}

dispatch(
setArrowUpDown(data, previousItemData, ARROW_TYPE.UP, isLigandOn, isProteinOn, isComplexOn, isSurfaceOn)
);
};

const moleculeTitle = data && data.name;
Expand Down Expand Up @@ -764,7 +722,7 @@ export const DatasetMoleculeView = memo(
clickOnInspirations({
datasetID,
currentID,
computed_inspirations: getInspirationsForMol(datasetID, currentID)
computed_inspirations: getInspirationsForMol(allInspirations, datasetID, currentID)
})
);
if (setRef) {
Expand Down
8 changes: 3 additions & 5 deletions js/components/datasets/redux/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -369,15 +369,13 @@ export const setDeselectedAllByType = (type, datsetID, items, isCrossReference)
}
});

export const setArrowUpDown = (item, newItem, arrowType, isLigand, isProtein, isComplex, isSurface) => ({
export const setArrowUpDown = (datasetID, item, newItem, arrowType, data) => ({
type: constants.SET_ARROW_UP_DOWN,
payload: {
datasetID,
item: item,
newItem: newItem,
arrowType: arrowType,
isLigand: isLigand,
isProtein: isProtein,
isComplex: isComplex,
isSurface: isSurface
data
}
});
103 changes: 103 additions & 0 deletions js/components/datasets/redux/dispatchActions.js
Original file line number Diff line number Diff line change
Expand Up @@ -693,6 +693,20 @@ export const removeAllSelectedDatasetMolecules = (stage, skipTracking) => (dispa
}
};

export const getInspirationsForMol = (allInspirations, datasetId, molId) => {
let inspirations = [];

if (
allInspirations &&
allInspirations.hasOwnProperty(datasetId) &&
allInspirations[datasetId].hasOwnProperty(molId)
) {
inspirations = allInspirations[datasetId][molId];
}

return inspirations;
};

export const moveMoleculeInspirationsSettings = (
data,
newItemData,
Expand Down Expand Up @@ -804,4 +818,93 @@ const moveInspirations = (
}
};

export const moveSelectedInspirations = (
stage,
objectsInView,
fragmentDisplayListMolecule,
proteinListMolecule,
complexListMolecule,
surfaceListMolecule,
vectorOnListMolecule,
skipTracking
) => (dispatch, getState) => {
const state = getState();
const molecules = state.datasetsReducers.inspirationMoleculeDataList;
if (molecules) {
molecules.forEach(molecule => {
if (molecule) {
if (fragmentDisplayListMolecule.includes(molecule.id)) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.LIGAND);
dispatch(
addLigand(
stage,
molecule,
colourList[molecule.id % colourList.length],
false,
skipTracking,
representations
)
);
}
if (proteinListMolecule.includes(molecule.id)) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.HIT_PROTEIN);
dispatch(
addHitProtein(stage, molecule, colourList[molecule.id % colourList.length], skipTracking, representations)
);
}
if (complexListMolecule.includes(molecule.id)) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.COMPLEX);
dispatch(
addComplex(stage, molecule, colourList[molecule.id % colourList.length], skipTracking, representations)
);
}
if (surfaceListMolecule.includes(molecule.id)) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.SURFACE);
dispatch(
addSurface(stage, molecule, colourList[molecule.id % colourList.length], skipTracking, representations)
);
}
if (vectorOnListMolecule.includes(molecule.id)) {
dispatch(addVector(stage, molecule, colourList[molecule.id % colourList.length], skipTracking));
}
}
});
}
};

export const moveSelectedMoleculeSettings = (
stage,
item,
newItem,
datasetIdOfMolecule,
datasetID,
data,
skipTracking
) => (dispatch, getState) => {
if (newItem && data) {
if (data.isLigandOn) {
let representations = getRepresentationsByType(data.objectsInView, item, OBJECT_TYPE.LIGAND, datasetID);
dispatch(addDatasetLigand(stage, newItem, data.colourToggle, datasetIdOfMolecule, skipTracking, representations));
}
if (data.isProteinOn) {
let representations = getRepresentationsByType(data.objectsInView, item, OBJECT_TYPE.PROTEIN, datasetID);
dispatch(
addDatasetHitProtein(stage, newItem, data.colourToggle, datasetIdOfMolecule, skipTracking, representations)
);
}
if (data.isComplexOn) {
let representations = getRepresentationsByType(data.objectsInView, item, OBJECT_TYPE.COMPLEX, datasetID);
dispatch(
addDatasetComplex(stage, newItem, data.colourToggle, datasetIdOfMolecule, skipTracking, representations)
);
}
if (data.isSurfaceOn) {
let representations = getRepresentationsByType(data.objectsInView, item, OBJECT_TYPE.SURFACE, datasetID);
dispatch(
addDatasetSurface(stage, newItem, data.colourToggle, datasetIdOfMolecule, skipTracking, representations)
);
}
}
};

export const getDatasetMoleculeID = (datasetID, moleculeID) => `datasetID-${datasetID}_moleculeID-${moleculeID}`;
49 changes: 8 additions & 41 deletions js/components/preview/molecule/moleculeList.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
ButtonGroup
} from '@material-ui/core';
import React, { useState, useEffect, useCallback, memo, useRef, useContext, useMemo } from 'react';
import { useDispatch, useSelector, useStore } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import MoleculeView, { colourList } from './moleculeView';
import { MoleculeListSortFilterDialog, filterMolecules, getAttrDefinition } from './moleculeListSortFilterDialog';
import InfiniteScroll from 'react-infinite-scroller';
Expand All @@ -45,7 +45,8 @@ import {
removeLigand,
hideAllSelectedMolecules,
initializeMolecules,
applyDirectSelection
applyDirectSelection,
removeAllSelectedMolTypes
} from './redux/dispatchActions';
import { DEFAULT_FILTER, PREDEFINED_FILTERS } from '../../../reducers/selection/constants';
import { DeleteSweep, FilterList, Search } from '@material-ui/icons';
Expand All @@ -58,7 +59,7 @@ import { getUrl, loadAllMolsFromMolGroup } from '../../../utils/genericList';
import * as listType from '../../../constants/listTypes';
import { useRouteMatch } from 'react-router-dom';
import { setSortDialogOpen } from './redux/actions';
import { setMoleculeList, setAllMolLists } from '../../../reducers/api/actions';
import { setMoleculeList, setAllMolLists, setAllMolecules } from '../../../reducers/api/actions';
import { AlertModal } from '../../common/Modal/AlertModal';
import { onSelectMoleculeGroup } from '../moleculeGroups/redux/dispatchActions';
import { setSelectedAllByType, setDeselectedAllByType } from '../../../reducers/selection/actions';
Expand Down Expand Up @@ -386,10 +387,13 @@ export const MoleculeList = memo(({ height, setFilterItemsHeight, filterItemsHei
Promise.all(promises)
.then(results => {
let listToSet = {};
let allMolecules = [];
results.forEach(molResult => {
listToSet[molResult.mol_group] = molResult.molecules;
allMolecules.push(...molResult.molecules);
});
dispatch(setAllMolLists(listToSet));
dispatch(setAllMolecules(allMolecules));
})
.catch(err => console.log(err));
}
Expand Down Expand Up @@ -569,44 +573,7 @@ export const MoleculeList = memo(({ height, setFilterItemsHeight, filterItemsHei

const removeOfAllSelectedTypes = (skipTracking = false) => {
let molecules = [...getJoinedMoleculeList, ...allInspirationMoleculeDataList];

proteinList?.forEach(moleculeID => {
const foundedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID);
dispatch(
removeHitProtein(
majorViewStage,
foundedMolecule,
colourList[foundedMolecule.id % colourList.length],
skipTracking
)
);
});
complexList?.forEach(moleculeID => {
const foundedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID);
dispatch(
removeComplex(majorViewStage, foundedMolecule, colourList[foundedMolecule.id % colourList.length], skipTracking)
);
});
fragmentDisplayList?.forEach(moleculeID => {
const foundedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID);
dispatch(removeLigand(majorViewStage, foundedMolecule, skipTracking));
});
surfaceList?.forEach(moleculeID => {
const foundedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID);
dispatch(
removeSurface(majorViewStage, foundedMolecule, colourList[foundedMolecule.id % colourList.length], skipTracking)
);
});
densityList?.forEach(moleculeID => {
const foundedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID);
dispatch(
removeDensity(majorViewStage, foundedMolecule, colourList[foundedMolecule.id % colourList.length], skipTracking)
);
});
vectorOnList?.forEach(moleculeID => {
const foundedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID);
dispatch(removeVector(majorViewStage, foundedMolecule, skipTracking));
});
dispatch(removeAllSelectedMolTypes(majorViewStage, molecules, skipTracking));
};

const selectMoleculeSite = moleculeGroupSite => {
Expand Down
Loading

0 comments on commit 5e37e48

Please sign in to comment.