diff --git a/js/components/preview/molecule/observationsDialog.js b/js/components/preview/molecule/observationsDialog.js index f22fce3a7..9310a2e3b 100644 --- a/js/components/preview/molecule/observationsDialog.js +++ b/js/components/preview/molecule/observationsDialog.js @@ -5,7 +5,7 @@ import { makeStyles } from '@material-ui/styles'; import { useDispatch, useSelector } from 'react-redux'; import classNames from 'classnames'; import { NglContext } from '../../nglView/nglProvider'; -import { PLURAL_TO_SINGULAR, VIEWS } from '../../../constants/constants'; +import { PLURAL_TO_SINGULAR, VIEWS, XCA_TAG_CATEGORIES } from '../../../constants/constants'; import { changeButtonClassname } from '../../datasets/helpers'; import { addComplex, @@ -16,6 +16,8 @@ import { copyPoseToPoseDTO, createNewPose, getAllCompatiblePoses, + getCategoryById, + prepareEmptyPoseDTO, removeComplex, removeHitProtein, removeLigand, @@ -36,7 +38,8 @@ import { setOpenObservationsDialog, setPoseIdForObservationsDialog, setSelectedAllByType, - setTagEditorOpenObs + setTagEditorOpenObs, + updateMoleculeInLHSObservations } from '../../../reducers/selection/actions'; import useDisableNglControlButtons from './useDisableNglControlButtons'; import { Button, Panel } from '../../common'; @@ -46,8 +49,10 @@ import MoleculeView from './moleculeView'; import { TagEditor } from '../tags/modal/tagEditor'; import { ToastContext } from '../../toast'; import { DJANGO_CONTEXT } from '../../../utils/djangoContext'; -import { updateLHSCompound } from '../../../reducers/api/actions'; +import { updateLHSCompound, updateMoleculeInMolLists, updateMoleculeTag, updateTag } from '../../../reducers/api/actions'; import { createPoseErrorMessage } from './api/poseApi'; +import { augumentTagObjectWithId, createMoleculeTagObject, DEFAULT_TAG_COLOR, getMoleculeTagForTag } from '../tags/utils/tagUtils'; +import { updateExistingTag } from '../tags/api/tagsApi'; const MIN_PANEL_HEIGHT = 250; @@ -174,8 +179,16 @@ const useStyles = makeStyles(theme => ({ backgroundColor: theme.palette.primary.light } }, + dropdownContentSide: { + left: 148, + marginTop: -18, + maxWidth: 260, + width: 260, + overflowY: 'auto', + maxHeight: 100 + }, dropdown: { - '&:hover $dropdownContent': { + '&:hover > $dropdownContent': { display: 'flex' } }, @@ -228,6 +241,10 @@ export const ObservationsDialog = memo( const informationList = useSelector(state => state.selectionReducers.informationList); const molForTagEditId = useSelector(state => state.selectionReducers.molForTagEdit); const moleculesToEditIds = useSelector(state => state.selectionReducers.moleculesToEdit); + const tagCategoriesList = useSelector(state => state.apiReducers.categoryList); + // const tagList = useSelector(state => state.apiReducers.tagList); + const tagList = useSelector(state => state.apiReducers.moleculeTags); + const targetId = useSelector(state => state.apiReducers.target_on); const poses = useSelector(state => state.apiReducers.lhs_compounds_list); const compatiblePoses = useMemo(() => { @@ -600,19 +617,18 @@ export const ObservationsDialog = memo( const getPanelHeight = useCallback(() => { let height = 0; if (anchorEl) { - // available height of the window - top position of the anchor element, ie pose from hit navigator - "bottom margin" + // available height of the window - top position of the anchor element, ie pose from hit navigator - "bottom margin" const maxHeight = window.innerHeight - anchorEl?.getBoundingClientRect().top - 13; - const observationsApproximateHeight = moleculeList.length * 47; - const headerFooterApproximateHeight = 87; - const totalApproximateHeight = observationsApproximateHeight + headerFooterApproximateHeight; - - if (totalApproximateHeight > maxHeight) { - height = maxHeight; - } else if (totalApproximateHeight < MIN_PANEL_HEIGHT) { - height = MIN_PANEL_HEIGHT; - } else { - height = totalApproximateHeight; - } + const observationsApproximateHeight = moleculeList.length * 47; + const headerFooterApproximateHeight = 87; + const totalApproximateHeight = observationsApproximateHeight + headerFooterApproximateHeight; + if (totalApproximateHeight > maxHeight) { + height = maxHeight; + } else if (totalApproximateHeight < MIN_PANEL_HEIGHT) { + height = MIN_PANEL_HEIGHT; + } else { + height = totalApproximateHeight; + } } else { height = MIN_PANEL_HEIGHT; } @@ -620,6 +636,205 @@ export const ObservationsDialog = memo( return height; }, [anchorEl, moleculeList.length]); + /** + * @param {string} category + * @return {array} + */ + const getTagsForCategory = useCallback(category => { + const tagCategory = tagCategoriesList.find(tagCategory => tagCategory.category === category); + return tagCategory ? tagList.filter(tag => { + if (tag.category === tagCategory.id) { + // console.log('good tag', { ...tag }); + return true; + } else return false; + }) : []; + }, [tagCategoriesList, tagList]); + + 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 tagObservations = async tag => { + try { + // setTaggingInProgress(true); + + let tagColor = DEFAULT_TAG_COLOR; + if (tag.colour && tag.colour !== '') { + tagColor = tag.colour; + } else { + const tagCategory = dispatch(getCategoryById(tag.category)); + if (tagCategory) { + tagColor = `#${tagCategory.colour}`; + } + } + + let molTagObjects = []; + observationsDataList.forEach(m => { + if (!m.tags_set.some(id => id === tag.id)) { + let newMol = { ...m }; + newMol.tags_set.push(tag.id); + const pose = poses.find(p => p.site_observations.includes(m.id)); + updateCmp(pose, newMol); + dispatch(updateMoleculeInMolLists(newMol)); + dispatch(updateMoleculeInLHSObservations(newMol)); + const moleculeTag = getMoleculeTagForTag(tagList, tag.id); + let mtObject = molTagObjects.find(mto => mto.tag === tag.tag); + if (mtObject) { + mtObject.site_observations.push(newMol.id); + } else { + mtObject = createMoleculeTagObject( + tag.tag, + targetId, + tag.category, + DJANGO_CONTEXT.pk, + tagColor, + tag.discourse_url, + [...moleculeTag.site_observations, newMol.id], + tag.create_date, + tag.additional_info, + tag.mol_group, + tag.hidden, + tag.tag_prefix, + tag.upload_name + ); + molTagObjects.push(mtObject); + } + } + }); + if (molTagObjects) { + for (const mto of molTagObjects) { + let molTagObject = { ...mto }; + let augMolTagObject = augumentTagObjectWithId(molTagObject, tag.id); + await updateExistingTag(molTagObject, tag.id); + dispatch(updateMoleculeTag(augMolTagObject)); + dispatch(updateTag(augMolTagObject)); + } + } + } catch (e) { + console.log(e); + //dispatch(setIsErrorDuringTagging(true)); + } finally { + // setTaggingInProgress(false); + } + }; + + const untagObservations = async tag => { + try { + // setTaggingInProgress(true); + + let tagColor = DEFAULT_TAG_COLOR; + if (tag.colour && tag.colour !== '') { + tagColor = tag.colour; + } else { + const tagCategory = dispatch(getCategoryById(tag.category)); + if (tagCategory) { + tagColor = `#${tagCategory.colour}`; + } + } + + let molTagObjects = []; + observationsDataList.forEach(m => { + let newMol = { ...m }; + newMol.tags_set = newMol.tags_set.filter(id => id !== tag.id); + const pose = poses.find(p => p.site_observations.includes(m.id)); + updateCmp(pose, newMol); + dispatch(updateMoleculeInMolLists(newMol)); + dispatch(updateMoleculeInLHSObservations(newMol)); + const moleculeTag = getMoleculeTagForTag(tagList, tag.id); + + let mtObject = molTagObjects.find(mto => mto.tag === tag.tag); + if (mtObject) { + mtObject.site_observations = mtObject.site_observations.filter(id => id !== m.id); + } else { + let newMolList = [...moleculeTag.site_observations]; + newMolList = newMolList.filter(id => id !== m.id); + mtObject = createMoleculeTagObject( + tag.tag, + targetId, + tag.category, + DJANGO_CONTEXT.pk, + tagColor, + tag.discourse_url, + newMolList, + tag.create_date, + tag.additional_info, + tag.mol_group, + tag.hidden, + tag.tag_prefix, + tag.upload_name + ); + molTagObjects.push(mtObject); + } + }); + if (molTagObjects) { + for (const mto of molTagObjects) { + let molTagObject = { ...mto }; + let augMolTagObject = augumentTagObjectWithId(molTagObject, tag.id); + await updateExistingTag(molTagObject, tag.id); + dispatch(updateMoleculeTag(augMolTagObject)); + dispatch(updateTag(augMolTagObject)); + } + } + } catch (e) { + console.log(e); + //dispatch(setIsErrorDuringTagging(true)); + } finally { + // setTaggingInProgress(false); + } + }; + + const getMainTagByCategory = categoryId => { + const firstSelectedObs = observationsDataList[0]; + if (firstSelectedObs) { + // console.log('firstSelectedObs?', { ...firstSelectedObs }); + const pose = poses.find(pose => pose.id === firstSelectedObs.pose); + const mainObservation = observationsDataList.find(observation => observation.id === pose.main_site_observation); + console.log('pose?', { ...pose }); + console.log('mainObservation?', { ...mainObservation }); + if (mainObservation) { + // tagList.filter(tag => { + + // if (tag.category === categoryId && mainObservation.tags_set.includes(tag.id)) { + // console.log('tag.category', tag.category) + // console.log('categoryId', categoryId) + // console.log('mainObservation.tags_set', mainObservation.tags_set) + // console.log('tag.id', tag.id) + // return true; + // } else { + // return false; + // } + // }).forEach(tag => console.log('in list', { ...tag })); + return tagList.find(tag => tag.category === categoryId && mainObservation.tags_set.includes(tag.id)); + } + } + return null; + }; + + /** + * Change the generated tags for all observations in a pose + * + * @param {*} tag + */ + const handleChangeXCAtag = async tag => { + console.log('tag', { ...tag }); + console.log('untagging'); + // untag first + const mainObservationTag = getMainTagByCategory(tag.category); + if (mainObservationTag) { + console.log('main tag', { ...mainObservationTag }); + await untagObservations(mainObservationTag); + } + // then tag + // await tagObservations(tag); + console.log('tagging'); + toastInfo(`Tag for observations was changed from "${mainObservationTag.upload_name}" to "${tag.upload_name}". They could disappear based on your tag selection`, { autoHideDuration: 5000 }); + }; + return ( ( - {PLURAL_TO_SINGULAR[tagCategory]} - + {PLURAL_TO_SINGULAR[tagCategory]} + ) )} @@ -904,10 +1119,35 @@ export const ObservationsDialog = memo( ))} - + {/* + + + {XCA_TAG_CATEGORIES.map(category => + + Change {category} + + {getTagsForCategory(category)?.map(tag => ( + handleChangeXCAtag(tag)}> + {tag.upload_name} + + ))} + + + )} + + */} )} - + )} {isLoadingInspirationListOfMolecules === true && ( diff --git a/js/components/preview/tags/modal/tagEditor.js b/js/components/preview/tags/modal/tagEditor.js index c8f168117..93b41dde6 100644 --- a/js/components/preview/tags/modal/tagEditor.js +++ b/js/components/preview/tags/modal/tagEditor.js @@ -3,14 +3,15 @@ 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 { updateLHSCompound, updateMoleculeInMolLists, updateMoleculeTag } from '../../../../reducers/api/actions'; +import { updateLHSCompound, updateMoleculeInMolLists, updateMoleculeTag, updateTag } from '../../../../reducers/api/actions'; import { getMoleculeForId } from '../redux/dispatchActions'; import { setMoleculeForTagEdit, setIsTagGlobalEdit, setAssignTagView, setTagEditorOpen, - setIsLHSCmpTagEdit + setIsLHSCmpTagEdit, + updateMoleculeInLHSObservations } from '../../../../reducers/selection/actions'; import { updateExistingTag } from '../api/tagsApi'; import { DJANGO_CONTEXT } from '../../../../utils/djangoContext'; @@ -215,6 +216,7 @@ export const TagEditor = memo( const pose = poses.find(p => p.site_observations.includes(m.id)); updateCmp(pose, newMol); dispatch(updateMoleculeInMolLists(newMol)); + dispatch(updateMoleculeInLHSObservations(newMol)); const moleculeTag = getMoleculeTagForTag(moleculeTags, tag.id); let mtObject = molTagObjects.find(mto => mto.tag === tag.tag); @@ -232,7 +234,11 @@ export const TagEditor = memo( tag.discourse_url, newMolList, tag.create_date, - tag.additional_info + tag.additional_info, + tag.mol_group, + tag.hidden, + tag.tag_prefix, + tag.upload_name ); molTagObjects.push(mtObject); } @@ -245,6 +251,7 @@ export const TagEditor = memo( const pose = poses.find(p => p.site_observations.includes(m.id)); updateCmp(pose, newMol); dispatch(updateMoleculeInMolLists(newMol)); + dispatch(updateMoleculeInLHSObservations(newMol)); const moleculeTag = getMoleculeTagForTag(moleculeTags, tag.id); let mtObject = molTagObjects.find(mto => mto.tag === tag.tag); if (mtObject) { @@ -259,7 +266,11 @@ export const TagEditor = memo( tag.discourse_url, [...moleculeTag.site_observations, newMol.id], tag.create_date, - tag.additional_info + tag.additional_info, + tag.mol_group, + tag.hidden, + tag.tag_prefix, + tag.upload_name ); molTagObjects.push(mtObject); } @@ -274,6 +285,7 @@ export const TagEditor = memo( let augMolTagObject = augumentTagObjectWithId(molTagObject, tag.id); await updateExistingTag(molTagObject, tag.id); dispatch(updateMoleculeTag(augMolTagObject)); + dispatch(updateTag(augMolTagObject)); molsLeft = molsLeft - 1; setMolsLeftForTagging(molsLeft); } diff --git a/js/components/preview/tags/utils/tagUtils.js b/js/components/preview/tags/utils/tagUtils.js index 2d4dcb4e1..9bd0e6b2f 100644 --- a/js/components/preview/tags/utils/tagUtils.js +++ b/js/components/preview/tags/utils/tagUtils.js @@ -22,7 +22,9 @@ export const createMoleculeTagObject = ( createDate = new Date(), additionalInfo = null, molGroup = null, - hidden = false + hidden = false, + tag_prefix = null, + upload_name = null ) => { return { tag: tagName, @@ -36,7 +38,9 @@ export const createMoleculeTagObject = ( help_text: tagName, additional_info: additionalInfo, mol_group: molGroup, - hidden: hidden + hidden: hidden, + tag_prefix: tag_prefix, + upload_name: upload_name }; }; diff --git a/js/constants/constants.js b/js/constants/constants.js index a6f991d6b..41df3fe4e 100644 --- a/js/constants/constants.js +++ b/js/constants/constants.js @@ -52,6 +52,7 @@ export const CATEGORY_TYPE_BY_ID = { 4: CATEGORY_TYPE.OTHER }; +export const XCA_TAG_CATEGORIES = ['CanonSites', 'ConformerSites', 'CrystalformSites', 'Quatassemblies']; export const OBSERVATION_TAG_CATEGORIES = ['ConformerSites', 'CrystalformSites', 'Quatassemblies', 'Crystalforms']; export const COMPOUND_PRIO_TAG_CATEGORIES = ['CanonSites']; export const TAG_DETAILS_REMOVED_CATEGORIES = ['CrystalformSites', 'ConformerSites']; diff --git a/js/reducers/api/apiReducers.js b/js/reducers/api/apiReducers.js index 38b3801d4..557750369 100644 --- a/js/reducers/api/apiReducers.js +++ b/js/reducers/api/apiReducers.js @@ -385,14 +385,18 @@ export default function apiReducers(state = INITIAL_STATE, action = {}) { case constants.UPDATE_TAG: let listWithUpdatedTag = [...state.tagList]; - let foundTags = listWithUpdatedTag.filter(t => t.id === action.item.id); - if (foundTags && foundTags.length > 0) { - let foundTag = foundTags[0]; - foundTag.tag = action.item.tag; - foundTag.colour = action.item.colour; - foundTag.category = action.item.category; - foundTag.discourse_url = action.item.discourse_url; - foundTag.hidden = action.item.hidden; + // let foundTags = listWithUpdatedTag.filter(t => t.id === action.item.id); + const foundTagIndex = listWithUpdatedTag.findIndex(t => t.id === action.item.id); + if (foundTagIndex >= 0) { + listWithUpdatedTag[foundTagIndex] = { ...action.item }; + // if (foundTags && foundTags.length > 0) { + // let foundTag = foundTags[0]; + // foundTag.tag = action.item.tag; + // foundTag.colour = action.item.colour; + // foundTag.category = action.item.category; + // foundTag.discourse_url = action.item.discourse_url; + // foundTag.hidden = action.item.hidden; + // foundTag.upload_name = action.item.upload_name; return { ...state, tagList: [...listWithUpdatedTag] }; } else { diff --git a/js/reducers/selection/actions.js b/js/reducers/selection/actions.js index e4d708386..2166e14f7 100644 --- a/js/reducers/selection/actions.js +++ b/js/reducers/selection/actions.js @@ -4,14 +4,14 @@ import { constants } from './constants'; -export const setToBuyList = function(to_buy_list) { +export const setToBuyList = function (to_buy_list) { return { type: constants.SET_TO_BUY_LIST, to_buy_list: to_buy_list }; }; -export const appendToBuyList = function(item, index, skipTracking = false) { +export const appendToBuyList = function (item, index, skipTracking = false) { return { type: constants.APPEND_TO_BUY_LIST, item: item, @@ -20,7 +20,7 @@ export const appendToBuyList = function(item, index, skipTracking = false) { }; }; -export const removeFromToBuyList = function(item, index, skipTracking = false) { +export const removeFromToBuyList = function (item, index, skipTracking = false) { return { type: constants.REMOVE_FROM_TO_BUY_LIST, item: item, @@ -29,21 +29,21 @@ export const removeFromToBuyList = function(item, index, skipTracking = false) { }; }; -export const appendToBuyListAll = function(items) { +export const appendToBuyListAll = function (items) { return { type: constants.APPEND_TO_BUY_LIST_ALL, items: items }; }; -export const removeFromToBuyListAll = function(items) { +export const removeFromToBuyListAll = function (items) { return { type: constants.REMOVE_FROM_BUY_LIST_ALL, items: items }; }; -export const setVectorList = function(vectList) { +export const setVectorList = function (vectList) { return { type: constants.SET_VECTOR_LIST, vector_list: vectList @@ -57,7 +57,7 @@ export const setCurrentVector = vectorSmile => { }; }; -export const setFragmentDisplayList = function(fragmentDisplayList, skipTracking = false) { +export const setFragmentDisplayList = function (fragmentDisplayList, skipTracking = false) { return { type: constants.SET_FRAGMENT_DISPLAY_LIST, fragmentDisplayList: fragmentDisplayList, @@ -65,7 +65,7 @@ export const setFragmentDisplayList = function(fragmentDisplayList, skipTracking }; }; -export const appendFragmentDisplayList = function(item, skipTracking = false) { +export const appendFragmentDisplayList = function (item, skipTracking = false) { return { type: constants.APPEND_FRAGMENT_DISPLAY_LIST, item: item, @@ -73,7 +73,7 @@ export const appendFragmentDisplayList = function(item, skipTracking = false) { }; }; -export const removeFromFragmentDisplayList = function(item, skipTracking = false) { +export const removeFromFragmentDisplayList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_FRAGMENT_DISPLAY_LIST, item: item, @@ -81,7 +81,7 @@ export const removeFromFragmentDisplayList = function(item, skipTracking = false }; }; -export const setProteinList = function(proteinList, skipTracking = false) { +export const setProteinList = function (proteinList, skipTracking = false) { return { type: constants.SET_PROTEIN_LIST, proteinList: proteinList, @@ -89,7 +89,7 @@ export const setProteinList = function(proteinList, skipTracking = false) { }; }; -export const appendProteinList = function(item, skipTracking = false) { +export const appendProteinList = function (item, skipTracking = false) { return { type: constants.APPEND_PROTEIN_LIST, item: item, @@ -97,14 +97,14 @@ export const appendProteinList = function(item, skipTracking = false) { }; }; -export const removeFromProteinList = function(item, skipTracking = false) { +export const removeFromProteinList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_PROTEIN_LIST, item: item, skipTracking: skipTracking }; }; -export const setComplexList = function(complexList, skipTracking = false) { +export const setComplexList = function (complexList, skipTracking = false) { return { type: constants.SET_COMPLEX_LIST, complexList: complexList, @@ -112,7 +112,7 @@ export const setComplexList = function(complexList, skipTracking = false) { }; }; -export const appendComplexList = function(item, skipTracking = false) { +export const appendComplexList = function (item, skipTracking = false) { return { type: constants.APPEND_COMPLEX_LIST, item: item, @@ -120,7 +120,7 @@ export const appendComplexList = function(item, skipTracking = false) { }; }; -export const removeFromComplexList = function(item, skipTracking = false) { +export const removeFromComplexList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_COMPLEX_LIST, item: item, @@ -128,7 +128,7 @@ export const removeFromComplexList = function(item, skipTracking = false) { }; }; -export const setSurfaceList = function(surfaceList, skipTracking = false) { +export const setSurfaceList = function (surfaceList, skipTracking = false) { return { type: constants.SET_SURFACE_LIST, surfaceList: surfaceList, @@ -136,7 +136,7 @@ export const setSurfaceList = function(surfaceList, skipTracking = false) { }; }; -export const appendSurfaceList = function(item, skipTracking = false) { +export const appendSurfaceList = function (item, skipTracking = false) { return { type: constants.APPEND_SURFACE_LIST, item: item, @@ -144,7 +144,7 @@ export const appendSurfaceList = function(item, skipTracking = false) { }; }; -export const removeFromSurfaceList = function(item, skipTracking = false) { +export const removeFromSurfaceList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_SURFACE_LIST, item: item, @@ -168,14 +168,14 @@ export const removeFromDensityListType = (item, skipTracking = false) => { }; }; -export const setDensityList = function(densityList) { +export const setDensityList = function (densityList) { return { type: constants.SET_DENSITY_LIST, densityList: densityList }; }; -export const appendDensityList = function(item, skipTracking = false) { +export const appendDensityList = function (item, skipTracking = false) { return { type: constants.APPEND_DENSITY_LIST, item: item, @@ -183,7 +183,7 @@ export const appendDensityList = function(item, skipTracking = false) { }; }; -export const removeFromDensityList = function(item, skipTracking = false) { +export const removeFromDensityList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_DENSITY_LIST, item: item, @@ -191,14 +191,14 @@ export const removeFromDensityList = function(item, skipTracking = false) { }; }; -export const setDensityListCustom = function(densityListCustom) { +export const setDensityListCustom = function (densityListCustom) { return { type: constants.SET_DENSITY_LIST_CUSTOM, densityListCustom: densityListCustom }; }; -export const appendDensityListCustom = function(item, skipTracking = false) { +export const appendDensityListCustom = function (item, skipTracking = false) { return { type: constants.APPEND_DENSITY_LIST_CUSTOM, item: item, @@ -206,7 +206,7 @@ export const appendDensityListCustom = function(item, skipTracking = false) { }; }; -export const removeFromDensityListCustom = function(item, skipTracking = false) { +export const removeFromDensityListCustom = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_DENSITY_LIST_CUSTOM, item: item, @@ -214,7 +214,7 @@ export const removeFromDensityListCustom = function(item, skipTracking = false) }; }; -export const setQualityList = function(qualityList, skipTracking = false) { +export const setQualityList = function (qualityList, skipTracking = false) { return { type: constants.SET_QUALITY_LIST, qualityList: qualityList, @@ -222,21 +222,21 @@ export const setQualityList = function(qualityList, skipTracking = false) { }; }; -export const appendInformationList = function(item) { +export const appendInformationList = function (item) { return { type: constants.APPEND_INFORMATION_LIST, item: item }; }; -export const removeFromInformationList = function(item) { +export const removeFromInformationList = function (item) { return { type: constants.REMOVE_FROM_INFORMATION_LIST, item: item }; }; -export const appendQualityList = function(item, skipTracking = false) { +export const appendQualityList = function (item, skipTracking = false) { return { type: constants.APPEND_QUALITY_LIST, item: item, @@ -244,7 +244,7 @@ export const appendQualityList = function(item, skipTracking = false) { }; }; -export const removeFromQualityList = function(item, skipTracking = false) { +export const removeFromQualityList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_QUALITY_LIST, item: item, @@ -252,7 +252,7 @@ export const removeFromQualityList = function(item, skipTracking = false) { }; }; -export const setVectorOnList = function(vectorOnList, skipTracking = false) { +export const setVectorOnList = function (vectorOnList, skipTracking = false) { return { type: constants.SET_VECTOR_ON_LIST, vectorOnList: vectorOnList, @@ -260,7 +260,7 @@ export const setVectorOnList = function(vectorOnList, skipTracking = false) { }; }; -export const appendVectorOnList = function(item, skipTracking = false) { +export const appendVectorOnList = function (item, skipTracking = false) { return { type: constants.APPEND_VECTOR_ON_LIST, item: item, @@ -268,7 +268,7 @@ export const appendVectorOnList = function(item, skipTracking = false) { }; }; -export const removeFromVectorOnList = function(item, skipTracking = false) { +export const removeFromVectorOnList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_VECTOR_ON_LIST, item: item, @@ -283,7 +283,7 @@ export const reloadSelectionReducer = savedSelectionReducers => { }; }; -export const resetSelectionState = function() { +export const resetSelectionState = function () { return { type: constants.RESET_SELECTION_STATE }; @@ -374,7 +374,7 @@ export const setArrowUpDown = (item, newItem, arrowType, data) => ({ } }); -export const setSelectedTagList = function(selectedTagList, skipTracking = false) { +export const setSelectedTagList = function (selectedTagList, skipTracking = false) { return { type: constants.SET_SELECTED_TAG_LIST, selectedTagList: selectedTagList, @@ -382,7 +382,7 @@ export const setSelectedTagList = function(selectedTagList, skipTracking = false }; }; -export const appendSelectedTagList = function(item, skipTracking = false) { +export const appendSelectedTagList = function (item, skipTracking = false) { return { type: constants.APPEND_SELECTED_TAG_LIST, item: item, @@ -390,7 +390,7 @@ export const appendSelectedTagList = function(item, skipTracking = false) { }; }; -export const removeFromSelectedTagList = function(item, skipTracking = false) { +export const removeFromSelectedTagList = function (item, skipTracking = false) { return { type: constants.REMOVE_FROM_SELECTED_TAG_LIST, item: item, @@ -444,6 +444,13 @@ export const setObservationsForLHSCmp = observations => { }; }; +export const updateMoleculeInLHSObservations = mol => { + return { + type: constants.UPDATE_MOL_IN_LHS_OBSERVATIONS, + mol: mol + }; +}; + export const setMoleculeForTagEdit = molIds => { return { type: constants.SET_MOLECULE_FOR_TAG_EDIT, diff --git a/js/reducers/selection/constants.js b/js/reducers/selection/constants.js index 7255753a6..49b5949c3 100644 --- a/js/reducers/selection/constants.js +++ b/js/reducers/selection/constants.js @@ -75,6 +75,7 @@ export const constants = { SET_OPEN_OBSERVATIONS_DIALOG: prefix + 'SET_OPEN_OBSERVATIONS_DIALOG', SET_OBSERVATIONS_FOR_LHS_CMP: prefix + 'SET_OBSERVATIONS_FOR_LHS_CMP', + UPDATE_MOL_IN_LHS_OBSERVATIONS: prefix + 'UPDATE_MOL_IN_LHS_OBSERVATIONS', SET_POSE_ID_FOR_OBSERVATIONS_DIALOG: prefix + 'SET_POSE_ID_FOR_OBSERVATIONS_DIALOG', SET_TAG_TO_EDIT: prefix + 'SET_TAG_TO_EDIT', diff --git a/js/reducers/selection/selectionReducers.js b/js/reducers/selection/selectionReducers.js index 2b17daaa1..5f4e5e4c7 100644 --- a/js/reducers/selection/selectionReducers.js +++ b/js/reducers/selection/selectionReducers.js @@ -180,6 +180,16 @@ export function selectionReducers(state = INITIAL_STATE, action = {}) { case constants.SET_OBSERVATIONS_FOR_LHS_CMP: return { ...state, observationsForLHSCmp: [...action.observations] }; + case constants.UPDATE_MOL_IN_LHS_OBSERVATIONS: + let newList = [...state.observationsForLHSCmp]; + const indexOfMol = newList.findIndex(m => m.id === action.mol.id); + if (indexOfMol >= 0) { + newList[indexOfMol] = { ...action.mol }; + return { ...state, observationsForLHSCmp: [...newList] }; + } else { + return state; + } + case constants.SET_SURFACE_LIST: let newSurfaceList = new Set(); action.surfaceList.forEach(f => {