Skip to content

Commit

Permalink
#407 Properly turn on/off inspiration fragments when using the next/p…
Browse files Browse the repository at this point in the history
…revious arrows (bug of #384)
  • Loading branch information
Adriána Kohanová committed Oct 16, 2020
1 parent 3a429c4 commit 90defc1
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 107 deletions.
83 changes: 78 additions & 5 deletions js/components/datasets/datasetMoleculeList.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
IconButton,
ButtonGroup
} from '@material-ui/core';
import React, { useState, useEffect, memo, useRef, useContext, useCallback } from 'react';
import React, { useState, useEffect, memo, useRef, useContext } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { DatasetMoleculeView, colourList } from './datasetMoleculeView';
import InfiniteScroll from 'react-infinite-scroller';
Expand All @@ -34,19 +34,28 @@ import {
removeDatasetComplex,
addDatasetSurface,
removeDatasetSurface,
resetCrossReferenceDialog,
autoHideDatasetDialogsOnScroll
} from './redux/dispatchActions';
import { setFilterDialogOpen, setIsOpenInspirationDialog, setSearchStringOfCompoundSet } from './redux/actions';
import { setFilterDialogOpen, setSearchStringOfCompoundSet } from './redux/actions';
import { DatasetFilter } from './datasetFilter';
import { FilterList, Search, Link } from '@material-ui/icons';
import { getFilteredDatasetMoleculeList } from './redux/selectors';
import { getFilteredDatasetMoleculeList, isAnyInspirationTurnedOnByType } from './redux/selectors';
import { debounce } from 'lodash';
import { InspirationDialog } from './inspirationDialog';
import { CrossReferenceDialog } from './crossReferenceDialog';
import { AlertModal } from '../common/Modal/AlertModal';
import { hideAllSelectedMolecules } from '../preview/molecule/redux/dispatchActions';
import { selectJoinedMoleculeList, getMoleculeList } from '../preview/molecule/redux/selectors';
import { getMoleculeList } from '../preview/molecule/redux/selectors';
import {
addVector,
addHitProtein,
addComplex,
addSurface,
addLigand,
addDensity
} from '../preview/molecule/redux/dispatchActions';
import { OBJECT_TYPE } from '../nglView/constants';
import { getRepresentationsByType } from '../nglView/generatingObjects';

const useStyles = makeStyles(theme => ({
container: {
Expand Down Expand Up @@ -263,6 +272,15 @@ export const DatasetMoleculeList = memo(

const selectedAll = useRef(false);

const objectsInView = useSelector(state => state.nglReducers.objectsInView) || {};

const proteinListMolecule = useSelector(state => state.selectionReducers.proteinList);
const complexListMolecule = useSelector(state => state.selectionReducers.complexList);
const fragmentDisplayListMolecule = useSelector(state => state.selectionReducers.fragmentDisplayList);
const surfaceListMolecule = useSelector(state => state.selectionReducers.surfaceList);
const densityListMolecule = useSelector(state => state.selectionReducers.densityList);
const vectorOnListMolecule = useSelector(state => state.selectionReducers.vectorOnList);

const ligandList = useSelector(state => state.datasetsReducers.ligandLists[datasetID]);
const proteinList = useSelector(state => state.datasetsReducers.proteinLists[datasetID]);
const complexList = useSelector(state => state.datasetsReducers.complexLists[datasetID]);
Expand Down Expand Up @@ -317,6 +335,60 @@ export const DatasetMoleculeList = memo(
});
};

const moveSelectedMoleculeInspirationsSettings = (data, newItemData, currentID) => (dispatch, getState) => {
const state = getState();
const molecules = state.datasetsReducers.inspirationMoleculeDataList;
if (newItemData && molecules) {
let computed_inspirations = (data && data.computed_inspirations) || [];
let isAnyInspirationLigandOn = isAnyInspirationTurnedOnByType(
computed_inspirations,
fragmentDisplayListMolecule
);
let isAnyInspirationProteinOn = isAnyInspirationTurnedOnByType(computed_inspirations, proteinListMolecule);
let isAnyInspirationComplexOn = isAnyInspirationTurnedOnByType(computed_inspirations, complexListMolecule);
let isAnyInspirationSurfaceOn = isAnyInspirationTurnedOnByType(computed_inspirations, surfaceListMolecule);
let isAnyInspirationDensityOn = isAnyInspirationTurnedOnByType(computed_inspirations, densityListMolecule);
let isAnyInspirationVectorOn = isAnyInspirationTurnedOnByType(computed_inspirations, vectorOnListMolecule);

if (
isAnyInspirationLigandOn ||
isAnyInspirationProteinOn ||
isAnyInspirationComplexOn ||
isAnyInspirationSurfaceOn ||
isAnyInspirationDensityOn ||
isAnyInspirationVectorOn
) {
molecules.forEach(molecule => {
if (molecule) {
if (isAnyInspirationLigandOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.LIGAND);
dispatch(addLigand(stage, molecule, colourList[currentID % colourList.length], false, representations));
}
if (isAnyInspirationProteinOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.HIT_PROTEIN);
dispatch(addHitProtein(stage, molecule, colourList[currentID % colourList.length], representations));
}
if (isAnyInspirationComplexOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.COMPLEX);
dispatch(addComplex(stage, molecule, colourList[currentID % colourList.length], representations));
}
if (isAnyInspirationSurfaceOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.SURFACE);
dispatch(addSurface(stage, molecule, colourList[currentID % colourList.length], representations));
}
if (isAnyInspirationDensityOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.DENSITY);
dispatch(addDensity(stage, molecule, colourList[currentID % colourList.length], representations));
}
if (isAnyInspirationVectorOn) {
dispatch(addVector(stage, molecule, colourList[currentID % colourList.length]));
}
}
});
}
}
};

// TODO "currentMolecules" do not need to correspondent to selections in {type}List
// TODO so this could lead to inconsistend behaviour while scrolling
// TODO maybe change "currentMolecules.forEach" to "{type}List.forEach"
Expand Down Expand Up @@ -621,6 +693,7 @@ export const DatasetMoleculeList = memo(
nextItemData={index < array?.length && array[index + 1]}
removeOfAllSelectedTypes={removeOfAllSelectedTypes}
removeOfAllSelectedTypesOfInspirations={removeOfAllSelectedTypesOfInspirations}
moveSelectedMoleculeInspirationsSettings={moveSelectedMoleculeInspirationsSettings}
/>
))}
</InfiniteScroll>
Expand Down
108 changes: 6 additions & 102 deletions js/components/datasets/datasetMoleculeView.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,10 @@ import {
clickOnInspirations,
getDatasetMoleculeID
} from './redux/dispatchActions';
import {
addVector,
addHitProtein,
addComplex,
addSurface,
addLigand,
addDensity
} from '../preview/molecule/redux/dispatchActions';

import { base_url } from '../routes/constants';
import { api } from '../../utils/api';
import {
isAnyInspirationTurnedOn,
isAnyInspirationTurnedOnByType,
getFilteredDatasetMoleculeList
} from './redux/selectors';
import { isAnyInspirationTurnedOn, getFilteredDatasetMoleculeList } from './redux/selectors';
import {
appendMoleculeToCompoundsOfDatasetToBuy,
removeMoleculeFromCompoundsOfDatasetToBuy,
Expand Down Expand Up @@ -262,7 +251,8 @@ export const DatasetMoleculeView = memo(
previousItemData,
nextItemData,
removeOfAllSelectedTypes,
removeOfAllSelectedTypesOfInspirations
removeOfAllSelectedTypesOfInspirations,
moveSelectedMoleculeInspirationsSettings
}) => {
const selectedAll = useRef(false);
const currentID = (data && data.id) || undefined;
Expand All @@ -282,13 +272,6 @@ export const DatasetMoleculeView = memo(
isAnyInspirationTurnedOn(state, (data && data.computed_inspirations) || [])
);

const proteinListMolecule = useSelector(state => state.selectionReducers.proteinList);
const complexListMolecule = useSelector(state => state.selectionReducers.complexList);
const fragmentDisplayListMolecule = useSelector(state => state.selectionReducers.fragmentDisplayList);
const surfaceListMolecule = useSelector(state => state.selectionReducers.surfaceList);
const densityListMolecule = useSelector(state => state.selectionReducers.densityList);
const vectorOnListMolecule = useSelector(state => state.selectionReducers.vectorOnList);

const filteredDatasetMoleculeList = useSelector(state => getFilteredDatasetMoleculeList(state, datasetID));
const objectsInView = useSelector(state => state.nglReducers.objectsInView) || {};

Expand Down Expand Up @@ -512,65 +495,6 @@ export const DatasetMoleculeView = memo(
return cssClass;
};

const moveSelectedMoleculeInspirationsSettings = (
newItemData,
ligands,
proteins,
complexis,
surfaces,
densities,
vectors
) => (dispatch, getState) => {
const state = getState();
const molecules = state.datasetsReducers.inspirationMoleculeDataList;
if (newItemData && molecules) {
let computed_inspirations = (data && data.computed_inspirations) || [];
let isAnyInspirationLigandOn = isAnyInspirationTurnedOnByType(computed_inspirations, ligands);
let isAnyInspirationProteinOn = isAnyInspirationTurnedOnByType(computed_inspirations, proteins);
let isAnyInspirationComplexOn = isAnyInspirationTurnedOnByType(computed_inspirations, complexis);
let isAnyInspirationSurfaceOn = isAnyInspirationTurnedOnByType(computed_inspirations, surfaces);
let isAnyInspirationDensityOn = isAnyInspirationTurnedOnByType(computed_inspirations, densities);
let isAnyInspirationVectorOn = isAnyInspirationTurnedOnByType(computed_inspirations, vectors);

if (
isAnyInspirationLigandOn ||
isAnyInspirationProteinOn ||
isAnyInspirationComplexOn ||
isAnyInspirationSurfaceOn ||
isAnyInspirationDensityOn ||
isAnyInspirationVectorOn
) {
molecules.forEach(molecule => {
if (molecule) {
if (isAnyInspirationLigandOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.LIGAND);
dispatch(addLigand(stage, molecule, colourToggle, false, representations));
}
if (isAnyInspirationProteinOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.HIT_PROTEIN);
dispatch(addHitProtein(stage, molecule, colourToggle, representations));
}
if (isAnyInspirationComplexOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.COMPLEX);
dispatch(addComplex(stage, molecule, colourToggle, representations));
}
if (isAnyInspirationSurfaceOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.SURFACE);
dispatch(addSurface(stage, molecule, colourToggle, representations));
}
if (isAnyInspirationDensityOn) {
let representations = getRepresentationsByType(objectsInView, molecule, OBJECT_TYPE.DENSITY);
dispatch(addDensity(stage, molecule, colourToggle, representations));
}
if (isAnyInspirationVectorOn) {
dispatch(addVector(stage, molecule, colourToggle));
}
}
});
}
}
};

const moveSelectedMoleculeSettings = (newItemData, datasetIdOfMolecule) => {
if (newItemData) {
if (isLigandOn) {
Expand Down Expand Up @@ -602,17 +526,7 @@ export const DatasetMoleculeView = memo(
dispatch(clearAllInspirationsOfDataset());
dispatch(loadInspirationMoleculesDataList(nextItem.computed_inspirations)).then(() => {
moveSelectedMoleculeSettings(nextItem, nextDatasetID);
dispatch(
moveSelectedMoleculeInspirationsSettings(
nextItem,
fragmentDisplayListMolecule,
proteinListMolecule,
complexListMolecule,
surfaceListMolecule,
densityListMolecule,
vectorOnListMolecule
)
);
dispatch(moveSelectedMoleculeInspirationsSettings(data, nextItem, currentID));
});
};

Expand All @@ -628,17 +542,7 @@ export const DatasetMoleculeView = memo(
dispatch(clearAllInspirationsOfDataset());
dispatch(loadInspirationMoleculesDataList(previousItem.computed_inspirations)).then(() => {
moveSelectedMoleculeSettings(previousItem, previousDatasetID);
dispatch(
moveSelectedMoleculeInspirationsSettings(
previousItem,
fragmentDisplayListMolecule,
proteinListMolecule,
complexListMolecule,
surfaceListMolecule,
densityListMolecule,
vectorOnListMolecule
)
);
dispatch(moveSelectedMoleculeInspirationsSettings(data, previousItem, currentID));
});
};

Expand Down

0 comments on commit 90defc1

Please sign in to comment.