// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; import { Grid, Paper, Toolbar } from '@material-ui/core'; import ContextMenu, { ContextMenuActionGroup } from "../../components/context-menu/context-menu"; import ColumnSelector from "../../components/column-selector/column-selector"; import DataTable from "../../components/data-table/data-table"; import { mockAnchorFromMouseEvent } from "../../components/popover/helpers"; import { DataColumn, toggleSortDirection } from "../../components/data-table/data-column"; import { DataTableFilterItem } from '../../components/data-table-filters/data-table-filters'; import { DataExplorerColumn } from './data-explorer-column'; interface DataExplorerProps { items: T[]; columns: Array>; contextActions: Array>; onRowClick: (item: T) => void; onColumnToggle: (column: DataExplorerColumn) => void; onSortingToggle: (column: DataExplorerColumn) => void; onFiltersChange: (columns: DataExplorerColumn) => void; } interface DataExplorerState { contextMenu: { anchorEl?: HTMLElement; item?: T; }; } class DataExplorer extends React.Component, DataExplorerState> { state: DataExplorerState = { contextMenu: {} }; render() { return this.props.onRowClick(row)} onRowContextMenu={this.openItemMenuOnRowClick} /> ; } get columns(): Array> { return this.props.columns.map((column): DataColumn => ({ configurable: column.configurable, filters: column.filters, name: column.name, onFiltersChange: column.filterable ? this.changeFilters(column) : undefined, onSortToggle: column.sortable ? this.toggleSort(column) : undefined, render: column.render, renderHeader: column.renderHeader, selected: column.selected, sortDirection: column.sortDirection })); } get contextActions() { return this.props.contextActions.map(actionGroup => actionGroup.map(action => ({ ...action, onClick: (item: T) => { this.closeContextMenu(); action.onClick(item); } }))); } toggleColumn = (column: DataExplorerColumn) => { this.props.onColumnToggle(column); } toggleSort = (column: DataExplorerColumn) => () => { this.props.onSortingToggle(toggleSortDirection(column)); } changeFilters = (column: DataExplorerColumn) => (filters: DataTableFilterItem[]) => { this.props.onFiltersChange({ ...column, filters }); } openItemMenuOnRowClick = (event: React.MouseEvent, item: T) => { event.preventDefault(); this.setState({ contextMenu: { anchorEl: mockAnchorFromMouseEvent(event), item } }); } openItemMenuOnActionsClick = (event: React.MouseEvent, item: T) => { this.setState({ contextMenu: { anchorEl: event.currentTarget, item } }); } closeContextMenu = () => { this.setState({ contextMenu: {} }); } } export default DataExplorer;