mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-23 12:38:13 +08:00
* run eslint --fix * camelcase * camelCase config part 1 * part 2 * part 3 - removing subscripts * fix "class-methods-use-this" * fix "class-methods-use-this" * fix eslint ignores * add eslint ignore for set state in update * reformat comments to appease eslint * add a11y features * sort-comp fix * a11y fix * add ignore for set state in update * add a11y htmlFor * remove unused toast * remove unnecessary bind * add ignore for set state in update * add rel="noopener noreferrer" Using target="_blank" without rel="noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener * use arrow function to bind * remove unused definitions/declarations * prettier * remove unused state * add comments to empty catch blocks remove curly brackets * escape ' * use eqeqeq * switch from default export * remove ignore log * remove static * fix import * revert subscripting config * clean-up * remove unnecessary subscript * fix new errors from master * change category click handler to a class property * fix camelcase changes that slipped by * unused import * Fix newly introduced ESLint errors from addGenes
120 lines
3.1 KiB
JavaScript
120 lines
3.1 KiB
JavaScript
import React from "react";
|
|
import {
|
|
AnchorButton,
|
|
ButtonGroup,
|
|
Popover,
|
|
Button,
|
|
Radio,
|
|
RadioGroup,
|
|
Tooltip,
|
|
Position,
|
|
} from "@blueprintjs/core";
|
|
import { connect } from "react-redux";
|
|
import * as globals from "../../globals";
|
|
import styles from "./menubar.css";
|
|
import { World } from "../../util/stateManager";
|
|
import actions from "../../actions";
|
|
|
|
@connect((state) => ({
|
|
universe: state.universe,
|
|
world: state.world,
|
|
layoutChoice: state.layoutChoice,
|
|
reembedController: state.reembedController,
|
|
enableReembedding: state.config?.parameters?.["enable-reembedding"] ?? false,
|
|
}))
|
|
class Embedding extends React.PureComponent {
|
|
handleLayoutChoiceChange = (e) => {
|
|
const { dispatch } = this.props;
|
|
dispatch({
|
|
type: "set layout choice",
|
|
layoutChoice: e.currentTarget.value,
|
|
});
|
|
};
|
|
|
|
renderReembedding() {
|
|
const {
|
|
enableReembedding,
|
|
world,
|
|
universe,
|
|
dispatch,
|
|
reembedController,
|
|
} = this.props;
|
|
|
|
if (!enableReembedding) return null;
|
|
|
|
const loading = !!reembedController?.pendingFetch;
|
|
const disabled = World.worldEqUniverse(world, universe);
|
|
const tipContent = disabled
|
|
? "Subset cells first, then click to recompute UMAP embedding."
|
|
: "Click to recompute UMAP embedding on the current cell subset.";
|
|
|
|
return (
|
|
<Tooltip
|
|
content={tipContent}
|
|
position="bottom"
|
|
hoverOpenDelay={globals.tooltipHoverOpenDelay}
|
|
>
|
|
<AnchorButton
|
|
icon="new-object"
|
|
style={{ marginRight: 10 }}
|
|
disabled={disabled}
|
|
onClick={() => dispatch(actions.requestReembed())}
|
|
loading={loading}
|
|
/>
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
render() {
|
|
const { layoutChoice } = this.props;
|
|
|
|
return (
|
|
<ButtonGroup className={styles.menubarButton}>
|
|
<Popover
|
|
target={
|
|
<Tooltip
|
|
content="Select embedding for visualization"
|
|
position="bottom"
|
|
hoverOpenDelay={globals.tooltipHoverOpenDelay}
|
|
>
|
|
<Button
|
|
type="button"
|
|
data-testid="layout-choice"
|
|
icon="heatmap"
|
|
style={{
|
|
cursor: "pointer",
|
|
}}
|
|
/>
|
|
</Tooltip>
|
|
}
|
|
position={Position.BOTTOM_RIGHT}
|
|
content={
|
|
<div
|
|
style={{
|
|
display: "flex",
|
|
justifyContent: "flex-start",
|
|
alignItems: "flex-start",
|
|
flexDirection: "column",
|
|
padding: 10,
|
|
}}
|
|
>
|
|
<RadioGroup
|
|
label="Embedding Choice"
|
|
onChange={this.handleLayoutChoiceChange}
|
|
selectedValue={layoutChoice.current}
|
|
>
|
|
{layoutChoice.available.map((name) => (
|
|
<Radio label={name} value={name} key={name} />
|
|
))}
|
|
</RadioGroup>
|
|
</div>
|
|
}
|
|
/>
|
|
{this.renderReembedding()}
|
|
</ButtonGroup>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default Embedding;
|