diff --git a/js/components/datasets/datasetMoleculeView.js b/js/components/datasets/datasetMoleculeView.js index 3f3588eac..eb42095d3 100644 --- a/js/components/datasets/datasetMoleculeView.js +++ b/js/components/datasets/datasetMoleculeView.js @@ -30,7 +30,9 @@ import { appendMoleculeToCompoundsOfDatasetToBuy, removeMoleculeFromCompoundsOfDatasetToBuy, setCrossReferenceCompoundName, - setIsOpenCrossReferenceDialog + setIsOpenCrossReferenceDialog, + setSelectedAll, + setDeselectedAll } from './redux/actions'; import { centerOnLigandByMoleculeID } from '../../reducers/ngl/dispatchActions'; import { ArrowDownward, ArrowUpward, MyLocation } from '@material-ui/icons'; @@ -365,22 +367,22 @@ export const DatasetMoleculeView = memo( const not_selected_style = {}; const current_style = isLigandOn || isProteinOn || isComplexOn || isSurfaceOn ? selected_style : not_selected_style; - const addNewLigand = () => { - dispatch(addDatasetLigand(stage, data, colourToggle, datasetID)); + const addNewLigand = (skipTracking = false) => { + dispatch(addDatasetLigand(stage, data, colourToggle, datasetID, skipTracking)); }; - const removeSelectedLigand = () => { - dispatch(removeDatasetLigand(stage, data, colourToggle, datasetID)); + const removeSelectedLigand = (skipTracking = false) => { + dispatch(removeDatasetLigand(stage, data, colourToggle, datasetID, skipTracking)); selectedAll.current = false; }; const onLigand = calledFromSelectAll => { if (calledFromSelectAll === true && selectedAll.current === true) { if (isLigandOn === false) { - addNewLigand(); + addNewLigand(calledFromSelectAll); } } else if (calledFromSelectAll && selectedAll.current === false) { - removeSelectedLigand(); + removeSelectedLigand(calledFromSelectAll); } else if (!calledFromSelectAll) { if (isLigandOn === false) { addNewLigand(); @@ -390,22 +392,22 @@ export const DatasetMoleculeView = memo( } }; - const removeSelectedProtein = () => { - dispatch(removeDatasetHitProtein(stage, data, colourToggle, datasetID)); + const removeSelectedProtein = (skipTracking = false) => { + dispatch(removeDatasetHitProtein(stage, data, colourToggle, datasetID, skipTracking)); selectedAll.current = false; }; - const addNewProtein = () => { - dispatch(addDatasetHitProtein(stage, data, colourToggle, datasetID)); + const addNewProtein = (skipTracking = false) => { + dispatch(addDatasetHitProtein(stage, data, colourToggle, datasetID, skipTracking)); }; const onProtein = calledFromSelectAll => { if (calledFromSelectAll === true && selectedAll.current === true) { if (isProteinOn === false) { - addNewProtein(); + addNewProtein(calledFromSelectAll); } } else if (calledFromSelectAll && selectedAll.current === false) { - removeSelectedProtein(); + removeSelectedProtein(calledFromSelectAll); } else if (!calledFromSelectAll) { if (isProteinOn === false) { addNewProtein(); @@ -415,22 +417,22 @@ export const DatasetMoleculeView = memo( } }; - const removeSelectedComplex = () => { - dispatch(removeDatasetComplex(stage, data, colourToggle, datasetID)); + const removeSelectedComplex = (skipTracking = false) => { + dispatch(removeDatasetComplex(stage, data, colourToggle, datasetID, skipTracking)); selectedAll.current = false; }; - const addNewComplex = () => { - dispatch(addDatasetComplex(stage, data, colourToggle, datasetID)); + const addNewComplex = (skipTracking = false) => { + dispatch(addDatasetComplex(stage, data, colourToggle, datasetID, skipTracking)); }; const onComplex = calledFromSelectAll => { if (calledFromSelectAll === true && selectedAll.current === true) { if (isComplexOn === false) { - addNewComplex(); + addNewComplex(calledFromSelectAll); } } else if (calledFromSelectAll && selectedAll.current === false) { - removeSelectedComplex(); + removeSelectedComplex(calledFromSelectAll); } else if (!calledFromSelectAll) { if (isComplexOn === false) { addNewComplex(); @@ -465,6 +467,15 @@ export const DatasetMoleculeView = memo( } }; + const setCalledFromAll = () => { + let isSelected = selectedAll.current === true; + if (isSelected) { + dispatch(setSelectedAll(datasetID, data)); + } else { + dispatch(setDeselectedAll(datasetID, data)); + } + }; + /** * Check if given molecule is matching current filter * @param Object item - item.name is attribute name, item.value is its value @@ -630,6 +641,7 @@ export const DatasetMoleculeView = memo( // always deselect all if are selected only some of options selectedAll.current = hasSomeValuesOn ? false : !selectedAll.current; + setCalledFromAll(); onLigand(true); onProtein(true); onComplex(true); diff --git a/js/components/datasets/redux/actions.js b/js/components/datasets/redux/actions.js index 7159713be..469cd049e 100644 --- a/js/components/datasets/redux/actions.js +++ b/js/components/datasets/redux/actions.js @@ -50,22 +50,24 @@ export const setLigandList = function(datsetID, ligandList) { } }; }; -export const appendLigandList = function(datsetID, item) { +export const appendLigandList = function(datsetID, item, skipTracking = false) { return { type: constants.APPEND_LIGAND_LIST, payload: { datasetID: datsetID, item: item - } + }, + skipTracking: skipTracking }; }; -export const removeFromLigandList = function(datsetID, item) { +export const removeFromLigandList = function(datsetID, item, skipTracking = false) { return { type: constants.REMOVE_FROM_LIGAND_LIST, payload: { datasetID: datsetID, item: item - } + }, + skipTracking: skipTracking }; }; @@ -78,22 +80,24 @@ export const setProteinList = function(datsetID, proteinList) { } }; }; -export const appendProteinList = function(datsetID, item) { +export const appendProteinList = function(datsetID, item, skipTracking = false) { return { type: constants.APPEND_PROTEIN_LIST, payload: { datasetID: datsetID, item: item - } + }, + skipTracking: skipTracking }; }; -export const removeFromProteinList = function(datsetID, item) { +export const removeFromProteinList = function(datsetID, item, skipTracking = false) { return { type: constants.REMOVE_FROM_PROTEIN_LIST, payload: { datasetID: datsetID, item: item - } + }, + skipTracking: skipTracking }; }; @@ -106,22 +110,24 @@ export const setComplexList = function(datsetID, complexList) { } }; }; -export const appendComplexList = function(datsetID, item) { +export const appendComplexList = function(datsetID, item, skipTracking = false) { return { type: constants.APPEND_COMPLEX_LIST, payload: { datasetID: datsetID, item: item - } + }, + skipTracking: skipTracking }; }; -export const removeFromComplexList = function(datsetID, item) { +export const removeFromComplexList = function(datsetID, item, skipTracking = false) { return { type: constants.REMOVE_FROM_COMPLEX_LIST, payload: { datasetID: datsetID, item: item - } + }, + skipTracking: skipTracking }; }; @@ -300,3 +306,19 @@ export const resetDatasetsState = () => { type: constants.RESET_DATASETS_STATE }; }; + +export const setSelectedAll = (datsetID, item) => ({ + type: constants.SET_SELECTED_ALL, + payload: { + datasetID: datsetID, + item: item + } +}); + +export const setDeselectedAll = (datsetID, item) => ({ + type: constants.SET_DESELECTED_ALL, + payload: { + datasetID: datsetID, + item: item + } +}); diff --git a/js/components/datasets/redux/constants.js b/js/components/datasets/redux/constants.js index 4a184c487..8653a8364 100644 --- a/js/components/datasets/redux/constants.js +++ b/js/components/datasets/redux/constants.js @@ -59,7 +59,10 @@ export const constants = { REMOVE_MOLECULE_FROM_COMPOUNDS_TO_BUY_OF_DATASET: prefix + 'REMOVE_MOLECULE_FROM_COMPOUNDS_TO_BUY_OF_DATASET', RELOAD_DATASETS_REDUCER: prefix + 'RELOAD_DATASETS_REDUCER', - RESET_DATASETS_STATE: prefix + 'RESET_DATASETS_STATE' + RESET_DATASETS_STATE: prefix + 'RESET_DATASETS_STATE', + + SET_SELECTED_ALL: prefix + 'SET_SELECTED_ALL', + SET_DESELECTED_ALL: prefix + 'SET_DESELECTED_ALL' }; export const COUNT_OF_VISIBLE_SCORES = 7; diff --git a/js/components/datasets/redux/dispatchActions.js b/js/components/datasets/redux/dispatchActions.js index 8a5ae26e6..4072d9a2b 100644 --- a/js/components/datasets/redux/dispatchActions.js +++ b/js/components/datasets/redux/dispatchActions.js @@ -50,7 +50,7 @@ export const initializeDatasetFilter = datasetID => (dispatch, getState) => { dispatch(setFilterProperties(datasetID, initFilterProperties)); }; -export const addDatasetHitProtein = (stage, data, colourToggle, datasetID) => dispatch => { +export const addDatasetHitProtein = (stage, data, colourToggle, datasetID, skipTracking = false) => dispatch => { dispatch( loadObject({ target: Object.assign( @@ -64,10 +64,10 @@ export const addDatasetHitProtein = (stage, data, colourToggle, datasetID) => di const currentOrientation = stage.viewerControls.getOrientation(); dispatch(setOrientation(VIEWS.MAJOR_VIEW, currentOrientation)); }); - dispatch(appendProteinList(datasetID, generateMoleculeCompoundId(data))); + dispatch(appendProteinList(datasetID, generateMoleculeCompoundId(data), skipTracking)); }; -export const removeDatasetHitProtein = (stage, data, colourToggle, datasetID) => dispatch => { +export const removeDatasetHitProtein = (stage, data, colourToggle, datasetID, skipTracking = false) => dispatch => { dispatch( deleteObject( Object.assign( @@ -77,10 +77,10 @@ export const removeDatasetHitProtein = (stage, data, colourToggle, datasetID) => stage ) ); - dispatch(removeFromProteinList(datasetID, generateMoleculeCompoundId(data))); + dispatch(removeFromProteinList(datasetID, generateMoleculeCompoundId(data), skipTracking)); }; -export const addDatasetComplex = (stage, data, colourToggle, datasetID) => dispatch => { +export const addDatasetComplex = (stage, data, colourToggle, datasetID, skipTracking = false) => dispatch => { dispatch( loadObject({ target: Object.assign( @@ -94,17 +94,17 @@ export const addDatasetComplex = (stage, data, colourToggle, datasetID) => dispa const currentOrientation = stage.viewerControls.getOrientation(); dispatch(setOrientation(VIEWS.MAJOR_VIEW, currentOrientation)); }); - dispatch(appendComplexList(datasetID, generateMoleculeCompoundId(data))); + dispatch(appendComplexList(datasetID, generateMoleculeCompoundId(data), skipTracking)); }; -export const removeDatasetComplex = (stage, data, colourToggle, datasetID) => dispatch => { +export const removeDatasetComplex = (stage, data, colourToggle, datasetID, skipTracking = false) => dispatch => { dispatch( deleteObject( Object.assign({ display_div: VIEWS.MAJOR_VIEW }, generateComplexObject(data, colourToggle, base_url, datasetID)), stage ) ); - dispatch(removeFromComplexList(datasetID, generateMoleculeCompoundId(data))); + dispatch(removeFromComplexList(datasetID, generateMoleculeCompoundId(data), skipTracking)); }; export const addDatasetSurface = (stage, data, colourToggle, datasetID) => dispatch => { @@ -134,7 +134,7 @@ export const removeDatasetSurface = (stage, data, colourToggle, datasetID) => di dispatch(removeFromSurfaceList(datasetID, generateMoleculeCompoundId(data))); }; -export const addDatasetLigand = (stage, data, colourToggle, datasetID) => dispatch => { +export const addDatasetLigand = (stage, data, colourToggle, datasetID, skipTracking = false) => dispatch => { const currentOrientation = stage.viewerControls.getOrientation(); dispatch( loadObject({ @@ -151,17 +151,17 @@ export const addDatasetLigand = (stage, data, colourToggle, datasetID) => dispat // keep current orientation of NGL View stage.viewerControls.orient(currentOrientation); }); - dispatch(appendLigandList(datasetID, generateMoleculeCompoundId(data))); + dispatch(appendLigandList(datasetID, generateMoleculeCompoundId(data), skipTracking)); }; -export const removeDatasetLigand = (stage, data, colourToggle, datasetID) => dispatch => { +export const removeDatasetLigand = (stage, data, colourToggle, datasetID, skipTracking = false) => dispatch => { dispatch( deleteObject( Object.assign({ display_div: VIEWS.MAJOR_VIEW }, generateMoleculeObject(data, undefined, datasetID)), stage ) ); - dispatch(removeFromLigandList(datasetID, generateMoleculeCompoundId(data))); + dispatch(removeFromLigandList(datasetID, generateMoleculeCompoundId(data), skipTracking)); }; export const loadDataSets = targetId => dispatch => diff --git a/js/components/datasets/redux/reducer.js b/js/components/datasets/redux/reducer.js index 449fe15ee..c69b1a892 100644 --- a/js/components/datasets/redux/reducer.js +++ b/js/components/datasets/redux/reducer.js @@ -21,6 +21,9 @@ export const INITIAL_STATE = { surfaceLists: {}, // map of $datasetID and its $list inspirationLists: {}, // map of $datasetID and its $list + molecule_all_selection: null, + molecule_all_deselection: null, + // search searchString: null, @@ -373,6 +376,15 @@ export const datasetsReducers = (state = INITIAL_STATE, action = {}) => { }; return Object.assign({}, state, { ...INITIAL_STATE, ...datasetsLists }); + case constants.SET_SELECTED_ALL: + return Object.assign({}, state, { + molecule_all_selection: action.payload + }); + + case constants.SET_DESELECTED_ALL: + return Object.assign({}, state, { + molecule_all_deselection: action.payload + }); default: return state; } diff --git a/js/reducers/tracking/trackingActions.js b/js/reducers/tracking/trackingActions.js index 4d701f575..65d2159a4 100644 --- a/js/reducers/tracking/trackingActions.js +++ b/js/reducers/tracking/trackingActions.js @@ -375,6 +375,42 @@ export const findTruckAction = (action, state) => { text: `${objectType} ${objectName} ${actionDescription.DESELECTED} of dataset: ${action.payload.datasetID}` }; } + } else if (action.type.includes(customDatasetConstants.SET_SELECTED_ALL)) { + if (action.payload && action.payload.item) { + let objectType = + action.payload.item.isCrossReference === true ? actionObjectType.CROSS_REFERENCE : actionObjectType.COMPOUND; + let objectName = action.payload.item.name; + + truckAction = { + type: actionType.ALL_TURNED_ON, + timestamp: Date.now(), + username: username, + project: project, + object_type: objectType, + object_name: objectName, + object_id: action.payload.item.id, + dataset_id: action.payload.datasetID, + text: `${actionDescription.ALL} ${actionDescription.TURNED_ON} ${objectType} ${objectName} of dataset: ${action.payload.datasetID}` + }; + } + } else if (action.type.includes(customDatasetConstants.SET_DESELECTED_ALL)) { + if (action.payload && action.payload.item) { + let objectType = + action.payload.item.isCrossReference === true ? actionObjectType.CROSS_REFERENCE : actionObjectType.COMPOUND; + let objectName = action.payload.item.name; + + truckAction = { + type: actionType.ALL_TURNED_OFF, + timestamp: Date.now(), + username: username, + project: project, + object_type: objectType, + object_name: objectName, + object_id: action.payload.item.id, + dataset_id: action.payload.datasetID, + text: `${actionDescription.ALL} ${actionDescription.ALL_TURNED_OFF} ${objectType} ${objectName} of dataset: ${action.payload.datasetID}` + }; + } } else if (action.type.includes(customDatasetConstants.APPEND_LIGAND_LIST)) { if (action.payload && action.payload.item) { let objectType =