1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React, { ReactElement } from 'react';
6 import { connect } from 'react-redux';
7 import { StyleRulesCallback, withStyles, WithStyles, Toolbar, Button } from '@material-ui/core';
8 import { ArvadosTheme } from 'common/custom-theme';
9 import { RootState } from 'store/store';
10 import { CopyToClipboardSnackbar } from 'components/copy-to-clipboard-snackbar/copy-to-clipboard-snackbar';
11 import { TCheckedList } from 'components/data-table/data-table';
13 type CssRules = 'root' | 'button';
15 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
21 color: theme.palette.text.primary,
26 type MultiselectToolbarAction = {
27 fn: (checkedList) => ReactElement;
30 export type MultiselectToolbarProps = {
31 buttons: Array<MultiselectToolbarAction>;
32 checkedList: TCheckedList;
35 export const defaultActions: Array<MultiselectToolbarAction> = [
37 fn: (checkedList) => MSToolbarCopyButton(checkedList),
41 const MSToolbarCopyButton = (checkedList) => {
42 let stringifiedSelectedList: string = '';
43 for (const [key, value] of Object.entries(checkedList)) {
45 stringifiedSelectedList += key + '\n';
48 return <CopyToClipboardSnackbar value={stringifiedSelectedList} children={<div>Copy</div>} />;
51 export const MultiselectToolbar = connect(mapStateToProps)(
52 withStyles(styles)((props: MultiselectToolbarProps & WithStyles<CssRules>) => {
53 const { classes, buttons, checkedList } = props;
55 <Toolbar className={classes.root}>
56 {buttons.map((btn, i) => (
57 <Button key={i} className={classes.button}>
66 function mapStateToProps(state: RootState) {
68 checkedList: state.multiselect.checkedList,