From 86a0d6b8d6368733cd2a50ad32f3d0682b1d40d2 Mon Sep 17 00:00:00 2001
From: Scott Cooper
Date: Mon, 11 May 2026 20:15:09 -0700
Subject: [PATCH 1/7] ref(issues): Remove InterimSection
InterimSection was only a temporary adapter around FoldSection. Replace the call sites with FoldSection directly and let the section context accept the string keys those call sites already used.
Also keeps jump-to limited to the known issue detail sections, so arbitrary drawer/sidebar section keys don't show up there.
Co-authored-by: Codex GPT-5
---
.../breadcrumbs/breadcrumbsDataSection.tsx | 10 +-
.../events/contexts/contextDataSection.tsx | 21 +-
static/app/components/events/device.tsx | 6 +-
.../components/events/eventAttachments.tsx | 12 +-
.../app/components/events/eventEvidence.tsx | 9 +-
.../events/eventExtraData/index.tsx | 8 +-
.../eventHydrationDiff/replayDiffContent.tsx | 28 +--
.../eventHydrationDiff/replayDiffSection.tsx | 8 +-
.../components/events/eventInsightDiff.tsx | 6 +-
.../events/eventProcessingErrors.tsx | 8 +-
.../events/eventReplay/replayClipSection.tsx | 13 +-
.../replayInlineOnboardingPanel.tsx | 6 +-
static/app/components/events/eventSdk.tsx | 6 +-
.../aggregateSpanDiff.tsx | 8 +-
.../breakpointChart.tsx | 8 +-
.../eventComparison/index.tsx | 8 +-
.../eventRegressionSummary.tsx | 9 +-
.../functionBreakpointChart.tsx | 8 +-
.../screenshot/screenshotDataSection.tsx | 11 +-
.../events/eventTagsAndScreenshot/tags.tsx | 27 +--
.../components/events/eventViewHierarchy.tsx | 8 +-
.../app/components/events/eventXrayDiff.tsx | 6 +-
.../featureFlags/eventFeatureFlagSection.tsx | 12 +-
.../groupingInfo/groupingInfoSection.tsx | 8 +-
.../highlights/highlightsDataSection.tsx | 53 +++--
.../events/interfaces/csp/index.tsx | 6 +-
.../events/interfaces/debugMeta/index.tsx | 11 +-
.../components/events/interfaces/generic.tsx | 8 +-
.../components/events/interfaces/message.tsx | 6 +-
.../interfaces/performance/anrRootCause.tsx | 18 +-
.../interfaces/performance/eventTraceView.tsx | 8 +-
.../interfaces/performance/spanEvidence.tsx | 17 +-
.../components/events/interfaces/template.tsx | 6 +-
.../components/events/interfaces/threads.tsx | 8 +-
.../uptime/uptimeAssertionsSection.tsx | 8 +-
.../events/metrics/metricsSection.tsx | 11 +-
.../events/ourlogs/ourlogsSection.tsx | 11 +-
static/app/components/events/packageData.tsx | 8 +-
.../events/profileEventEvidence.tsx | 6 +-
.../components/events/rrwebIntegration.tsx | 14 +-
.../events/traceEventDataSection.tsx | 187 +++++++++---------
.../stackTrace/issueStackTrace/index.tsx | 14 +-
.../issueStackTrace/sharedIssueStackTrace.tsx | 14 +-
.../groupEventDetailsContent.tsx | 12 +-
.../metricIssues/metricIssuesSection.tsx | 16 +-
.../metricKitHangProfileSection.tsx | 8 +-
.../issueDetails/profilePreviewSection.tsx | 8 +-
.../views/issueDetails/streamline/context.tsx | 12 +-
.../issueDetails/streamline/foldSection.tsx | 10 +-
.../streamline/interimSection.tsx | 40 ----
.../streamline/issueDetailsJumpTo.tsx | 19 +-
.../sidebar/attributeComparisonSection.tsx | 8 +-
.../metricDetectorTriggeredSection.tsx | 22 +--
.../sidebar/openPeriodTimelineSection.tsx | 6 +-
.../sidebar/sizeAnalysisTriggeredSection.tsx | 8 +-
.../details/profiling/profilePreview.tsx | 8 +-
.../span/components/profileDetails.tsx | 8 +-
.../traceDrawer/details/span/index.tsx | 8 +-
.../details/span/sections/generalInfo.tsx | 10 +-
.../traceDrawer/details/transaction/index.tsx | 8 +-
.../transaction/sections/breadCrumbs.tsx | 8 +-
.../details/transaction/sections/entries.tsx | 6 +-
.../transaction/sections/generalInfo.tsx | 10 +-
.../transaction/sections/replayPreview.tsx | 8 +-
64 files changed, 400 insertions(+), 511 deletions(-)
delete mode 100644 static/app/views/issueDetails/streamline/interimSection.tsx
diff --git a/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx b/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx
index d0e45a612b9f..1d0e14935bd9 100644
--- a/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx
+++ b/static/app/components/events/breadcrumbs/breadcrumbsDataSection.tsx
@@ -33,7 +33,7 @@ import {trackAnalytics} from 'sentry/utils/analytics';
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
interface BreadcrumbsDataSectionProps {
event: Event;
@@ -164,11 +164,9 @@ export function BreadcrumbsDataSection({
const numHiddenCrumbs = enhancedCrumbs.length - summaryCrumbs.length;
return (
-
@@ -201,7 +199,7 @@ export function BreadcrumbsDataSection({
)}
-
+
);
}
diff --git a/static/app/components/events/contexts/contextDataSection.tsx b/static/app/components/events/contexts/contextDataSection.tsx
index ff470da656f1..dc1941696ca1 100644
--- a/static/app/components/events/contexts/contextDataSection.tsx
+++ b/static/app/components/events/contexts/contextDataSection.tsx
@@ -1,15 +1,12 @@
-import {ExternalLink} from '@sentry/scraps/link';
-
import {ErrorBoundary} from 'sentry/components/errorBoundary';
import {getOrderedContextItems} from 'sentry/components/events/contexts';
import {ContextCard} from 'sentry/components/events/contexts/contextCard';
-import {CONTEXT_DOCS_LINK} from 'sentry/components/events/contexts/utils';
import {KeyValueData} from 'sentry/components/keyValueData';
-import {t, tct} from 'sentry/locale';
+import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
interface ContextDataSectionProps {
event: Event;
@@ -40,22 +37,14 @@ export function ContextDataSection({
}
return (
- ,
- }
- )}
- isHelpHoverable
disableCollapsePersistence={disableCollapsePersistence}
>
{cards}
-
+
);
}
diff --git a/static/app/components/events/device.tsx b/static/app/components/events/device.tsx
index afa075852652..fb180f41ff83 100644
--- a/static/app/components/events/device.tsx
+++ b/static/app/components/events/device.tsx
@@ -2,7 +2,7 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {KeyValueList} from './interfaces/keyValueList';
@@ -24,7 +24,7 @@ export function EventDevice({event}: Props) {
}
return (
-
+
-
+
);
}
diff --git a/static/app/components/events/eventAttachments.tsx b/static/app/components/events/eventAttachments.tsx
index 6e2b640ef5ad..5d0dff420e4a 100644
--- a/static/app/components/events/eventAttachments.tsx
+++ b/static/app/components/events/eventAttachments.tsx
@@ -20,7 +20,7 @@ import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {InlineEventAttachment} from 'sentry/views/issueDetails/groupEventAttachments/inlineEventAttachment';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
import {useGroupDetailsRoute} from 'sentry/views/issueDetails/useGroupDetailsRoute';
@@ -86,12 +86,12 @@ function EventAttachmentsContent({
if (isError) {
return (
-
+
-
+
);
}
@@ -113,8 +113,8 @@ function EventAttachmentsContent({
};
return (
- : null}
disableCollapsePersistence={disableCollapsePersistence}
@@ -179,7 +179,7 @@ function EventAttachmentsContent({
))}
)}
-
+
);
}
diff --git a/static/app/components/events/eventEvidence.tsx b/static/app/components/events/eventEvidence.tsx
index ff00cea0d9d8..6a623292ae3a 100644
--- a/static/app/components/events/eventEvidence.tsx
+++ b/static/app/components/events/eventEvidence.tsx
@@ -9,7 +9,7 @@ import {
getIssueCategoryAndTypeFromOccurrenceType,
} from 'sentry/utils/issueTypeConfig';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type EvidenceProps = {
event: Event;
@@ -46,10 +46,9 @@ export function EventEvidence({
}
return (
-
-
+
);
}
diff --git a/static/app/components/events/eventExtraData/index.tsx b/static/app/components/events/eventExtraData/index.tsx
index a89973a76610..90bf932a2313 100644
--- a/static/app/components/events/eventExtraData/index.tsx
+++ b/static/app/components/events/eventExtraData/index.tsx
@@ -12,7 +12,7 @@ import type {Event} from 'sentry/types/event';
import {defined} from 'sentry/utils';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {getEventExtraDataKnownDataDetails} from './getEventExtraDataKnownDataDetails';
import type {EventExtraDataType, EventExtraData as TEventExtraData} from './types';
@@ -42,8 +42,8 @@ export function EventExtraData({event}: Props) {
}
return (
-
{contextBlock}
-
+
);
}
diff --git a/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx b/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx
index 7c1f125f64ad..cc9d285311cc 100644
--- a/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx
+++ b/static/app/components/events/eventHydrationDiff/replayDiffContent.tsx
@@ -19,7 +19,7 @@ import {getReplayDiffOffsetsFromEvent} from 'sentry/utils/replays/getDiffTimesta
import {useLoadReplayReader} from 'sentry/utils/replays/hooks/useLoadReplayReader';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
interface Props {
event: Event;
@@ -37,7 +37,7 @@ export default function ReplayDiffContent({event, group, orgSlug, replaySlug}: P
});
const sectionProps = {
- type: SectionKey.HYDRATION_DIFF,
+ sectionKey: SectionKey.HYDRATION_DIFF,
title: t('Hydration Error Diff'),
};
@@ -45,33 +45,33 @@ export default function ReplayDiffContent({event, group, orgSlug, replaySlug}: P
(
-
+
-
+
)}
renderLoading={() => (
-
+
-
+
)}
renderError={() => (
-
+
-
+
)}
renderThrottled={() => (
-
+
-
+
)}
renderMissing={() => (
-
+
-
+
)}
>
{({replay}) => {
@@ -80,7 +80,7 @@ export default function ReplayDiffContent({event, group, orgSlug, replaySlug}: P
event
);
return (
-
-
+
);
}}
diff --git a/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx b/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx
index 1c3a239abaf2..83207eda032e 100644
--- a/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx
+++ b/static/app/components/events/eventHydrationDiff/replayDiffSection.tsx
@@ -13,7 +13,7 @@ import type {Group} from 'sentry/types/group';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
interface Props {
event: Event;
@@ -36,14 +36,14 @@ export function ReplayDiffSection({event, group, replayId}: Props) {
replaySlug={replayId}
LazyComponent={ReplayDiffContent}
loadingFallback={
-
-
+
}
/>
diff --git a/static/app/components/events/eventInsightDiff.tsx b/static/app/components/events/eventInsightDiff.tsx
index fefd3a404e18..740c02f7a466 100644
--- a/static/app/components/events/eventInsightDiff.tsx
+++ b/static/app/components/events/eventInsightDiff.tsx
@@ -12,7 +12,7 @@ import {
useSizeAnalysisComparison,
} from 'sentry/utils/preprod/useSizeAnalysisComparison';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {InsightComparisonSection} from 'sentry/views/preprod/buildComparison/main/insightComparisonSection';
type SectionProps = MetricIds & {project: Project};
@@ -50,7 +50,7 @@ function EventInsightDiffContent({baseMetricId, headMetricId, project}: SectionP
function EventInsightDiffSection({baseMetricId, headMetricId, project}: SectionProps) {
return (
-
+
-
+
);
}
diff --git a/static/app/components/events/eventProcessingErrors.tsx b/static/app/components/events/eventProcessingErrors.tsx
index 524ba7079f9b..2f98ebf555b1 100644
--- a/static/app/components/events/eventProcessingErrors.tsx
+++ b/static/app/components/events/eventProcessingErrors.tsx
@@ -13,7 +13,7 @@ import {t, tct} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type Props = {
event: Event;
@@ -124,15 +124,15 @@ export function EventProcessingErrors({event, project, isShare}: Props) {
}
return (
-
{errors.map((error, idx) => {
return ;
})}
-
+
);
}
diff --git a/static/app/components/events/eventReplay/replayClipSection.tsx b/static/app/components/events/eventReplay/replayClipSection.tsx
index f2f2c87b35e6..feb5c63f924f 100644
--- a/static/app/components/events/eventReplay/replayClipSection.tsx
+++ b/static/app/components/events/eventReplay/replayClipSection.tsx
@@ -17,7 +17,7 @@ import {getAnalyticsDataForEvent, getAnalyticsDataForGroup} from 'sentry/utils/e
import {useReplayCountForIssues} from 'sentry/utils/replayCount/useReplayCountForIssues';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
import {useGroupDetailsRoute} from 'sentry/views/issueDetails/useGroupDetailsRoute';
@@ -103,26 +103,21 @@ export function ReplayClipSection({event, group, replayId}: Props) {
return (
-
{lazyReplay}
-
+
);
}
-// The min-height here is due to max-height that is set in replayPreview.tsx
-const ReplaySectionMinHeight = styled(InterimSection)`
- min-height: 557px;
-`;
-
const StyledNegativeSpaceContainer = styled(NegativeSpaceContainer)`
height: ${REPLAY_LOADING_HEIGHT}px;
margin-bottom: ${p => p.theme.space.xl};
diff --git a/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx b/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx
index d0b04c9fc698..389f05c6dfb0 100644
--- a/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx
+++ b/static/app/components/events/eventReplay/replayInlineOnboardingPanel.tsx
@@ -17,7 +17,7 @@ import {useReplayOnboardingSidebarPanel} from 'sentry/utils/replays/hooks/useRep
import {useMedia} from 'sentry/utils/useMedia';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type OnboardingCTAProps = {
platform: PlatformKey;
@@ -48,7 +48,7 @@ export default function ReplayInlineOnboardingPanel({
}
return (
-
+
@@ -106,7 +106,7 @@ export default function ReplayInlineOnboardingPanel({
]}
/>
-
+
);
}
diff --git a/static/app/components/events/eventSdk.tsx b/static/app/components/events/eventSdk.tsx
index 7e30b81baf4b..6c01f6fdca0a 100644
--- a/static/app/components/events/eventSdk.tsx
+++ b/static/app/components/events/eventSdk.tsx
@@ -2,7 +2,7 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {KeyValueList} from './interfaces/keyValueList';
import {AnnotatedText} from './meta/annotatedText';
@@ -18,7 +18,7 @@ export function EventSdk({sdk, meta}: Props) {
}
return (
-
+
-
+
);
}
diff --git a/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx b/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx
index 67ebf508806c..fa1fc9f20ac3 100644
--- a/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx
+++ b/static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx
@@ -15,7 +15,7 @@ import {useOrganization} from 'sentry/utils/useOrganization';
import {useSpans} from 'sentry/views/insights/common/queries/useDiscover';
import {SpanFields} from 'sentry/views/insights/types';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {makeTracesPathname} from 'sentry/views/traces/pathnames';
import {EventRegressionTable, type EventRegressionTableRow} from './eventRegressionTable';
@@ -217,8 +217,8 @@ export function AggregateSpanDiff({event, project}: AggregateSpanDiffProps) {
});
return (
-
-
+
);
}
diff --git a/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx b/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx
index 63ca0502c0ae..983072fdedee 100644
--- a/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx
+++ b/static/app/components/events/eventStatisticalDetector/breakpointChart.tsx
@@ -18,7 +18,7 @@ import {useOrganization} from 'sentry/utils/useOrganization';
import {Mode} from 'sentry/views/explore/queryParams/mode';
import {getExploreUrl} from 'sentry/views/explore/utils';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import type {BreakpointEvidenceData} from './breakpointChartOptions';
import {RELATIVE_DAYS_WINDOW} from './consts';
@@ -96,8 +96,8 @@ export function EventBreakpointChart({event}: EventBreakpointChartProps) {
});
return (
-
-
+
);
}
diff --git a/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx b/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx
index b086c84a419e..e68cf4e6db02 100644
--- a/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx
+++ b/static/app/components/events/eventStatisticalDetector/eventComparison/index.tsx
@@ -7,7 +7,7 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
const COMPARISON_DESCRIPTION = t(
'To better understand what happened before and after this regression, compare a baseline event with a regressed event. Look for any significant shape changes, operation percentage changes, and tag differences.'
@@ -25,8 +25,8 @@ export function EventComparison({event, project}: EventComparisonProps) {
event?.occurrence?.evidenceData ?? {};
return (
-
{COMPARISON_DESCRIPTION}
@@ -52,7 +52,7 @@ export function EventComparison({event, project}: EventComparisonProps) {
/>
-
+
);
}
diff --git a/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx b/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx
index 8b9fdfa14511..b04dff7fdbe2 100644
--- a/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx
+++ b/static/app/components/events/eventStatisticalDetector/eventRegressionSummary.tsx
@@ -15,7 +15,7 @@ import {getDuration} from 'sentry/utils/duration/getDuration';
import {formatPercentage} from 'sentry/utils/number/formatPercentage';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {
DisplayModes,
transactionSummaryRouteWithQuery,
@@ -39,9 +39,12 @@ export function EventRegressionSummary({event, group}: EventRegressionSummaryPro
}
return (
-
+
-
+
);
}
diff --git a/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx b/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx
index 69e7c89636d5..8bfb74bab1f4 100644
--- a/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx
+++ b/static/app/components/events/eventStatisticalDetector/functionBreakpointChart.tsx
@@ -10,7 +10,7 @@ import {defined} from 'sentry/utils';
import {useProfileEventsStats} from 'sentry/utils/profiling/hooks/useProfileEventsStats';
import {useRelativeDateTime} from 'sentry/utils/profiling/hooks/useRelativeDateTime';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {RELATIVE_DAYS_WINDOW} from './consts';
@@ -84,8 +84,8 @@ function EventFunctionBreakpointChartInner({
};
return (
-
-
+
);
}
diff --git a/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx b/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx
index 3da64f98c8cf..be637a0780dc 100644
--- a/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx
+++ b/static/app/components/events/eventTagsAndScreenshot/screenshot/screenshotDataSection.tsx
@@ -21,7 +21,7 @@ import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {EventAttachmentFilter} from 'sentry/views/issueDetails/groupEventAttachments/groupEventAttachmentsFilter';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {Tab, TabPaths} from 'sentry/views/issueDetails/types';
interface ScreenshotDataSectionProps {
@@ -109,12 +109,9 @@ export function ScreenshotDataSection({
const title = tn('Screenshot', 'Screenshots', screenshots.length);
return showScreenshot ? (
-
{t('View All')}
@@ -134,6 +131,6 @@ export function ScreenshotDataSection({
totalScreenshots={screenshots.length}
openVisualizationModal={handleOpenVisualizationModal}
/>
-
+
) : null;
}
diff --git a/static/app/components/events/eventTagsAndScreenshot/tags.tsx b/static/app/components/events/eventTagsAndScreenshot/tags.tsx
index 7d20e55c8d25..db78ed223d2e 100644
--- a/static/app/components/events/eventTagsAndScreenshot/tags.tsx
+++ b/static/app/components/events/eventTagsAndScreenshot/tags.tsx
@@ -1,8 +1,6 @@
import {useMemo, useState} from 'react';
-import styled from '@emotion/styled';
import {Grid} from '@sentry/scraps/layout';
-import {ExternalLink} from '@sentry/scraps/link';
import {SegmentedControl} from '@sentry/scraps/segmentedControl';
import {GuideAnchor} from 'sentry/components/assistant/guideAnchor';
@@ -12,13 +10,12 @@ import {
getSentryDefaultTags,
TagFilter,
TagFilterData,
- TAGS_DOCS_LINK,
} from 'sentry/components/events/eventTags/util';
-import {t, tct} from 'sentry/locale';
+import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type Props = {
event: Event;
@@ -84,20 +81,15 @@ export function EventTagsDataSection({
);
return (
-
{t('Tags')}
}
- help={tct('The searchable tags associated with this event. [link:Learn more]', {
- link: ,
- })}
- isHelpHoverable
actions={actions}
- data-test-id="event-tags"
- type={SectionKey.TAGS}
+ sectionKey={SectionKey.TAGS}
ref={ref}
>
-
+
);
}
-
-const StyledEventDataSection = styled(InterimSection)`
- padding: ${p => p.theme.space.xs} ${p => p.theme.space.xl} ${p => p.theme.space.md};
-
- @media (min-width: ${p => p.theme.breakpoints.md}) {
- padding: ${p => p.theme.space.md} ${p => p.theme.space['3xl']}
- ${p => p.theme.space.lg};
- }
-`;
diff --git a/static/app/components/events/eventViewHierarchy.tsx b/static/app/components/events/eventViewHierarchy.tsx
index f3ea25b585b5..928a02b13437 100644
--- a/static/app/components/events/eventViewHierarchy.tsx
+++ b/static/app/components/events/eventViewHierarchy.tsx
@@ -16,7 +16,7 @@ import type {getApiUrl} from 'sentry/utils/api/getApiUrl';
import {useApiQuery} from 'sentry/utils/queryClient';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import type {ViewHierarchyData} from './viewHierarchy';
import {ViewHierarchy} from './viewHierarchy';
@@ -96,9 +96,9 @@ function EventViewHierarchyContent({event, project, disableCollapsePersistence}:
const platformViewConfig = getPlatformViewConfig(platform);
return (
-
@@ -110,7 +110,7 @@ function EventViewHierarchyContent({event, project, disableCollapsePersistence}:
nodeField={platformViewConfig.nodeField}
/>
-
+
);
}
diff --git a/static/app/components/events/eventXrayDiff.tsx b/static/app/components/events/eventXrayDiff.tsx
index d9b9d29ff019..6832694a17d8 100644
--- a/static/app/components/events/eventXrayDiff.tsx
+++ b/static/app/components/events/eventXrayDiff.tsx
@@ -11,7 +11,7 @@ import {
useSizeAnalysisComparison,
} from 'sentry/utils/preprod/useSizeAnalysisComparison';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {TreemapDiffSection} from 'sentry/views/preprod/buildComparison/main/treemapDiffSection';
type SectionProps = MetricIds & {project: Project};
@@ -43,7 +43,7 @@ function EventXrayDiffContent({baseMetricId, headMetricId, project}: SectionProp
function EventXrayDiffSection({baseMetricId, headMetricId, project}: SectionProps) {
return (
-
+
-
+
);
}
diff --git a/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx b/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx
index f6f0c3bf384e..346dc0c249ad 100644
--- a/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx
+++ b/static/app/components/events/featureFlags/eventFeatureFlagSection.tsx
@@ -37,8 +37,8 @@ import {useLocation} from 'sentry/utils/useLocation';
import {useMedia} from 'sentry/utils/useMedia';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {useIssueDetailsEventView} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
export function EventFeatureFlagSection(props: EventFeatureFlagSectionProps) {
return (
@@ -271,13 +271,9 @@ function BaseEventFeatureFlagList({event, group, project}: EventFeatureFlagSecti
const label = tn('View 1 More Flag', 'View %s More Flags', extraFlags);
return (
-
{hasFlags ? (
@@ -302,7 +298,7 @@ function BaseEventFeatureFlagList({event, group, project}: EventFeatureFlagSecti
{label}
)}
-
+
);
}
diff --git a/static/app/components/events/groupingInfo/groupingInfoSection.tsx b/static/app/components/events/groupingInfo/groupingInfoSection.tsx
index 9ee6686c828e..05df74bfbd10 100644
--- a/static/app/components/events/groupingInfo/groupingInfoSection.tsx
+++ b/static/app/components/events/groupingInfo/groupingInfoSection.tsx
@@ -5,7 +5,7 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Group} from 'sentry/types/group';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
interface EventGroupingInfoSectionProps {
event: Event;
@@ -23,9 +23,9 @@ export function EventGroupingInfoSection({
group,
}: EventGroupingInfoSectionProps) {
return (
-
-
+
);
}
diff --git a/static/app/components/events/highlights/highlightsDataSection.tsx b/static/app/components/events/highlights/highlightsDataSection.tsx
index f45c0fe4bd66..a4bacd87d4d4 100644
--- a/static/app/components/events/highlights/highlightsDataSection.tsx
+++ b/static/app/components/events/highlights/highlightsDataSection.tsx
@@ -3,7 +3,6 @@ import {css, type Theme, useTheme} from '@emotion/react';
import styled from '@emotion/styled';
import {Button} from '@sentry/scraps/button';
-import {ExternalLink} from '@sentry/scraps/link';
import {useModal} from '@sentry/scraps/modal';
import {hasEveryAccess} from 'sentry/components/acl/access';
@@ -21,11 +20,10 @@ import {
EMPTY_HIGHLIGHT_DEFAULT,
getHighlightContextData,
getHighlightTagData,
- HIGHLIGHT_DOCS_LINK,
} from 'sentry/components/events/highlights/util';
import {LoadingIndicator} from 'sentry/components/loadingIndicator';
import {IconEdit} from 'sentry/icons';
-import {t, tct} from 'sentry/locale';
+import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
import {trackAnalytics} from 'sentry/utils/analytics';
@@ -34,7 +32,7 @@ import {useReplayData} from 'sentry/utils/replays/hooks/useReplayData';
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
interface HighlightsDataSectionProps {
event: Event;
@@ -226,24 +224,26 @@ function HighlightsData({
return (
{isPending ? (
+ hasDisabledHighlights ? (
+
+
+ {t("There's nothing here...")}
+
+ {t('Add Highlights')}
+
+
+
+ ) : (
+ columns
+ )
+ ) : (
- ) : hasDisabledHighlights ? (
-
-
- {t("There's nothing here...")}
-
- {t('Add Highlights')}
-
-
-
- ) : (
- columns
)}
);
@@ -251,18 +251,9 @@ function HighlightsData({
export function HighlightsDataSection({event, project}: HighlightsDataSectionProps) {
return (
- ,
- }
- )}
- isHelpHoverable
- data-test-id="event-highlights"
actions={
@@ -272,7 +263,7 @@ export function HighlightsDataSection({event, project}: HighlightsDataSectionPro
-
+
);
}
diff --git a/static/app/components/events/interfaces/csp/index.tsx b/static/app/components/events/interfaces/csp/index.tsx
index 3a793f238b3c..2c7d93aa47a9 100644
--- a/static/app/components/events/interfaces/csp/index.tsx
+++ b/static/app/components/events/interfaces/csp/index.tsx
@@ -7,7 +7,7 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import type {HelpProps} from './help';
import {CSPHelp as Help} from './help';
@@ -68,8 +68,8 @@ export function Csp({data, event}: Props) {
);
return (
-
+
{getView(view, cleanData, meta)}
-
+
);
}
diff --git a/static/app/components/events/interfaces/debugMeta/index.tsx b/static/app/components/events/interfaces/debugMeta/index.tsx
index b9583167fa31..ab6a3e1b5909 100644
--- a/static/app/components/events/interfaces/debugMeta/index.tsx
+++ b/static/app/components/events/interfaces/debugMeta/index.tsx
@@ -33,7 +33,7 @@ import type {Project} from 'sentry/types/project';
import {defined} from 'sentry/utils';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {Status} from './debugImage/status';
import {DebugImage} from './debugImage';
@@ -228,12 +228,9 @@ export function DebugMeta({data, projectSlug, groupId, event}: DebugMetaProps) {
const showFilters = filterOptions.some(s => 'options' in s && s.options.length > 1);
return (
-
@@ -328,7 +325,7 @@ export function DebugMeta({data, projectSlug, groupId, event}: DebugMetaProps) {
)}
-
+
);
}
diff --git a/static/app/components/events/interfaces/generic.tsx b/static/app/components/events/interfaces/generic.tsx
index a95be95ee798..bccb0f2853ef 100644
--- a/static/app/components/events/interfaces/generic.tsx
+++ b/static/app/components/events/interfaces/generic.tsx
@@ -5,7 +5,7 @@ import {SegmentedControl} from '@sentry/scraps/segmentedControl';
import {KeyValueList} from 'sentry/components/events/interfaces/keyValueList';
import {AnnotatedText} from 'sentry/components/events/meta/annotatedText';
import {t} from 'sentry/locale';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
function getView({
data,
@@ -49,8 +49,8 @@ type View = 'report' | 'raw';
export function Generic({type, data, meta}: Props) {
const [view, setView] = useState('report');
return (
-
{getView({view, data, meta})}
-
+
);
}
diff --git a/static/app/components/events/interfaces/message.tsx b/static/app/components/events/interfaces/message.tsx
index 505df62a6245..fce148da8abd 100644
--- a/static/app/components/events/interfaces/message.tsx
+++ b/static/app/components/events/interfaces/message.tsx
@@ -8,7 +8,7 @@ import type {Event} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type Props = {
data: {
@@ -60,12 +60,12 @@ export function Message({data, event}: Props) {
: null;
return (
-
+
{renderParams(data.params, meta)}
-
+
);
}
diff --git a/static/app/components/events/interfaces/performance/anrRootCause.tsx b/static/app/components/events/interfaces/performance/anrRootCause.tsx
index 94c11b0810d2..577708c1632e 100644
--- a/static/app/components/events/interfaces/performance/anrRootCause.tsx
+++ b/static/app/components/events/interfaces/performance/anrRootCause.tsx
@@ -24,7 +24,7 @@ import {trackAnalytics} from 'sentry/utils/analytics';
import {useLocation} from 'sentry/utils/useLocation';
import {useProjects} from 'sentry/utils/useProjects';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {useIssuesTraceTree} from 'sentry/views/performance/newTraceDetails/traceApi/useIssuesTraceTree';
import {useTrace} from 'sentry/views/performance/newTraceDetails/traceApi/useTrace';
import {useTraceStateAnalytics} from 'sentry/views/performance/newTraceDetails/useTraceStateAnalytics';
@@ -90,15 +90,6 @@ export function AnrRootCause({event, organization}: Props) {
return Object.values(AnrRootCauseAllowlist).includes(issueType);
});
- const helpText =
- !potentialAnrRootCause || potentialAnrRootCause.length === 0
- ? t(
- 'Suspect Root Cause identifies common patterns that may be contributing to this ANR'
- )
- : t(
- 'Suspect Root Cause identifies potential Performance Issues that may be contributing to this ANR.'
- );
-
function renderAnrCulprit() {
if (!defined(anrCulprit)) {
return;
@@ -139,10 +130,9 @@ export function AnrRootCause({event, organization}: Props) {
}
return (
-
{potentialAnrRootCause?.map(occurence => {
const project = projects.find(p => p.id === occurence.project_id.toString());
@@ -179,7 +169,7 @@ export function AnrRootCause({event, organization}: Props) {
);
})}
{renderAnrCulprit()}
-
+
);
}
diff --git a/static/app/components/events/interfaces/performance/eventTraceView.tsx b/static/app/components/events/interfaces/performance/eventTraceView.tsx
index e2ab731ce52c..2dc5d2d6e05b 100644
--- a/static/app/components/events/interfaces/performance/eventTraceView.tsx
+++ b/static/app/components/events/interfaces/performance/eventTraceView.tsx
@@ -20,7 +20,7 @@ import {getConfigForIssueType} from 'sentry/utils/issueTypeConfig';
import {useRouteAnalyticsParams} from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams';
import {useLocation} from 'sentry/utils/useLocation';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {TraceIssueEvent} from 'sentry/views/issueDetails/traceTimeline/traceIssue';
import {useTraceTimelineEvents} from 'sentry/views/issueDetails/traceTimeline/useTraceTimelineEvents';
import {IssuesTraceWaterfall} from 'sentry/views/performance/newTraceDetails/issuesTraceWaterfall';
@@ -180,8 +180,8 @@ export function EventTraceView({group, event, organization}: EventTraceViewProps
const hasTracePreviewFeature = organization.features.includes('profiling');
return (
-
@@ -211,6 +211,6 @@ export function EventTraceView({group, event, organization}: EventTraceViewProps
)}
-
+
);
}
diff --git a/static/app/components/events/interfaces/performance/spanEvidence.tsx b/static/app/components/events/interfaces/performance/spanEvidence.tsx
index 06d4a41526b1..840c932f78af 100644
--- a/static/app/components/events/interfaces/performance/spanEvidence.tsx
+++ b/static/app/components/events/interfaces/performance/spanEvidence.tsx
@@ -13,7 +13,7 @@ import {
import type {Organization} from 'sentry/types/organization';
import {sanitizeQuerySelector} from 'sentry/utils/sanitizeQuerySelector';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {SpanEvidenceKeyValueList} from './spanEvidenceKeyValueList';
@@ -23,7 +23,7 @@ interface Props {
projectSlug: string;
}
-function SpanEvidenceInterimSection({
+function SpanEvidenceFoldSection({
children,
event,
organization,
@@ -39,12 +39,9 @@ function SpanEvidenceInterimSection({
const sanitizedHash = hashTitle && sanitizeQuerySelector(hashTitle);
return (
-
{children}
-
+
);
}
@@ -81,7 +78,7 @@ export function SpanEvidenceSection({event, organization, projectSlug}: Props) {
const traceId = event.contexts.trace?.trace_id;
return (
-
)}
-
+
);
}
diff --git a/static/app/components/events/interfaces/template.tsx b/static/app/components/events/interfaces/template.tsx
index beb508aff640..82b1427caeb3 100644
--- a/static/app/components/events/interfaces/template.tsx
+++ b/static/app/components/events/interfaces/template.tsx
@@ -2,7 +2,7 @@ import {t} from 'sentry/locale';
import type {Event, Frame} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import DeprecatedLine from './frame/deprecatedLine';
@@ -15,7 +15,7 @@ export function Template({data, event}: Props) {
const entryIndex = event.entries.findIndex(entry => entry.type === EntryType.TEMPLATE);
const meta = event._meta?.entries?.[entryIndex]?.data?.values;
return (
-
+
-
+
);
}
diff --git a/static/app/components/events/interfaces/threads.tsx b/static/app/components/events/interfaces/threads.tsx
index 3fef288206a9..8a50b30e458d 100644
--- a/static/app/components/events/interfaces/threads.tsx
+++ b/static/app/components/events/interfaces/threads.tsx
@@ -37,8 +37,8 @@ import type {PlatformKey, Project} from 'sentry/types/project';
import {StackType, StackView} from 'sentry/types/stacktrace';
import {defined} from 'sentry/utils';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {setActiveThreadId} from 'sentry/views/issueDetails/streamline/hooks/useCopyIssueDetails';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
import {ExceptionContent} from './crashContent/exception';
import {StackTraceContent} from './crashContent/stackTrace';
@@ -402,15 +402,15 @@ export function Threads({data, event, projectSlug, groupingCurrentLevel, group}:
// If there is only one thread, we expect the stacktrace to wrap itself in a section
return hasMoreThanOneThread ? (
-
{threadComponent}
-
+
) : (
threadComponent
);
diff --git a/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx b/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx
index 72d79149d1e0..ad0cd019cb45 100644
--- a/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx
+++ b/static/app/components/events/interfaces/uptime/uptimeAssertionsSection.tsx
@@ -3,7 +3,7 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {AssertionFailureTree} from 'sentry/views/alerts/rules/uptime/assertions/assertionFailure/assertionFailureTree';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
export function UptimeAssertionsSection({event}: {event: Event}) {
const evidenceData = event.occurrence?.evidenceData;
@@ -13,8 +13,8 @@ export function UptimeAssertionsSection({event}: {event: Event}) {
}
return (
-
@@ -31,6 +31,6 @@ export function UptimeAssertionsSection({event}: {event: Event}) {
},
]}
/>
-
+
);
}
diff --git a/static/app/components/events/metrics/metricsSection.tsx b/static/app/components/events/metrics/metricsSection.tsx
index 75a7fb884a51..47408d35ba56 100644
--- a/static/app/components/events/metrics/metricsSection.tsx
+++ b/static/app/components/events/metrics/metricsSection.tsx
@@ -21,7 +21,7 @@ import {METRICS_DRAWER_QUERY_PARAM} from 'sentry/views/explore/metrics/constants
import {MetricsSamplesTable} from 'sentry/views/explore/metrics/metricInfoTabs/metricsSamplesTable';
import {canUseMetricsUI} from 'sentry/views/explore/metrics/metricsFlags';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {TraceViewMetricsProviderWrapper} from 'sentry/views/performance/newTraceDetails/traceMetrics';
import {NUMBER_ABBREVIATED_METRICS} from './useMetricsIssueSection';
@@ -145,12 +145,7 @@ function MetricsSectionContent({
}
return (
-
+
{result.data && result.data.length > NUMBER_ABBREVIATED_METRICS ? (
@@ -167,6 +162,6 @@ function MetricsSectionContent({
) : null}
-
+
);
}
diff --git a/static/app/components/events/ourlogs/ourlogsSection.tsx b/static/app/components/events/ourlogs/ourlogsSection.tsx
index ee2ed42bb6c1..10b5fa33cf0a 100644
--- a/static/app/components/events/ourlogs/ourlogsSection.tsx
+++ b/static/app/components/events/ourlogs/ourlogsSection.tsx
@@ -29,7 +29,7 @@ import {LogsQueryParamsProvider} from 'sentry/views/explore/logs/logsQueryParams
import {LogRowContent} from 'sentry/views/explore/logs/tables/logsTableRow';
import {useQueryParamsSearch} from 'sentry/views/explore/queryParams/context';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
export function OurlogsSection({
event,
@@ -185,12 +185,7 @@ function OurlogsSectionContent({
return null;
}
return (
-
+
@@ -222,7 +217,7 @@ function OurlogsSectionContent({
) : null}
-
+
);
}
diff --git a/static/app/components/events/packageData.tsx b/static/app/components/events/packageData.tsx
index 50f45aabe6e7..3453744fd5b5 100644
--- a/static/app/components/events/packageData.tsx
+++ b/static/app/components/events/packageData.tsx
@@ -7,7 +7,7 @@ import {t} from 'sentry/locale';
import type {Event} from 'sentry/types/event';
import {isEmptyObject} from 'sentry/utils/object/isEmptyObject';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type Props = {
event: Event;
@@ -59,14 +59,14 @@ export function EventPackageData({event}: Props) {
}
return (
-
{columns}
-
+
);
}
diff --git a/static/app/components/events/profileEventEvidence.tsx b/static/app/components/events/profileEventEvidence.tsx
index 6acbfbb5bc1d..be0ede36f788 100644
--- a/static/app/components/events/profileEventEvidence.tsx
+++ b/static/app/components/events/profileEventEvidence.tsx
@@ -9,7 +9,7 @@ import {generateProfileFlamechartRouteWithHighlightFrame} from 'sentry/utils/pro
import {useLocation} from 'sentry/utils/useLocation';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type ProfileEvidenceProps = {event: Event; projectSlug: string};
@@ -79,8 +79,8 @@ export function ProfileEventEvidence({event, projectSlug}: ProfileEvidenceProps)
];
return (
-
+
-
+
);
}
diff --git a/static/app/components/events/rrwebIntegration.tsx b/static/app/components/events/rrwebIntegration.tsx
index a0549fd5756d..33144c637ae3 100644
--- a/static/app/components/events/rrwebIntegration.tsx
+++ b/static/app/components/events/rrwebIntegration.tsx
@@ -1,5 +1,4 @@
import {lazy} from 'react';
-import styled from '@emotion/styled';
import {LazyLoad} from 'sentry/components/lazyLoad';
import {LoadingError} from 'sentry/components/loadingError';
@@ -12,7 +11,7 @@ import {getApiUrl} from 'sentry/utils/api/getApiUrl';
import {useApiQuery} from 'sentry/utils/queryClient';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type Props = {
event: Event;
@@ -78,8 +77,8 @@ function EventRRWebIntegrationContent({
`/api/0/projects/${orgId}/${projectSlug}/events/${event.id}/attachments/${attachment.id}/?download`;
return (
-
@@ -87,7 +86,7 @@ function EventRRWebIntegrationContent({
LazyComponent={LazyReplayer}
urls={attachmentList.map(createAttachmentUrl)}
/>
-
+
);
}
@@ -104,8 +103,3 @@ export function EventRRWebIntegration(props: Props) {
return ;
}
-
-const StyledReplayEventDataSection = styled(InterimSection)`
- overflow: hidden;
- margin-bottom: ${p => p.theme.space['2xl']};
-`;
diff --git a/static/app/components/events/traceEventDataSection.tsx b/static/app/components/events/traceEventDataSection.tsx
index d0545d75cdd2..76af22d8d9b4 100644
--- a/static/app/components/events/traceEventDataSection.tsx
+++ b/static/app/components/events/traceEventDataSection.tsx
@@ -19,7 +19,7 @@ import {trackAnalytics} from 'sentry/utils/analytics';
import {isMobilePlatform, isNativePlatform} from 'sentry/utils/platform';
import {useApi} from 'sentry/utils/useApi';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
const sortByOptions = {
'recent-first': t('Newest'),
@@ -425,106 +425,111 @@ export function TraceEventDataSection({
: undefined
: t('Not available on stack trace with single frame');
- const SectionComponent = isNestedSection ? InlineThreadSection : InterimSection;
-
const optionsToShow = getDisplayOptions();
const displayValues = displayOptions.filter(value =>
optionsToShow.some(opt => opt.value === value && !opt.disabled)
);
+ const actions = !stackTraceNotFound && (
+
+ {!displayOptions.includes('raw-stack-trace') && (
+
+
+ {t('Most Relevant')}
+
+
+ {t('Full Stack Trace')}
+
+
+ )}
+ {displayOptions.includes('raw-stack-trace') && nativePlatform && (
+ {
+ trackAnalytics('stack-trace.download_clicked', {
+ organization,
+ project_slug: projectSlug,
+ platform,
+ is_mobile: isMobile,
+ });
+ }}
+ >
+ {t('Download')}
+
+ )}
+ (
+ }
+ size="xs"
+ tooltipProps={{title: sortByTooltip}}
+ />
+ )}
+ disabled={!!sortByTooltip}
+ position="bottom-end"
+ onChange={selectedOption => {
+ handleSortByChange(selectedOption.value);
+ }}
+ value={isNewestFramesFirst ? 'recent-first' : 'recent-last'}
+ options={Object.entries(sortByOptions).map(([value, label]) => ({
+ label,
+ value: value as keyof typeof sortByOptions,
+ }))}
+ />
+ (
+ }
+ aria-label={t('Display as')}
+ >
+ {t('Display as')}
+
+ )}
+ multiple
+ position="bottom-end"
+ value={displayValues}
+ onChange={opts => handleDisplayChange(opts.map(opt => opt.value))}
+ options={[{label: t('Display'), options: optionsToShow}]}
+ />
+
+
+
+ );
+
+ if (isNestedSection) {
+ return (
+
+ {children}
+
+ );
+ }
+
return (
-
- {!displayOptions.includes('raw-stack-trace') && (
-
-
- {t('Most Relevant')}
-
-
- {t('Full Stack Trace')}
-
-
- )}
- {displayOptions.includes('raw-stack-trace') && nativePlatform && (
- {
- trackAnalytics('stack-trace.download_clicked', {
- organization,
- project_slug: projectSlug,
- platform,
- is_mobile: isMobile,
- });
- }}
- >
- {t('Download')}
-
- )}
- (
- }
- size="xs"
- tooltipProps={{title: sortByTooltip}}
- />
- )}
- disabled={!!sortByTooltip}
- position="bottom-end"
- onChange={selectedOption => {
- handleSortByChange(selectedOption.value);
- }}
- value={isNewestFramesFirst ? 'recent-first' : 'recent-last'}
- options={Object.entries(sortByOptions).map(([value, label]) => ({
- label,
- value: value as keyof typeof sortByOptions,
- }))}
- />
- (
- }
- aria-label={t('Display as')}
- >
- {t('Display as')}
-
- )}
- multiple
- position="bottom-end"
- value={displayValues}
- onChange={opts => handleDisplayChange(opts.map(opt => opt.value))}
- options={[{label: t('Display'), options: optionsToShow}]}
- />
-
-
-
- )
- }
+ actions={actions}
>
{children}
-
+
);
}
diff --git a/static/app/components/stackTrace/issueStackTrace/index.tsx b/static/app/components/stackTrace/issueStackTrace/index.tsx
index b526a37650bc..ae28dece7063 100644
--- a/static/app/components/stackTrace/issueStackTrace/index.tsx
+++ b/static/app/components/stackTrace/issueStackTrace/index.tsx
@@ -39,7 +39,7 @@ import {useDetailedProject} from 'sentry/utils/project/useDetailedProject';
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
import {useOrganization} from 'sentry/utils/useOrganization';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {IssueFrameActions} from './issueFrameActions';
import {IssueStackTraceFrameContext} from './issueStackTraceFrameContext';
@@ -217,7 +217,7 @@ function IssueStackTraceContent({
if (view === 'raw') {
return (
-
+
@@ -235,7 +235,7 @@ function IssueStackTraceContent({
projectSlug={projectSlug}
/>
-
+
);
}
@@ -247,7 +247,7 @@ function IssueStackTraceContent({
const excMeta = exceptionValuesMeta?.[exc.exceptionIndex];
return (
-
+
{hasExceptionInfo && (
@@ -285,12 +285,12 @@ function IssueStackTraceContent({
projectSlug={projectSlug}
/>
-
+
);
}
return (
-
+
{tn(
@@ -376,7 +376,7 @@ function IssueStackTraceContent({
projectSlug={projectSlug}
/>
-
+
);
}
diff --git a/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx b/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx
index bf4aaf6c6fad..3be882d07e88 100644
--- a/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx
+++ b/static/app/components/stackTrace/issueStackTrace/sharedIssueStackTrace.tsx
@@ -31,7 +31,7 @@ import {EntryType} from 'sentry/types/event';
import type {StacktraceType} from 'sentry/types/stacktrace';
import {defined} from 'sentry/utils';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {
formatExceptionsAsText,
@@ -172,7 +172,7 @@ function SharedIssueStackTraceContent({
if (view === 'raw') {
return (
-
+
{formatExceptionsAsText({
@@ -183,7 +183,7 @@ function SharedIssueStackTraceContent({
})}
-
+
);
}
@@ -194,7 +194,7 @@ function SharedIssueStackTraceContent({
const excMeta = exceptionValuesMeta?.[exc.exceptionIndex];
return (
-
+
{hasExceptionInfo && (
@@ -218,12 +218,12 @@ function SharedIssueStackTraceContent({
-
+
);
}
return (
-
+
{tn(
@@ -295,6 +295,6 @@ function SharedIssueStackTraceContent({
);
})}
-
+
);
}
diff --git a/static/app/views/issueDetails/groupEventDetails/groupEventDetailsContent.tsx b/static/app/views/issueDetails/groupEventDetails/groupEventDetailsContent.tsx
index 482c8741af5c..4a768bd959a6 100644
--- a/static/app/views/issueDetails/groupEventDetails/groupEventDetailsContent.tsx
+++ b/static/app/views/issueDetails/groupEventDetails/groupEventDetailsContent.tsx
@@ -78,9 +78,9 @@ import {
import {ProfilePreviewSection} from 'sentry/views/issueDetails/profilePreviewSection';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
import {EventDetails} from 'sentry/views/issueDetails/streamline/eventDetails';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {useCopyIssueDetails} from 'sentry/views/issueDetails/streamline/hooks/useCopyIssueDetails';
import {InstrumentationFixSection} from 'sentry/views/issueDetails/streamline/instrumentationFixSection';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
import {MetricDetectorTriggeredSection} from 'sentry/views/issueDetails/streamline/sidebar/metricDetectorTriggeredSection';
import {SizeAnalysisTriggeredSection} from 'sentry/views/issueDetails/streamline/sidebar/sizeAnalysisTriggeredSection';
import {useIsSampleEvent} from 'sentry/views/issueDetails/utils';
@@ -145,14 +145,14 @@ export function EventDetailsContent({
)}
{event.userReport && (
-
+
-
+
)}
{(event.contexts?.metric_alert?.alert_rule_id ||
event?.occurrence?.evidenceData?.alertId) && (
@@ -293,8 +293,8 @@ export function EventDetailsContent({
-
{t('Largest Changes in Call Stack Frequency')}
@@ -304,7 +304,7 @@ export function EventDetailsContent({
contributed to the cause for the duration regression.`)}
-
+
)}
diff --git a/static/app/views/issueDetails/metricIssues/metricIssuesSection.tsx b/static/app/views/issueDetails/metricIssues/metricIssuesSection.tsx
index e6cc0714d224..a73b25dd8d34 100644
--- a/static/app/views/issueDetails/metricIssues/metricIssuesSection.tsx
+++ b/static/app/views/issueDetails/metricIssues/metricIssuesSection.tsx
@@ -17,7 +17,7 @@ import {
useMetricTimePeriod,
} from 'sentry/views/issueDetails/metricIssues/utils';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
interface MetricIssuesSectionProps {
group: Group;
@@ -78,10 +78,9 @@ export function MetricIssuesSection({
);
return (
-
-
+
);
}
if ([Dataset.TRANSACTIONS, Dataset.GENERIC_METRICS].includes(dataset)) {
return (
-
-
+
);
}
diff --git a/static/app/views/issueDetails/metricKitHangProfileSection.tsx b/static/app/views/issueDetails/metricKitHangProfileSection.tsx
index af2941e95aa6..adba83f913fd 100644
--- a/static/app/views/issueDetails/metricKitHangProfileSection.tsx
+++ b/static/app/views/issueDetails/metricKitHangProfileSection.tsx
@@ -10,7 +10,7 @@ import {t} from 'sentry/locale';
import type {Event, Frame} from 'sentry/types/event';
import {EntryType} from 'sentry/types/event';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
export interface HangProfileData {
exceptionValue: string;
@@ -61,8 +61,8 @@ export function getHangProfileData(event: Event): HangProfileData | null {
export function MetricKitHangProfileSection({data}: {data: HangProfileData}) {
return (
-
{t('Hang Profile')}
@@ -77,7 +77,7 @@ export function MetricKitHangProfileSection({data}: {data: HangProfileData}) {
>
{data.exceptionValue && {data.exceptionValue}}
-
+
);
}
diff --git a/static/app/views/issueDetails/profilePreviewSection.tsx b/static/app/views/issueDetails/profilePreviewSection.tsx
index 37f4ea2fcabf..419f2259daf1 100644
--- a/static/app/views/issueDetails/profilePreviewSection.tsx
+++ b/static/app/views/issueDetails/profilePreviewSection.tsx
@@ -29,7 +29,7 @@ import {
useProfiles,
} from 'sentry/views/explore/profiling/profilesProvider';
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
export function ProfilePreviewSection({
event,
@@ -82,8 +82,8 @@ export function ProfilePreviewSection({
>
{profiles => (
-
{sectionTitle}
@@ -117,7 +117,7 @@ export function ProfilePreviewSection({
/>
-
+
)}
diff --git a/static/app/views/issueDetails/streamline/context.tsx b/static/app/views/issueDetails/streamline/context.tsx
index 371a2f083351..143b07452938 100644
--- a/static/app/views/issueDetails/streamline/context.tsx
+++ b/static/app/views/issueDetails/streamline/context.tsx
@@ -105,13 +105,15 @@ export const enum SectionKey {
STACKTRACE_FLAMEGRAPH = 'stacktrace-flamegraph',
}
+export type FoldSectionKey = SectionKey | string;
+
/**
* This can be extended to create shared state for each section.
* For example, if we needed to know the number of context cards we're rendering,
* the can update the config for other components to read from.
*/
export interface SectionConfig {
- key: SectionKey;
+ key: FoldSectionKey;
initialCollapse?: boolean;
}
@@ -156,11 +158,11 @@ interface IssueDetailsState {
/**
* Controls the state of each section.
*/
- sectionData: Partial>;
+ sectionData: Partial>;
}
type UpdateEventSectionAction = {
- key: SectionKey;
+ key: FoldSectionKey;
type: 'UPDATE_EVENT_SECTION';
config?: Partial;
};
@@ -177,7 +179,7 @@ type UpdateDetectorDetailsAction = {
};
type RemoveEventSectionAction = {
- key: SectionKey;
+ key: FoldSectionKey;
type: 'REMOVE_EVENT_SECTION';
};
@@ -191,7 +193,7 @@ type IssueDetailsActions =
function updateEventSection(
state: IssueDetailsState,
- sectionKey: SectionKey,
+ sectionKey: FoldSectionKey,
updatedConfig: Partial
): IssueDetailsState {
const existingConfig = state.sectionData[sectionKey] ?? {key: sectionKey};
diff --git a/static/app/views/issueDetails/streamline/foldSection.tsx b/static/app/views/issueDetails/streamline/foldSection.tsx
index d81f1416bb8a..4b1258333329 100644
--- a/static/app/views/issueDetails/streamline/foldSection.tsx
+++ b/static/app/views/issueDetails/streamline/foldSection.tsx
@@ -18,10 +18,10 @@ import {t} from 'sentry/locale';
import {trackAnalytics} from 'sentry/utils/analytics';
import {useOrganization} from 'sentry/utils/useOrganization';
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
-import type {SectionKey} from 'sentry/views/issueDetails/streamline/context';
+import type {FoldSectionKey} from 'sentry/views/issueDetails/streamline/context';
import {useIssueDetails} from 'sentry/views/issueDetails/streamline/context';
-export function getFoldSectionKey(key: SectionKey) {
+export function getFoldSectionKey(key: FoldSectionKey) {
// Original key had a typo, this will migrate existing keys to the correct key
const localStorageValue = localStorage.getItem(
`'issue-details-fold-section-collapse:${key}`
@@ -35,7 +35,7 @@ export function getFoldSectionKey(key: SectionKey) {
export interface FoldSectionProps {
children: React.ReactNode;
- sectionKey: SectionKey;
+ sectionKey: FoldSectionKey;
/**
* Title of the section, always visible
*/
@@ -64,7 +64,7 @@ export interface FoldSectionProps {
}
function useOptionalLocalStorageState(
- key: SectionKey,
+ key: FoldSectionKey,
initialState: boolean,
disablePersistence: boolean
): [boolean, (value: boolean) => void] {
@@ -80,7 +80,7 @@ function useOptionalLocalStorageState(
}
function useScrollToSection(
- sectionKey: SectionKey,
+ sectionKey: FoldSectionKey,
expanded: boolean,
setIsCollapsed: (value: boolean) => void
): React.RefCallback {
diff --git a/static/app/views/issueDetails/streamline/interimSection.tsx b/static/app/views/issueDetails/streamline/interimSection.tsx
deleted file mode 100644
index b2d111cd7a32..000000000000
--- a/static/app/views/issueDetails/streamline/interimSection.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import {type EventDataSectionProps} from 'sentry/components/events/eventDataSection';
-import type {SectionKey} from 'sentry/views/issueDetails/streamline/context';
-import {
- FoldSection,
- type FoldSectionProps,
-} from 'sentry/views/issueDetails/streamline/foldSection';
-
-/**
- * This section is meant to provide a shared component while the streamline UI
- * for issue details is being developed. Once GA'd, all occurances should be replaced
- * with just
- */
-export function InterimSection({
- ref,
- children,
- title,
- type,
- actions = null,
- initialCollapse,
- preventCollapse,
- disableCollapsePersistence,
-}: EventDataSectionProps &
- Pick<
- FoldSectionProps,
- 'initialCollapse' | 'preventCollapse' | 'disableCollapsePersistence'
- >) {
- return (
-
- {children}
-
- );
-}
diff --git a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx b/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
index 64835a974699..b631ca8a6968 100644
--- a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
+++ b/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
@@ -31,6 +31,19 @@ const sectionLabels: Partial> = {
[SectionKey.FEATURE_FLAGS]: t('Flags'),
};
+type JumpToSectionConfig = SectionConfig & {key: SectionKey};
+
+function isJumpToSectionConfig(
+ config: SectionConfig | undefined,
+ excludedSectionKeys: SectionKey[]
+): config is JumpToSectionConfig {
+ return Boolean(
+ config &&
+ Object.hasOwn(sectionLabels, config.key) &&
+ !excludedSectionKeys.includes(config.key as SectionKey)
+ );
+}
+
export function IssueDetailsJumpTo() {
const {sectionData} = useIssueDetails();
const organization = useOrganization();
@@ -51,8 +64,8 @@ export function IssueDetailsJumpTo() {
}, [organization.features]);
const eventSectionConfigs = useMemo(() => {
- const configs = Object.values(sectionData ?? {}).filter(
- config => sectionLabels[config.key] && !excludedSectionKeys.includes(config.key)
+ const configs = Object.values(sectionData ?? {}).filter(config =>
+ isJumpToSectionConfig(config, excludedSectionKeys)
);
// Build a position map by querying the DOM once
@@ -95,7 +108,7 @@ export function IssueDetailsJumpTo() {
);
}
-function JumpToLink({config}: {config: SectionConfig}) {
+function JumpToLink({config}: {config: JumpToSectionConfig}) {
const theme = useTheme();
const [_isCollapsed, setIsCollapsed] = useSyncedLocalStorageState(
getFoldSectionKey(config.key),
diff --git a/static/app/views/issueDetails/streamline/sidebar/attributeComparisonSection.tsx b/static/app/views/issueDetails/streamline/sidebar/attributeComparisonSection.tsx
index 86d77a42d845..a06ff80097d9 100644
--- a/static/app/views/issueDetails/streamline/sidebar/attributeComparisonSection.tsx
+++ b/static/app/views/issueDetails/streamline/sidebar/attributeComparisonSection.tsx
@@ -19,7 +19,7 @@ import {useFilteredRankedAttributes} from 'sentry/views/explore/hooks/useFiltere
import {Mode} from 'sentry/views/explore/queryParams/mode';
import {getExploreUrl} from 'sentry/views/explore/utils';
import {ChartType} from 'sentry/views/insights/common/components/chart';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
const BASELINE_DAYS = 7;
const CHARTS_PER_PAGE = 9; // 3 rows × 3 columns max
@@ -122,9 +122,9 @@ export function AttributeComparisonSection({
]);
return (
-
{t('View All')}
@@ -183,7 +183,7 @@ export function AttributeComparisonSection({
)}
-
+
);
}
diff --git a/static/app/views/issueDetails/streamline/sidebar/metricDetectorTriggeredSection.tsx b/static/app/views/issueDetails/streamline/sidebar/metricDetectorTriggeredSection.tsx
index 76881cd9d22a..21276bf7fc6a 100644
--- a/static/app/views/issueDetails/streamline/sidebar/metricDetectorTriggeredSection.tsx
+++ b/static/app/views/issueDetails/streamline/sidebar/metricDetectorTriggeredSection.tsx
@@ -48,7 +48,7 @@ import {DetectorDataset} from 'sentry/views/detectors/datasetConfig/types';
import {useEventOpenPeriod} from 'sentry/views/detectors/hooks/useOpenPeriods';
import {getMetricDetectorSuffix} from 'sentry/views/detectors/utils/metricDetectorSuffix';
import {makeDiscoverPathname} from 'sentry/views/discover/pathnames';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {AttributeComparisonSection} from './attributeComparisonSection';
import {OpenPeriodTimelineSection} from './openPeriodTimelineSection';
@@ -282,9 +282,9 @@ function ContributingIssues({
};
return (
-
)}
-
+
);
}
@@ -404,9 +404,9 @@ function TriggeredConditionDetails({
openPeriodEnd={endDate}
/>
)}
-
-
+
{detectorDataset === DetectorDataset.SPANS && openPeriod && (
+
-
+
) : (
{message && (
-
+
-
+
)}
+
{children}
-
+
);
}
diff --git a/static/app/views/issueDetails/streamline/sidebar/sizeAnalysisTriggeredSection.tsx b/static/app/views/issueDetails/streamline/sidebar/sizeAnalysisTriggeredSection.tsx
index cf68dcef8719..808ead7f0aeb 100644
--- a/static/app/views/issueDetails/streamline/sidebar/sizeAnalysisTriggeredSection.tsx
+++ b/static/app/views/issueDetails/streamline/sidebar/sizeAnalysisTriggeredSection.tsx
@@ -8,7 +8,7 @@ import type {Group} from 'sentry/types/group';
import type {MetricCondition} from 'sentry/types/workflowEngine/detectors';
import {defined} from 'sentry/utils';
import {useOrganization} from 'sentry/utils/useOrganization';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {getCompareBuildPath} from 'sentry/views/preprod/utils/buildLinkUtils';
import {
bytesToMB,
@@ -120,9 +120,9 @@ export function SizeAnalysisTriggeredSection({event}: SizeAnalysisTriggeredSecti
: null;
return (
-
@@ -182,6 +182,6 @@ export function SizeAnalysisTriggeredSection({event}: SizeAnalysisTriggeredSecti
},
]}
/>
-
+
);
}
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/profiling/profilePreview.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/profiling/profilePreview.tsx
index 1c9ccd31f2fb..cb7ebf27c7b0 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/profiling/profilePreview.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/profiling/profilePreview.tsx
@@ -30,7 +30,7 @@ import {useOrganization} from 'sentry/utils/useOrganization';
import {useProfileGroup} from 'sentry/views/explore/profiling/profileGroupProvider';
import {useProfiles} from 'sentry/views/explore/profiling/profilesProvider';
import {SectionDivider} from 'sentry/views/issueDetails/streamline/foldSection';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import type {NoInstrumentationNode} from 'sentry/views/performance/newTraceDetails/traceModels/traceTreeNode/noInstrumentationNode';
interface SpanProfileProps {
@@ -169,9 +169,9 @@ export function ProfilePreview({
{message}
-
@@ -195,7 +195,7 @@ export function ProfilePreview({
)}
-
+
);
}
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/components/profileDetails.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/components/profileDetails.tsx
index 8d02a4f950a3..954be20b9b48 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/components/profileDetails.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/components/profileDetails.tsx
@@ -10,7 +10,7 @@ import type {EventTransaction} from 'sentry/types/event';
import type {Organization} from 'sentry/types/organization';
import type {Project} from 'sentry/types/project';
import {defined} from 'sentry/utils';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
export function ProfileDetails({
organization,
@@ -30,15 +30,15 @@ export function ProfileDetails({
}
return (
-
-
+
);
}
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/index.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/index.tsx
index e5fe989f66b2..d49092a39e0c 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/index.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/index.tsx
@@ -37,7 +37,7 @@ import {useSpansDataset} from 'sentry/views/explore/spans/spansQueryParams';
import {TraceItemDataset} from 'sentry/views/explore/types';
import {useSpansQueryWithoutPageFilters} from 'sentry/views/insights/common/queries/useSpansQuery';
import {getIsAiGenerationNode} from 'sentry/views/insights/pages/agents/utils/aiTraceNodes';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {traceAnalytics} from 'sentry/views/performance/newTraceDetails/traceAnalytics';
import {useTransaction} from 'sentry/views/performance/newTraceDetails/traceApi/useTransaction';
import {IssueList} from 'sentry/views/performance/newTraceDetails/traceDrawer/details/issues/issues';
@@ -98,9 +98,9 @@ function SpanSections({
onParentClick={onParentClick}
/>
{hasSpanSpecificData ? (
-
@@ -111,7 +111,7 @@ function SpanSections({
) : null}
-
+
) : null}
);
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx
index e56137c1dda3..3bf6be588649 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx
@@ -15,7 +15,7 @@ import {FullSpanDescription} from 'sentry/views/insights/common/components/fullS
import {WiderHovercard} from 'sentry/views/insights/common/components/tableCells/spanDescriptionCell';
import {resolveSpanModule} from 'sentry/views/insights/common/utils/resolveSpanModule';
import {ModuleName, SpanFields} from 'sentry/views/insights/types';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {
TraceDrawerComponents,
type SectionCardKeyValueList,
@@ -226,17 +226,13 @@ export function GeneralInfo(props: GeneralnfoProps) {
items = [...items, ...ancestryAndGroupingItems];
return (
-
+
{items.map(item => (
))}
-
+
);
}
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/index.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/index.tsx
index 839f40ff23b5..26d07c16b8a6 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/index.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/index.tsx
@@ -19,7 +19,7 @@ import {useLocation} from 'sentry/utils/useLocation';
import {useProjects} from 'sentry/utils/useProjects';
import {useSpans} from 'sentry/views/insights/common/queries/useDiscover';
import type {SpanQueryFilters, SpanResponse} from 'sentry/views/insights/types';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
import {Referrer} from 'sentry/views/performance/newTraceDetails/referrers';
import {traceAnalytics} from 'sentry/views/performance/newTraceDetails/traceAnalytics';
import {useTransaction} from 'sentry/views/performance/newTraceDetails/traceApi/useTransaction';
@@ -251,9 +251,9 @@ function TransactionSpecificSections(props: TransactionSpecificSectionsProps) {
location={location}
cacheMetrics={cacheMetrics}
/>
-
@@ -269,7 +269,7 @@ function TransactionSpecificSections(props: TransactionSpecificSectionsProps) {
) : null}
-
+
);
}
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/breadCrumbs.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/breadCrumbs.tsx
index 4507f2aefc5b..1a081c6c961f 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/breadCrumbs.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/breadCrumbs.tsx
@@ -23,7 +23,7 @@ import {IconFilter, IconSearch, IconSort} from 'sentry/icons';
import {t} from 'sentry/locale';
import type {EventTransaction} from 'sentry/types/event';
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
const MAX_BREADCRUMBS_HEIGHT = 400;
@@ -128,9 +128,9 @@ export function BreadCrumbs({event}: {event: EventTransaction}) {
return (
-
@@ -147,7 +147,7 @@ export function BreadCrumbs({event}: {event: EventTransaction}) {
/>
)}
-
+
);
}
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/entries.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/entries.tsx
index 93d0b5c5c62e..85ab60d064c8 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/entries.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/entries.tsx
@@ -16,7 +16,7 @@ import {
type EventTransaction,
} from 'sentry/types/event';
import type {Project} from 'sentry/types/project';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
type EventEntryContentProps = {
entry: Entry;
@@ -112,9 +112,9 @@ export function Entries({
(
-
+
{t('There was an error rendering this data.')}
-
+
)}
>
+
{items.map(item => (
))}
-
+
);
}
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/replayPreview.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/replayPreview.tsx
index 1b414a820fa1..ffab36066fbc 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/replayPreview.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/replayPreview.tsx
@@ -9,7 +9,7 @@ import type {EventTransaction} from 'sentry/types/event';
import type {Organization} from 'sentry/types/organization';
import {getAnalyticsDataForEvent} from 'sentry/utils/events';
import {getReplayIdFromEvent} from 'sentry/utils/replays/getReplayIdFromEvent';
-import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
+import {FoldSection} from 'sentry/views/issueDetails/streamline/foldSection';
const REPLAY_CLIP_OFFSETS = {
durationAfterMs: 5_000,
@@ -68,13 +68,13 @@ export function ReplayPreview({
return (
-
-
+
);
}
From ec56a626f188d10f085650e5964e143242e200a0 Mon Sep 17 00:00:00 2001
From: Scott Cooper
Date: Mon, 11 May 2026 20:21:25 -0700
Subject: [PATCH 2/7] ref(issues): Remove unused highlights docs link
InterimSection was the last consumer of this exported link after the section cleanup. Drop it so knip stays quiet.
Co-authored-by: Codex GPT-5
---
static/app/components/events/highlights/util.tsx | 2 --
1 file changed, 2 deletions(-)
diff --git a/static/app/components/events/highlights/util.tsx b/static/app/components/events/highlights/util.tsx
index 327186719a83..0b757e250237 100644
--- a/static/app/components/events/highlights/util.tsx
+++ b/static/app/components/events/highlights/util.tsx
@@ -25,8 +25,6 @@ interface ContextData extends ContextItem {
}
export const EMPTY_HIGHLIGHT_DEFAULT = '--';
-export const HIGHLIGHT_DOCS_LINK =
- 'https://docs.sentry.io/product/issues/issue-details/#event-highlights';
/**
* Helper function to use try HighlightContext saved values on multiple fields improve match rate.
From 96836f179ba4c1a60acd07a14713af66f2a992b9 Mon Sep 17 00:00:00 2001
From: Scott Cooper
Date: Tue, 12 May 2026 09:40:31 -0700
Subject: [PATCH 3/7] fix(issues): Fix highlights loading state
Highlights rendered the empty state while the detailed project request was still pending, then kept the loading spinner around after the request settled. That left issue details stuck with a loading indicator and knocked over the acceptance shards.
Render loading only while the request is pending, and keep the now-local prop types unexported so knip stays quiet.
Co-Authored-By: Codex
---
.../components/events/eventDataSection.tsx | 2 +-
.../highlights/highlightsDataSection.tsx | 32 +++++++++----------
.../issueDetails/streamline/foldSection.tsx | 2 +-
3 files changed, 17 insertions(+), 19 deletions(-)
diff --git a/static/app/components/events/eventDataSection.tsx b/static/app/components/events/eventDataSection.tsx
index 46a5e2eaf225..192e5b8a83e0 100644
--- a/static/app/components/events/eventDataSection.tsx
+++ b/static/app/components/events/eventDataSection.tsx
@@ -6,7 +6,7 @@ import {DataSection} from 'sentry/components/events/styles';
import {QuestionTooltip} from 'sentry/components/questionTooltip';
import {IconLink} from 'sentry/icons';
-export interface EventDataSectionProps {
+interface EventDataSectionProps {
children: React.ReactNode;
/**
* The title of the section
diff --git a/static/app/components/events/highlights/highlightsDataSection.tsx b/static/app/components/events/highlights/highlightsDataSection.tsx
index a4bacd87d4d4..c1afff5d5db6 100644
--- a/static/app/components/events/highlights/highlightsDataSection.tsx
+++ b/static/app/components/events/highlights/highlightsDataSection.tsx
@@ -224,26 +224,24 @@ function HighlightsData({
return (
{isPending ? (
- hasDisabledHighlights ? (
-
-
- {t("There's nothing here...")}
-
- {t('Add Highlights')}
-
-
-
- ) : (
- columns
- )
- ) : (
+ ) : hasDisabledHighlights ? (
+
+
+ {t("There's nothing here...")}
+
+ {t('Add Highlights')}
+
+
+
+ ) : (
+ columns
)}
);
diff --git a/static/app/views/issueDetails/streamline/foldSection.tsx b/static/app/views/issueDetails/streamline/foldSection.tsx
index 4b1258333329..c94340676a2a 100644
--- a/static/app/views/issueDetails/streamline/foldSection.tsx
+++ b/static/app/views/issueDetails/streamline/foldSection.tsx
@@ -33,7 +33,7 @@ export function getFoldSectionKey(key: FoldSectionKey) {
return `issue-details-fold-section-collapse:${key}`;
}
-export interface FoldSectionProps {
+interface FoldSectionProps {
children: React.ReactNode;
sectionKey: FoldSectionKey;
/**
From 479103cc63c27b4b43193ea08e653a9c97d74260 Mon Sep 17 00:00:00 2001
From: Scott Cooper
Date: Tue, 12 May 2026 10:24:28 -0700
Subject: [PATCH 4/7] add jump to comment
---
static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx b/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
index b631ca8a6968..a1df2b128e49 100644
--- a/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
+++ b/static/app/views/issueDetails/streamline/issueDetailsJumpTo.tsx
@@ -33,6 +33,8 @@ const sectionLabels: Partial> = {
type JumpToSectionConfig = SectionConfig & {key: SectionKey};
+// FoldSection is also used outside issue details with arbitrary string keys.
+// Jump To only supports issue-detail sections that have known SectionKey labels.
function isJumpToSectionConfig(
config: SectionConfig | undefined,
excludedSectionKeys: SectionKey[]
From 98ff5fbe2ca1aa74f3b9d2b89096355759f1c0ac Mon Sep 17 00:00:00 2001
From: Scott Cooper
Date: Tue, 12 May 2026 10:28:00 -0700
Subject: [PATCH 5/7] attempt to reduce changes
---
.../events/traceEventDataSection.tsx | 201 ++++++++++--------
1 file changed, 111 insertions(+), 90 deletions(-)
diff --git a/static/app/components/events/traceEventDataSection.tsx b/static/app/components/events/traceEventDataSection.tsx
index 76af22d8d9b4..b76c44fe43a2 100644
--- a/static/app/components/events/traceEventDataSection.tsx
+++ b/static/app/components/events/traceEventDataSection.tsx
@@ -425,108 +425,129 @@ export function TraceEventDataSection({
: undefined
: t('Not available on stack trace with single frame');
+ const SectionComponent = isNestedSection ? InlineThreadSection : FoldTraceSection;
+
const optionsToShow = getDisplayOptions();
const displayValues = displayOptions.filter(value =>
optionsToShow.some(opt => opt.value === value && !opt.disabled)
);
- const actions = !stackTraceNotFound && (
-
- {!displayOptions.includes('raw-stack-trace') && (
-
-
- {t('Most Relevant')}
-
-
- {t('Full Stack Trace')}
-
-
- )}
- {displayOptions.includes('raw-stack-trace') && nativePlatform && (
- {
- trackAnalytics('stack-trace.download_clicked', {
- organization,
- project_slug: projectSlug,
- platform,
- is_mobile: isMobile,
- });
- }}
- >
- {t('Download')}
-
- )}
- (
- }
- size="xs"
- tooltipProps={{title: sortByTooltip}}
- />
- )}
- disabled={!!sortByTooltip}
- position="bottom-end"
- onChange={selectedOption => {
- handleSortByChange(selectedOption.value);
- }}
- value={isNewestFramesFirst ? 'recent-first' : 'recent-last'}
- options={Object.entries(sortByOptions).map(([value, label]) => ({
- label,
- value: value as keyof typeof sortByOptions,
- }))}
- />
- (
- }
- aria-label={t('Display as')}
- >
- {t('Display as')}
-
- )}
- multiple
- position="bottom-end"
- value={displayValues}
- onChange={opts => handleDisplayChange(opts.map(opt => opt.value))}
- options={[{label: t('Display'), options: optionsToShow}]}
- />
-
-
-
+ return (
+
+ {!displayOptions.includes('raw-stack-trace') && (
+
+
+ {t('Most Relevant')}
+
+
+ {t('Full Stack Trace')}
+
+
+ )}
+ {displayOptions.includes('raw-stack-trace') && nativePlatform && (
+ {
+ trackAnalytics('stack-trace.download_clicked', {
+ organization,
+ project_slug: projectSlug,
+ platform,
+ is_mobile: isMobile,
+ });
+ }}
+ >
+ {t('Download')}
+
+ )}
+ (
+ }
+ size="xs"
+ tooltipProps={{title: sortByTooltip}}
+ />
+ )}
+ disabled={!!sortByTooltip}
+ position="bottom-end"
+ onChange={selectedOption => {
+ handleSortByChange(selectedOption.value);
+ }}
+ value={isNewestFramesFirst ? 'recent-first' : 'recent-last'}
+ options={Object.entries(sortByOptions).map(([value, label]) => ({
+ label,
+ value: value as keyof typeof sortByOptions,
+ }))}
+ />
+ (
+ }
+ aria-label={t('Display as')}
+ >
+ {t('Display as')}
+
+ )}
+ multiple
+ position="bottom-end"
+ value={displayValues}
+ onChange={opts => handleDisplayChange(opts.map(opt => opt.value))}
+ options={[{label: t('Display'), options: optionsToShow}]}
+ />
+
+
+
+ )
+ }
+ >
+ {children}
+
);
+}
- if (isNestedSection) {
- return (
-
- {children}
-
- );
- }
-
+function FoldTraceSection({
+ children,
+ title,
+ actions,
+ type,
+ disableCollapsePersistence,
+}: {
+ actions: React.ReactNode;
+ children: React.ReactNode;
+ title: React.ReactNode;
+ type: string;
+ disableCollapsePersistence?: boolean;
+ showPermalink?: boolean;
+}) {
return (
{children}
From 459e45ce843a3fa39f06ff9a1987d48296ffecd5 Mon Sep 17 00:00:00 2001
From: Scott Cooper
Date: Tue, 12 May 2026 10:52:01 -0700
Subject: [PATCH 6/7] just render fold or not
---
.../events/traceEventDataSection.tsx | 201 ++++++++----------
1 file changed, 90 insertions(+), 111 deletions(-)
diff --git a/static/app/components/events/traceEventDataSection.tsx b/static/app/components/events/traceEventDataSection.tsx
index b76c44fe43a2..76af22d8d9b4 100644
--- a/static/app/components/events/traceEventDataSection.tsx
+++ b/static/app/components/events/traceEventDataSection.tsx
@@ -425,129 +425,108 @@ export function TraceEventDataSection({
: undefined
: t('Not available on stack trace with single frame');
- const SectionComponent = isNestedSection ? InlineThreadSection : FoldTraceSection;
-
const optionsToShow = getDisplayOptions();
const displayValues = displayOptions.filter(value =>
optionsToShow.some(opt => opt.value === value && !opt.disabled)
);
- return (
-
- {!displayOptions.includes('raw-stack-trace') && (
-
-
- {t('Most Relevant')}
-
-
- {t('Full Stack Trace')}
-
-
- )}
- {displayOptions.includes('raw-stack-trace') && nativePlatform && (
- {
- trackAnalytics('stack-trace.download_clicked', {
- organization,
- project_slug: projectSlug,
- platform,
- is_mobile: isMobile,
- });
- }}
- >
- {t('Download')}
-
- )}
- (
- }
- size="xs"
- tooltipProps={{title: sortByTooltip}}
- />
- )}
- disabled={!!sortByTooltip}
- position="bottom-end"
- onChange={selectedOption => {
- handleSortByChange(selectedOption.value);
- }}
- value={isNewestFramesFirst ? 'recent-first' : 'recent-last'}
- options={Object.entries(sortByOptions).map(([value, label]) => ({
- label,
- value: value as keyof typeof sortByOptions,
- }))}
- />
- (
- }
- aria-label={t('Display as')}
- >
- {t('Display as')}
-
- )}
- multiple
- position="bottom-end"
- value={displayValues}
- onChange={opts => handleDisplayChange(opts.map(opt => opt.value))}
- options={[{label: t('Display'), options: optionsToShow}]}
- />
-
-
-
- )
- }
- >
- {children}
-
+ const actions = !stackTraceNotFound && (
+
+ {!displayOptions.includes('raw-stack-trace') && (
+
+
+ {t('Most Relevant')}
+
+
+ {t('Full Stack Trace')}
+
+
+ )}
+ {displayOptions.includes('raw-stack-trace') && nativePlatform && (
+ {
+ trackAnalytics('stack-trace.download_clicked', {
+ organization,
+ project_slug: projectSlug,
+ platform,
+ is_mobile: isMobile,
+ });
+ }}
+ >
+ {t('Download')}
+
+ )}
+ (
+ }
+ size="xs"
+ tooltipProps={{title: sortByTooltip}}
+ />
+ )}
+ disabled={!!sortByTooltip}
+ position="bottom-end"
+ onChange={selectedOption => {
+ handleSortByChange(selectedOption.value);
+ }}
+ value={isNewestFramesFirst ? 'recent-first' : 'recent-last'}
+ options={Object.entries(sortByOptions).map(([value, label]) => ({
+ label,
+ value: value as keyof typeof sortByOptions,
+ }))}
+ />
+ (
+ }
+ aria-label={t('Display as')}
+ >
+ {t('Display as')}
+
+ )}
+ multiple
+ position="bottom-end"
+ value={displayValues}
+ onChange={opts => handleDisplayChange(opts.map(opt => opt.value))}
+ options={[{label: t('Display'), options: optionsToShow}]}
+ />
+
+
+
);
-}
-function FoldTraceSection({
- children,
- title,
- actions,
- type,
- disableCollapsePersistence,
-}: {
- actions: React.ReactNode;
- children: React.ReactNode;
- title: React.ReactNode;
- type: string;
- disableCollapsePersistence?: boolean;
- showPermalink?: boolean;
-}) {
+ if (isNestedSection) {
+ return (
+
+ {children}
+
+ );
+ }
+
return (
{children}
From a803e939d67b560cd8373bc44a3b2e1660cb3a80 Mon Sep 17 00:00:00 2001
From: Scott Cooper
Date: Tue, 12 May 2026 11:07:15 -0700
Subject: [PATCH 7/7] persist disableCollapsePersistence
---
.../traceDrawer/details/span/sections/generalInfo.tsx | 6 +++++-
.../details/transaction/sections/generalInfo.tsx | 6 +++++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx
index 3bf6be588649..0b9be9fea432 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/span/sections/generalInfo.tsx
@@ -226,7 +226,11 @@ export function GeneralInfo(props: GeneralnfoProps) {
items = [...items, ...ancestryAndGroupingItems];
return (
-
+
{items.map(item => (
diff --git a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/generalInfo.tsx b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/generalInfo.tsx
index 1ac1a056fd5c..ae983b5138b4 100644
--- a/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/generalInfo.tsx
+++ b/static/app/views/performance/newTraceDetails/traceDrawer/details/transaction/sections/generalInfo.tsx
@@ -97,7 +97,11 @@ export function GeneralInfo(props: GeneralInfoProps) {
}
return (
-
+
{items.map(item => (