From 7a6cfebbe0e7aade1ee04dce15a51a222ca58fe1 Mon Sep 17 00:00:00 2001 From: ag-m2ms Date: Thu, 26 Nov 2020 17:34:10 +0100 Subject: [PATCH 1/5] Add selected molecules from unselected sites at the end of the list --- .../preview/molecule/moleculeList.js | 34 +++++++-- .../moleculeGroups/redux/dispatchActions.js | 72 +------------------ 2 files changed, 33 insertions(+), 73 deletions(-) diff --git a/js/components/preview/molecule/moleculeList.js b/js/components/preview/molecule/moleculeList.js index 07e872db8..c5945d841 100644 --- a/js/components/preview/molecule/moleculeList.js +++ b/js/components/preview/molecule/moleculeList.js @@ -283,16 +283,42 @@ export const MoleculeList = memo(({ height, setFilterItemsHeight, filterItemsHei molecule.protein_code.toLowerCase().includes(searchString.toLowerCase()) ); } else { - joinedMoleculeLists = getJoinedMoleculeList; + joinedMoleculeLists = [...getJoinedMoleculeList]; } - if (isActiveFilter) { - joinedMoleculeLists = filterMolecules(joinedMoleculeLists, filter); - } else { + //Ensures that sorting is applied on only selected sites + if (!isActiveFilter) { // default sort is by site joinedMoleculeLists.sort((a, b) => a.site - b.site || a.number - b.number); } + const addSelectedMoleculesFromUnselectedSites = (list) => { + const mols = []; + list?.forEach(moleculeID => { + const foundJoinedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID); + if (!foundJoinedMolecule) { + const molecule = getAllMoleculeList.find(mol => mol.id === moleculeID); + if (molecule) { + mols.push(molecule); + } + } + }); + + mols.sort((a, b) => a.site - b.site || a.number - b.number); + joinedMoleculeLists.push(...mols); + }; + + addSelectedMoleculesFromUnselectedSites(proteinList); + addSelectedMoleculesFromUnselectedSites(complexList); + addSelectedMoleculesFromUnselectedSites(fragmentDisplayList); + addSelectedMoleculesFromUnselectedSites(surfaceList); + addSelectedMoleculesFromUnselectedSites(densityList); + addSelectedMoleculesFromUnselectedSites(vectorOnList); + + if (isActiveFilter) { + joinedMoleculeLists = filterMolecules(joinedMoleculeLists, filter); + } + const loadNextMolecules = () => { setCurrentPage(currentPage + 1); }; diff --git a/js/components/preview/moleculeGroups/redux/dispatchActions.js b/js/components/preview/moleculeGroups/redux/dispatchActions.js index 8b05dcde2..3f7687ca1 100644 --- a/js/components/preview/moleculeGroups/redux/dispatchActions.js +++ b/js/components/preview/moleculeGroups/redux/dispatchActions.js @@ -12,11 +12,6 @@ import { } from '../../../../reducers/ngl/dispatchActions'; import { selectJoinedMoleculeList } from '../../molecule/redux/selectors'; import { - removeFromComplexList, - removeFromProteinList, - removeFromSurfaceList, - removeFromFragmentDisplayList, - removeFromVectorOnList, resetSelectionState, setComplexList, setFilter, @@ -34,68 +29,11 @@ import { setSortDialogOpen } from '../../molecule/redux/actions'; import { resetCurrentCompoundsSettings } from '../../compounds/redux/actions'; import { reloadSession } from '../../../snapshot/redux/dispatchActions'; -export const clearAfterDeselectingMoleculeGroup = ({ molGroupId, currentMolGroup, majorViewStage }) => ( - dispatch, - getState +export const clearAfterDeselectingMoleculeGroup = () => ( + dispatch ) => { - dispatch(setObjectSelection([molGroupId])); - - let site; - const state = getState(); - const vector_list = state.selectionReducers.vector_list; - - // loop through all molecules - selectJoinedMoleculeList(state).forEach(mol => { - site = mol.site; - - // remove Ligand - dispatch( - deleteObject( - Object.assign({ display_div: VIEWS.MAJOR_VIEW }, generateMolecule(mol.protein_code, mol.sdf_info)), - majorViewStage - ) - ); - - // remove Complex, Protein, Surface - Object.keys(complexObjectTypes).forEach(type => { - dispatch( - deleteObject( - Object.assign( - { display_div: VIEWS.MAJOR_VIEW }, - generateComplex(mol.protein_code, mol.sdf_info, mol.molecule_protein, type) - ), - majorViewStage - ) - ); - }); - }); - - // remove all Vectors - vector_list - .filter(v => v.site === site) - .forEach(item => { - dispatch(deleteObject(Object.assign({ display_div: VIEWS.MAJOR_VIEW }, item), majorViewStage)); - }); - - dispatch(setObjectSelection(undefined)); - // remove all molecule orientations dispatch(setMoleculeOrientations({})); - - // remove all selected ALCV of given site - currentMolGroup.mol_id.forEach(moleculeID => { - // remove Ligand, Complex, Vectors from selection - //Ligand - dispatch(removeFromFragmentDisplayList({ id: moleculeID })); - // Complex - dispatch(removeFromComplexList({ id: moleculeID })); - // Protein - dispatch(removeFromProteinList({ id: moleculeID })); - // Surface - dispatch(removeFromSurfaceList({ id: moleculeID })); - // Vectors - dispatch(removeFromVectorOnList({ id: moleculeID })); - }); }; export const saveMoleculeGroupsToNglView = (molGroupList, stage, projectId) => dispatch => { @@ -229,11 +167,7 @@ export const onDeselectMoleculeGroup = ({ moleculeGroup, stageSummaryView, major const selectionCopy = mol_group_selection.slice(); const objIdx = mol_group_selection.indexOf(moleculeGroup.id); dispatch( - clearAfterDeselectingMoleculeGroup({ - molGroupId: moleculeGroup.id, - currentMolGroup, - majorViewStage - }) + clearAfterDeselectingMoleculeGroup() ); selectionCopy.splice(objIdx, 1); dispatch( From 0ea5fcb3da2a28093cc400b389c3b4460c0e691e Mon Sep 17 00:00:00 2001 From: ag-m2ms Date: Thu, 26 Nov 2020 17:47:50 +0100 Subject: [PATCH 2/5] Removed unused imports and params --- js/components/nglView/redux/dispatchActions.js | 12 ++++-------- .../preview/moleculeGroups/redux/dispatchActions.js | 5 ----- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/js/components/nglView/redux/dispatchActions.js b/js/components/nglView/redux/dispatchActions.js index eec05e82c..4d8b2d0f6 100644 --- a/js/components/nglView/redux/dispatchActions.js +++ b/js/components/nglView/redux/dispatchActions.js @@ -8,7 +8,7 @@ import { setDuckYankData, setMolGroupOn, setPanddaSiteOn } from '../../../reduce import * as listTypes from '../../../constants/listTypes'; import { selectVectorAndResetCompounds } from '../../../reducers/selection/dispatchActions'; -export const toggleMoleculeGroup = (molGroupId, summaryViewStage, majorViewStage) => (dispatch, getState) => { +export const toggleMoleculeGroup = (molGroupId, summaryViewStage) => (dispatch, getState) => { const state = getState(); const molGroupSelection = state.selectionReducers.mol_group_selection; const objIdx = molGroupSelection.indexOf(molGroupId); @@ -58,11 +58,7 @@ export const toggleMoleculeGroup = (molGroupId, summaryViewStage, majorViewStage throw new Error(error); }); dispatch( - clearAfterDeselectingMoleculeGroup({ - molGroupId, - currentMolGroup, - majorViewStage - }) + clearAfterDeselectingMoleculeGroup() ); } }; @@ -117,9 +113,9 @@ export const handleNglViewPick = (stage, pickingProxy, getNglView) => (dispatch, const type = name.split('_')[0]; const pk = parseInt(name.split('_')[1], 10); if (type === OBJECT_TYPE.MOLECULE_GROUP && getNglView(VIEWS.MAJOR_VIEW)) { - dispatch(toggleMoleculeGroup(pk, stage, getNglView(VIEWS.MAJOR_VIEW).stage)); + dispatch(toggleMoleculeGroup(pk, stage)); } else if (type === OBJECT_TYPE.MOLGROUPS_SELECT && getNglView(VIEWS.MAJOR_VIEW)) { - dispatch(toggleMoleculeGroup(pk, stage, getNglView(VIEWS.MAJOR_VIEW).stage)); + dispatch(toggleMoleculeGroup(pk, stage)); } else if (type === listTypes.PANDDA_SITE) { dispatch(setPanddaSiteOn(pk)); } diff --git a/js/components/preview/moleculeGroups/redux/dispatchActions.js b/js/components/preview/moleculeGroups/redux/dispatchActions.js index 3f7687ca1..11041838b 100644 --- a/js/components/preview/moleculeGroups/redux/dispatchActions.js +++ b/js/components/preview/moleculeGroups/redux/dispatchActions.js @@ -1,7 +1,4 @@ import { - complexObjectTypes, - generateComplex, - generateMolecule, generateSphere } from '../../molecule/molecules_helpers'; import { VIEWS } from '../../../../constants/constants'; @@ -10,14 +7,12 @@ import { deleteObject, loadObject } from '../../../../reducers/ngl/dispatchActions'; -import { selectJoinedMoleculeList } from '../../molecule/redux/selectors'; import { resetSelectionState, setComplexList, setFilter, setFragmentDisplayList, setMolGroupSelection, - setObjectSelection, setVectorList, setVectorOnList } from '../../../../reducers/selection/actions'; From 6f17ae09065a273764cfc97cb5915cf6e0e8d772 Mon Sep 17 00:00:00 2001 From: ag-m2ms Date: Mon, 30 Nov 2020 10:27:39 +0100 Subject: [PATCH 3/5] Add selected molecules from unselected sites to filter --- .../preview/molecule/moleculeList.js | 60 ++++++++++++------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/js/components/preview/molecule/moleculeList.js b/js/components/preview/molecule/moleculeList.js index f468963d2..d6ad196cf 100644 --- a/js/components/preview/molecule/moleculeList.js +++ b/js/components/preview/molecule/moleculeList.js @@ -287,39 +287,53 @@ export const MoleculeList = memo(({ height, setFilterItemsHeight, filterItemsHei } }, [getJoinedMoleculeList, getAllMoleculeList, searchString]); - // Used for MoleculeListSortFilterDialog when using textSearch - const joinedMoleculeListsCopy = useMemo(() => [...joinedMoleculeLists], [joinedMoleculeLists]); - - //Ensures that sorting is applied on only selected sites - if (!isActiveFilter) { - // default sort is by site - joinedMoleculeLists.sort((a, b) => a.site - b.site || a.number - b.number); - } - - const addSelectedMoleculesFromUnselectedSites = (list) => { - const mols = []; + const addSelectedMoleculesFromUnselectedSites = useCallback((joinedMoleculeLists, list) => { + const result = [...joinedMoleculeLists]; list?.forEach(moleculeID => { - const foundJoinedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID); + const foundJoinedMolecule = result.find(mol => mol.id === moleculeID); if (!foundJoinedMolecule) { const molecule = getAllMoleculeList.find(mol => mol.id === moleculeID); if (molecule) { - mols.push(molecule); + result.push(molecule); } } }); - mols.sort((a, b) => a.site - b.site || a.number - b.number); - joinedMoleculeLists.push(...mols); - }; + return result; + }, [getAllMoleculeList]); - addSelectedMoleculesFromUnselectedSites(proteinList); - addSelectedMoleculesFromUnselectedSites(complexList); - addSelectedMoleculesFromUnselectedSites(fragmentDisplayList); - addSelectedMoleculesFromUnselectedSites(surfaceList); - addSelectedMoleculesFromUnselectedSites(densityList); - addSelectedMoleculesFromUnselectedSites(vectorOnList); + joinedMoleculeLists = useMemo( + () => addSelectedMoleculesFromUnselectedSites(joinedMoleculeLists, proteinList), + [addSelectedMoleculesFromUnselectedSites, joinedMoleculeLists, proteinList] + ); + joinedMoleculeLists = useMemo( + () => addSelectedMoleculesFromUnselectedSites(joinedMoleculeLists, complexList), + [addSelectedMoleculesFromUnselectedSites, joinedMoleculeLists, complexList] + ); + joinedMoleculeLists = useMemo( + () => addSelectedMoleculesFromUnselectedSites(joinedMoleculeLists, fragmentDisplayList), + [addSelectedMoleculesFromUnselectedSites, joinedMoleculeLists, fragmentDisplayList] + ); + joinedMoleculeLists = useMemo( + () => addSelectedMoleculesFromUnselectedSites(joinedMoleculeLists, surfaceList), + [addSelectedMoleculesFromUnselectedSites, joinedMoleculeLists, surfaceList] + ); + joinedMoleculeLists = useMemo( + () => addSelectedMoleculesFromUnselectedSites(joinedMoleculeLists, densityList), + [addSelectedMoleculesFromUnselectedSites, joinedMoleculeLists, densityList] + ); + joinedMoleculeLists = useMemo( + () => addSelectedMoleculesFromUnselectedSites(joinedMoleculeLists, vectorOnList), + [addSelectedMoleculesFromUnselectedSites, joinedMoleculeLists, vectorOnList] + ); + + // Used for MoleculeListSortFilterDialog when using textSearch + const joinedMoleculeListsCopy = useMemo(() => [...joinedMoleculeLists], [joinedMoleculeLists]); - if (isActiveFilter) { + if (!isActiveFilter) { + // default sort is by site + joinedMoleculeLists.sort((a, b) => a.site - b.site || a.number - b.number); + } else { joinedMoleculeLists = filterMolecules(joinedMoleculeLists, filter); } From 15b0286c654d69bc69c8f6b623608fc88e731faf Mon Sep 17 00:00:00 2001 From: ag-m2ms Date: Mon, 30 Nov 2020 10:46:22 +0100 Subject: [PATCH 4/5] Fixed filter related issues --- js/components/preview/molecule/moleculeList.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/js/components/preview/molecule/moleculeList.js b/js/components/preview/molecule/moleculeList.js index d6ad196cf..d921f7562 100644 --- a/js/components/preview/molecule/moleculeList.js +++ b/js/components/preview/molecule/moleculeList.js @@ -328,6 +328,8 @@ export const MoleculeList = memo(({ height, setFilterItemsHeight, filterItemsHei ); // Used for MoleculeListSortFilterDialog when using textSearch + // Also used for displaying filter, since using the original would perform deadlock when creating a filter which matches + // 0 molecules const joinedMoleculeListsCopy = useMemo(() => [...joinedMoleculeLists], [joinedMoleculeLists]); if (!isActiveFilter) { @@ -445,6 +447,12 @@ export const MoleculeList = memo(({ height, setFilterItemsHeight, filterItemsHei } }, [isActiveFilter, setFilterItemsHeight]); + useEffect(() => { + if (!joinedMoleculeListsCopy.length) { + dispatch(setSortDialogOpen(false)); + } + }, [dispatch, joinedMoleculeListsCopy.length]); + const handleFilterChange = filter => { const filterSet = Object.assign({}, filter); for (let attr of MOL_ATTRIBUTES) { @@ -607,7 +615,7 @@ export const MoleculeList = memo(({ height, setFilterItemsHeight, filterItemsHei }; const actions = [ - +