Skip to content

Commit b815e2e

Browse files
authored
fix(issues): Derive activity timeline connectors from layout (#121578)
fixes missing activity timeline connectors around collapsed activity rollups <img width="393" height="101" alt="image" src="https://github.com/user-attachments/assets/0d85da38-70c4-4f69-8e20-8533afe9724f" />
1 parent 57c6ef7 commit b815e2e

6 files changed

Lines changed: 22 additions & 68 deletions

File tree

static/app/views/issueDetails/activitySection/activityLineItem.stories.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,14 +476,12 @@ function ActivityFeedExamples({items}: {items: ActivityFeedItem[]}) {
476476
group={group}
477477
inputVariant="compact"
478478
onDelete={async () => {}}
479-
showConnector={index < items.length - 1}
480479
/>
481480
) : (
482481
<ActivityLine
483482
key={`${item.activity.id}-${index}`}
484483
group={group}
485484
item={item}
486-
showConnector={index < items.length - 1}
487485
timestampUnitStyle="short"
488486
/>
489487
)

static/app/views/issueDetails/activitySection/activityLineItem/index.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,10 @@ import {ActivityLineMarker} from './progressMarker';
1212
interface ActivityLineProps {
1313
group: Group;
1414
item: ActivityFeedItem;
15-
showConnector?: boolean;
1615
timestampUnitStyle?: React.ComponentProps<typeof TimeSince>['unitStyle'];
1716
}
1817

19-
export function ActivityLine({
20-
item,
21-
group,
22-
showConnector,
23-
timestampUnitStyle,
24-
}: ActivityLineProps) {
18+
export function ActivityLine({item, group, timestampUnitStyle}: ActivityLineProps) {
2519
const organization = useOrganization();
2620
const showProgress = organization.features.includes('issue-activity-progress');
2721
const {issueCategory, project} = group;
@@ -47,7 +41,7 @@ export function ActivityLine({
4741
}
4842

4943
return (
50-
<ActivityLineRow showConnector={showConnector}>
44+
<ActivityLineRow>
5145
<ActivityLineMarker
5246
actorItem={actorActivity}
5347
item={activity}

static/app/views/issueDetails/activitySection/activityLineItem/layout.tsx

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {Fragment} from 'react';
2-
import {css} from '@emotion/react';
32
import styled from '@emotion/styled';
43

54
import {Flex} from '@sentry/scraps/layout';
@@ -51,9 +50,7 @@ export function ActivityLineHeadline({
5150
);
5251
}
5352

54-
export const ActivityLineRow = styled('div', {
55-
shouldForwardProp: prop => prop !== 'showConnector',
56-
})<{showConnector?: boolean}>`
53+
export const ActivityLineRow = styled('div')`
5754
position: relative;
5855
display: grid;
5956
grid-template-columns: auto minmax(0, 1fr);
@@ -65,18 +62,15 @@ export const ActivityLineRow = styled('div', {
6562
column-gap: ${p => p.theme.space.sm};
6663
}
6764
68-
${p =>
69-
p.showConnector &&
70-
css`
71-
&::before {
72-
content: '';
73-
position: absolute;
74-
left: 10.5px;
75-
top: 11px;
76-
bottom: calc(-${p.theme.space.md} - 11px);
77-
border-left: 1px solid ${p.theme.tokens.border.transparent.neutral.muted};
78-
}
79-
`}
65+
&:not(:last-child)::before {
66+
content: '';
67+
position: absolute;
68+
left: 10.5px;
69+
top: 11px;
70+
bottom: calc(-${p => p.theme.space.md} - 11px);
71+
border-left: 1px solid
72+
${p => p.theme.tokens.border.transparent.neutral.muted};
73+
}
8074
`;
8175

8276
const ActivityLineSentence = styled('span')`

static/app/views/issueDetails/activitySection/activityLineItem/note.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ interface ActivityLineNoteProps {
2424
inputVariant: ActivityLineVariant;
2525
onDelete: () => Promise<void>;
2626
onCommentEdited?: (activity: GroupActivity[]) => void;
27-
showConnector?: boolean;
2827
timestampUnitStyle?: React.ComponentProps<typeof TimeSince>['unitStyle'];
2928
}
3029

@@ -38,7 +37,6 @@ export function ActivityLineNote({
3837
inputVariant,
3938
onDelete,
4039
onCommentEdited,
41-
showConnector,
4240
timestampUnitStyle,
4341
}: ActivityLineNoteProps) {
4442
const [editing, setEditing] = useState(false);
@@ -49,7 +47,7 @@ export function ActivityLineNote({
4947
);
5048

5149
return (
52-
<ActivityLineRow showConnector={showConnector}>
50+
<ActivityLineRow>
5351
<ActivityLineMarker item={activity} showProgress={showProgress} />
5452
<ActivityLineNoteHeadline
5553
title={t('%s commented', getActivityNoteAuthor(activity))}

static/app/views/issueDetails/activitySection/index.tsx

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ interface ActivityFeedRowProps {
3838
inputVariant: 'compact' | 'full';
3939
item: DisplayedActivityFeedItem;
4040
onCommentEdited?: (activity: GroupActivity[]) => void;
41-
showConnector?: boolean;
4241
timestampUnitStyle?: React.ComponentProps<typeof TimeSince>['unitStyle'];
4342
}
4443

@@ -48,7 +47,6 @@ function ActivityFeedRow({
4847
onCommentEdited,
4948
group,
5049
inputVariant,
51-
showConnector,
5250
timestampUnitStyle,
5351
}: ActivityFeedRowProps) {
5452
if (item.type === 'collapsed_status_activities') {
@@ -73,12 +71,7 @@ function ActivityFeedRow({
7371

7472
if (!isActivityNote(activity)) {
7573
return (
76-
<ActivityLine
77-
item={item}
78-
group={group}
79-
showConnector={showConnector}
80-
timestampUnitStyle={timestampUnitStyle}
81-
/>
74+
<ActivityLine item={item} group={group} timestampUnitStyle={timestampUnitStyle} />
8275
);
8376
}
8477

@@ -89,7 +82,6 @@ function ActivityFeedRow({
8982
inputVariant={inputVariant}
9083
onDelete={() => handleDelete(activity)}
9184
onCommentEdited={onCommentEdited}
92-
showConnector={showConnector}
9385
timestampUnitStyle={timestampUnitStyle}
9486
/>
9587
);
@@ -189,18 +181,14 @@ export function ActivitySection({
189181
const inputVariant = isStandalone ? 'full' : 'compact';
190182
const timestampUnitStyle = isStandalone ? undefined : 'short';
191183

192-
const renderActivityItem = (
193-
item: DisplayedActivityFeedItem,
194-
showConnector: boolean
195-
) => (
184+
const renderActivityItem = (item: DisplayedActivityFeedItem) => (
196185
<ActivityFeedRow
197186
item={item}
198187
handleDelete={handleDelete}
199188
onCommentEdited={onCommentEdited}
200189
group={group}
201190
key={item.activity.id}
202191
inputVariant={inputVariant}
203-
showConnector={showConnector}
204192
timestampUnitStyle={timestampUnitStyle}
205193
/>
206194
);
@@ -220,9 +208,7 @@ export function ActivitySection({
220208

221209
const timeline = (
222210
<ActivityLineList data-test-id="activity-timeline">
223-
{displayedActivities.map((item, index) =>
224-
renderActivityItem(item, index < displayedActivities.length - 1)
225-
)}
211+
{displayedActivities.map(renderActivityItem)}
226212
</ActivityLineList>
227213
);
228214
const hiddenActivityCount =
@@ -231,7 +217,7 @@ export function ActivitySection({
231217
hiddenActivityCount > 0 ? displayedActivities.slice(0, 3) : displayedActivities;
232218
const sidebarActivityItems = (
233219
<Fragment>
234-
{sidebarVisibleActivities.map(item => renderActivityItem(item, true))}
220+
{sidebarVisibleActivities.map(renderActivityItem)}
235221
<MoreActivityRow>
236222
<MoreActivityIcon>
237223
<RotatedEllipsisIcon direction="up" />

static/app/views/issueList/progressActivityTooltip.tsx

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,41 +66,30 @@ function getProgressActivities(activities: GroupActivity[]): GroupActivity[] {
6666
return activities.slice(0, MAX_ITEMS).toReversed();
6767
}
6868

69-
function ProgressActivityItem({
70-
group,
71-
item,
72-
showConnector,
73-
}: {
74-
group: Group;
75-
item: GroupActivity;
76-
showConnector: boolean;
77-
}) {
69+
function ProgressActivityItem({group, item}: {group: Group; item: GroupActivity}) {
7870
if (isActivityNote(item)) {
79-
return <ProgressActivityNote item={item} showConnector={showConnector} />;
71+
return <ProgressActivityNote item={item} />;
8072
}
8173

8274
return (
8375
<ActivityLine
8476
group={group}
8577
item={{type: 'activity', activity: item}}
86-
showConnector={showConnector}
8778
timestampUnitStyle="extraShort"
8879
/>
8980
);
9081
}
9182

9283
function ProgressActivityNote({
9384
item,
94-
showConnector,
9585
}: {
9686
item: Extract<GroupActivity, {type: GroupActivityType.NOTE}>;
97-
showConnector: boolean;
9887
}) {
9988
const organization = useOrganization();
10089
const showProgress = organization.features.includes('issue-activity-progress');
10190

10291
return (
103-
<ActivityLineRow showConnector={showConnector}>
92+
<ActivityLineRow>
10493
<ActivityLineMarker item={item} showProgress={showProgress} />
10594
<ActivityLineHeadline
10695
title={getActivityNoteAuthor(item)}
@@ -161,13 +150,8 @@ function ProgressActivityBody({group}: {group: Group}) {
161150
return (
162151
<ActivityListContainer>
163152
<ActivityLineList>
164-
{items.map((item, index) => (
165-
<ProgressActivityItem
166-
key={item.id}
167-
group={group}
168-
item={item}
169-
showConnector={index < items.length - 1}
170-
/>
153+
{items.map(item => (
154+
<ProgressActivityItem key={item.id} group={group} item={item} />
171155
))}
172156
</ActivityLineList>
173157
</ActivityListContainer>

0 commit comments

Comments
 (0)