Skip to content

Commit 177ffa6

Browse files
Merge pull request #226 from m2ms/#455
#455
2 parents bacb410 + 260e01c commit 177ffa6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+3477
-814
lines changed

js/components/datasets/crossReferenceDialog.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import {
2727
getListOfSelectedLigandOfAllDatasets,
2828
getListOfSelectedProteinOfAllDatasets
2929
} from './redux/selectors';
30-
import { changeButtonClassname, onButtonToggle } from './helpers';
30+
import { changeButtonClassname } from './helpers';
3131

3232
const useStyles = makeStyles(theme => ({
3333
paper: {

js/components/datasets/datasetMoleculeList.js

+45-9
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,17 @@ import {
3434
removeDatasetComplex,
3535
addDatasetSurface,
3636
removeDatasetSurface,
37-
resetCrossReferenceDialog,
3837
autoHideDatasetDialogsOnScroll
3938
} from './redux/dispatchActions';
40-
import { setFilterDialogOpen, setIsOpenInspirationDialog, setSearchStringOfCompoundSet } from './redux/actions';
39+
import { setFilterDialogOpen, setSearchStringOfCompoundSet } from './redux/actions';
4140
import { DatasetFilter } from './datasetFilter';
4241
import { FilterList, Search, Link } from '@material-ui/icons';
4342
import { getFilteredDatasetMoleculeList } from './redux/selectors';
4443
import { debounce } from 'lodash';
4544
import { InspirationDialog } from './inspirationDialog';
4645
import { CrossReferenceDialog } from './crossReferenceDialog';
4746
import { AlertModal } from '../common/Modal/AlertModal';
47+
import { setSelectedAllByType, setDeselectedAllByType } from './redux/actions';
4848

4949
const useStyles = makeStyles(theme => ({
5050
container: {
@@ -311,15 +311,17 @@ export const DatasetMoleculeList = memo(
311311
// TODO so this could lead to inconsistend behaviour while scrolling
312312
// TODO maybe change "currentMolecules.forEach" to "{type}List.forEach"
313313

314-
const removeSelectedType = type => {
314+
const removeSelectedType = (type, skipTracking) => {
315315
joinedMoleculeLists.forEach(molecule => {
316-
dispatch(removeType[type](stage, molecule, colourList[molecule.id % colourList.length], datasetID));
316+
dispatch(
317+
removeType[type](stage, molecule, colourList[molecule.id % colourList.length], datasetID, skipTracking)
318+
);
317319
});
318320
selectedAll.current = false;
319321
};
320-
const addNewType = type => {
322+
const addNewType = (type, skipTracking) => {
321323
joinedMoleculeLists.forEach(molecule => {
322-
dispatch(addType[type](stage, molecule, colourList[molecule.id % colourList.length], datasetID));
324+
dispatch(addType[type](stage, molecule, colourList[molecule.id % colourList.length], datasetID, skipTracking));
323325
});
324326
};
325327
const ucfirst = string => {
@@ -335,12 +337,46 @@ export const DatasetMoleculeList = memo(
335337
removeSelectedType(type);
336338
} else if (!calledFromSelectAll) {
337339
if (eval('is' + ucfirst(type) + 'On') === false) {
338-
addNewType(type);
340+
let molecules = getSelectedMoleculesByType(type, true);
341+
dispatch(setSelectedAllByType(type, datasetID, molecules));
342+
addNewType(type, true);
339343
} else {
340-
removeSelectedType(type);
344+
let molecules = getSelectedMoleculesByType(type, false);
345+
dispatch(setDeselectedAllByType(type, datasetID, molecules));
346+
removeSelectedType(type, true);
341347
}
342348
}
343349
};
350+
351+
const getSelectedMoleculesByType = (type, isAdd) => {
352+
switch (type) {
353+
case 'ligand':
354+
return isAdd ? getMoleculesToSelect(ligandList) : getMoleculesToDeselect(ligandList);
355+
case 'protein':
356+
return isAdd ? getMoleculesToSelect(proteinList) : getMoleculesToDeselect(proteinList);
357+
case 'complex':
358+
return isAdd ? getMoleculesToSelect(complexList) : getMoleculesToDeselect(complexList);
359+
default:
360+
return null;
361+
}
362+
};
363+
364+
const getMoleculesToSelect = list => {
365+
let molecules = joinedMoleculeLists.filter(m => !list.includes(m.id));
366+
let data = molecules.map(m => {
367+
return { datasetID, molecule: m };
368+
});
369+
return data;
370+
};
371+
372+
const getMoleculesToDeselect = list => {
373+
let molecules = joinedMoleculeLists.filter(m => list.includes(m.id));
374+
let data = molecules.map(m => {
375+
return { datasetID, molecule: m };
376+
});
377+
return data;
378+
};
379+
344380
let debouncedFn;
345381

346382
const handleSearch = event => {
@@ -456,7 +492,7 @@ export const DatasetMoleculeList = memo(
456492
<Tooltip
457493
title={`${filterProperties[attr].minValue}-${filterProperties[attr].maxValue} ${
458494
filterProperties[attr].order === 1 ? '\u2191' : '\u2193'
459-
}`}
495+
}`}
460496
placement="top"
461497
>
462498
<Chip size="small" label={attr} className={classes.propertyChip} />

js/components/datasets/datasetMoleculeView.js

+31-19
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ import {
3030
appendMoleculeToCompoundsOfDatasetToBuy,
3131
removeMoleculeFromCompoundsOfDatasetToBuy,
3232
setCrossReferenceCompoundName,
33-
setIsOpenCrossReferenceDialog
33+
setIsOpenCrossReferenceDialog,
34+
setSelectedAll,
35+
setDeselectedAll
3436
} from './redux/actions';
3537
import { centerOnLigandByMoleculeID } from '../../reducers/ngl/dispatchActions';
3638
import { ArrowDownward, ArrowUpward, MyLocation } from '@material-ui/icons';
@@ -365,22 +367,22 @@ export const DatasetMoleculeView = memo(
365367
const not_selected_style = {};
366368
const current_style = isLigandOn || isProteinOn || isComplexOn || isSurfaceOn ? selected_style : not_selected_style;
367369

368-
const addNewLigand = () => {
369-
dispatch(addDatasetLigand(stage, data, colourToggle, datasetID));
370+
const addNewLigand = (skipTracking = false) => {
371+
dispatch(addDatasetLigand(stage, data, colourToggle, datasetID, skipTracking));
370372
};
371373

372-
const removeSelectedLigand = () => {
373-
dispatch(removeDatasetLigand(stage, data, colourToggle, datasetID));
374+
const removeSelectedLigand = (skipTracking = false) => {
375+
dispatch(removeDatasetLigand(stage, data, colourToggle, datasetID, skipTracking));
374376
selectedAll.current = false;
375377
};
376378

377379
const onLigand = calledFromSelectAll => {
378380
if (calledFromSelectAll === true && selectedAll.current === true) {
379381
if (isLigandOn === false) {
380-
addNewLigand();
382+
addNewLigand(calledFromSelectAll);
381383
}
382384
} else if (calledFromSelectAll && selectedAll.current === false) {
383-
removeSelectedLigand();
385+
removeSelectedLigand(calledFromSelectAll);
384386
} else if (!calledFromSelectAll) {
385387
if (isLigandOn === false) {
386388
addNewLigand();
@@ -390,22 +392,22 @@ export const DatasetMoleculeView = memo(
390392
}
391393
};
392394

393-
const removeSelectedProtein = () => {
394-
dispatch(removeDatasetHitProtein(stage, data, colourToggle, datasetID));
395+
const removeSelectedProtein = (skipTracking = false) => {
396+
dispatch(removeDatasetHitProtein(stage, data, colourToggle, datasetID, skipTracking));
395397
selectedAll.current = false;
396398
};
397399

398-
const addNewProtein = () => {
399-
dispatch(addDatasetHitProtein(stage, data, colourToggle, datasetID));
400+
const addNewProtein = (skipTracking = false) => {
401+
dispatch(addDatasetHitProtein(stage, data, colourToggle, datasetID, skipTracking));
400402
};
401403

402404
const onProtein = calledFromSelectAll => {
403405
if (calledFromSelectAll === true && selectedAll.current === true) {
404406
if (isProteinOn === false) {
405-
addNewProtein();
407+
addNewProtein(calledFromSelectAll);
406408
}
407409
} else if (calledFromSelectAll && selectedAll.current === false) {
408-
removeSelectedProtein();
410+
removeSelectedProtein(calledFromSelectAll);
409411
} else if (!calledFromSelectAll) {
410412
if (isProteinOn === false) {
411413
addNewProtein();
@@ -415,22 +417,22 @@ export const DatasetMoleculeView = memo(
415417
}
416418
};
417419

418-
const removeSelectedComplex = () => {
419-
dispatch(removeDatasetComplex(stage, data, colourToggle, datasetID));
420+
const removeSelectedComplex = (skipTracking = false) => {
421+
dispatch(removeDatasetComplex(stage, data, colourToggle, datasetID, skipTracking));
420422
selectedAll.current = false;
421423
};
422424

423-
const addNewComplex = () => {
424-
dispatch(addDatasetComplex(stage, data, colourToggle, datasetID));
425+
const addNewComplex = (skipTracking = false) => {
426+
dispatch(addDatasetComplex(stage, data, colourToggle, datasetID, skipTracking));
425427
};
426428

427429
const onComplex = calledFromSelectAll => {
428430
if (calledFromSelectAll === true && selectedAll.current === true) {
429431
if (isComplexOn === false) {
430-
addNewComplex();
432+
addNewComplex(calledFromSelectAll);
431433
}
432434
} else if (calledFromSelectAll && selectedAll.current === false) {
433-
removeSelectedComplex();
435+
removeSelectedComplex(calledFromSelectAll);
434436
} else if (!calledFromSelectAll) {
435437
if (isComplexOn === false) {
436438
addNewComplex();
@@ -465,6 +467,15 @@ export const DatasetMoleculeView = memo(
465467
}
466468
};
467469

470+
const setCalledFromAll = () => {
471+
let isSelected = selectedAll.current === true;
472+
if (isSelected) {
473+
dispatch(setSelectedAll(datasetID, data, true, true, true));
474+
} else {
475+
dispatch(setDeselectedAll(datasetID, data, isLigandOn, isProteinOn, isComplexOn));
476+
}
477+
};
478+
468479
/**
469480
* Check if given molecule is matching current filter
470481
* @param Object item - item.name is attribute name, item.value is its value
@@ -630,6 +641,7 @@ export const DatasetMoleculeView = memo(
630641
// always deselect all if are selected only some of options
631642
selectedAll.current = hasSomeValuesOn ? false : !selectedAll.current;
632643

644+
setCalledFromAll();
633645
onLigand(true);
634646
onProtein(true);
635647
onComplex(true);

js/components/datasets/inspirationDialog.js

+52-10
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { NglContext } from '../nglView/nglProvider';
3737
import { VIEWS } from '../../constants/constants';
3838
import { Panel } from '../common/Surfaces/Panel';
3939
import { changeButtonClassname } from './helpers';
40+
import { setSelectedAllByType, setDeselectedAllByType } from '../../reducers/selection/actions';
4041

4142
const useStyles = makeStyles(theme => ({
4243
paper: {
@@ -254,17 +255,30 @@ export const InspirationDialog = memo(
254255
});
255256
};
256257

257-
const removeSelectedType = type => {
258-
moleculeList.forEach(molecule => {
259-
dispatch(removeType[type](stage, molecule, colourList[molecule.id % colourList.length], datasetID));
260-
});
258+
const removeSelectedType = (type, skipTracking = false) => {
259+
if (type === 'ligand') {
260+
moleculeList.forEach(molecule => {
261+
dispatch(removeType[type](stage, molecule, skipTracking));
262+
});
263+
} else {
264+
moleculeList.forEach(molecule => {
265+
dispatch(removeType[type](stage, molecule, colourList[molecule.id % colourList.length], skipTracking));
266+
});
267+
}
268+
261269
selectedAll.current = false;
262270
};
263271

264-
const addNewType = type => {
265-
moleculeList.forEach(molecule => {
266-
dispatch(addType[type](stage, molecule, colourList[molecule.id % colourList.length]));
267-
});
272+
const addNewType = (type, skipTracking = false) => {
273+
if (type === 'ligand') {
274+
moleculeList.forEach(molecule => {
275+
dispatch(addType[type](stage, molecule, colourList[molecule.id % colourList.length], false, skipTracking));
276+
});
277+
} else {
278+
moleculeList.forEach(molecule => {
279+
dispatch(addType[type](stage, molecule, colourList[molecule.id % colourList.length], skipTracking));
280+
});
281+
}
268282
};
269283

270284
const ucfirst = string => {
@@ -281,12 +295,40 @@ export const InspirationDialog = memo(
281295
removeSelectedType(type);
282296
} else if (!calledFromSelectAll) {
283297
if (eval('is' + ucfirst(type) + 'On') === false) {
284-
addNewType(type);
298+
let molecules = getSelectedMoleculesByType(type, true);
299+
dispatch(setSelectedAllByType(type, molecules, true));
300+
addNewType(type, true);
285301
} else {
286-
removeSelectedType(type);
302+
let molecules = getSelectedMoleculesByType(type, false);
303+
dispatch(setDeselectedAllByType(type, molecules, true));
304+
removeSelectedType(type, true);
287305
}
288306
}
289307
};
308+
309+
const getSelectedMoleculesByType = (type, isAdd) => {
310+
switch (type) {
311+
case 'ligand':
312+
return isAdd ? getMoleculesToSelect(ligandList) : getMoleculesToDeselect(ligandList);
313+
case 'protein':
314+
return isAdd ? getMoleculesToSelect(proteinList) : getMoleculesToDeselect(proteinList);
315+
case 'complex':
316+
return isAdd ? getMoleculesToSelect(complexList) : getMoleculesToDeselect(complexList);
317+
default:
318+
return null;
319+
}
320+
};
321+
322+
const getMoleculesToSelect = list => {
323+
let molecules = moleculeList.filter(m => !list.includes(m.id));
324+
return molecules;
325+
};
326+
327+
const getMoleculesToDeselect = list => {
328+
let molecules = moleculeList.filter(m => list.includes(m.id));
329+
return molecules;
330+
};
331+
290332
// TODO refactor to this line
291333

292334
return (

0 commit comments

Comments
 (0)