From 90defc1d76756c3a89e2115d1da76c7403282f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1na=20Kohanov=C3=A1?= Date: Fri, 16 Oct 2020 15:24:30 +0200 Subject: [PATCH] #407 Properly turn on/off inspiration fragments when using the next/previous arrows (bug of #384) --- js/components/datasets/datasetMoleculeList.js | 83 +++++++++++++- js/components/datasets/datasetMoleculeView.js | 108 +----------------- 2 files changed, 84 insertions(+), 107 deletions(-) diff --git a/js/components/datasets/datasetMoleculeList.js b/js/components/datasets/datasetMoleculeList.js index 733ab2f9b..21c1b9f7d 100644 --- a/js/components/datasets/datasetMoleculeList.js +++ b/js/components/datasets/datasetMoleculeList.js @@ -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'; @@ -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: { @@ -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]); @@ -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" @@ -621,6 +693,7 @@ export const DatasetMoleculeList = memo( nextItemData={index < array?.length && array[index + 1]} removeOfAllSelectedTypes={removeOfAllSelectedTypes} removeOfAllSelectedTypesOfInspirations={removeOfAllSelectedTypesOfInspirations} + moveSelectedMoleculeInspirationsSettings={moveSelectedMoleculeInspirationsSettings} /> ))} diff --git a/js/components/datasets/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView.js index 433d1580e..fa9415970 100644 --- a/js/components/datasets/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView.js @@ -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, @@ -262,7 +251,8 @@ export const DatasetMoleculeView = memo( previousItemData, nextItemData, removeOfAllSelectedTypes, - removeOfAllSelectedTypesOfInspirations + removeOfAllSelectedTypesOfInspirations, + moveSelectedMoleculeInspirationsSettings }) => { const selectedAll = useRef(false); const currentID = (data && data.id) || undefined; @@ -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) || {}; @@ -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) { @@ -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)); }); }; @@ -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)); }); };