import { grey } from '@material-ui/core/colors';
import { TCheckedList } from 'components/data-table/data-table';
-export type CssRules = 'root' | 'icon' | 'iconButton' | 'optionsContainer' | 'option';
+export type CssRules = 'root' | 'icon' | 'iconButton' | 'disabled' | 'optionsContainer' | 'option';
const styles: StyleRulesCallback<CssRules> = (theme: Theme) => ({
root: {
padding: 1,
paddingBottom: 5,
},
+ disabled: {
+ color: grey[500],
+ },
optionsContainer: {
padding: '1rem 0',
flex: 1,
export interface DataTableMultiselectProps {
name: string;
+ disabled: boolean;
options: DataTableMultiselectOption[];
checkedList: TCheckedList;
}
icon = React.createRef<HTMLElement>();
render() {
- const { classes, children, options, checkedList } = this.props;
+ const { classes, children, options, checkedList, disabled } = this.props;
return (
<>
<Tooltip disableFocusListener title='Select Options'>
- <ButtonBase className={classnames(classes.root)} component='span' onClick={this.open} disableRipple>
+ <ButtonBase className={classnames(classes.root)} component='span' onClick={disabled ? () => {} : this.open} disableRipple>
{children}
<IconButton component='span' classes={{ root: classes.iconButton }} tabIndex={-1}>
- <i className={classnames(['fas fa-sort-down', classes.icon])} data-fa-transform='shrink-3' ref={this.icon} />
+ <i
+ className={`${classnames(['fas fa-sort-down', classes.icon])}${disabled ? ` ${classes.disabled}` : ''}`}
+ data-fa-transform='shrink-3'
+ ref={this.icon}
+ />
</IconButton>
</ButtonBase>
</Tooltip>
import { SvgIconProps } from '@material-ui/core/SvgIcon';
import ArrowDownwardIcon from '@material-ui/icons/ArrowDownward';
import { createTree } from 'models/tree';
-import arraysAreCongruent from 'validators/arrays-are-congruent';
import { DataTableMultiselectOption } from '../data-table-multiselect-popover/data-table-multiselect-popover';
export type DataColumns<I, R> = Array<DataColumn<I, R>>;
componentDidUpdate(prevProps: Readonly<DataTableProps<T>>, prevState: DataTableState) {
const { items, toggleMSToolbar, setCheckedListOnStore } = this.props;
const { isSelected, checkedList } = this.state;
- if (!arraysAreCongruent(prevProps.items, items)) {
+ if (prevProps.items !== items) {
if (isSelected === true) this.setState({ isSelected: false });
if (items.length) this.initializeCheckedList(items);
+ else this.setState({ checkedList: {} });
}
if (prevState.checkedList !== checkedList) {
toggleMSToolbar(this.isAnySelected() ? true : false);
<TableCell key={key || index} className={classes.checkBoxCell}>
<div className={classes.checkBoxHead}>
<Tooltip title={this.state.isSelected ? 'Deselect All' : 'Select All'}>
- <input type='checkbox' className={classes.checkBox} checked={isSelected} onChange={this.handleSelectorSelect}></input>
+ <input
+ type='checkbox'
+ className={classes.checkBox}
+ checked={isSelected}
+ disabled={!this.props.items.length}
+ onChange={this.handleSelectorSelect}
+ ></input>
</Tooltip>
<DataTableMultiselectPopover
name={`Options`}
+ disabled={!this.props.items.length}
options={this.multiselectOptions}
checkedList={checkedList}
></DataTableMultiselectPopover>
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-export default function arraysAreCongruent<T>(arr1: T[], arr2: T[]): boolean {
- if (!arr1.length || !arr2.length) return false;
- if (arr1.length !== arr2.length) return false;
-
- const sortedArr1 = [...arr1].sort();
- const sortedArr2 = [...arr2].sort();
-
- for (let i = 0; i < sortedArr1.length; i++) {
- if (sortedArr1[i] !== sortedArr2[i]) return false;
- }
-
- return true;
-}