mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
115 lines
3.4 KiB
TypeScript
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;
|