import {useMemo} from 'react';
import Count from 'sentry/components/count';
import DateTime from 'sentry/components/dateTime';
import GridEditable, {
COL_WIDTH_UNDEFINED,
GridColumnOrder,
} from 'sentry/components/gridEditable';
import ProjectBadge from 'sentry/components/idBadge/projectBadge';
import Link from 'sentry/components/links/link';
import PerformanceDuration from 'sentry/components/performanceDuration';
import {t} from 'sentry/locale';
import {ProfileTransaction} from 'sentry/types/profiling/core';
import {defined} from 'sentry/utils';
import {Container, NumberContainer} from 'sentry/utils/discover/styles';
import {generateProfileSummaryRouteWithQuery} from 'sentry/utils/profiling/routes';
import {renderTableHead} from 'sentry/utils/profiling/tableRenderer';
import {useLocation} from 'sentry/utils/useLocation';
import useOrganization from 'sentry/utils/useOrganization';
import useProjects from 'sentry/utils/useProjects';
interface ProfileTransactionsTableProps {
error: string | null;
isLoading: boolean;
transactions: ProfileTransaction[];
}
function ProfileTransactionsTable(props: ProfileTransactionsTableProps) {
const location = useLocation();
const organization = useOrganization();
const {projects} = useProjects();
const transactions: TableDataRow[] = useMemo(() => {
return props.transactions.map(transaction => {
const project = projects.find(proj => proj.id === transaction.project_id);
return {
transaction: project ? (
{transaction.name}
) : (
transaction.name
),
count: transaction.profiles_count,
project,
p50: transaction.duration_ms.p50,
p75: transaction.duration_ms.p75,
p90: transaction.duration_ms.p90,
p95: transaction.duration_ms.p95,
p99: transaction.duration_ms.p99,
lastSeen: transaction.last_profile_at,
};
});
}, [props.transactions, location, organization, projects]);
return (
COLUMNS[key])}
columnSortBy={[]}
grid={{
renderHeadCell: renderTableHead({rightAlignedColumns: RIGHT_ALIGNED_COLUMNS}),
renderBodyCell: renderTableBody,
}}
location={location}
/>
);
}
const RIGHT_ALIGNED_COLUMNS = new Set([
'count',
'p50',
'p75',
'p90',
'p95',
'p99',
]);
function renderTableBody(
column: TableColumn,
dataRow: TableDataRow,
rowIndex: number,
columnIndex: number
) {
return (
);
}
interface ProfilingTransactionsTableCellProps {
column: TableColumn;
columnIndex: number;
dataRow: TableDataRow;
rowIndex: number;
}
function ProfilingTransactionsTableCell({
column,
dataRow,
}: ProfilingTransactionsTableCellProps) {
const value = dataRow[column.key];
switch (column.key) {
case 'project':
if (!defined(value)) {
// should never happen but just in case
return {t('n/a')};
}
return (
);
case 'count':
return (
);
case 'p50':
case 'p75':
case 'p90':
case 'p95':
case 'p99':
return (
);
case 'lastSeen':
return (
);
default:
return {value};
}
}
type TableColumnKey =
| 'transaction'
| 'count'
| 'project'
| 'p50'
| 'p75'
| 'p90'
| 'p95'
| 'p99'
| 'lastSeen';
type TableDataRow = Record;
type TableColumn = GridColumnOrder;
const COLUMN_ORDER: TableColumnKey[] = [
'transaction',
'project',
'lastSeen',
'p75',
'p95',
'count',
];
const COLUMNS: Record = {
transaction: {
key: 'transaction',
name: t('Transaction'),
width: COL_WIDTH_UNDEFINED,
},
count: {
key: 'count',
name: t('Count'),
width: COL_WIDTH_UNDEFINED,
},
project: {
key: 'project',
name: t('Project'),
width: COL_WIDTH_UNDEFINED,
},
p50: {
key: 'p50',
name: t('P50'),
width: COL_WIDTH_UNDEFINED,
},
p75: {
key: 'p75',
name: t('P75'),
width: COL_WIDTH_UNDEFINED,
},
p90: {
key: 'p90',
name: t('P90'),
width: COL_WIDTH_UNDEFINED,
},
p95: {
key: 'p95',
name: t('P95'),
width: COL_WIDTH_UNDEFINED,
},
p99: {
key: 'p99',
name: t('P99'),
width: COL_WIDTH_UNDEFINED,
},
lastSeen: {
key: 'lastSeen',
name: t('Last Seen'),
width: COL_WIDTH_UNDEFINED,
},
};
export {ProfileTransactionsTable};