Files
2024-02-15 17:01:50 +00:00

115 lines
3.4 KiB
TypeScript

import {Fragment} from 'react';
import {Link} from 'react-router';
import * as qs from 'query-string';
import type {GridColumnHeader, GridColumnOrder} from 'sentry/components/gridEditable';
import GridEditable, {COL_WIDTH_UNDEFINED} from 'sentry/components/gridEditable';
import Pagination from 'sentry/components/pagination';
import {useLocation} from 'sentry/utils/useLocation';
import {BrowserStarfishFields} from 'sentry/views/performance/browser/useBrowserFilters';
import type {ValidSort} from 'sentry/views/performance/browser/useBrowserSort';
import {useInteractionsQuery} from 'sentry/views/performance/browser/useInteractionsQuery';
import {DurationCell} from 'sentry/views/starfish/components/tableCells/durationCell';
import {renderHeadCell} from 'sentry/views/starfish/components/tableCells/renderHeadCell';
import {TextAlignRight} from 'sentry/views/starfish/components/textAlign';
type Row = {
'count()': number;
interactionElement: string;
'p75(transaction.duration)': number;
'span.group': string;
transaction: string;
'transaction.op': string;
};
type Column = GridColumnHeader<keyof Row>;
type Props = {
sort: ValidSort;
};
function InteractionsTable({sort}: Props) {
const location = useLocation();
const columnOrder: GridColumnOrder<keyof Row>[] = [
{key: 'span.group', width: COL_WIDTH_UNDEFINED, name: 'Interaction'},
{key: 'transaction', width: COL_WIDTH_UNDEFINED, name: 'Page'},
{key: 'count()', width: COL_WIDTH_UNDEFINED, name: 'Count'},
{
key: 'p75(transaction.duration)',
width: COL_WIDTH_UNDEFINED,
name: 'Duration (p75)',
},
];
const {data, isLoading, pageLinks} = useInteractionsQuery({sort});
const tableData: Row[] =
!isLoading && data.length
? data.map(row => ({
'span.group': 'NOT IMPLEMENTED',
...row,
}))
: [];
const renderBodyCell = (col: Column, row: Row) => {
const {key} = col;
if (key === 'span.group') {
return (
<Link
to={`/performance/browser/interactions/summary/?${qs.stringify({
[BrowserStarfishFields.COMPONENT]: row.interactionElement,
[BrowserStarfishFields.PAGE]: row.transaction,
[BrowserStarfishFields.TRANSACTION_OP]: row['transaction.op'],
})}`}
>
{getActionName(row['transaction.op'])}
<span style={{fontWeight: 'bold'}}> {row.interactionElement}</span>
</Link>
);
}
if (key === 'p75(transaction.duration)') {
return <DurationCell milliseconds={row[key]} />;
}
if (key === 'count()') {
return <TextAlignRight>{row[key]}</TextAlignRight>;
}
return <span>{row[key]}</span>;
};
return (
<Fragment>
<GridEditable
data={tableData}
isLoading={isLoading}
columnOrder={columnOrder}
columnSortBy={[
{
key: sort.field,
order: sort.kind,
},
]}
grid={{
renderHeadCell: column =>
renderHeadCell({
column,
location,
sort,
}),
renderBodyCell,
}}
location={location}
/>
<Pagination pageLinks={pageLinks} />
</Fragment>
);
}
export const getActionName = (transactionOp: string) => {
switch (transactionOp) {
case 'ui.action.click':
return 'Click';
default:
return transactionOp;
}
};
export default InteractionsTable;