1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React, { useEffect } from 'react';
20 } from '@material-ui/core';
21 import classnames from 'classnames';
22 import { DefaultTransformOrigin } from 'components/popover/helpers';
23 import { createTree } from 'models/tree';
24 import { getNodeDescendants } from 'models/tree';
25 import debounce from 'lodash/debounce';
26 import { green, grey } from '@material-ui/core/colors';
28 export type CssRules = 'root' | 'icon' | 'iconButton' | 'optionsContainer' | 'option';
30 const styles: StyleRulesCallback<CssRules> = (theme: Theme) => ({
34 backgroundColor: grey[200],
37 color: theme.palette.text.primary,
45 color: theme.palette.text.primary,
49 color: theme.palette.text.primary,
65 backgroundColor: 'rgba(0, 0, 0, 0.08)',
70 export type DataTableMultiselectOption = {
72 fn: (checkedList) => void;
75 export interface DataTableMultiselectProps {
77 options: DataTableMultiselectOption[];
78 checkedList: Record<string, boolean>;
81 interface DataTableFMultiselectPopState {
82 anchorEl?: HTMLElement;
85 export const DataTableMultiselectPopover = withStyles(styles)(
86 class extends React.Component<DataTableMultiselectProps & WithStyles<CssRules>, DataTableFMultiselectPopState> {
87 state: DataTableFMultiselectPopState = {
90 icon = React.createRef<HTMLElement>();
93 const { name, classes, children, options, checkedList } = this.props;
96 <Tooltip disableFocusListener title='Multiselect Actions'>
97 <ButtonBase className={classnames(classes.root)} component='span' onClick={this.open} disableRipple>
99 <IconButton component='span' classes={{ root: classes.iconButton }} tabIndex={-1}>
100 <i className={classnames(['fas fa-sort-down', classes.icon])} data-fa-transform='shrink-3' ref={this.icon} />
105 anchorEl={this.state.anchorEl}
106 open={!!this.state.anchorEl}
107 anchorOrigin={DefaultTransformOrigin}
108 transformOrigin={DefaultTransformOrigin}
113 <Typography variant='caption'>{'Options'}</Typography>
115 <div className={classes.optionsContainer}>
117 options.map((option, i) => (
118 <div key={i} className={classes.option} onClick={() => option.fn(checkedList)}>
124 <Button color='primary' variant='outlined' size='small' onClick={this.close}>
130 <this.MountHandler />
136 this.setState({ anchorEl: this.icon.current || undefined });
139 submit = debounce(() => {
140 // const { onChange } = this.props;
142 // onChange(this.state.filters);
146 MountHandler = () => {
149 this.submit.cancel();
156 this.setState((prev) => ({