Skip to content

Commit 31d1d3c

Browse files
Change types and add helper
Signed-off-by: Adhitya Mamallan <[email protected]>
1 parent 4db12a9 commit 31d1d3c

File tree

5 files changed

+170
-48
lines changed

5 files changed

+170
-48
lines changed

src/views/workflow-history-v2/workflow-history-ungrouped-event/workflow-history-ungrouped-event.types.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import { type Timestamp } from '@/__generated__/proto-ts/google/protobuf/Timestamp';
21
import { type WorkflowPageTabsParams } from '@/views/workflow-page/workflow-page-tabs/workflow-page-tabs.types';
32

43
import { type UngroupedEventInfo } from '../workflow-history-ungrouped-table/workflow-history-ungrouped-table.types';
54

65
export type Props = {
76
// Core data props
87
eventInfo: UngroupedEventInfo;
9-
workflowStartTime: Timestamp | null;
8+
workflowStartTimeMs: number | null;
109
decodedPageUrlParams: WorkflowPageTabsParams;
1110

1211
// Expansion state
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import { type Timestamp } from '@/__generated__/proto-ts/google/protobuf/Timestamp';
2+
import {
3+
pendingActivityTaskStartEvent,
4+
pendingDecisionTaskStartEvent,
5+
} from '@/views/workflow-history/__fixtures__/workflow-history-pending-events';
6+
import { startWorkflowExecutionEvent } from '@/views/workflow-history/__fixtures__/workflow-history-single-events';
7+
import { type HistoryEventsGroup } from '@/views/workflow-history/workflow-history.types';
8+
9+
import { type UngroupedEventInfo } from '../../workflow-history-ungrouped-table.types';
10+
import compareUngroupedEvents from '../compare-ungrouped-events';
11+
12+
function createMockEventGroup(
13+
label: string,
14+
event: UngroupedEventInfo['event']
15+
): HistoryEventsGroup {
16+
return {
17+
groupType: 'Event',
18+
label,
19+
eventsMetadata: [],
20+
status: 'COMPLETED',
21+
hasMissingEvents: false,
22+
timeMs: null,
23+
startTimeMs: null,
24+
timeLabel: '',
25+
firstEventId: null,
26+
events: [event],
27+
} as HistoryEventsGroup;
28+
}
29+
30+
describe(compareUngroupedEvents.name, () => {
31+
it('orders non-pending events by event ID', () => {
32+
const eventA: UngroupedEventInfo = {
33+
id: '1',
34+
label: 'Event A',
35+
event: startWorkflowExecutionEvent,
36+
eventGroup: createMockEventGroup('Event A', startWorkflowExecutionEvent),
37+
};
38+
const eventB: UngroupedEventInfo = {
39+
id: '2',
40+
label: 'Event B',
41+
event: startWorkflowExecutionEvent,
42+
eventGroup: createMockEventGroup('Event B', startWorkflowExecutionEvent),
43+
};
44+
45+
expect(compareUngroupedEvents(eventA, eventB)).toBe(-1);
46+
expect(compareUngroupedEvents(eventB, eventA)).toBe(1);
47+
expect(compareUngroupedEvents(eventA, eventA)).toBe(0);
48+
});
49+
50+
it('puts non-pending events before pending events', () => {
51+
const nonPendingEvent: UngroupedEventInfo = {
52+
id: '2',
53+
label: 'Non-pending Event',
54+
event: startWorkflowExecutionEvent,
55+
eventGroup: createMockEventGroup(
56+
'Non-pending Event',
57+
startWorkflowExecutionEvent
58+
),
59+
};
60+
const pendingEvent: UngroupedEventInfo = {
61+
id: '1',
62+
label: 'Pending Event',
63+
event: pendingActivityTaskStartEvent,
64+
eventGroup: createMockEventGroup(
65+
'Pending Event',
66+
pendingActivityTaskStartEvent
67+
),
68+
};
69+
70+
expect(compareUngroupedEvents(nonPendingEvent, pendingEvent)).toBe(-1);
71+
expect(compareUngroupedEvents(pendingEvent, nonPendingEvent)).toBe(1);
72+
});
73+
74+
it('orders pending events by event time', () => {
75+
const eventTimeA: Timestamp = { seconds: '1000', nanos: 0 };
76+
const eventTimeB: Timestamp = { seconds: '2000', nanos: 0 };
77+
78+
const eventA = {
79+
...pendingActivityTaskStartEvent,
80+
eventTime: eventTimeA,
81+
};
82+
const eventB = {
83+
...pendingDecisionTaskStartEvent,
84+
eventTime: eventTimeB,
85+
};
86+
87+
const pendingEventA: UngroupedEventInfo = {
88+
id: '1',
89+
label: 'Pending Event A',
90+
event: eventA,
91+
eventGroup: createMockEventGroup('Pending Event A', eventA),
92+
};
93+
const pendingEventB: UngroupedEventInfo = {
94+
id: '2',
95+
label: 'Pending Event B',
96+
event: eventB,
97+
eventGroup: createMockEventGroup('Pending Event B', eventB),
98+
};
99+
100+
expect(compareUngroupedEvents(pendingEventA, pendingEventB)).toBe(-1000000);
101+
expect(compareUngroupedEvents(pendingEventB, pendingEventA)).toBe(1000000);
102+
expect(compareUngroupedEvents(pendingEventA, pendingEventA)).toBe(0);
103+
});
104+
105+
it('returns 0 when pending events have no event time', () => {
106+
const eventA = {
107+
...pendingActivityTaskStartEvent,
108+
eventTime: null,
109+
};
110+
const eventB = {
111+
...pendingDecisionTaskStartEvent,
112+
eventTime: null,
113+
};
114+
115+
const pendingEventA: UngroupedEventInfo = {
116+
id: '1',
117+
label: 'Pending Event A',
118+
event: eventA,
119+
eventGroup: createMockEventGroup('Pending Event A', eventA),
120+
};
121+
const pendingEventB: UngroupedEventInfo = {
122+
id: '2',
123+
label: 'Pending Event B',
124+
event: eventB,
125+
eventGroup: createMockEventGroup('Pending Event B', eventB),
126+
};
127+
128+
expect(compareUngroupedEvents(pendingEventA, pendingEventB)).toBe(0);
129+
});
130+
});
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import parseGrpcTimestamp from '@/utils/datetime/parse-grpc-timestamp';
2+
import isPendingHistoryEvent from '@/views/workflow-history/workflow-history-event-details/helpers/is-pending-history-event';
3+
4+
import { type UngroupedEventInfo } from '../workflow-history-ungrouped-table.types';
5+
6+
export default function compareUngroupedEvents(
7+
eventA: UngroupedEventInfo,
8+
eventB: UngroupedEventInfo
9+
) {
10+
const isPendingA = isPendingHistoryEvent(eventA.event);
11+
const isPendingB = isPendingHistoryEvent(eventB.event);
12+
13+
// If both history events are non-pending ones, order by event ID
14+
if (!isPendingA && !isPendingB) {
15+
return parseInt(eventA.id) - parseInt(eventB.id);
16+
}
17+
18+
// Put non-pending history events before pending ones
19+
if (!isPendingA) return -1;
20+
if (!isPendingB) return 1;
21+
22+
if (!eventA.event.eventTime || !eventB.event.eventTime) return 0;
23+
24+
// Sort pending events by scheduled time
25+
return (
26+
parseGrpcTimestamp(eventA.event.eventTime) -
27+
parseGrpcTimestamp(eventB.event.eventTime)
28+
);
29+
}

src/views/workflow-history-v2/workflow-history-ungrouped-table/workflow-history-ungrouped-table.tsx

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { useMemo } from 'react';
22

33
import { Virtuoso } from 'react-virtuoso';
44

5-
import compareUngroupedEvents from '@/views/workflow-history/helpers/compare-ungrouped-events';
65
import WorkflowHistoryTimelineLoadMore from '@/views/workflow-history/workflow-history-timeline-load-more/workflow-history-timeline-load-more';
76

87
import WorkflowHistoryUngroupedEvent from '../workflow-history-ungrouped-event/workflow-history-ungrouped-event';
98

9+
import compareUngroupedEvents from './helpers/compare-ungrouped-events';
1010
import { styled } from './workflow-history-ungrouped-table.styles';
1111
import {
1212
type UngroupedEventInfo,
@@ -32,12 +32,12 @@ export default function WorkflowHistoryUngroupedTable({
3232
() =>
3333
eventGroupsById
3434
.map(([_, group]) => [
35-
...group.events.map((event, index) => ({
35+
...group.events.map((event) => ({
36+
id: event.eventId ?? event.computedEventId,
3637
event,
37-
eventMetadata: group.eventsMetadata[index],
38+
eventGroup: group,
3839
label: group.label,
3940
shortLabel: group.shortLabel,
40-
id: event.eventId ?? event.computedEventId,
4141
canReset: group.resetToDecisionEventId === event.eventId,
4242
})),
4343
])
@@ -46,12 +46,10 @@ export default function WorkflowHistoryUngroupedTable({
4646
[eventGroupsById]
4747
);
4848

49-
const workflowStartTime = useMemo(
49+
const workflowStartTimeMs = useMemo(
5050
() =>
51-
eventsInfoFromGroups.length > 0
52-
? eventsInfoFromGroups[0].event.eventTime
53-
: null,
54-
[eventsInfoFromGroups]
51+
eventGroupsById.length > 0 ? eventGroupsById[0][1].startTimeMs : null,
52+
[eventGroupsById]
5553
);
5654

5755
const maybeHighlightedEventId = useMemo(
@@ -88,7 +86,7 @@ export default function WorkflowHistoryUngroupedTable({
8886
itemContent={(_, eventInfo) => (
8987
<WorkflowHistoryUngroupedEvent
9088
eventInfo={eventInfo}
91-
workflowStartTime={workflowStartTime}
89+
workflowStartTimeMs={workflowStartTimeMs}
9290
decodedPageUrlParams={decodedPageUrlParams}
9391
isExpanded={getIsEventExpanded(eventInfo.id)}
9492
toggleIsExpanded={() => toggleIsEventExpanded(eventInfo.id)}

src/views/workflow-history-v2/workflow-history-ungrouped-table/workflow-history-ungrouped-table.types.ts

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { type RequestError } from '@/utils/request/request-error';
66
import {
77
type ExtendedHistoryEvent,
88
type HistoryEventsGroup,
9-
type HistoryGroupEventMetadata,
109
} from '@/views/workflow-history/workflow-history.types';
1110
import { type WorkflowPageTabsParams } from '@/views/workflow-page/workflow-page-tabs/workflow-page-tabs.types';
1211

@@ -41,42 +40,9 @@ export type Props = {
4140

4241
export type UngroupedEventInfo = {
4342
id: string;
43+
event: ExtendedHistoryEvent;
44+
eventGroup: HistoryEventsGroup;
4445
label: string;
4546
shortLabel?: string;
46-
event: ExtendedHistoryEvent;
47-
eventMetadata: HistoryGroupEventMetadata;
4847
canReset?: boolean;
4948
};
50-
51-
// import { type ListRange, type VirtuosoHandle } from 'react-virtuoso';
52-
53-
// import { type RequestError } from '@/utils/request/request-error';
54-
// import { type WorkflowPageTabsParams } from '@/views/workflow-page/workflow-page-tabs/workflow-page-tabs.types';
55-
56-
// import {
57-
// type GetIsEventExpanded,
58-
// type ToggleIsEventExpanded,
59-
// } from '../hooks/use-event-expansion-toggle.types';
60-
// import { type WorkflowHistoryUngroupedEventInfo } from '../workflow-history-ungrouped-event/workflow-history-ungrouped-event.types';
61-
62-
// export type Props = {
63-
// // Data and state props
64-
// eventsInfo: Array<WorkflowHistoryUngroupedEventInfo>;
65-
// selectedEventId?: string;
66-
// decodedPageUrlParams: WorkflowPageTabsParams;
67-
// onResetToEventId: (eventId: string) => void;
68-
69-
// // React Query props
70-
// error: RequestError | null;
71-
// hasMoreEvents: boolean;
72-
// isFetchingMoreEvents: boolean;
73-
// fetchMoreEvents: () => void;
74-
75-
// // Event expansion state management
76-
// getIsEventExpanded: GetIsEventExpanded;
77-
// toggleIsEventExpanded: ToggleIsEventExpanded;
78-
79-
// // Virtualization props
80-
// onVisibleRangeChange: (r: ListRange) => void;
81-
// virtuosoRef: React.RefObject<VirtuosoHandle>;
82-
// };

0 commit comments

Comments
 (0)