mirror of
https://github.com/grafana/grafana.git
synced 2025-02-10 23:55:47 -06:00
When selecting text via mouse, our ReactTable cells' click handler triggers an event. - check event target to be the link, only then handle the event
65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
import _ from 'lodash';
|
|
import React, { PureComponent } from 'react';
|
|
import ReactTable from 'react-table';
|
|
|
|
import TableModel from 'app/core/table_model';
|
|
|
|
const EMPTY_TABLE = new TableModel();
|
|
// Identify columns that contain values
|
|
const VALUE_REGEX = /^[Vv]alue #\d+/;
|
|
|
|
interface TableProps {
|
|
data: TableModel;
|
|
loading: boolean;
|
|
onClickCell?: (columnKey: string, rowValue: string) => void;
|
|
}
|
|
|
|
function prepareRows(rows, columnNames) {
|
|
return rows.map(cells => _.zipObject(columnNames, cells));
|
|
}
|
|
|
|
export default class Table extends PureComponent<TableProps> {
|
|
getCellProps = (state, rowInfo, column) => {
|
|
return {
|
|
onClick: (e: React.SyntheticEvent) => {
|
|
// Only handle click on link, not the cell
|
|
if (e.target) {
|
|
const link = e.target as HTMLElement;
|
|
if (link.className === 'link') {
|
|
const columnKey = column.Header;
|
|
const rowValue = rowInfo.row[columnKey];
|
|
this.props.onClickCell(columnKey, rowValue);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
};
|
|
|
|
render() {
|
|
const { data, loading } = this.props;
|
|
const tableModel = data || EMPTY_TABLE;
|
|
const columnNames = tableModel.columns.map(({ text }) => text);
|
|
const columns = tableModel.columns.map(({ filterable, text }) => ({
|
|
Header: text,
|
|
accessor: text,
|
|
className: VALUE_REGEX.test(text) ? 'text-right' : '',
|
|
show: text !== 'Time',
|
|
Cell: row => <span className={filterable ? 'link' : ''}>{row.value}</span>,
|
|
}));
|
|
const noDataText = data ? 'The queries returned no data for a table.' : '';
|
|
|
|
return (
|
|
<ReactTable
|
|
columns={columns}
|
|
data={tableModel.rows}
|
|
getTdProps={this.getCellProps}
|
|
loading={loading}
|
|
minRows={0}
|
|
noDataText={noDataText}
|
|
resolveData={data => prepareRows(data, columnNames)}
|
|
showPagination={Boolean(data)}
|
|
/>
|
|
);
|
|
}
|
|
}
|