From e39721c2353fe40249ea7cac6d7d01bc58186fe2 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Mon, 26 Feb 2024 08:42:49 +0100 Subject: [PATCH 01/21] - checkpoint --- docker-compose.dev.vector.yml | 4 +- .../datasetMoleculeView.js | 40 +++++++++---------- .../datasets/redux/dispatchActions.js | 20 ++++++++-- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/docker-compose.dev.vector.yml b/docker-compose.dev.vector.yml index 272e4b83f..e9238a97c 100644 --- a/docker-compose.dev.vector.yml +++ b/docker-compose.dev.vector.yml @@ -53,10 +53,10 @@ services: start_period: 10s web: container_name: web_dock - image: xchem/fragalysis-stack:latest + # image: xchem/fragalysis-stack:latest # image: alanbchristie/fragalysis-backend:1187.3 # image: boriskovarm2ms/fragalysis-stack:experiment2 - # image: kaliif/fragalysis-backend:latest + image: kaliif/fragalysis-backend:latest command: /bin/bash /code/launch-stack.sh volumes: - ../data/logs:/code/logs/ diff --git a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js index 68e6ae435..50455a492 100644 --- a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js @@ -63,7 +63,15 @@ import { centerOnLigandByMoleculeID } from '../../../reducers/ngl/dispatchAction import { ArrowDownward, ArrowUpward, MyLocation } from '@material-ui/icons'; import { isString } from 'lodash'; import { SvgTooltip } from '../../common'; -import { addComplex, addHitProtein, addSurface, getMolImage, removeComplex, removeHitProtein, removeSurface } from '../../preview/molecule/redux/dispatchActions'; +import { + addComplex, + addHitProtein, + addSurface, + getMolImage, + removeComplex, + removeHitProtein, + removeSurface +} from '../../preview/molecule/redux/dispatchActions'; import { MOL_TYPE } from '../../preview/molecule/redux/constants'; import { deselectVectorCompound, @@ -453,6 +461,7 @@ const DatasetMoleculeView = memo( // #1249 dataset molecules currently could use side observation molecule for some renders const allMolecules = useSelector(state => state.apiReducers.all_mol_lists); const [pdbData, setPdbData] = useState(null); + const [isCustomPdb, setIsCustomPdb] = useState(false); const isPdbAvailable = !!(data && (data.pdb_info || pdbData)); useEffect(() => { @@ -462,7 +471,8 @@ const DatasetMoleculeView = memo( setPdbData(molecule); } } else { - setPdbData(data.pdb_info); + setPdbData(data); + setIsCustomPdb(true); } }, [data, allMolecules]); @@ -1236,13 +1246,7 @@ const DatasetMoleculeView = memo( wrap="nowrap" className={classes.fullHeight} > - + {filteredScoreProperties && datasetID && filteredScoreProperties[datasetID] && @@ -1270,21 +1274,15 @@ const DatasetMoleculeView = memo( null} )) || ( - - - - - )} + + - + + )} ); })} - + {Object.keys(compoundsColors).map(color => { const colorIncluded = shoppingCartColors?.includes(color); return ( @@ -1363,7 +1361,7 @@ const DatasetMoleculeView = memo( )} {moleculeTooltipOpen && !inSelectedCompoundsList && ( - + diff --git a/js/components/datasets/redux/dispatchActions.js b/js/components/datasets/redux/dispatchActions.js index fa9135242..51cfd82cb 100644 --- a/js/components/datasets/redux/dispatchActions.js +++ b/js/components/datasets/redux/dispatchActions.js @@ -299,10 +299,17 @@ export const loadDatasetCompoundsWithScores = (datasetsToLoad = null) => (dispat // -----> add 'site_observation_code' to molecules whereas '/compound-molecules' has more molecule info so far, can be removed later const compondMolecules = await api({ url: `${base_url}/api/compound-molecules/?compound_set=${dataset.id}` }); const compondMoleculesMap = {}; - compondMolecules.data.results.forEach(molecule => compondMoleculesMap[molecule.name] = molecule.site_observation_code); + compondMolecules.data.results.forEach( + molecule => + (compondMoleculesMap[molecule.name] = { + site_observation_code: molecule.site_observation_code, + pdb_info: molecule.pdb_info + }) + ); response.data.results.forEach(molecule => { if (compondMoleculesMap.hasOwnProperty(molecule.name)) { - molecule['site_observation_code'] = compondMoleculesMap[molecule.name]; + molecule['site_observation_code'] = compondMoleculesMap[molecule.name].site_observation_code; + molecule['pdb_info'] = compondMoleculesMap[molecule.name].pdb_info; } }); // <----- @@ -1331,7 +1338,14 @@ export const moveSelectedMoleculeSettings = ( let representations = getRepresentationsByType(data.objectsInView, newItem, OBJECT_TYPE.PROTEIN, datasetID); promises.push( dispatch( - addDatasetHitProtein(stage, newItem, getRandomColor(newItem), datasetIdOfMolecule, skipTracking, representations) + addDatasetHitProtein( + stage, + newItem, + getRandomColor(newItem), + datasetIdOfMolecule, + skipTracking, + representations + ) ) ); } From c13628b494bb5bfcd3b889b7a040568b683549a8 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 27 Feb 2024 09:23:04 +0100 Subject: [PATCH 02/21] - checkpoint --- js/components/datasets/datasetMoleculeList.js | 95 ++++++++++--------- .../datasetMoleculeView.js | 23 +++-- .../datasets/redux/dispatchActions.js | 1 + 3 files changed, 66 insertions(+), 53 deletions(-) diff --git a/js/components/datasets/datasetMoleculeList.js b/js/components/datasets/datasetMoleculeList.js index e8f0144d2..d62441614 100644 --- a/js/components/datasets/datasetMoleculeList.js +++ b/js/components/datasets/datasetMoleculeList.js @@ -428,9 +428,9 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { ); const ligandList = useSelector(state => state.datasetsReducers.ligandLists[datasetID]); - // const proteinList = useSelector(state => state.datasetsReducers.proteinLists[datasetID]); - // const complexList = useSelector(state => state.datasetsReducers.complexLists[datasetID]); - // const surfaceList = useSelector(state => state.datasetsReducers.surfaceLists[datasetID]); + const proteinListDataset = useSelector(state => state.datasetsReducers.proteinLists[datasetID]); + const complexListDataset = useSelector(state => state.datasetsReducers.complexLists[datasetID]); + const surfaceListDataset = useSelector(state => state.datasetsReducers.surfaceLists[datasetID]); // #1249 dataset molecules currently could use side observation molecule for some renders const proteinList = useSelector(state => state.selectionReducers.proteinList); const complexList = useSelector(state => state.selectionReducers.complexList); @@ -656,7 +656,7 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { <> {/* fontSize does not change font here, but it disqualifies default font size so we do not need to !important */} - {isActiveFilter && } + {isActiveFilter && } @@ -917,7 +917,7 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { }; return ( - + { setIsDeleteDatasetAlertOpen(false); }} /> - { - sortDialogOpen && ( - - ) - } - { - isOpenInspirationDialog && ( - - ) - } - { - askLockCompoundsQuestion && isLockVisibleCompoundsDialogOpenGlobal && ( - - ) - } - { - isOpenCrossReferenceDialog && ( - - ) - } + {sortDialogOpen && ( + + )} + {isOpenInspirationDialog && ( + + )} + {askLockCompoundsQuestion && isLockVisibleCompoundsDialogOpenGlobal && ( + + )} + {isOpenCrossReferenceDialog && ( + + )}
{/* TODO disable showing of filter tags for now */} {false && isActiveFilter && ( @@ -992,8 +984,9 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { {filterSettings.priorityOrder.map(attr => ( @@ -1336,9 +1329,21 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { previousItemData={index > 0 && array[index - 1]} nextItemData={index < array?.length && array[index + 1]} L={ligandList?.includes(data.id)} - P={proteinList?.includes(idToFind)} - C={complexList?.includes(idToFind)} - S={surfaceList?.includes(idToFind)} + P={ + data.isCustomPdb + ? proteinListDataset?.includes(idToFind) + : proteinList?.includes(idToFind) + } + C={ + data.isCustomPdb + ? complexListDataset?.includes(idToFind) + : complexList?.includes(idToFind) + } + S={ + data.isCustomPdb + ? surfaceListDataset?.includes(idToFind) + : surfaceList?.includes(idToFind) + } V={false} moveMolecule={moveMolecule} isLocked={locked} @@ -1396,7 +1401,7 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { )} - + ); }; diff --git a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js index 50455a492..93cf38334 100644 --- a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js @@ -461,7 +461,6 @@ const DatasetMoleculeView = memo( // #1249 dataset molecules currently could use side observation molecule for some renders const allMolecules = useSelector(state => state.apiReducers.all_mol_lists); const [pdbData, setPdbData] = useState(null); - const [isCustomPdb, setIsCustomPdb] = useState(false); const isPdbAvailable = !!(data && (data.pdb_info || pdbData)); useEffect(() => { @@ -472,7 +471,6 @@ const DatasetMoleculeView = memo( } } else { setPdbData(data); - setIsCustomPdb(true); } }, [data, allMolecules]); @@ -554,8 +552,11 @@ const DatasetMoleculeView = memo( const addNewProtein = (skipTracking = false) => { dispatch( withDisabledDatasetMoleculeNglControlButton(datasetID, currentID, 'protein', () => { - dispatch(addHitProtein(stage, pdbData, colourToggle, true, skipTracking, undefined, true)); - // dispatch(addDatasetHitProtein(stage, data, colourToggle, datasetID, skipTracking)); + if (data.isCustomPdb) { + dispatch(addDatasetHitProtein(stage, data, colourToggle, datasetID, skipTracking)); + } else { + dispatch(addHitProtein(stage, pdbData, colourToggle, true, skipTracking, undefined, true)); + } }) ); }; @@ -588,8 +589,11 @@ const DatasetMoleculeView = memo( const addNewComplex = (skipTracking = false) => { dispatch( withDisabledDatasetMoleculeNglControlButton(datasetID, currentID, 'complex', () => { - // dispatch(addDatasetComplex(stage, data, colourToggle, datasetID, skipTracking)); - dispatch(addComplex(stage, pdbData, colourToggle, skipTracking, undefined, true)); + if (data.isCustomPdb) { + dispatch(addDatasetComplex(stage, data, colourToggle, datasetID, skipTracking)); + } else { + dispatch(addComplex(stage, pdbData, colourToggle, skipTracking, undefined, true)); + } }) ); }; @@ -622,8 +626,11 @@ const DatasetMoleculeView = memo( const addNewSurface = async () => { dispatch( withDisabledDatasetMoleculeNglControlButton(datasetID, currentID, 'surface', () => { - dispatch(addSurface(stage, pdbData, colourToggle, false, undefined, true)); - // dispatch(addDatasetSurface(stage, data, colourToggle, datasetID)); + if (data.isCustomPdb) { + dispatch(addDatasetSurface(stage, data, colourToggle, datasetID)); + } else { + dispatch(addSurface(stage, pdbData, colourToggle, false, undefined, true)); + } }) ); }; diff --git a/js/components/datasets/redux/dispatchActions.js b/js/components/datasets/redux/dispatchActions.js index 51cfd82cb..1463b83ad 100644 --- a/js/components/datasets/redux/dispatchActions.js +++ b/js/components/datasets/redux/dispatchActions.js @@ -310,6 +310,7 @@ export const loadDatasetCompoundsWithScores = (datasetsToLoad = null) => (dispat if (compondMoleculesMap.hasOwnProperty(molecule.name)) { molecule['site_observation_code'] = compondMoleculesMap[molecule.name].site_observation_code; molecule['pdb_info'] = compondMoleculesMap[molecule.name].pdb_info; + molecule['isCustomPdb'] = !!!compondMoleculesMap[molecule.name].site_observation_code; } }); // <----- From 7407dbd02fe0cf50dcb069740475e914010e9016 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 27 Feb 2024 10:27:08 +0100 Subject: [PATCH 03/21] - checkpoint --- docker-compose.dev.vector.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.dev.vector.yml b/docker-compose.dev.vector.yml index e9238a97c..272e4b83f 100644 --- a/docker-compose.dev.vector.yml +++ b/docker-compose.dev.vector.yml @@ -53,10 +53,10 @@ services: start_period: 10s web: container_name: web_dock - # image: xchem/fragalysis-stack:latest + image: xchem/fragalysis-stack:latest # image: alanbchristie/fragalysis-backend:1187.3 # image: boriskovarm2ms/fragalysis-stack:experiment2 - image: kaliif/fragalysis-backend:latest + # image: kaliif/fragalysis-backend:latest command: /bin/bash /code/launch-stack.sh volumes: - ../data/logs:/code/logs/ From 027eaf0eacd1ea929eb00bfca4aef9e34ba1deab Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 27 Feb 2024 12:16:45 +0100 Subject: [PATCH 04/21] - checkpoint --- docker-compose.dev.vector.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.dev.vector.yml b/docker-compose.dev.vector.yml index 272e4b83f..e9238a97c 100644 --- a/docker-compose.dev.vector.yml +++ b/docker-compose.dev.vector.yml @@ -53,10 +53,10 @@ services: start_period: 10s web: container_name: web_dock - image: xchem/fragalysis-stack:latest + # image: xchem/fragalysis-stack:latest # image: alanbchristie/fragalysis-backend:1187.3 # image: boriskovarm2ms/fragalysis-stack:experiment2 - # image: kaliif/fragalysis-backend:latest + image: kaliif/fragalysis-backend:latest command: /bin/bash /code/launch-stack.sh volumes: - ../data/logs:/code/logs/ From 6db8b22ca6133eddeb7322cc0bd0ab52a5272fd6 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Thu, 29 Feb 2024 10:32:27 +0100 Subject: [PATCH 05/21] - checkpoint --- js/components/datasets/datasetMoleculeList.js | 22 ++++++---- js/components/datasets/redux/selectors.js | 40 +++++++++++++++++++ 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/js/components/datasets/datasetMoleculeList.js b/js/components/datasets/datasetMoleculeList.js index d62441614..be9ebc830 100644 --- a/js/components/datasets/datasetMoleculeList.js +++ b/js/components/datasets/datasetMoleculeList.js @@ -61,7 +61,7 @@ import { } from './redux/actions'; import { DatasetFilter } from './datasetFilter'; import { FilterList, Link, DeleteForever, ArrowUpward, ArrowDownward, Edit } from '@material-ui/icons'; -import { getJoinedMoleculeLists } from './redux/selectors'; +import { getJoinedMoleculeLists, getLHSVisibleListsForRHS } from './redux/selectors'; import { InspirationDialog } from './inspirationDialog'; import { CrossReferenceDialog } from './crossReferenceDialog'; import { AlertModal } from '../common/Modal/AlertModal'; @@ -432,9 +432,11 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { const complexListDataset = useSelector(state => state.datasetsReducers.complexLists[datasetID]); const surfaceListDataset = useSelector(state => state.datasetsReducers.surfaceLists[datasetID]); // #1249 dataset molecules currently could use side observation molecule for some renders - const proteinList = useSelector(state => state.selectionReducers.proteinList); - const complexList = useSelector(state => state.selectionReducers.complexList); - const surfaceList = useSelector(state => state.selectionReducers.surfaceList); + + const { proteinList, complexList, surfaceList } = useSelector(state => getLHSVisibleListsForRHS(state, datasetID)); + // const proteinList = useSelector(state => state.selectionReducers.proteinList); + // const complexList = useSelector(state => state.selectionReducers.complexList); + // const surfaceList = useSelector(state => state.selectionReducers.surfaceList); const allMoleculesList = useSelector(state => state.apiReducers.all_mol_lists); // const [selectedMolecules, setSelectedMolecules] = useState([]); @@ -485,11 +487,17 @@ const DatasetMoleculeList = ({ title, datasetID, url }) => { }; let isLigandOn = isSelectedTypeOn(ligandList); - let isProteinOn = isSelectedTypeOn(proteinList); - let isComplexOn = isSelectedTypeOn(complexList); + let isProteinOn = isSelectedTypeOn(proteinList) || isSelectedTypeOn(proteinListDataset); + let isComplexOn = isSelectedTypeOn(complexList) || isSelectedTypeOn(complexListDataset); let areArrowsVisible = - isTypeOn(ligandList) || isTypeOn(proteinList) || isTypeOn(complexList) || isTypeOn(surfaceList); + isTypeOn(ligandList) || + isTypeOn(proteinList) || + isTypeOn(complexList) || + isTypeOn(surfaceList) || + isTypeOn(proteinListDataset) || + isTypeOn(complexListDataset) || + isTypeOn(surfaceListDataset); const addType = { ligand: addDatasetLigand, diff --git a/js/components/datasets/redux/selectors.js b/js/components/datasets/redux/selectors.js index 4c33776eb..323839bf0 100644 --- a/js/components/datasets/redux/selectors.js +++ b/js/components/datasets/redux/selectors.js @@ -478,3 +478,43 @@ export const getJoinedMoleculeLists = (datasetID, state) => { return moleculeList; }; + +export const getLHSVisibleListsForRHS = createSelector( + (_, datasetID) => datasetID, + moleculeLists, + proteinList, + complexList, + surfaceList, + (datasetID, molecules, proteins, complexes, surfaces) => { + const result = { proteinList: [], complexList: [], surfaceList: [] }; + + const rhsCompoundsWithLHSReference = {}; + const moleculesOfDataset = molecules[datasetID] || []; + + moleculesOfDataset.forEach(molecule => { + if (molecule.site_observation_code) { + rhsCompoundsWithLHSReference[molecule.id] = molecule; + } + }); + + proteins.forEach(id => { + if (rhsCompoundsWithLHSReference[id]) { + result.proteinList.push(rhsCompoundsWithLHSReference[id].id); + } + }); + + complexes.forEach(id => { + if (rhsCompoundsWithLHSReference[id]) { + result.complexList.push(rhsCompoundsWithLHSReference[id].id); + } + }); + + surfaces.forEach(id => { + if (rhsCompoundsWithLHSReference[id]) { + result.surfaceList.push(rhsCompoundsWithLHSReference[id].id); + } + }); + + return result; + } +); From 8765a3c69ef662a8c34ce73806bedfa306ab12f7 Mon Sep 17 00:00:00 2001 From: matej Date: Mon, 26 Feb 2024 21:36:12 +0100 Subject: [PATCH 06/21] #1341 "pin" edit tag row outside of tag list --- js/components/preview/tags/details/tagDetails.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/js/components/preview/tags/details/tagDetails.js b/js/components/preview/tags/details/tagDetails.js index 33277de87..ee044bd8c 100644 --- a/js/components/preview/tags/details/tagDetails.js +++ b/js/components/preview/tags/details/tagDetails.js @@ -53,7 +53,6 @@ const useStyles = makeStyles(theme => ({ display: 'flex', flexDirection: 'column', overflow: 'auto', - height: '100%', width: '100%', marginTop: -theme.spacing(), justifyContent: 'space-between', @@ -199,8 +198,8 @@ const TagDetails = memo(() => { const moleculesToEditIds = useSelector(state => state.selectionReducers.moleculesToEdit); const moleculesToEdit = moleculesToEditIds && - moleculesToEditIds.length > 0 && - !(moleculesToEditIds.length === 1 && moleculesToEditIds[0] === null) + moleculesToEditIds.length > 0 && + !(moleculesToEditIds.length === 1 && moleculesToEditIds[0] === null) ? moleculesToEditIds.map(id => dispatch(getMoleculeForId(id))) : []; @@ -442,7 +441,7 @@ const TagDetails = memo(() => {
-
+
{tagDetailView ? ( <>
@@ -604,9 +603,9 @@ const TagDetails = memo(() => { )}
)} -
- -
+
+
+
); From 03158bec02a2a6a8ded44bae99bfccd0f1df49ca Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Mon, 4 Mar 2024 08:45:22 +0100 Subject: [PATCH 07/21] - fixed problem with tags not visually updating on observations --- .../observationCmpView/observationCmpView.js | 63 ++++++++++++++----- js/components/preview/tags/modal/tagEditor.js | 21 ++++++- js/constants/constants.js | 7 +++ js/reducers/api/actions.js | 7 +++ js/reducers/api/apiReducers.js | 13 +++- js/reducers/api/constants.js | 3 +- 6 files changed, 94 insertions(+), 20 deletions(-) diff --git a/js/components/preview/molecule/observationCmpView/observationCmpView.js b/js/components/preview/molecule/observationCmpView/observationCmpView.js index cd3c7e002..0fadba08e 100644 --- a/js/components/preview/molecule/observationCmpView/observationCmpView.js +++ b/js/components/preview/molecule/observationCmpView/observationCmpView.js @@ -524,28 +524,41 @@ const ObservationCmpView = memo( setTagPopoverOpen(null); }; - const resolveTagBackgroundColor = tag => { - let color = DEFAULT_TAG_COLOR; + const resolveTagBackgroundColor = useCallback( + tag => { + let color = DEFAULT_TAG_COLOR; - if (tag.colour && tag.colour !== '') { - color = tag.colour; - } else { - const category = dispatch(getCategoryById(tag.category)); - if (category) { - color = `#${category.colour}`; + if (tag.colour && tag.colour !== '') { + color = tag.colour; + } else { + const category = dispatch(getCategoryById(tag.category)); + if (category) { + color = `#${category.colour}`; + } } - } - return color; - }; + return color; + }, + [dispatch] + ); - const resolveTagForegroundColor = tag => { - const bgColor = resolveTagBackgroundColor(tag); - return getFontColorByBackgroundColor(bgColor); - }; + const resolveTagForegroundColor = useCallback( + tag => { + const bgColor = resolveTagBackgroundColor(tag); + return getFontColorByBackgroundColor(bgColor); + }, + [resolveTagBackgroundColor] + ); - const generateTagPopover = () => { + const generateTagPopover = useCallback(() => { + // console.log('generateTagPopover'); const allData = getAllTagsForLHSCmp(observations, tagList, tagCategories); + // console.log( + // `generateTagPopover ${observations[0].compound_code} assigned tags: ${observations[0].tags_set} count: ` + + // allData?.length + + // ' ' + + // JSON.stringify(allData) + // ); // const sortedData = [...allData].sort((a, b) => a.tag.localeCompare(b.tag)); const modifiedObjects = allData.map((obj, index) => { @@ -772,7 +785,23 @@ const ObservationCmpView = memo( ); - }; + }, [ + classes.editButtonIcon, + classes.paper, + classes.popover, + classes.tagPopover, + dispatch, + observations, + open, + resolveTagBackgroundColor, + resolveTagForegroundColor, + setRef, + tagCategories, + tagEditModalOpenNew, + tagEditorOpen, + tagList, + tagPopoverOpen + ]); // componentDidMount useEffect(() => { diff --git a/js/components/preview/tags/modal/tagEditor.js b/js/components/preview/tags/modal/tagEditor.js index a8dcb1dfa..e220242da 100644 --- a/js/components/preview/tags/modal/tagEditor.js +++ b/js/components/preview/tags/modal/tagEditor.js @@ -3,7 +3,7 @@ import { Grid, Popper, IconButton, Tooltip, makeStyles, FormControlLabel, Switch import { Panel } from '../../../common'; import { Close } from '@material-ui/icons'; import { useDispatch, useSelector } from 'react-redux'; -import { updateMoleculeInMolLists, updateMoleculeTag } from '../../../../reducers/api/actions'; +import { updateLHSCompound, updateMoleculeInMolLists, updateMoleculeTag } from '../../../../reducers/api/actions'; import { getMoleculeForId } from '../redux/dispatchActions'; import { setMoleculeForTagEdit, @@ -130,6 +130,8 @@ export const TagEditor = memo( const moleculesToEditIdsSt = useSelector(state => state.selectionReducers.moleculesToEdit) || []; + const lhsCompounds = useSelector(state => state.apiReducers.lhs_compounds_list); + const [taggingInProgress, setTaggingInProgress] = useState(false); const [isError, setIsError] = useState(false); const [molsLeftForTagging, setMolsLeftForTagging] = useState(0); @@ -142,6 +144,12 @@ export const TagEditor = memo( } const moleculesToEdit = moleculesToEditIds.map(id => dispatch(getMoleculeForId(id))); + let lhsCmp = null; + if (moleculesToEdit?.length > 0) { + const firstMolToEdit = moleculesToEdit[0]; + const cmpId = firstMolToEdit.cmpd; + lhsCmp = lhsCompounds?.find(c => c.origId === cmpId && firstMolToEdit.canon_site_conf === c.canonSiteConf); + } moleculeTags = moleculeTags.sort(compareTagsAsc); const assignTagEditorOpen = useSelector(state => state.selectionReducers.tagEditorOpened); @@ -170,6 +178,15 @@ export const TagEditor = memo( } }; + const updateCmp = (cmp, obs) => { + let newCmp = { ...cmp }; + const index = newCmp.associatedObs.findIndex(o => o.id === obs.id); + if (index >= 0) { + newCmp.associatedObs[index] = obs; + dispatch(updateLHSCompound(newCmp)); + } + }; + const handleTagClick = async (selected, tag) => { try { setTaggingInProgress(true); @@ -189,6 +206,7 @@ export const TagEditor = memo( moleculesToEdit.forEach(m => { let newMol = { ...m }; newMol.tags_set = newMol.tags_set.filter(id => id !== tag.id); + updateCmp(lhsCmp, newMol); dispatch(updateMoleculeInMolLists(newMol)); const moleculeTag = getMoleculeTagForTag(moleculeTags, tag.id); @@ -217,6 +235,7 @@ export const TagEditor = memo( if (!m.tags_set.some(id => id === tag.id)) { let newMol = { ...m }; newMol.tags_set.push(tag.id); + updateCmp(lhsCmp, newMol); dispatch(updateMoleculeInMolLists(newMol)); const moleculeTag = getMoleculeTagForTag(moleculeTags, tag.id); let mtObject = molTagObjects.find(mto => mto.tag === tag.tag); diff --git a/js/constants/constants.js b/js/constants/constants.js index 3f38e612a..11c1a6230 100644 --- a/js/constants/constants.js +++ b/js/constants/constants.js @@ -55,6 +55,13 @@ export const CATEGORY_TYPE_BY_ID = { export const OBSERVATION_TAG_CATEGORIES = ['ConformerSites', 'CrystalformSites', 'Quatassemblies', 'Crystalforms']; export const COMPOUND_PRIO_TAG_CATEGORIES = ['CanonSites']; export const TAG_DETAILS_REMOVED_CATEGORIES = ['CrystalformSites', 'ConformerSites']; +export const NON_ASSIGNABLE_CATEGORIES = [ + 'ConformerSites', + 'CanonSites', + 'CrystalformSites', + 'Quatassemblies', + 'Crystalforms' +]; export const TAG_TYPE = { ALL: 'ALL', diff --git a/js/reducers/api/actions.js b/js/reducers/api/actions.js index a07ecb43e..bfca124d5 100644 --- a/js/reducers/api/actions.js +++ b/js/reducers/api/actions.js @@ -161,6 +161,13 @@ export const updateMoleculeInMolLists = mol => { }; }; +export const updateLHSCompound = cmp => { + return { + type: constants.UPDATE_LHS_COMPOUND, + cmp: cmp + }; +}; + export const setSavingState = function(savingState) { return { type: constants.SET_SAVING_STATE, diff --git a/js/reducers/api/apiReducers.js b/js/reducers/api/apiReducers.js index 7ef91833a..b74af2b7a 100644 --- a/js/reducers/api/apiReducers.js +++ b/js/reducers/api/apiReducers.js @@ -176,7 +176,7 @@ export default function apiReducers(state = INITIAL_STATE, action = {}) { const indexOfMol = newList.findIndex(m => m.id === action.mol.id); if (indexOfMol >= 0) { newList[indexOfMol] = { ...action.mol }; - return { ...state, all_mol_lists: newList }; + return { ...state, all_mol_lists: [...newList] }; } else { return state; } @@ -184,6 +184,17 @@ export default function apiReducers(state = INITIAL_STATE, action = {}) { case constants.SET_LHS_COMPOUNDS_LIST: return { ...state, lhs_compounds_list: action.lhs_compounds_list }; + case constants.UPDATE_LHS_COMPOUND: { + let newList = [...state.lhs_compounds_list]; + const indexOfCmp = newList.findIndex(c => c.id === action.cmp.id); + if (indexOfCmp >= 0) { + newList[indexOfCmp] = { ...action.cmp }; + return { ...state, lhs_compounds_list: [...newList] }; + } else { + return state; + } + } + case constants.SET_PANNDA_EVENT_LIST: return Object.assign({}, state, { pandda_event_list: action.pandda_event_list diff --git a/js/reducers/api/constants.js b/js/reducers/api/constants.js index 22a5b3277..baf9ab700 100644 --- a/js/reducers/api/constants.js +++ b/js/reducers/api/constants.js @@ -53,5 +53,6 @@ export const constants = { SET_ALL_DATA_LOADED: prefix + 'SET_ALL_DATA_LOADED', SET_SNAPSHOT_LOADING_IN_PROGRESS: prefix + 'SET_SNAPSHOT_LOADING_IN_PROGRESS', SET_IS_SNAPSHOT: prefix + 'SET_IS_SNAPSHOT', - SET_LHS_COMPOUNDS_LIST: prefix + 'SET_LHS_COMPOUNDS_LIST' + SET_LHS_COMPOUNDS_LIST: prefix + 'SET_LHS_COMPOUNDS_LIST', + UPDATE_LHS_COMPOUND: prefix + 'UPDATE_LHS_COMPOUND' }; From 4d96ff464b940f7aca3340819496e1d6fa03d1cf Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Mon, 4 Mar 2024 10:07:06 +0100 Subject: [PATCH 08/21] - implemented changes requested in #1326 --- .../snapshot/modals/downloadStructuresDialog.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/js/components/snapshot/modals/downloadStructuresDialog.js b/js/components/snapshot/modals/downloadStructuresDialog.js index bca38c4db..e4775552e 100644 --- a/js/components/snapshot/modals/downloadStructuresDialog.js +++ b/js/components/snapshot/modals/downloadStructuresDialog.js @@ -105,7 +105,7 @@ const MAP_FILES = [ ]; const CRYSTALLOGRAPHIC_FILES = [ - { flag: 'NAN', text: 'Coordinate files (not re-aligned) (.pdb)', defaultValue: false }, + { flag: 'pdb_info', text: 'Coordinate files (not re-aligned) (.pdb)', defaultValue: false }, { flag: 'mtz_info', text: 'Reflections and map coefficients (.mtz)', defaultValue: false }, { flag: 'cif_info', text: 'Ligand definitions and geometry restrains (.cif)', defaultValue: false }, { flag: 'map_info', text: 'Real-space map files (VERY BIG!!) (.map)', defaultValue: false, disabled: true } @@ -117,8 +117,8 @@ const PERMALINK_OPTIONS = [ ]; const OTHERS = [ - { flag: 'single_sdf_file', text: 'Single SDF of all ligands', defaultValue: true }, - { flag: 'sdf_info', text: 'Separate SDFs in subdirectory', defaultValue: false } + { flag: 'single_sdf_file', text: 'Single SDF of all ligands', defaultValue: true } + // { flag: 'sdf_info', text: 'Separate SDFs in subdirectory', defaultValue: false } ]; // Creates an object with flag as keys with boolean values @@ -238,10 +238,8 @@ export const DownloadStructureDialog = memo(({}) => { ...mapFiles, ...crystallographicFiles, ...other, - apo_file: pdb, - bound_file: bound, + all_aligned_structures: true, metadata_info: metadata, - smiles_info: smiles, static_link: isStaticDownload(), file_url: '' }; From 4121519dad01feb107c1a4b2751caefb620f5471 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 5 Mar 2024 08:17:49 +0100 Subject: [PATCH 09/21] - implemented #1357 --- .../preview/tags/details/newTagDetailRow.js | 51 +++++++++++++------ js/components/preview/tags/tagCategory.js | 5 +- js/components/preview/tags/tagView.js | 4 +- js/components/preview/tags/utils/tagUtils.js | 25 ++++++++- 4 files changed, 64 insertions(+), 21 deletions(-) diff --git a/js/components/preview/tags/details/newTagDetailRow.js b/js/components/preview/tags/details/newTagDetailRow.js index c52ada057..927a9cd99 100644 --- a/js/components/preview/tags/details/newTagDetailRow.js +++ b/js/components/preview/tags/details/newTagDetailRow.js @@ -1,4 +1,4 @@ -import React, { memo, useState, useEffect } from 'react'; +import React, { memo, useState, useEffect, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { CATEGORY_TYPE, CATEGORY_ID, CATEGORY_TYPE_BY_ID } from '../../../../constants/constants'; import { ColorPicker } from '../../../common/Components/ColorPicker'; @@ -6,7 +6,8 @@ import { DEFAULT_CATEGORY, DEFAULT_TAG_COLOR, augumentTagObjectWithId, - createMoleculeTagObject + createMoleculeTagObject, + getEditNewTagCategories } from '../utils/tagUtils'; import { DJANGO_CONTEXT } from '../../../../utils/djangoContext'; import { updateTagProp, removeSelectedTag } from '../redux/dispatchActions'; @@ -73,11 +74,15 @@ const NewTagDetailRow = memo(({ moleculesToEditIds, moleculesToEdit }) => { const allMolList = useSelector(state => state.apiReducers.all_mol_lists); const categoriesList = useSelector(state => state.apiReducers.categoryList); - const [newTagCategory, setNewTagCategory] = useState(1); + const [newTagCategory, setNewTagCategory] = useState(DEFAULT_CATEGORY); const [newTagColor, setNewTagColor] = useState(DEFAULT_TAG_COLOR); const [newTagName, setNewTagName] = useState(''); const [newTagLink, setNewTagLink] = useState(''); + const comboCategories = useMemo(() => { + return getEditNewTagCategories(categoriesList); + }, [categoriesList]); + useEffect(() => { const category = dispatch(getCategoryById(DEFAULT_CATEGORY)); if (category) { @@ -160,18 +165,32 @@ const NewTagDetailRow = memo(({ moleculesToEditIds, moleculesToEdit }) => { const updateTag = () => { if (tagToEdit && newTagCategory && newTagName) { // update all props at once - dispatch( - updateTagProp( - Object.assign({}, tagToEdit, { - category: newTagCategory, - colour: newTagColor, - tag: newTagName, - discourse_url: newTagLink - }), - newTagName, - 'tag' - ) - ); + if (newTagCategory) { + dispatch( + updateTagProp( + Object.assign({}, tagToEdit, { + category: newTagCategory, + colour: newTagColor, + tag: newTagName, + discourse_url: newTagLink + }), + newTagName, + 'tag' + ) + ); + } else { + dispatch( + updateTagProp( + Object.assign({}, tagToEdit, { + colour: newTagColor, + tag: newTagName, + discourse_url: newTagLink + }), + newTagName, + 'tag' + ) + ); + } // reset tag/fields after updating selected one resetTagToEditState(); } @@ -240,7 +259,7 @@ const NewTagDetailRow = memo(({ moleculesToEditIds, moleculesToEdit }) => { onChange={onCategoryForNewTagChange} disabled={!DJANGO_CONTEXT.pk} > - {categoriesList?.map(c => ( + {comboCategories?.map(c => ( {c.category} diff --git a/js/components/preview/tags/tagCategory.js b/js/components/preview/tags/tagCategory.js index ffcce463f..25465e6b2 100644 --- a/js/components/preview/tags/tagCategory.js +++ b/js/components/preview/tags/tagCategory.js @@ -4,7 +4,7 @@ import { useSelector } from 'react-redux'; import TagCategoryView from './tagCategoryListView'; import TagCategoryGridView from './tagCategoryGridView'; import { CATEGORY_TYPE } from '../../../constants/constants'; -import { compareTagsAsc } from './utils/tagUtils'; +import { compareTagsAsc, getProhibitedCategoriesForEditIds } from './utils/tagUtils'; const useStyles = makeStyles(theme => ({ category: { @@ -16,10 +16,11 @@ const TagCategory = memo(({ tagClickCallback, disabled = false }) => { const classes = useStyles(); const categoryList = useSelector(state => state.apiReducers.categoryList); + const listOfProhibitedCategories = getProhibitedCategoriesForEditIds(categoryList); let tagList = useSelector(state => state.apiReducers.tagList); tagList = tagList .filter(t => { - if (t.additional_info?.downloadName) { + if (t.additional_info?.downloadName || listOfProhibitedCategories.some(cid => cid === t.category)) { return false; } else { return true; diff --git a/js/components/preview/tags/tagView.js b/js/components/preview/tags/tagView.js index 9f69c3c33..3254fb536 100644 --- a/js/components/preview/tags/tagView.js +++ b/js/components/preview/tags/tagView.js @@ -130,9 +130,11 @@ const TagView = memo( if (tagCategory) { if (!tag.colour || tag.colour === '') { setBgColor(`#${tagCategory.colour}`); + } else { + setBgColor(`${tag.colour}`); } } - }, [tagCategory]); + }, [tagCategory, tag.colour, tagCategories]); useEffect(() => { if (assignTagView === undefined) { diff --git a/js/components/preview/tags/utils/tagUtils.js b/js/components/preview/tags/utils/tagUtils.js index 372e0ea99..e0cc5865c 100644 --- a/js/components/preview/tags/utils/tagUtils.js +++ b/js/components/preview/tags/utils/tagUtils.js @@ -3,11 +3,12 @@ import { CATEGORY_TYPE_BY_ID, OBSERVATION_TAG_CATEGORIES, COMPOUND_PRIO_TAG_CATEGORIES, - TAG_DETAILS_REMOVED_CATEGORIES + TAG_DETAILS_REMOVED_CATEGORIES, + NON_ASSIGNABLE_CATEGORIES } from '../../../../constants/constants'; export const DEFAULT_TAG_COLOR = '#E0E0E0'; -export const DEFAULT_CATEGORY = 1; +export const DEFAULT_CATEGORY = 8; export const createMoleculeTagObject = ( tagName, @@ -247,3 +248,23 @@ export const getAllTagsForLHSCmp = (observations, tagList, tagCategoryList) => { export const getDefaultTagDiscoursePostText = tag => { return `This post for tag ${tag.tag} is here to discuss its contents.`; }; + +export const getEditNewTagCategories = tagCategoryList => { + let result = []; + + result = tagCategoryList?.filter(categ => !NON_ASSIGNABLE_CATEGORIES.some(c => c === categ.category)) || []; + + return result; +}; + +export const getProhibitedCategoriesForEdit = tagCategoryList => { + let result = []; + + result = tagCategoryList?.filter(categ => NON_ASSIGNABLE_CATEGORIES.some(c => c === categ.category)) || []; + + return result; +}; + +export const getProhibitedCategoriesForEditIds = tagCategoryList => { + return getProhibitedCategoriesForEdit(tagCategoryList).map(c => c.id); +}; From a3dc8191aadd627f4de6f7425c9dfb72c34c1d23 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 5 Mar 2024 13:05:12 +0100 Subject: [PATCH 10/21] - first implementation of #1354 --- .../projects/legacySnapshotModal/index.js | 22 +++++++++++++++++++ .../projects/projectPreview/index.js | 11 ++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 js/components/projects/legacySnapshotModal/index.js diff --git a/js/components/projects/legacySnapshotModal/index.js b/js/components/projects/legacySnapshotModal/index.js new file mode 100644 index 000000000..7ce0dc984 --- /dev/null +++ b/js/components/projects/legacySnapshotModal/index.js @@ -0,0 +1,22 @@ +import React, { Fragment, useState } from 'react'; +import { Modal } from '../../common'; +import { DJANGO_CONTEXT } from '../../../utils/djangoContext'; + +export const LegacySnapshotModal = ({ open, project, snapshot }) => { + const [legacyLink, setLegacyLink] = useState(''); + + if (DJANGO_CONTEXT['legacy_url'] && DJANGO_CONTEXT['legacy_url'] !== '' && legacyLink === '') { + setLegacyLink(`${DJANGO_CONTEXT['legacy_url']}/viewer/react/projects/${project}/${snapshot}`); + } + + return ( + +

+ Snapshot is not recognized. Maybe it is available in the legacy system. Please try link below.
+

+ + Legacy link + +
+ ); +}; diff --git a/js/components/projects/projectPreview/index.js b/js/components/projects/projectPreview/index.js index 287ffebf0..bfe1c7064 100644 --- a/js/components/projects/projectPreview/index.js +++ b/js/components/projects/projectPreview/index.js @@ -8,8 +8,9 @@ import { restoreCurrentActionsList } from '../../../reducers/tracking/dispatchAc import { setIsSnapshotDirty } from '../../../reducers/tracking/actions'; import { setDownloadStructuresDialogOpen } from '../../snapshot/redux/actions'; import { ToastContext } from '../../toast'; +import { LegacySnapshotModal } from '../legacySnapshotModal'; -export const ProjectPreview = memo(({ }) => { +export const ProjectPreview = memo(({}) => { const { toast } = useContext(ToastContext); const [canShow, setCanShow] = useState(undefined); const isSnapshotLoaded = useRef(undefined); @@ -23,6 +24,8 @@ export const ProjectPreview = memo(({ }) => { const isActionRestoring = useSelector(state => state.trackingReducers.isActionRestoring); const isActionRestored = useSelector(state => state.trackingReducers.isActionRestored); + const [showLegacySnapshotModal, setShowLegacySnapshotModal] = useState(false); + useEffect(() => { if (!snapshotId && currentSnapshotID === null) { dispatch(loadSnapshotByProjectID(projectId)) @@ -49,6 +52,7 @@ export const ProjectPreview = memo(({ }) => { setCanShow(true); } else { setCanShow(false); + setShowLegacySnapshotModal(true); } if (response.data) { const dataObj = JSON.parse(response.data); @@ -59,6 +63,7 @@ export const ProjectPreview = memo(({ }) => { } else { isSnapshotLoaded.current = response; setCanShow(false); + setShowLegacySnapshotModal(true); } } }) @@ -96,5 +101,7 @@ export const ProjectPreview = memo(({ }) => { (currentSessionProject.projectID === null || currentSessionProject.authorID === null)) } /> - ) : null; + ) : ( + + ); }); From bb3bf3b6ceafdd40b0778157ff95d01ecceb6f8e Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 5 Mar 2024 13:21:32 +0100 Subject: [PATCH 11/21] - updated message for #1354 --- js/components/projects/legacySnapshotModal/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/js/components/projects/legacySnapshotModal/index.js b/js/components/projects/legacySnapshotModal/index.js index 7ce0dc984..e347fa9ff 100644 --- a/js/components/projects/legacySnapshotModal/index.js +++ b/js/components/projects/legacySnapshotModal/index.js @@ -12,10 +12,11 @@ export const LegacySnapshotModal = ({ open, project, snapshot }) => { return (

- Snapshot is not recognized. Maybe it is available in the legacy system. Please try link below.
+ Project/Snapshot could not be resolved. It's possible that this is legacy URL and you may try to visit URL + below.

- Legacy link + Legacy URL
); From 8a193a551faa91e4441783429b980608c116665c Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 5 Mar 2024 13:24:11 +0100 Subject: [PATCH 12/21] - cleanup for #1354 --- js/components/projects/legacySnapshotModal/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/components/projects/legacySnapshotModal/index.js b/js/components/projects/legacySnapshotModal/index.js index e347fa9ff..7a36fe6a4 100644 --- a/js/components/projects/legacySnapshotModal/index.js +++ b/js/components/projects/legacySnapshotModal/index.js @@ -1,4 +1,4 @@ -import React, { Fragment, useState } from 'react'; +import React, { useState } from 'react'; import { Modal } from '../../common'; import { DJANGO_CONTEXT } from '../../../utils/djangoContext'; From 66a98f3c617d0d110e73cf4df09048c572b3edee Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Wed, 6 Mar 2024 09:47:12 +0100 Subject: [PATCH 13/21] - implemented #1361 - improvements for #1354 --- .../molecule/moleculeView/moleculeView.js | 17 +++++++--- .../observationCmpView/observationCmpView.js | 19 ++++++----- js/components/preview/tags/tagView.js | 16 ++++++---- js/components/preview/tags/utils/tagUtils.js | 14 +++++--- .../projects/legacySnapshotModal/index.js | 32 +++++++++++++++++-- 5 files changed, 72 insertions(+), 26 deletions(-) diff --git a/js/components/preview/molecule/moleculeView/moleculeView.js b/js/components/preview/molecule/moleculeView/moleculeView.js index f1b590d24..8245e145b 100644 --- a/js/components/preview/molecule/moleculeView/moleculeView.js +++ b/js/components/preview/molecule/moleculeView/moleculeView.js @@ -455,11 +455,18 @@ const MoleculeView = memo( // const sortedData = [...allData].sort((a, b) => a.tag.localeCompare(b.tag)); const modifiedObjects = allData.map(obj => { - const tagNameShortLength = 3; - if (obj.tag.length > tagNameShortLength) { - return { ...obj, tag: obj.tag.slice(0, tagNameShortLength) }; + let result = obj; + + if (obj.tag_prefix) { + result = { ...obj, tag: obj.tag_prefix }; + } else { + const tagNameShortLength = 3; + if (obj.tag.length > tagNameShortLength) { + result = { ...obj, tag: obj.tag.slice(0, tagNameShortLength) }; + } } - return obj; + + return result; }); const allTagsLength = allData.length > 9 ? 9 : allData.length; @@ -630,7 +637,7 @@ const MoleculeView = memo( xs={allData.length === 1 ? 12 : allData.length === 2 ? 6 : 4} key={index} > -
{item.tag}
+
{item.tag_prefix ? `${item.tag_prefix} - ${item.tag}` : item.tag}
))} diff --git a/js/components/preview/molecule/observationCmpView/observationCmpView.js b/js/components/preview/molecule/observationCmpView/observationCmpView.js index 0fadba08e..ba20bfae7 100644 --- a/js/components/preview/molecule/observationCmpView/observationCmpView.js +++ b/js/components/preview/molecule/observationCmpView/observationCmpView.js @@ -562,15 +562,18 @@ const ObservationCmpView = memo( // const sortedData = [...allData].sort((a, b) => a.tag.localeCompare(b.tag)); const modifiedObjects = allData.map((obj, index) => { - const tagNameShortLength = 3; - if (obj.tag.length > tagNameShortLength) { - let shortened = { ...obj, tag: obj.tag.slice(0, tagNameShortLength) }; - if (index === 0) { - shortened = { ...shortened, tag: shortened.tag.replace('-', '') }; + let result = obj; + + if (obj.tag_prefix) { + result = { ...obj, tag: obj.tag_prefix }; + } else { + const tagNameShortLength = 3; + if (obj.tag.length > tagNameShortLength) { + result = { ...obj, tag: obj.tag.slice(0, tagNameShortLength) }; } - return shortened; } - return obj; + + return result; }); const allTagsLength = allData.length > 9 ? 9 : allData.length; @@ -745,7 +748,7 @@ const ObservationCmpView = memo( xs={allData.length === 1 ? 12 : allData.length === 2 ? 6 : 4} key={index} > -
{item.tag}
+
{item.tag_prefix ? `${item.tag_prefix} - ${item.tag}` : item.tag}
))} diff --git a/js/components/preview/tags/tagView.js b/js/components/preview/tags/tagView.js index 3254fb536..fa6c4b0bf 100644 --- a/js/components/preview/tags/tagView.js +++ b/js/components/preview/tags/tagView.js @@ -207,6 +207,10 @@ const TagView = memo( } }; + const getTagLabel = tag => { + return tag.tag_prefix ? `${tag.tag_prefix} - ${tag.tag}` : tag.tag; + }; + const generateProps = () => { // If in Tag Details if (isTagEditor) { @@ -219,9 +223,9 @@ const TagView = memo( label: assignTagView === false ? tagDetailView === false - ? tagData.tag - : originalTagData.tag - : originalTagData.tag, + ? getTagLabel(tagData) + : getTagLabel(originalTagData) + : getTagLabel(originalTagData), clickable: true, style: style, onClick: () => { @@ -236,7 +240,7 @@ const TagView = memo( className: `${classes.chip} ${selected && !isSpecialTag ? classes.chipSelected : null} ${ tagDetailView === true ? classes.tagDetailsChip : classes.tagDetailsChipList }`, - label: assignTagView === false ? (tagDetailView === false ? tagData.tag : tagData.tag) : tagData.tag, + label: getTagLabel(tagData), clickable: true, style: { backgroundColor: 'white', @@ -259,7 +263,7 @@ const TagView = memo( return { size: 'small', className: `${classes.chip} ${selected && !isSpecialTag ? classes.chipSelected : null}`, - label: partiallySelected ? `${tagData.tag}*` : originalTagData.tag, + label: partiallySelected ? `${getTagLabel(tagData)}*` : getTagLabel(originalTagData), clickable: true, // borderColor: bgColor, style: { ...style, borderColor: bgColor }, @@ -274,7 +278,7 @@ const TagView = memo( return { size: 'small', className: `${classes.chip} ${selected && !isSpecialTag ? classes.chipSelected : null}`, - label: tagDetailView === true && assignTagView === true ? tagData.tag : originalTagData.tag, + label: tagDetailView === true && assignTagView === true ? getTagLabel(tagData) : getTagLabel(originalTagData), clickable: true, // borderColor: bgColor, style: { ...style, borderColor: bgColor }, diff --git a/js/components/preview/tags/utils/tagUtils.js b/js/components/preview/tags/utils/tagUtils.js index e0cc5865c..9faa71c41 100644 --- a/js/components/preview/tags/utils/tagUtils.js +++ b/js/components/preview/tags/utils/tagUtils.js @@ -38,20 +38,26 @@ export const createMoleculeTagObject = ( }; export const compareTagsAsc = (a, b) => { - if (a.tag < b.tag) { + const aName = a.tag_prefix ? `${a.tag_prefix} - ${a.tag}` : a.tag; + const bName = b.tag_prefix ? `${b.tag_prefix} - ${b.tag}` : b.tag; + + if (aName < bName) { return -1; } - if (a.tag > b.tag) { + if (aName > bName) { return 1; } return 0; }; export const compareTagsDesc = (a, b) => { - if (a.tag > b.tag) { + const aName = a.tag_prefix ? `${a.tag_prefix} - ${a.tag}` : a.tag; + const bName = b.tag_prefix ? `${b.tag_prefix} - ${b.tag}` : b.tag; + + if (aName > bName) { return -1; } - if (a.tag < b.tag) { + if (aName < bName) { return 1; } return 0; diff --git a/js/components/projects/legacySnapshotModal/index.js b/js/components/projects/legacySnapshotModal/index.js index 7a36fe6a4..025d0117d 100644 --- a/js/components/projects/legacySnapshotModal/index.js +++ b/js/components/projects/legacySnapshotModal/index.js @@ -1,6 +1,8 @@ import React, { useState } from 'react'; -import { Modal } from '../../common'; +import { Button, Modal } from '../../common'; import { DJANGO_CONTEXT } from '../../../utils/djangoContext'; +import { DialogActions, DialogContent, DialogContentText, DialogTitle } from '@material-ui/core'; +import { updateClipboard } from '../../snapshot/helpers'; export const LegacySnapshotModal = ({ open, project, snapshot }) => { const [legacyLink, setLegacyLink] = useState(''); @@ -9,15 +11,39 @@ export const LegacySnapshotModal = ({ open, project, snapshot }) => { setLegacyLink(`${DJANGO_CONTEXT['legacy_url']}/viewer/react/projects/${project}/${snapshot}`); } + const openInNewTab = () => { + window.open(legacyLink); + }; + return ( -

+ <> + Potential legacy link detected + + + Project/Snapshot could not be resolved. It's possible that this is legacy URL and you may try to visit URL + below. + + + {legacyLink} + + + + + + + + {/*

Project/Snapshot could not be resolved. It's possible that this is legacy URL and you may try to visit URL below.

Legacy URL - + */}
); }; From 4ff5f945954ea6533f9c3728c0565b20c79b2b0d Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Thu, 7 Mar 2024 10:10:41 +0100 Subject: [PATCH 14/21] - implemented #1376 - also fixed bug in download structures dialog where only first download got added to the dropdown menu --- .../modals/downloadStructuresDialog.js | 47 ++++++++++++++----- js/reducers/api/apiReducers.js | 4 +- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/js/components/snapshot/modals/downloadStructuresDialog.js b/js/components/snapshot/modals/downloadStructuresDialog.js index e4775552e..b41bf4b3b 100644 --- a/js/components/snapshot/modals/downloadStructuresDialog.js +++ b/js/components/snapshot/modals/downloadStructuresDialog.js @@ -470,6 +470,13 @@ export const DownloadStructureDialog = memo(({}) => { } }; + const resetDownloadOnChange = () => { + setSelectedDownload(newDownload); + setDownloadTagUrl(null); + setFileSize(null); + setDownloadUrl(null); + }; + const copyPOSTJson = () => { const requestObject = prepareRequestObject(); const jsonString = JSON.stringify(requestObject); @@ -563,7 +570,14 @@ export const DownloadStructureDialog = memo(({}) => { } + control={ + { + resetDownloadOnChange(); + }} + /> + } label={text} /> ); @@ -578,11 +592,12 @@ export const DownloadStructureDialog = memo(({}) => { control={ + onChange={() => { setMapFiles(prevState => { return { ...prevState, [flag]: !prevState[flag] }; - }) - } + }); + resetDownloadOnChange(); + }} disabled={zipPreparing} /> } @@ -599,11 +614,12 @@ export const DownloadStructureDialog = memo(({}) => { control={ + onChange={() => { setCrystallographicFiles(prevState => { return { ...prevState, [flag]: !prevState[flag] }; - }) - } + }); + resetDownloadOnChange(); + }} disabled={zipPreparing || disabled} /> } @@ -626,6 +642,7 @@ export const DownloadStructureDialog = memo(({}) => { name="radio-group-download-type" onChange={event => { setLinkType(event.currentTarget.value); + resetDownloadOnChange(); }} > {PERMALINK_OPTIONS.map(({ flag, text }) => { @@ -633,7 +650,14 @@ export const DownloadStructureDialog = memo(({}) => { } + control={ + { + resetDownloadOnChange(); + }} + /> + } label={text} /> ); @@ -648,11 +672,12 @@ export const DownloadStructureDialog = memo(({}) => { control={ + onChange={() => { setOthers(prevState => { return { ...prevState, [flag]: !prevState[flag] }; - }) - } + }); + resetDownloadOnChange(); + }} disabled={zipPreparing} /> } diff --git a/js/reducers/api/apiReducers.js b/js/reducers/api/apiReducers.js index b74af2b7a..51fb3ff21 100644 --- a/js/reducers/api/apiReducers.js +++ b/js/reducers/api/apiReducers.js @@ -266,8 +266,8 @@ export default function apiReducers(state = INITIAL_STATE, action = {}) { return { ...state, downloadTags: [...action.downloadTags] }; case constants.APPEND_TO_DOWNLOAD_TAGS: - if (!state.downloadTags.find(dt => action.tag.tag)) { - return { ...state, downloadTags: [...state.downloadTags, action.tag] }; + if (!state.downloadTags.find(dt => dt.tag === action.tag.tag)) { + return { ...state, downloadTags: [...state.downloadTags, { ...action.tag }] }; } else { return state; } From 9439f5d40bb696f2247f412901b65db8d1ea5ea6 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Thu, 7 Mar 2024 13:59:03 +0100 Subject: [PATCH 15/21] - partial fix for purple release for #1370 --- .../preview/molecule/observationCmpList.js | 9 +++++++-- .../observationCmpView/observationCmpView.js | 6 +++--- .../preview/molecule/redux/dispatchActions.js | 15 ++++++++++----- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/js/components/preview/molecule/observationCmpList.js b/js/components/preview/molecule/observationCmpList.js index 858e2e4b4..f4b353343 100644 --- a/js/components/preview/molecule/observationCmpList.js +++ b/js/components/preview/molecule/observationCmpList.js @@ -1107,7 +1107,7 @@ export const ObservationCmpList = memo(({ hideProjects }) => { [classes.contColButtonHalfSelected]: false })} onClick={() => { - dispatch(selectAllHits(joinedMoleculeLists, setNextXMolecules, selectAllHitsPressed)); + dispatch(selectAllHits(filteredLHSCompoundsList, setNextXMolecules, selectAllHitsPressed)); setSelectAllHitsPressed(!selectAllHitsPressed); }} disabled={false} @@ -1214,7 +1214,12 @@ export const ObservationCmpList = memo(({ hideProjects }) => { > {filteredLHSCompoundsList.map((data, index, array) => { const molsForCmp = data.associatedObs; - const selected = allSelectedMolecules.some(molecule => molecule.cmpd === data.origId); + // const selected = allSelectedMolecules.some( + // molecule => molecule.cmpd === data.origId && molecule.canon_site_conf === data.canonSiteConf + // ); + const selected = allSelectedMolecules.some(molecule => + data.associatedObs.some(obs => obs.id === molecule.id) + ); return ( { const result = e.target.checked; if (result) { - observations?.forEach(obs => { - dispatch(appendToMolListToEdit(obs.id)); - }); + if (observations?.length > 0) { + dispatch(appendToMolListToEdit(observations[0].id)); + } // dispatch(appendToObsCmpListToEdit(currentID)); } else { observations?.forEach(obs => { diff --git a/js/components/preview/molecule/redux/dispatchActions.js b/js/components/preview/molecule/redux/dispatchActions.js index b2e0ad9b5..35fc6ddc9 100644 --- a/js/components/preview/molecule/redux/dispatchActions.js +++ b/js/components/preview/molecule/redux/dispatchActions.js @@ -1232,16 +1232,21 @@ export const withDisabledMoleculesNglControlButtons = (moleculeIds, type, callba }); }; -export const selectAllHits = (allFilteredMolecules, setNextXMolecules, unselect) => (dispatch, getState) => { +export const selectAllHits = (allFilteredLhsCompounds, setNextXMolecules, unselect) => (dispatch, getState) => { if (setNextXMolecules) { - dispatch(setNextXMolecules(allFilteredMolecules?.length || 0)); + dispatch(setNextXMolecules(allFilteredLhsCompounds?.length || 0)); } - const listOfIds = allFilteredMolecules.map(m => m.id); + const listOfIds = []; + allFilteredLhsCompounds.forEach(cmp => { + if (cmp.associatedObs?.length > 0) { + listOfIds.push(cmp.associatedObs[0].id); + } + }); if (!unselect) { dispatch(setMolListToEdit(listOfIds)); - dispatch(setSelectAllMolecules(allFilteredMolecules)); + dispatch(setSelectAllMolecules(allFilteredLhsCompounds)); } else { dispatch(setMolListToEdit([])); - dispatch(setUnselectAllMolecules(allFilteredMolecules)); + dispatch(setUnselectAllMolecules(allFilteredLhsCompounds)); } }; From 2fb59dcd5c2c14941fd8c74282473822af87b0fb Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 12 Mar 2024 09:48:51 +0100 Subject: [PATCH 16/21] - using official backend version --- docker-compose.dev.vector.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.dev.vector.yml b/docker-compose.dev.vector.yml index e9238a97c..272e4b83f 100644 --- a/docker-compose.dev.vector.yml +++ b/docker-compose.dev.vector.yml @@ -53,10 +53,10 @@ services: start_period: 10s web: container_name: web_dock - # image: xchem/fragalysis-stack:latest + image: xchem/fragalysis-stack:latest # image: alanbchristie/fragalysis-backend:1187.3 # image: boriskovarm2ms/fragalysis-stack:experiment2 - image: kaliif/fragalysis-backend:latest + # image: kaliif/fragalysis-backend:latest command: /bin/bash /code/launch-stack.sh volumes: - ../data/logs:/code/logs/ From d336352f1856fa02722eb27f19511e29f26781c0 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Mon, 26 Feb 2024 08:42:49 +0100 Subject: [PATCH 17/21] - checkpoint --- docker-compose.dev.vector.yml | 4 ++-- .../datasets/datasetMoleculeView/datasetMoleculeView.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-compose.dev.vector.yml b/docker-compose.dev.vector.yml index 272e4b83f..e9238a97c 100644 --- a/docker-compose.dev.vector.yml +++ b/docker-compose.dev.vector.yml @@ -53,10 +53,10 @@ services: start_period: 10s web: container_name: web_dock - image: xchem/fragalysis-stack:latest + # image: xchem/fragalysis-stack:latest # image: alanbchristie/fragalysis-backend:1187.3 # image: boriskovarm2ms/fragalysis-stack:experiment2 - # image: kaliif/fragalysis-backend:latest + image: kaliif/fragalysis-backend:latest command: /bin/bash /code/launch-stack.sh volumes: - ../data/logs:/code/logs/ diff --git a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js index 93cf38334..e9b6ac1b0 100644 --- a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js @@ -461,6 +461,7 @@ const DatasetMoleculeView = memo( // #1249 dataset molecules currently could use side observation molecule for some renders const allMolecules = useSelector(state => state.apiReducers.all_mol_lists); const [pdbData, setPdbData] = useState(null); + const [isCustomPdb, setIsCustomPdb] = useState(false); const isPdbAvailable = !!(data && (data.pdb_info || pdbData)); useEffect(() => { From 8cf43e054416ed1a54565604859a411530ba1837 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 27 Feb 2024 09:23:04 +0100 Subject: [PATCH 18/21] - checkpoint --- .../datasets/datasetMoleculeView/datasetMoleculeView.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js index e9b6ac1b0..93cf38334 100644 --- a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js @@ -461,7 +461,6 @@ const DatasetMoleculeView = memo( // #1249 dataset molecules currently could use side observation molecule for some renders const allMolecules = useSelector(state => state.apiReducers.all_mol_lists); const [pdbData, setPdbData] = useState(null); - const [isCustomPdb, setIsCustomPdb] = useState(false); const isPdbAvailable = !!(data && (data.pdb_info || pdbData)); useEffect(() => { From 0e4155177fde3500404a15cd514bc774f3836b43 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Mon, 26 Feb 2024 08:42:49 +0100 Subject: [PATCH 19/21] - checkpoint --- .../datasets/datasetMoleculeView/datasetMoleculeView.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js index 93cf38334..e9b6ac1b0 100644 --- a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js @@ -461,6 +461,7 @@ const DatasetMoleculeView = memo( // #1249 dataset molecules currently could use side observation molecule for some renders const allMolecules = useSelector(state => state.apiReducers.all_mol_lists); const [pdbData, setPdbData] = useState(null); + const [isCustomPdb, setIsCustomPdb] = useState(false); const isPdbAvailable = !!(data && (data.pdb_info || pdbData)); useEffect(() => { From 125b8d48589d0180d261e781fc18f3b88787cc05 Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 27 Feb 2024 09:23:04 +0100 Subject: [PATCH 20/21] - checkpoint --- .../datasets/datasetMoleculeView/datasetMoleculeView.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js index e9b6ac1b0..93cf38334 100644 --- a/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView/datasetMoleculeView.js @@ -461,7 +461,6 @@ const DatasetMoleculeView = memo( // #1249 dataset molecules currently could use side observation molecule for some renders const allMolecules = useSelector(state => state.apiReducers.all_mol_lists); const [pdbData, setPdbData] = useState(null); - const [isCustomPdb, setIsCustomPdb] = useState(false); const isPdbAvailable = !!(data && (data.pdb_info || pdbData)); useEffect(() => { From e728f49cb7e08238afb349039b7cf15d4290555f Mon Sep 17 00:00:00 2001 From: Boris Kovar Date: Tue, 12 Mar 2024 12:35:21 +0100 Subject: [PATCH 21/21] - latest backend --- docker-compose.dev.vector.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.dev.vector.yml b/docker-compose.dev.vector.yml index e9238a97c..272e4b83f 100644 --- a/docker-compose.dev.vector.yml +++ b/docker-compose.dev.vector.yml @@ -53,10 +53,10 @@ services: start_period: 10s web: container_name: web_dock - # image: xchem/fragalysis-stack:latest + image: xchem/fragalysis-stack:latest # image: alanbchristie/fragalysis-backend:1187.3 # image: boriskovarm2ms/fragalysis-stack:experiment2 - image: kaliif/fragalysis-backend:latest + # image: kaliif/fragalysis-backend:latest command: /bin/bash /code/launch-stack.sh volumes: - ../data/logs:/code/logs/