diff --git a/js/components/datasets/datasetFilter.js b/js/components/datasets/datasetFilter.js index 39bdc6e5a..710eae06c 100644 --- a/js/components/datasets/datasetFilter.js +++ b/js/components/datasets/datasetFilter.js @@ -8,6 +8,7 @@ import { setFilterDialogOpen, setFilterProperties, setFilterSettings, + setDatasetFilter, setFilterWithInspirations } from './redux/actions'; import { @@ -96,12 +97,13 @@ export const DatasetFilter = memo( return scoreDatasetList[Object.keys(scoreDatasetList).find(attrName => attrName === attr)]; }; - const handleFilterChange = (newFilterProperties, newFilterSettings) => { + const handleFilterChange = (newFilterProperties, newFilterSettings, key) => { Object.keys(scoreDatasetList).forEach(attrKey => { if (newFilterProperties[attrKey].priority === undefined || newFilterProperties[attrKey].priority === '') { newFilterProperties[attrKey].priority = 0; } }); + dispatch(setDatasetFilter(datasetID, newFilterProperties, newFilterSettings, key)); dispatch(setFilterProperties(datasetID, newFilterProperties)); dispatch(setFilterSettings(datasetID, newFilterSettings)); }; @@ -109,7 +111,7 @@ export const DatasetFilter = memo( const handleItemChange = key => setting => { const newFilterSettings = createFilterSettingsObject({ active: true, predefined, priorityOrder }); const newFilterProperties = { ...filterProperties, [key]: setting }; - handleFilterChange(newFilterProperties, newFilterSettings); + handleFilterChange(newFilterProperties, newFilterSettings, key); }; const handlePrioChange = key => inc => () => { @@ -124,13 +126,13 @@ export const DatasetFilter = memo( newFilterSettings.priorityOrder = localPriorityOrder; newFilterSettings.active = true; - handleFilterChange(filterProperties, newFilterSettings); + handleFilterChange(filterProperties, newFilterSettings, key); } }; const handleClear = () => { setPredefinedFilter('none'); - handleFilterChange(defaultFilterProperties, defaultFilterSettings); + handleFilterChange(defaultFilterProperties, defaultFilterSettings, 'clear'); }; // Check for multiple attributes with same sorting priority diff --git a/js/components/datasets/redux/actions.js b/js/components/datasets/redux/actions.js index 03aea52d6..ac0cc5e7d 100644 --- a/js/components/datasets/redux/actions.js +++ b/js/components/datasets/redux/actions.js @@ -52,6 +52,11 @@ export const setFilterProperties = (datasetID, properties) => ({ payload: { datasetID, properties } }); +export const setDatasetFilter = (datasetID, properties, settings, key) => ({ + type: constants.SET_DATASET_FILTER, + payload: { datasetID, properties, settings, key } +}); + export const setFilterDialogOpen = filterDialogOpen => ({ type: constants.SET_FILTER_DIALOG_OPEN, payload: filterDialogOpen diff --git a/js/components/datasets/redux/constants.js b/js/components/datasets/redux/constants.js index 6b5e17fda..32bb4de98 100644 --- a/js/components/datasets/redux/constants.js +++ b/js/components/datasets/redux/constants.js @@ -14,6 +14,7 @@ export const constants = { SET_FILTER_PROPERTIES: prefix + 'SET_FILTER_PROPERTIES', SET_FILTER_DIALOG_OPEN: prefix + 'SET_FILTER_DIALOG_OPEN', SET_FILTER_WITH_INSPIRATIONS: prefix + 'SET_FILTER_WITH_INSPIRATIONS', + SET_DATASET_FILTER: prefix + 'SET_DATASET_FILTER', SET_LIGAND_LIST: prefix + 'SET_LIGAND_LIST', APPEND_LIGAND_LIST: prefix + 'APPEND_LIGAND_LIST', diff --git a/js/reducers/tracking/dispatchActions.js b/js/reducers/tracking/dispatchActions.js index 8b26f03d5..62959ab75 100644 --- a/js/reducers/tracking/dispatchActions.js +++ b/js/reducers/tracking/dispatchActions.js @@ -65,7 +65,10 @@ import { removeMoleculeFromCompoundsOfDatasetToBuy, setMoleculeListIsLoading, setTabValue, - setSelectedDatasetIndex + setSelectedDatasetIndex, + setDatasetFilter, + setFilterProperties, + setFilterSettings } from '../../components/datasets/redux/actions'; import { setAllMolLists } from '../api/actions'; import { getUrl, loadAllMolsFromMolGroup } from '../../../js/utils/genericList'; @@ -1023,6 +1026,16 @@ const restoreTabActions = moleculesAction => (dispatch, getState) => { ) ); } + + let filterAction = moleculesAction.find(action => action.type === actionType.DATASET_FILTER); + if (filterAction) { + let datasetID = filterAction.dataset_id; + let newFilterProperties = filterAction.newProperties; + let newFilterSettings = filterAction.newSettings; + dispatch(setDatasetFilter(datasetID, newFilterProperties, newFilterSettings, filterAction.key)); + dispatch(setFilterProperties(datasetID, newFilterProperties)); + dispatch(setFilterSettings(datasetID, newFilterSettings)); + } }; const restoreSnapshotImageActions = projectID => async (dispatch, getState) => { @@ -1393,6 +1406,9 @@ const handleUndoAction = (action, stages) => (dispatch, getState) => { case actionType.DATASET_INDEX: dispatch(handleTabAction(action, false)); break; + case actionType.DATASET_FILTER: + dispatch(handleFilterAction(action, false)); + break; case actionType.REPRESENTATION_VISIBILITY_UPDATED: dispatch(handleUpdateRepresentationVisibilityAction(action, false, majorView)); break; @@ -1545,6 +1561,9 @@ const handleRedoAction = (action, stages) => (dispatch, getState) => { case actionType.DATASET_INDEX: dispatch(handleTabAction(action, true)); break; + case actionType.DATASET_FILTER: + dispatch(handleFilterAction(action, true)); + break; case actionType.REPRESENTATION_VISIBILITY_UPDATED: dispatch(handleUpdateRepresentationVisibilityAction(action, true, majorView)); break; @@ -1841,6 +1860,17 @@ const handleTabAction = (action, isSelected) => (dispatch, getState) => { } }; +const handleFilterAction = (action, isSelected) => (dispatch, getState) => { + if (action) { + let datasetID = action.dataset_id; + let newFilterProperties = isSelected === true ? action.newProperties : action.oldProperties; + let newFilterSettings = isSelected === true ? action.newSettings : action.oldSettings; + dispatch(setDatasetFilter(datasetID, newFilterProperties, newFilterSettings, action.key)); + dispatch(setFilterProperties(datasetID, newFilterProperties)); + dispatch(setFilterSettings(datasetID, newFilterSettings)); + } +}; + const handleCompoundAction = (action, isSelected) => (dispatch, getState) => { const state = getState(); if (action) { diff --git a/js/reducers/tracking/trackingActions.js b/js/reducers/tracking/trackingActions.js index 15d3c2724..adf1ac83e 100644 --- a/js/reducers/tracking/trackingActions.js +++ b/js/reducers/tracking/trackingActions.js @@ -874,6 +874,34 @@ export const findTrackAction = (action, state) => { text: `${actionDescription.DATASET} ${objectName} ${actionDescription.SELECTED}` }; } + } else if (action.type === customDatasetConstants.SET_DATASET_FILTER) { + if (action.payload) { + const filterProperties = state.datasetsReducers.filterPropertiesDatasetMap; + const filterSettings = state.datasetsReducers.filterDatasetMap; + + let filterPropertiesOfDataset = filterProperties[action.payload.datasetID]; + let filterSettingsOfDataset = filterSettings[action.payload.datasetID]; + + let objectType = actionObjectType.COMPOUND; + let key = action.payload.key; + + trackAction = { + type: actionType.DATASET_FILTER, + annotation: actionAnnotation.CHECK, + timestamp: Date.now(), + username: username, + object_type: objectType, + oldProperties: filterPropertiesOfDataset, + oldSettings: filterSettingsOfDataset, + newProperties: action.payload.properties, + newSettings: action.payload.settings, + dataset_id: action.payload.datasetID, + text: + key === 'clear' + ? `Filter ${actionDescription.CHANGED} to default values of dataset: ${action.payload.datasetID}` + : `Filter parameter: ${action.payload.key} ${actionDescription.CHANGED} of dataset: ${action.payload.datasetID}` + }; + } } else if (action.type === nglConstants.UPDATE_COMPONENT_REPRESENTATION_VISIBILITY) { let objectType = actionObjectType.REPRESENTATION; let value = action.newVisibility;