import classNames from 'classnames'; import React, { ReactNode, useRef, useState } from 'react'; import { Wrapper as MenuWrapper, Button, Menu, MenuItem } from 'react-aria-menubutton'; import { FaAngleDown } from 'react-icons/fa'; import { Column } from '../../SearchUI/types'; interface ColumnsMenuProps { /** * The ID used to identify this component in Dash callbacks */ id?: string; /** * Class name(s) to append to the component's default class (`mpc-data-block`) */ className?: string; /** * An array of column definition objects to control how keys/values are rendered in the data block. * See `Column` documentation for specifics on how to construct `Column` objects. * If no column definitions are supplied, the key names are used as labels and the values are rendered * without any formatting. */ columns: Column[]; setColumns: (columns: Column[]) => any; } /** * Component for displaying a single row (object) of data in a card-like block. * Blocks have a top section that displays data horizontally and an optional collapsible bottom * section that displays data vertically. */ export const ColumnsMenu: React.FC = (props) => { const [allCollumnsSelected, setAllCollumnsSelected] = useState(() => { const anyNotSelected = props.columns.find((col) => col.omit); return !anyNotSelected; }); const toggleColumn = (columnIndex: number) => { const newColumns = [...props.columns]; const changedColumn = newColumns[columnIndex]; if (changedColumn) changedColumn.omit = !changedColumn.omit; const anyNotSelected = newColumns.find((col) => col.omit); setAllCollumnsSelected(!anyNotSelected); props.setColumns(newColumns); }; const toggleAllColumns = () => { const newAllColumnsSelected = !allCollumnsSelected; const newColumns = props.columns.map((col) => { if (col.excludeFromColumnsSelector) { col.omit = false; } else { col.omit = !newAllColumnsSelected; } return col; }); setAllCollumnsSelected(newAllColumnsSelected); props.setColumns(newColumns); }; return (
  • {props.columns.map((col, i) => { if (col.excludeFromColumnsSelector) { return null; } else { return (
  • ); } })}
); };