import {Fragment} from 'react';
import {css, useTheme} from '@emotion/react';
import styled from '@emotion/styled';
import {Button} from 'sentry/components/button';
import {Flex} from 'sentry/components/container/flex';
import ErrorBoundary from 'sentry/components/errorBoundary';
import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
import {t} from 'sentry/locale';
import {space} from 'sentry/styles/space';
import type {Event} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
import type {Project} from 'sentry/types/project';
import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig';
import {useLocation} from 'sentry/utils/useLocation';
import {useNavigate} from 'sentry/utils/useNavigate';
import {EventGraph} from 'sentry/views/issueDetails/streamline/eventGraph';
import {
EventSearch,
useEventQuery,
} from 'sentry/views/issueDetails/streamline/eventSearch';
import IssueTagsPreview from 'sentry/views/issueDetails/streamline/issueTagsPreview';
import {OccurrenceSummary} from 'sentry/views/issueDetails/streamline/occurrenceSummary';
import {ToggleSidebar} from 'sentry/views/issueDetails/streamline/sidebar/toggleSidebar';
import {useEnvironmentsFromUrl} from 'sentry/views/issueDetails/utils';
interface EventDetailsHeaderProps {
group: Group;
project: Project;
event?: Event;
}
export function EventDetailsHeader({group, event, project}: EventDetailsHeaderProps) {
const navigate = useNavigate();
const location = useLocation();
const environments = useEnvironmentsFromUrl();
const searchQuery = useEventQuery({groupId: group.id});
const issueTypeConfig = getConfigForIssueType(group, project);
const searchText = t(
'Filter %s\u2026',
issueTypeConfig.customCopy.eventUnits.toLocaleLowerCase()
);
return (
{issueTypeConfig.header.filterBar.enabled && (
{
navigate(
{...location, query: {...location.query, query}},
{replace: true}
);
}}
environments={environments}
query={searchQuery}
queryBuilderProps={{
disallowFreeText: true,
placeholder: searchText,
label: searchText,
}}
/>
)}
{issueTypeConfig.header.graph.enabled && (
{issueTypeConfig.header.tagDistribution.enabled && (
)}
)}
{issueTypeConfig.header.occurrenceSummary.enabled && (
)}
);
}
function EnvironmentSelector({group, event, project}: EventDetailsHeaderProps) {
const theme = useTheme();
const issueTypeConfig = getConfigForIssueType(group, project);
const isFixedEnvironment = issueTypeConfig.header.filterBar.fixedEnvironment;
const eventEnvironment = event?.tags?.find(tag => tag.key === 'environment')?.value;
const environmentCss = css`
grid-area: env;
&:before {
right: 0;
top: ${space(1)};
bottom: ${space(1)};
width: 1px;
content: '';
position: absolute;
background: ${theme.translucentInnerBorder};
}
`;
return isFixedEnvironment ? (
) : (
);
}
const FilterContainer = styled('div')<{
hasFilterBar: boolean;
}>`
padding-left: 24px;
display: grid;
grid-template-columns: auto auto minmax(100px, 1fr) auto;
grid-template-rows: ${p => (p.hasFilterBar ? 'minmax(38px, auto) auto auto' : 'auto')};
grid-template-areas:
'env date search toggle'
'graph graph graph graph'
'timeline timeline timeline timeline';
border: 0px solid ${p => p.theme.translucentBorder};
border-width: 0 1px 1px 0;
`;
const SearchFilter = styled(EventSearch)`
border-color: transparent;
border-radius: 0;
box-shadow: none;
`;
const DateFilter = styled(DatePageFilter)`
grid-area: date;
&:before {
right: 0;
top: ${space(1)};
bottom: ${space(1)};
width: 1px;
content: '';
position: absolute;
background: ${p => p.theme.translucentInnerBorder};
}
`;
const GraphSection = styled('div')`
grid-area: graph;
display: flex;
&:not(:first-child) {
border-top: 1px solid ${p => p.theme.translucentBorder};
}
`;
const OccurrenceSummarySection = styled(OccurrenceSummary)`
grid-area: timeline;
padding: ${space(2)};
padding-right: 0;
&:not(:first-child) {
border-top: 1px solid ${p => p.theme.translucentBorder};
}
`;
const PageErrorBoundary = styled(ErrorBoundary)`
margin: 0;
border: 0px solid ${p => p.theme.translucentBorder};
border-width: 0 1px 1px 0;
border-radius: 0;
padding: ${space(1.5)} 24px;
`;