Skip to content

Commit 5086e2d

Browse files
clnollDagster Devtools
authored andcommitted
fix: display materializations in tick details for DA runs (#25717)
## Summary & Motivation Fixes an issue where were passing backfill ID into the tick details component, resulting in a 400. Instead, we'll display the same details from run -> tick details as we show on sensor -> tick details, as described in the [issue](https://linear.app/dagster-labs/issue/ASSIST-181/tick-details-view-passes-backfill-id-into-request-instead-of-run-id). Closes https://linear.app/dagster-labs/issue/ASSIST-181/tick-details-view-passes-backfill-id-into-request-instead-of-run-id. Before: <img width="1450" height="838" alt="image" src="https://github.com/user-attachments/assets/50f42a9f-54fd-4fd9-80c0-b774ef1fd186" /> After: <img width="1447" height="839" alt="image" src="https://github.com/user-attachments/assets/ab7d8d20-9a1a-4162-b76f-6a4d9193af53" /> Internal-RevId: 144f3dacceb81cfa66f4bf6fdd52be25767c7bb8
1 parent 7e8a130 commit 5086e2d

5 files changed

Lines changed: 36 additions & 21 deletions

File tree

js_modules/ui-core/src/instigation/TickDetailsDialog.tsx

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {useMemo} from 'react';
1818
import {RunList, TargetedRunList} from './InstigationTick';
1919
import {HISTORY_TICK_FRAGMENT} from './InstigationUtils';
2020
import {TickMaterializationsTable} from './TickMaterializationsTable';
21+
import {getTickResultType} from './util';
2122
import {gql, useQuery} from '../apollo-client';
2223
import {HistoryTickFragment} from './types/InstigationUtils.types';
2324
import {SelectedTickQuery, SelectedTickQueryVariables} from './types/TickDetailsDialog.types';
@@ -46,24 +47,14 @@ interface DialogProps extends InnerProps {
4647
isOpen: boolean;
4748
}
4849

49-
export const TickDetailsDialog = ({
50-
tickId,
51-
tickResultType,
52-
isOpen,
53-
instigationSelector,
54-
onClose,
55-
}: DialogProps) => {
50+
export const TickDetailsDialog = ({tickId, isOpen, instigationSelector, onClose}: DialogProps) => {
5651
return (
5752
<Dialog
5853
isOpen={isOpen}
5954
onClose={onClose}
6055
style={{width: '80vw', maxWidth: '1200px', minWidth: '600px'}}
6156
>
62-
<TickDetailsDialogImpl
63-
tickId={tickId}
64-
tickResultType={tickResultType}
65-
instigationSelector={instigationSelector}
66-
/>
57+
<TickDetailsDialogImpl tickId={tickId} instigationSelector={instigationSelector} />
6758
<DialogFooter topBorder>
6859
<Button onClick={onClose}>Close</Button>
6960
</DialogFooter>
@@ -73,11 +64,10 @@ export const TickDetailsDialog = ({
7364

7465
interface InnerProps {
7566
tickId: string | undefined;
76-
tickResultType: TickResultType;
7767
instigationSelector: InstigationSelector;
7868
}
7969

80-
const TickDetailsDialogImpl = ({tickId, tickResultType, instigationSelector}: InnerProps) => {
70+
const TickDetailsDialogImpl = ({tickId, instigationSelector}: InnerProps) => {
8171
const {data, loading} = useQuery<SelectedTickQuery, SelectedTickQueryVariables>(
8272
JOB_SELECTED_TICK_QUERY,
8373
{
@@ -131,6 +121,8 @@ const TickDetailsDialogImpl = ({tickId, tickResultType, instigationSelector}: In
131121
);
132122
}
133123

124+
const resultType = getTickResultType(tick);
125+
134126
return (
135127
<>
136128
<DialogHeader
@@ -145,10 +137,10 @@ const TickDetailsDialogImpl = ({tickId, tickResultType, instigationSelector}: In
145137
}
146138
/>
147139
<Box padding={{vertical: 12, horizontal: 24}} border="bottom">
148-
<TickDetailSummary tick={tick} tickResultType={tickResultType} />
140+
<TickDetailSummary tick={tick} tickResultType={resultType} />
149141
</Box>
150-
{tickResultType === 'materializations' ? <TickMaterializationsTable tick={tick} /> : null}
151-
{tickResultType === 'runs' ? (
142+
{resultType === 'materializations' ? <TickMaterializationsTable tick={tick} /> : null}
143+
{resultType === 'runs' ? (
152144
<div style={{height: '500px', overflowY: 'auto'}}>
153145
{tick.runIds.length ? (
154146
<>

js_modules/ui-core/src/instigation/TickHistory.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ export const TicksTable = ({
245245
<TickDetailsDialog
246246
isOpen={!!showDetailsForTick}
247247
tickId={showDetailsForTick?.tickId}
248-
tickResultType={tickResultType}
249248
instigationSelector={instigationSelector}
250249
onClose={() => setShowDetailsForTick(null)}
251250
/>
@@ -405,7 +404,6 @@ export const TickHistoryTimeline = ({
405404
<TickDetailsDialog
406405
isOpen={!!selectedTickId}
407406
tickId={selectedTickId}
408-
tickResultType={tickResultType}
409407
instigationSelector={instigationSelector}
410408
onClose={() => onTickClick(undefined)}
411409
/>

js_modules/ui-core/src/instigation/__tests__/util.test.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {buildInstigationTick} from '../../graphql/builders';
22
import {InstigationTickStatus} from '../../graphql/types';
3-
import {isStuckStartedTick} from '../util';
3+
import {getTickResultType, isStuckStartedTick} from '../util';
44

55
const DAY = 1000 * 60 * 60 * 24;
66

@@ -37,3 +37,15 @@ describe('isStuckStarted', () => {
3737
expect(isStuckStartedTick(todayTickFailure, 1)).toBe(false);
3838
});
3939
});
40+
41+
describe('getTickResultType', () => {
42+
it('shows materializations for a tick that requested materializations', () => {
43+
// Declarative-automation tick (e.g. opened from a run, where the run is a backfill).
44+
expect(getTickResultType({requestedAssetMaterializationCount: 3})).toBe('materializations');
45+
});
46+
47+
it('shows runs for a tick that requested no materializations', () => {
48+
// Plain sensor/schedule tick that launched runs.
49+
expect(getTickResultType({requestedAssetMaterializationCount: 0})).toBe('runs');
50+
});
51+
});

js_modules/ui-core/src/instigation/util.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {DynamicPartitionsRequestType, InstigationTickStatus} from '../graphql/types';
2+
import type {TickResultType} from '../ticks/TickStatusTag';
23

34
type DynamicPartitionsRequestResult = {
45
partitionKeys: string[] | null;
@@ -45,3 +46,16 @@ export function countPartitionsAddedOrDeleted(
4546
return sum;
4647
}, 0);
4748
}
49+
50+
/**
51+
* Decide which view the tick details dialog should show.
52+
*
53+
* When the "run" that was createed is a backfill, the runs view can't render (400s when its backfill ID is passed to the
54+
* runs feed as a run UUID). So when a tick requested any materializations, show the materializations view; otherwise show
55+
* the runs view.
56+
*/
57+
export function getTickResultType(tick: {
58+
requestedAssetMaterializationCount: number;
59+
}): TickResultType {
60+
return tick.requestedAssetMaterializationCount > 0 ? 'materializations' : 'runs';
61+
}

js_modules/ui-core/src/runs/TickTagForRun.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ export const TickTagForRun = ({instigationSelector, instigationType, tickId}: Pr
5454
</TagActionsPopover>
5555
<TickDetailsDialog
5656
isOpen={showDetails}
57-
tickResultType="runs"
5857
onClose={() => setShowDetails(false)}
5958
instigationSelector={instigationSelector}
6059
tickId={tickId}

0 commit comments

Comments
 (0)