mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-28 13:18:12 +08:00
* immutable crossfilter * first cut at reducer refactor with cascade model * add initial redo/undo implementation * small optimization * integrate expression with history * add tests for new reducers and fix a couple of small initialization bugs * treat tiny lasso selections as a clear * better function name for clarity * fix undo for differential expression * remove logging * fix regression due to bad merge * cleanup and comments for clarity * improve undoable configuration for flexibility * fix stale comments * remove debugging code from production build * rename categoricalSelectionState * rename file * improve comments
106 lines
2.7 KiB
JavaScript
106 lines
2.7 KiB
JavaScript
import _ from "lodash";
|
|
|
|
import { ControlsHelpers } from "../util/stateManager";
|
|
import * as globals from "../globals";
|
|
|
|
function maxCategoryItems(state) {
|
|
return _.get(
|
|
state.config,
|
|
"parameters.max-category-items",
|
|
globals.configDefaults.parameters["max-category-items"]
|
|
);
|
|
}
|
|
|
|
const CategoricalSelection = (
|
|
state,
|
|
action,
|
|
nextSharedState,
|
|
prevSharedState
|
|
) => {
|
|
switch (action.type) {
|
|
case "initial data load complete (universe exists)":
|
|
case "set World to current selection":
|
|
case "reset World to eq Universe": {
|
|
const { world } = nextSharedState;
|
|
return ControlsHelpers.createCategoricalSelection(
|
|
maxCategoryItems(prevSharedState),
|
|
world
|
|
);
|
|
}
|
|
|
|
case "categorical metadata filter select": {
|
|
/*
|
|
Set the specific category in this field to false
|
|
*/
|
|
const newCategorySelected = Array.from(
|
|
state[action.metadataField].categorySelected
|
|
);
|
|
newCategorySelected[action.categoryIndex] = true;
|
|
const newCategoricalSelection = {
|
|
...state,
|
|
[action.metadataField]: {
|
|
...state[action.metadataField],
|
|
categorySelected: newCategorySelected
|
|
}
|
|
};
|
|
return newCategoricalSelection;
|
|
}
|
|
|
|
case "categorical metadata filter deselect": {
|
|
/*
|
|
Set the specific category in this field to false
|
|
*/
|
|
const newCategorySelected = Array.from(
|
|
state[action.metadataField].categorySelected
|
|
);
|
|
newCategorySelected[action.categoryIndex] = false;
|
|
const newCategoricalSelection = {
|
|
...state,
|
|
[action.metadataField]: {
|
|
...state[action.metadataField],
|
|
categorySelected: newCategorySelected
|
|
}
|
|
};
|
|
return newCategoricalSelection;
|
|
}
|
|
|
|
case "categorical metadata filter none of these": {
|
|
/*
|
|
set all categories in this field to false.
|
|
*/
|
|
const newCategoricalSelection = {
|
|
...state,
|
|
[action.metadataField]: {
|
|
...state[action.metadataField],
|
|
categorySelected: Array.from(
|
|
state[action.metadataField].categorySelected
|
|
).fill(false)
|
|
}
|
|
};
|
|
return newCategoricalSelection;
|
|
}
|
|
|
|
case "categorical metadata filter all of these": {
|
|
/*
|
|
set all categories in this field to true.
|
|
*/
|
|
const newCategoricalSelection = {
|
|
...state,
|
|
[action.metadataField]: {
|
|
...state[action.metadataField],
|
|
categorySelected: Array.from(
|
|
state[action.metadataField].categorySelected
|
|
).fill(true)
|
|
}
|
|
};
|
|
return newCategoricalSelection;
|
|
}
|
|
|
|
default: {
|
|
return state;
|
|
}
|
|
}
|
|
};
|
|
|
|
export default CategoricalSelection;
|