import {Fragment} from 'react';
import {css} from '@emotion/react';
import styled from '@emotion/styled';
import {BaseGroup, GroupTombstone, Organization} from 'sentry/types';
import {Event} from 'sentry/types/event';
import {getTitle} from 'sentry/utils/events';
import withOrganization from 'sentry/utils/withOrganization';
import EventTitleTreeLabel from './eventTitleTreeLabel';
import GroupPreviewTooltip from './groupPreviewTooltip';
type Props = {
data: Event | BaseGroup | GroupTombstone;
organization: Organization;
className?: string;
/* is issue breakdown? */
grouping?: boolean;
hasGuideAnchor?: boolean;
withStackTracePreview?: boolean;
};
function EventOrGroupTitle({
organization,
data,
withStackTracePreview,
grouping = false,
className,
}: Props) {
const event = data as Event;
const groupingCurrentLevel = (data as BaseGroup).metadata?.current_level;
const groupingIssueCategory = (data as BaseGroup)?.issueCategory;
const hasGroupingTreeUI = !!organization?.features.includes('grouping-tree-ui');
const {id, eventID, groupID, projectID} = event;
const {title, subtitle, treeLabel} = getTitle(event, organization?.features, grouping);
return (
{withStackTracePreview ? (
{treeLabel ? : title ?? ''}
) : treeLabel ? (
) : (
title
)}
{subtitle && (
{subtitle}
)}
);
}
export default withOrganization(EventOrGroupTitle);
/**
* is used instead of margin/padding to split title and subtitle
* into 2 separate text nodes on the HTML AST. This allows the
* title to be highlighted without spilling over to the subtitle.
*/
const Spacer = () => ;
const Subtitle = styled('em')`
color: ${p => p.theme.gray300};
font-style: normal;
`;
const Wrapper = styled('span')<{hasGroupingTreeUI: boolean}>`
font-size: ${p => p.theme.fontSizeLarge};
${p =>
p.hasGroupingTreeUI &&
css`
display: inline-grid;
grid-template-columns: auto max-content 1fr max-content;
align-items: baseline;
${Subtitle} {
${p.theme.overflowEllipsis};
display: inline-block;
height: 100%;
}
`}
`;