@shipfox/client-triggers 17.0.0 → 22.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +41 -0
- package/dist/components/events-filter-bar.d.ts.map +1 -1
- package/dist/components/events-filter-bar.js +98 -94
- package/dist/components/events-filter-bar.js.map +1 -1
- package/dist/components/events-list-states.d.ts.map +1 -1
- package/dist/components/events-list-states.js +31 -35
- package/dist/components/events-list-states.js.map +1 -1
- package/dist/components/events-list.d.ts.map +1 -1
- package/dist/components/events-list.js +5 -3
- package/dist/components/events-list.js.map +1 -1
- package/dist/components/trigger-event-detail.d.ts.map +1 -1
- package/dist/components/trigger-event-detail.js +173 -157
- package/dist/components/trigger-event-detail.js.map +1 -1
- package/dist/pages/events-page.d.ts.map +1 -1
- package/dist/pages/events-page.js +29 -47
- package/dist/pages/events-page.js.map +1 -1
- package/dist/routes/events-settings.d.ts +3 -0
- package/dist/routes/events-settings.js +3 -0
- package/dist/routes/events-settings.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/src/components/events-filter-bar.tsx +80 -77
- package/src/components/events-list-states.tsx +32 -30
- package/src/components/events-list.test.tsx +9 -0
- package/src/components/events-list.tsx +6 -3
- package/src/components/trigger-event-detail.test.tsx +3 -0
- package/src/components/trigger-event-detail.tsx +129 -126
- package/src/pages/events-page.test.tsx +7 -0
- package/src/pages/events-page.tsx +1 -15
- package/src/routes/events-settings.tsx +1 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -6,6 +6,7 @@ import { Callout } from '@shipfox/react-ui/callout';
|
|
|
6
6
|
import { CodeBlock, CodeBlockBody, CodeBlockContent, CodeBlockCopyButton, CodeBlockFilename, CodeBlockFiles, CodeBlockHeader, CodeBlockItem } from '@shipfox/react-ui/code-block';
|
|
7
7
|
import { EmptyState } from '@shipfox/react-ui/empty-state';
|
|
8
8
|
import { Icon } from '@shipfox/react-ui/icon';
|
|
9
|
+
import { Panel, PanelBody, PanelHeader, PanelTitle } from '@shipfox/react-ui/panel';
|
|
9
10
|
import { RelativeTime } from '@shipfox/react-ui/relative-time';
|
|
10
11
|
import { Skeleton } from '@shipfox/react-ui/skeleton';
|
|
11
12
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@shipfox/react-ui/tooltip';
|
|
@@ -16,7 +17,6 @@ import { useMemo } from 'react';
|
|
|
16
17
|
import { useTriggerEventQuery } from '#hooks/api/trigger-events.js';
|
|
17
18
|
import { triggerEventResult } from './trigger-event-result.js';
|
|
18
19
|
import { TriggerSourceIcon } from './trigger-source-icon.js';
|
|
19
|
-
const PANEL_CLASS = 'min-h-0 rounded-8 border border-border-neutral-base bg-background-neutral-base';
|
|
20
20
|
const DETAIL_RAIL_CLASS = '@min-[820px]:sticky @min-[820px]:top-16 @min-[820px]:max-h-[calc(var(--app-content-h,100dvh_-_96px)_-_32px)] @min-[820px]:min-h-[min(320px,calc(var(--app-content-h,100dvh_-_96px)_-_32px))]';
|
|
21
21
|
export function TriggerEventDetail({ workspaceId, workspaceSlug, eventId, onBack }) {
|
|
22
22
|
const query = useTriggerEventQuery(eventId);
|
|
@@ -46,10 +46,10 @@ export function TriggerEventDetailView({ workspaceId, workspaceSlug, event, onBa
|
|
|
46
46
|
]);
|
|
47
47
|
return /*#__PURE__*/ _jsxs("aside", {
|
|
48
48
|
"aria-label": "Event details",
|
|
49
|
-
className: cn(
|
|
49
|
+
className: cn(DETAIL_RAIL_CLASS, 'flex min-h-0 flex-col gap-group'),
|
|
50
50
|
children: [
|
|
51
51
|
/*#__PURE__*/ _jsxs("div", {
|
|
52
|
-
className: "flex shrink-0 flex-col gap-cluster
|
|
52
|
+
className: "flex shrink-0 flex-col gap-cluster p-panel-compact",
|
|
53
53
|
children: [
|
|
54
54
|
/*#__PURE__*/ _jsx(Button, {
|
|
55
55
|
type: "button",
|
|
@@ -119,7 +119,7 @@ export function TriggerEventDetailView({ workspaceId, workspaceSlug, event, onBa
|
|
|
119
119
|
]
|
|
120
120
|
}),
|
|
121
121
|
/*#__PURE__*/ _jsxs("div", {
|
|
122
|
-
className: "flex min-h-0 flex-1 flex-col gap-
|
|
122
|
+
className: "flex min-h-0 flex-1 flex-col gap-group overflow-y-auto scrollbar",
|
|
123
123
|
children: [
|
|
124
124
|
/*#__PURE__*/ _jsx(EventRuns, {
|
|
125
125
|
workspaceId: workspaceId,
|
|
@@ -146,92 +146,106 @@ function triggerEventFullLabel(event) {
|
|
|
146
146
|
function TriggerEventDetailPlaceholder() {
|
|
147
147
|
return /*#__PURE__*/ _jsx("aside", {
|
|
148
148
|
"aria-label": "Event details",
|
|
149
|
-
className:
|
|
150
|
-
children: /*#__PURE__*/ _jsx(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
149
|
+
className: "hidden min-h-[240px] @min-[820px]:flex",
|
|
150
|
+
children: /*#__PURE__*/ _jsx(Panel, {
|
|
151
|
+
className: "flex min-h-0 flex-1 items-center justify-center p-panel",
|
|
152
|
+
children: /*#__PURE__*/ _jsx(EmptyState, {
|
|
153
|
+
icon: "pulseLine",
|
|
154
|
+
variant: "compact",
|
|
155
|
+
title: "No event selected"
|
|
156
|
+
})
|
|
154
157
|
})
|
|
155
158
|
});
|
|
156
159
|
}
|
|
157
160
|
function TriggerEventDetailLoading({ onBack }) {
|
|
158
|
-
return /*#__PURE__*/
|
|
159
|
-
"aria-label": "Event details",
|
|
160
|
-
className: cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col gap-group p-panel-compact'),
|
|
161
|
-
children: [
|
|
162
|
-
/*#__PURE__*/ _jsx(Button, {
|
|
163
|
-
type: "button",
|
|
164
|
-
variant: "transparentMuted",
|
|
165
|
-
size: "sm",
|
|
166
|
-
iconLeft: "arrowLeftLine",
|
|
167
|
-
className: "self-start @min-[820px]:hidden",
|
|
168
|
-
onClick: onBack,
|
|
169
|
-
children: "Back to events"
|
|
170
|
-
}),
|
|
171
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
172
|
-
className: "flex flex-col gap-inline",
|
|
173
|
-
children: [
|
|
174
|
-
/*#__PURE__*/ _jsx(Skeleton, {
|
|
175
|
-
className: "h-16 w-160"
|
|
176
|
-
}),
|
|
177
|
-
/*#__PURE__*/ _jsx(Skeleton, {
|
|
178
|
-
className: "h-12 w-120"
|
|
179
|
-
})
|
|
180
|
-
]
|
|
181
|
-
}),
|
|
182
|
-
/*#__PURE__*/ _jsx(Skeleton, {
|
|
183
|
-
className: "h-96"
|
|
184
|
-
}),
|
|
185
|
-
/*#__PURE__*/ _jsx(Skeleton, {
|
|
186
|
-
className: "h-160"
|
|
187
|
-
})
|
|
188
|
-
]
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
function TriggerEventDetailError({ onBack, onRetry }) {
|
|
192
|
-
return /*#__PURE__*/ _jsxs("aside", {
|
|
161
|
+
return /*#__PURE__*/ _jsx("aside", {
|
|
193
162
|
"aria-label": "Event details",
|
|
194
|
-
className: cn(
|
|
195
|
-
children:
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
className: "flex items-center justify-between gap-cluster",
|
|
163
|
+
className: cn(DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col'),
|
|
164
|
+
children: /*#__PURE__*/ _jsxs(Panel, {
|
|
165
|
+
className: "flex min-h-[320px] flex-col gap-group p-panel-compact",
|
|
166
|
+
children: [
|
|
167
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
168
|
+
type: "button",
|
|
169
|
+
variant: "transparentMuted",
|
|
170
|
+
size: "sm",
|
|
171
|
+
iconLeft: "arrowLeftLine",
|
|
172
|
+
className: "self-start @min-[820px]:hidden",
|
|
173
|
+
onClick: onBack,
|
|
174
|
+
children: "Back to events"
|
|
175
|
+
}),
|
|
176
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
177
|
+
className: "flex flex-col gap-inline",
|
|
210
178
|
children: [
|
|
211
|
-
/*#__PURE__*/ _jsx(
|
|
212
|
-
|
|
213
|
-
children: "Event detail could not be loaded."
|
|
179
|
+
/*#__PURE__*/ _jsx(Skeleton, {
|
|
180
|
+
className: "h-16 w-160"
|
|
214
181
|
}),
|
|
215
|
-
/*#__PURE__*/ _jsx(
|
|
216
|
-
|
|
217
|
-
variant: "secondary",
|
|
218
|
-
size: "xs",
|
|
219
|
-
onClick: onRetry,
|
|
220
|
-
children: "Retry"
|
|
182
|
+
/*#__PURE__*/ _jsx(Skeleton, {
|
|
183
|
+
className: "h-12 w-120"
|
|
221
184
|
})
|
|
222
185
|
]
|
|
186
|
+
}),
|
|
187
|
+
/*#__PURE__*/ _jsx(Skeleton, {
|
|
188
|
+
className: "h-96"
|
|
189
|
+
}),
|
|
190
|
+
/*#__PURE__*/ _jsx(Skeleton, {
|
|
191
|
+
className: "h-160"
|
|
223
192
|
})
|
|
224
|
-
|
|
225
|
-
|
|
193
|
+
]
|
|
194
|
+
})
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function TriggerEventDetailError({ onBack, onRetry }) {
|
|
198
|
+
return /*#__PURE__*/ _jsx("aside", {
|
|
199
|
+
"aria-label": "Event details",
|
|
200
|
+
className: cn(DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col'),
|
|
201
|
+
children: /*#__PURE__*/ _jsxs(Panel, {
|
|
202
|
+
className: "flex min-h-[320px] flex-col gap-group p-panel-compact",
|
|
203
|
+
children: [
|
|
204
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
205
|
+
type: "button",
|
|
206
|
+
variant: "transparentMuted",
|
|
207
|
+
size: "sm",
|
|
208
|
+
iconLeft: "arrowLeftLine",
|
|
209
|
+
className: "self-start @min-[820px]:hidden",
|
|
210
|
+
onClick: onBack,
|
|
211
|
+
children: "Back to events"
|
|
212
|
+
}),
|
|
213
|
+
/*#__PURE__*/ _jsx(Callout, {
|
|
214
|
+
role: "alert",
|
|
215
|
+
type: "error",
|
|
216
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
217
|
+
className: "flex items-center justify-between gap-cluster",
|
|
218
|
+
children: [
|
|
219
|
+
/*#__PURE__*/ _jsx(Text, {
|
|
220
|
+
size: "sm",
|
|
221
|
+
children: "Event detail could not be loaded."
|
|
222
|
+
}),
|
|
223
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
224
|
+
type: "button",
|
|
225
|
+
variant: "secondary",
|
|
226
|
+
size: "xs",
|
|
227
|
+
onClick: onRetry,
|
|
228
|
+
children: "Retry"
|
|
229
|
+
})
|
|
230
|
+
]
|
|
231
|
+
})
|
|
232
|
+
})
|
|
233
|
+
]
|
|
234
|
+
})
|
|
226
235
|
});
|
|
227
236
|
}
|
|
228
237
|
function EventRuns({ workspaceId, workspaceSlug, event }) {
|
|
229
238
|
if (event.decisions.length === 0) {
|
|
230
239
|
if (event.outcome === 'discarded') {
|
|
231
|
-
return /*#__PURE__*/ _jsx(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
240
|
+
return /*#__PURE__*/ _jsx(Panel, {
|
|
241
|
+
children: /*#__PURE__*/ _jsx(PanelBody, {
|
|
242
|
+
className: "p-panel-compact",
|
|
243
|
+
children: /*#__PURE__*/ _jsx(Text, {
|
|
244
|
+
size: "sm",
|
|
245
|
+
className: "text-foreground-neutral-muted",
|
|
246
|
+
children: "No workflows are subscribed to this event."
|
|
247
|
+
})
|
|
248
|
+
})
|
|
235
249
|
});
|
|
236
250
|
}
|
|
237
251
|
return null;
|
|
@@ -265,25 +279,23 @@ function EventRunsWithProjects({ workspaceId, workspaceSlug, event }) {
|
|
|
265
279
|
});
|
|
266
280
|
}
|
|
267
281
|
function EventRunsList({ workspaceSlug, projectSlugs, projectDetailLookupEnabled = false, event }) {
|
|
268
|
-
return /*#__PURE__*/ _jsxs(
|
|
269
|
-
"aria-labelledby": "trigger-event-runs-heading",
|
|
270
|
-
className: "flex flex-col gap-inline",
|
|
282
|
+
return /*#__PURE__*/ _jsxs(Panel, {
|
|
271
283
|
children: [
|
|
272
|
-
/*#__PURE__*/ _jsx(
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
children: "Matched workflows"
|
|
284
|
+
/*#__PURE__*/ _jsx(PanelHeader, {
|
|
285
|
+
children: /*#__PURE__*/ _jsx(PanelTitle, {
|
|
286
|
+
children: "Matched workflows"
|
|
287
|
+
})
|
|
277
288
|
}),
|
|
278
|
-
/*#__PURE__*/ _jsx(
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
289
|
+
/*#__PURE__*/ _jsx(PanelBody, {
|
|
290
|
+
children: /*#__PURE__*/ _jsx("ul", {
|
|
291
|
+
children: event.decisions.map((decision)=>/*#__PURE__*/ _jsx(DecisionRow, {
|
|
292
|
+
workspaceSlug: workspaceSlug,
|
|
293
|
+
projectId: decision.projectId ?? undefined,
|
|
294
|
+
projectSlug: decision.projectId ? projectSlugs.get(decision.projectId) : undefined,
|
|
295
|
+
projectDetailLookupEnabled: projectDetailLookupEnabled,
|
|
296
|
+
decision: decision
|
|
297
|
+
}, decision.id))
|
|
298
|
+
})
|
|
287
299
|
})
|
|
288
300
|
]
|
|
289
301
|
});
|
|
@@ -293,34 +305,37 @@ function DecisionRow({ projectId, projectSlug, workspaceSlug, projectDetailLooku
|
|
|
293
305
|
const projectQuery = useProjectQuery(canRenderRunLink && projectDetailLookupEnabled && !projectSlug ? projectId : undefined);
|
|
294
306
|
const resolvedProjectSlug = projectSlug ?? projectQuery.data?.slug;
|
|
295
307
|
if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {
|
|
296
|
-
return /*#__PURE__*/
|
|
297
|
-
className: "
|
|
298
|
-
children:
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
308
|
+
return /*#__PURE__*/ _jsx("li", {
|
|
309
|
+
className: "border-b border-border-neutral-base px-row py-row last:border-b-0",
|
|
310
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
311
|
+
className: "flex min-w-0 items-start gap-inline",
|
|
312
|
+
children: [
|
|
313
|
+
/*#__PURE__*/ _jsx(Icon, {
|
|
314
|
+
name: "cornerDownRightLine",
|
|
315
|
+
className: "size-14 shrink-0 text-foreground-neutral-disabled",
|
|
316
|
+
"aria-hidden": "true"
|
|
317
|
+
}),
|
|
318
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
319
|
+
className: "flex min-w-0 flex-col gap-tight",
|
|
320
|
+
children: [
|
|
321
|
+
/*#__PURE__*/ _jsx(Text, {
|
|
322
|
+
size: "sm",
|
|
323
|
+
className: "min-w-0 truncate text-foreground-neutral-base",
|
|
324
|
+
children: decision.subscriptionName
|
|
325
|
+
}),
|
|
326
|
+
decision.reason ? /*#__PURE__*/ _jsx(Text, {
|
|
327
|
+
size: "xs",
|
|
328
|
+
className: "text-foreground-highlight-error",
|
|
329
|
+
children: decision.reason
|
|
330
|
+
}) : /*#__PURE__*/ _jsx(Text, {
|
|
331
|
+
size: "xs",
|
|
332
|
+
className: "text-foreground-neutral-disabled",
|
|
333
|
+
children: "No run created"
|
|
334
|
+
})
|
|
335
|
+
]
|
|
336
|
+
})
|
|
337
|
+
]
|
|
338
|
+
})
|
|
324
339
|
});
|
|
325
340
|
}
|
|
326
341
|
const row = /*#__PURE__*/ _jsxs(_Fragment, {
|
|
@@ -349,8 +364,9 @@ function DecisionRow({ projectId, projectSlug, workspaceSlug, projectDetailLooku
|
|
|
349
364
|
})
|
|
350
365
|
]
|
|
351
366
|
});
|
|
352
|
-
const rowClassName = 'flex min-w-0 items-start gap-inline
|
|
367
|
+
const rowClassName = 'flex min-w-0 items-start gap-inline px-row py-row hover:bg-background-neutral-hover focus-visible:outline-none focus-visible:shadow-button-neutral-focus';
|
|
353
368
|
return /*#__PURE__*/ _jsx("li", {
|
|
369
|
+
className: "border-b border-border-neutral-base last:border-b-0",
|
|
354
370
|
children: workspaceSlug && resolvedProjectSlug ? /*#__PURE__*/ _jsx(Link, {
|
|
355
371
|
to: "/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId",
|
|
356
372
|
params: {
|
|
@@ -374,46 +390,46 @@ function EventPayload({ payload }) {
|
|
|
374
390
|
code: payload
|
|
375
391
|
}
|
|
376
392
|
];
|
|
377
|
-
return /*#__PURE__*/ _jsxs(
|
|
378
|
-
"aria-labelledby": "trigger-event-payload-heading",
|
|
379
|
-
className: "flex flex-col gap-inline",
|
|
393
|
+
return /*#__PURE__*/ _jsxs(Panel, {
|
|
380
394
|
children: [
|
|
381
|
-
/*#__PURE__*/ _jsx(
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
children: "Payload"
|
|
395
|
+
/*#__PURE__*/ _jsx(PanelHeader, {
|
|
396
|
+
children: /*#__PURE__*/ _jsx(PanelTitle, {
|
|
397
|
+
children: "Payload"
|
|
398
|
+
})
|
|
386
399
|
}),
|
|
387
|
-
/*#__PURE__*/
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
400
|
+
/*#__PURE__*/ _jsx(PanelBody, {
|
|
401
|
+
className: "p-0",
|
|
402
|
+
children: /*#__PURE__*/ _jsxs(CodeBlock, {
|
|
403
|
+
data: data,
|
|
404
|
+
className: "flex h-auto flex-col overflow-visible rounded-none bg-background-contrast-base shadow-none",
|
|
405
|
+
children: [
|
|
406
|
+
/*#__PURE__*/ _jsxs(CodeBlockHeader, {
|
|
407
|
+
className: "sticky top-0 z-10 shrink-0 border-b border-border-contrast-base bg-background-contrast-base p-tight",
|
|
408
|
+
children: [
|
|
409
|
+
/*#__PURE__*/ _jsx(CodeBlockFiles, {
|
|
410
|
+
children: (item)=>/*#__PURE__*/ _jsx(CodeBlockFilename, {
|
|
411
|
+
value: item.filename,
|
|
412
|
+
children: item.filename
|
|
413
|
+
})
|
|
414
|
+
}),
|
|
415
|
+
/*#__PURE__*/ _jsx(CodeBlockCopyButton, {})
|
|
416
|
+
]
|
|
417
|
+
}),
|
|
418
|
+
/*#__PURE__*/ _jsx(CodeBlockBody, {
|
|
419
|
+
className: "min-h-0 scrollbar",
|
|
420
|
+
children: (item)=>/*#__PURE__*/ _jsx(CodeBlockItem, {
|
|
421
|
+
value: item.filename,
|
|
422
|
+
lineNumbers: false,
|
|
423
|
+
className: "px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color",
|
|
424
|
+
children: /*#__PURE__*/ _jsx(CodeBlockContent, {
|
|
425
|
+
language: "json",
|
|
426
|
+
syntaxHighlighting: false,
|
|
427
|
+
children: item.code
|
|
398
428
|
})
|
|
399
|
-
}),
|
|
400
|
-
/*#__PURE__*/ _jsx(CodeBlockCopyButton, {})
|
|
401
|
-
]
|
|
402
|
-
}),
|
|
403
|
-
/*#__PURE__*/ _jsx(CodeBlockBody, {
|
|
404
|
-
className: "min-h-0 scrollbar",
|
|
405
|
-
children: (item)=>/*#__PURE__*/ _jsx(CodeBlockItem, {
|
|
406
|
-
value: item.filename,
|
|
407
|
-
lineNumbers: false,
|
|
408
|
-
className: "px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&>div]:dark:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color",
|
|
409
|
-
children: /*#__PURE__*/ _jsx(CodeBlockContent, {
|
|
410
|
-
language: "json",
|
|
411
|
-
syntaxHighlighting: false,
|
|
412
|
-
children: item.code
|
|
413
429
|
})
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
430
|
+
})
|
|
431
|
+
]
|
|
432
|
+
})
|
|
417
433
|
})
|
|
418
434
|
]
|
|
419
435
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/trigger-event-detail.tsx"],"sourcesContent":["import {useProjectQuery, useProjectsInfiniteQuery} from '@shipfox/client-projects';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useMemo} from 'react';\nimport type {\n TriggerEventDetail as TriggerEventDetailModel,\n TriggerEventMatchedWorkflowResult,\n} from '#core/trigger-event.js';\nimport {useTriggerEventQuery} from '#hooks/api/trigger-events.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\nconst PANEL_CLASS =\n 'min-h-0 rounded-8 border border-border-neutral-base bg-background-neutral-base';\nconst DETAIL_RAIL_CLASS =\n '@min-[820px]:sticky @min-[820px]:top-16 @min-[820px]:max-h-[calc(var(--app-content-h,100dvh_-_96px)_-_32px)] @min-[820px]:min-h-[min(320px,calc(var(--app-content-h,100dvh_-_96px)_-_32px))]';\n\nexport interface TriggerEventDetailProps {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n eventId?: string | undefined;\n onBack: () => void;\n}\n\nexport function TriggerEventDetail({\n workspaceId,\n workspaceSlug,\n eventId,\n onBack,\n}: TriggerEventDetailProps) {\n const query = useTriggerEventQuery(eventId);\n\n if (!eventId) return <TriggerEventDetailPlaceholder />;\n if (query.data) {\n return (\n <TriggerEventDetailView\n workspaceId={workspaceId}\n workspaceSlug={workspaceSlug}\n event={query.data}\n onBack={onBack}\n />\n );\n }\n if (query.isError)\n return <TriggerEventDetailError onBack={onBack} onRetry={() => query.refetch()} />;\n return <TriggerEventDetailLoading onBack={onBack} />;\n}\n\nexport function TriggerEventDetailView({\n workspaceId,\n workspaceSlug,\n event,\n onBack,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n onBack: () => void;\n}) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n const formattedPayload = useMemo(\n () => JSON.stringify(event.payload ?? null, null, 2) ?? 'null',\n [event.payload],\n );\n\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(PANEL_CLASS, DETAIL_RAIL_CLASS, 'flex min-h-0 flex-col overflow-hidden')}\n >\n <div className=\"flex shrink-0 flex-col gap-cluster border-b border-border-neutral-base p-panel-compact\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex min-w-0 items-start justify-between gap-cluster\">\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={fullEventLabel}\n className=\"flex min-w-0 items-center gap-inline rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n <Text size=\"xs\" className=\"truncate text-foreground-neutral-muted\">\n <RelativeTime value={event.receivedAt} />\n </Text>\n </div>\n <Badge variant={result.badge} size=\"xs\">\n {result.label}\n </Badge>\n </div>\n </div>\n\n <div\n key={event.id}\n className=\"flex min-h-0 flex-1 flex-col gap-section overflow-y-auto p-panel-compact scrollbar\"\n >\n <EventRuns workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n <EventPayload payload={formattedPayload} />\n </div>\n </aside>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n\nfunction TriggerEventDetailPlaceholder() {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n 'hidden min-h-[240px] items-center justify-center p-panel @min-[820px]:flex',\n )}\n >\n <EmptyState icon=\"pulseLine\" variant=\"compact\" title=\"No event selected\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailLoading({onBack}: {onBack: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n DETAIL_RAIL_CLASS,\n 'flex min-h-[320px] flex-col gap-group p-panel-compact',\n )}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex flex-col gap-inline\">\n <Skeleton className=\"h-16 w-160\" />\n <Skeleton className=\"h-12 w-120\" />\n </div>\n <Skeleton className=\"h-96\" />\n <Skeleton className=\"h-160\" />\n </aside>\n );\n}\n\nfunction TriggerEventDetailError({onBack, onRetry}: {onBack: () => void; onRetry: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(\n PANEL_CLASS,\n DETAIL_RAIL_CLASS,\n 'flex min-h-[320px] flex-col gap-group p-panel-compact',\n )}\n >\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-cluster\">\n <Text size=\"sm\">Event detail could not be loaded.</Text>\n <Button type=\"button\" variant=\"secondary\" size=\"xs\" onClick={onRetry}>\n Retry\n </Button>\n </div>\n </Callout>\n </aside>\n );\n}\n\nfunction EventRuns({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n if (event.decisions.length === 0) {\n if (event.outcome === 'discarded') {\n return (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n No workflows are subscribed to this event.\n </Text>\n );\n }\n return null;\n }\n\n if (!workspaceId) {\n return <EventRunsList workspaceSlug={workspaceSlug} projectSlugs={new Map()} event={event} />;\n }\n\n return (\n <EventRunsWithProjects workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n );\n}\n\nfunction EventRunsWithProjects({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId: string;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n const projectsQuery = useProjectsInfiniteQuery(workspaceId);\n const projectSlugs = useMemo(\n () =>\n new Map(\n projectsQuery.data?.pages\n .flatMap((page) => page.projects)\n .map((project) => [project.id, project.slug] as const),\n ),\n [projectsQuery.data],\n );\n return (\n <EventRunsList\n workspaceSlug={workspaceSlug}\n projectSlugs={projectSlugs}\n projectDetailLookupEnabled={!projectsQuery.isPending}\n event={event}\n />\n );\n}\n\nfunction EventRunsList({\n workspaceSlug,\n projectSlugs,\n projectDetailLookupEnabled = false,\n event,\n}: {\n workspaceSlug?: string | undefined;\n projectSlugs: ReadonlyMap<string, string>;\n projectDetailLookupEnabled?: boolean;\n event: TriggerEventDetailModel;\n}) {\n return (\n <section aria-labelledby=\"trigger-event-runs-heading\" className=\"flex flex-col gap-inline\">\n <Text id=\"trigger-event-runs-heading\" size=\"sm\" bold>\n Matched workflows\n </Text>\n <ul className=\"-mx-inline flex flex-col gap-tight\">\n {event.decisions.map((decision) => (\n <DecisionRow\n key={decision.id}\n workspaceSlug={workspaceSlug}\n projectId={decision.projectId ?? undefined}\n projectSlug={decision.projectId ? projectSlugs.get(decision.projectId) : undefined}\n projectDetailLookupEnabled={projectDetailLookupEnabled}\n decision={decision}\n />\n ))}\n </ul>\n </section>\n );\n}\n\nfunction DecisionRow({\n projectId,\n projectSlug,\n workspaceSlug,\n projectDetailLookupEnabled,\n decision,\n}: {\n projectId?: string | undefined;\n projectSlug?: string | undefined;\n workspaceSlug?: string | undefined;\n projectDetailLookupEnabled: boolean;\n decision: TriggerEventMatchedWorkflowResult;\n}) {\n const canRenderRunLink =\n decision.decision === 'triggered' && Boolean(decision.runId && decision.runName);\n const projectQuery = useProjectQuery(\n canRenderRunLink && projectDetailLookupEnabled && !projectSlug ? projectId : undefined,\n );\n const resolvedProjectSlug = projectSlug ?? projectQuery.data?.slug;\n\n if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {\n return (\n <li className=\"flex min-w-0 items-start gap-inline rounded-6 p-tight\">\n <Icon\n name=\"cornerDownRightLine\"\n className=\"size-14 shrink-0 text-foreground-neutral-disabled\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Text size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n {decision.reason ? (\n <Text size=\"xs\" className=\"text-foreground-highlight-error\">\n {decision.reason}\n </Text>\n ) : (\n <Text size=\"xs\" className=\"text-foreground-neutral-disabled\">\n No run created\n </Text>\n )}\n </div>\n </li>\n );\n }\n\n const row = (\n <>\n <Icon\n name=\"cornerDownRightLine\"\n className=\"size-14 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <span className=\"flex min-w-0 flex-col gap-tight\">\n <Text as=\"span\" size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-muted\">\n {decision.runName}\n </Code>\n </span>\n </>\n );\n const rowClassName =\n 'flex min-w-0 items-start gap-inline rounded-6 p-tight hover:bg-background-components-hover focus-visible:outline-none focus-visible:shadow-button-neutral-focus';\n\n return (\n <li>\n {workspaceSlug && resolvedProjectSlug ? (\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId\"\n params={{\n workspaceSlug,\n projectSlug: resolvedProjectSlug,\n workflowRunId: decision.runId,\n }}\n className={rowClassName}\n >\n {row}\n </Link>\n ) : (\n <div className={rowClassName}>{row}</div>\n )}\n </li>\n );\n}\n\nfunction EventPayload({payload}: {payload: string}) {\n const data = [{language: 'json', filename: 'payload.json', code: payload}];\n\n return (\n <section aria-labelledby=\"trigger-event-payload-heading\" className=\"flex flex-col gap-inline\">\n <Text id=\"trigger-event-payload-heading\" size=\"sm\" bold>\n Payload\n </Text>\n <CodeBlock\n data={data}\n className=\"flex h-auto flex-col overflow-visible rounded-8 bg-background-contrast-base shadow-none\"\n >\n <CodeBlockHeader className=\"sticky top-0 z-10 shrink-0 border-b border-border-contrast-base bg-background-contrast-base p-tight\">\n <CodeBlockFiles>\n {(item) => <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody className=\"min-h-0 scrollbar\">\n {(item) => (\n <CodeBlockItem\n value={item.filename}\n lineNumbers={false}\n className=\"px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&>div]:dark:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color\"\n >\n <CodeBlockContent language=\"json\" syntaxHighlighting={false}>\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </section>\n );\n}\n"],"names":["useProjectQuery","useProjectsInfiniteQuery","Badge","Button","Callout","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","EmptyState","Icon","RelativeTime","Skeleton","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","Link","useMemo","useTriggerEventQuery","triggerEventResult","TriggerSourceIcon","PANEL_CLASS","DETAIL_RAIL_CLASS","TriggerEventDetail","workspaceId","workspaceSlug","eventId","onBack","query","TriggerEventDetailPlaceholder","data","TriggerEventDetailView","event","isError","TriggerEventDetailError","onRetry","refetch","TriggerEventDetailLoading","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","formattedPayload","JSON","stringify","payload","aside","aria-label","className","div","type","variant","size","iconLeft","onClick","asChild","button","provider","source","aria-hidden","as","value","receivedAt","badge","label","EventRuns","EventPayload","id","filter","Boolean","join","icon","title","role","decisions","length","outcome","EventRunsList","projectSlugs","Map","EventRunsWithProjects","projectsQuery","pages","flatMap","page","projects","map","project","slug","projectDetailLookupEnabled","isPending","section","aria-labelledby","bold","ul","decision","DecisionRow","projectId","undefined","projectSlug","get","canRenderRunLink","runId","runName","projectQuery","resolvedProjectSlug","li","name","subscriptionName","reason","row","span","rowClassName","to","params","workflowRunId","language","filename","code","item","lineNumbers","syntaxHighlighting"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/trigger-event-detail.tsx"],"sourcesContent":["import {useProjectQuery, useProjectsInfiniteQuery} from '@shipfox/client-projects';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Panel, PanelBody, PanelHeader, PanelTitle} from '@shipfox/react-ui/panel';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useMemo} from 'react';\nimport type {\n TriggerEventDetail as TriggerEventDetailModel,\n TriggerEventMatchedWorkflowResult,\n} from '#core/trigger-event.js';\nimport {useTriggerEventQuery} from '#hooks/api/trigger-events.js';\nimport {triggerEventResult} from './trigger-event-result.js';\nimport {TriggerSourceIcon} from './trigger-source-icon.js';\n\nconst DETAIL_RAIL_CLASS =\n '@min-[820px]:sticky @min-[820px]:top-16 @min-[820px]:max-h-[calc(var(--app-content-h,100dvh_-_96px)_-_32px)] @min-[820px]:min-h-[min(320px,calc(var(--app-content-h,100dvh_-_96px)_-_32px))]';\n\nexport interface TriggerEventDetailProps {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n eventId?: string | undefined;\n onBack: () => void;\n}\n\nexport function TriggerEventDetail({\n workspaceId,\n workspaceSlug,\n eventId,\n onBack,\n}: TriggerEventDetailProps) {\n const query = useTriggerEventQuery(eventId);\n\n if (!eventId) return <TriggerEventDetailPlaceholder />;\n if (query.data) {\n return (\n <TriggerEventDetailView\n workspaceId={workspaceId}\n workspaceSlug={workspaceSlug}\n event={query.data}\n onBack={onBack}\n />\n );\n }\n if (query.isError)\n return <TriggerEventDetailError onBack={onBack} onRetry={() => query.refetch()} />;\n return <TriggerEventDetailLoading onBack={onBack} />;\n}\n\nexport function TriggerEventDetailView({\n workspaceId,\n workspaceSlug,\n event,\n onBack,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n onBack: () => void;\n}) {\n const result = triggerEventResult(event);\n const eventLabel = triggerEventDisplayLabel(event);\n const fullEventLabel = triggerEventFullLabel(event);\n const formattedPayload = useMemo(\n () => JSON.stringify(event.payload ?? null, null, 2) ?? 'null',\n [event.payload],\n );\n\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(DETAIL_RAIL_CLASS, 'flex min-h-0 flex-col gap-group')}\n >\n <div className=\"flex shrink-0 flex-col gap-cluster p-panel-compact\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex min-w-0 items-start justify-between gap-cluster\">\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={fullEventLabel}\n className=\"flex min-w-0 items-center gap-inline rounded-6 border-0 bg-transparent p-0 text-left outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={event.provider}\n source={event.source}\n aria-hidden=\"true\"\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n />\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-base\">\n {eventLabel}\n </Code>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Code as=\"span\" variant=\"label\" className=\"block max-w-[360px] break-words\">\n {fullEventLabel}\n </Code>\n </TooltipContent>\n </Tooltip>\n <Text size=\"xs\" className=\"truncate text-foreground-neutral-muted\">\n <RelativeTime value={event.receivedAt} />\n </Text>\n </div>\n <Badge variant={result.badge} size=\"xs\">\n {result.label}\n </Badge>\n </div>\n </div>\n\n <div\n key={event.id}\n className=\"flex min-h-0 flex-1 flex-col gap-group overflow-y-auto scrollbar\"\n >\n <EventRuns workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n <EventPayload payload={formattedPayload} />\n </div>\n </aside>\n );\n}\n\nfunction triggerEventDisplayLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return event.event || event.source;\n}\n\nfunction triggerEventFullLabel(event: Pick<TriggerEventDetailModel, 'event' | 'source'>) {\n return [event.source, event.event].filter(Boolean).join(' · ');\n}\n\nfunction TriggerEventDetailPlaceholder() {\n return (\n <aside aria-label=\"Event details\" className=\"hidden min-h-[240px] @min-[820px]:flex\">\n <Panel className=\"flex min-h-0 flex-1 items-center justify-center p-panel\">\n <EmptyState icon=\"pulseLine\" variant=\"compact\" title=\"No event selected\" />\n </Panel>\n </aside>\n );\n}\n\nfunction TriggerEventDetailLoading({onBack}: {onBack: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col')}\n >\n <Panel className=\"flex min-h-[320px] flex-col gap-group p-panel-compact\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <div className=\"flex flex-col gap-inline\">\n <Skeleton className=\"h-16 w-160\" />\n <Skeleton className=\"h-12 w-120\" />\n </div>\n <Skeleton className=\"h-96\" />\n <Skeleton className=\"h-160\" />\n </Panel>\n </aside>\n );\n}\n\nfunction TriggerEventDetailError({onBack, onRetry}: {onBack: () => void; onRetry: () => void}) {\n return (\n <aside\n aria-label=\"Event details\"\n className={cn(DETAIL_RAIL_CLASS, 'flex min-h-[320px] flex-col')}\n >\n <Panel className=\"flex min-h-[320px] flex-col gap-group p-panel-compact\">\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"sm\"\n iconLeft=\"arrowLeftLine\"\n className=\"self-start @min-[820px]:hidden\"\n onClick={onBack}\n >\n Back to events\n </Button>\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-cluster\">\n <Text size=\"sm\">Event detail could not be loaded.</Text>\n <Button type=\"button\" variant=\"secondary\" size=\"xs\" onClick={onRetry}>\n Retry\n </Button>\n </div>\n </Callout>\n </Panel>\n </aside>\n );\n}\n\nfunction EventRuns({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId?: string | undefined;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n if (event.decisions.length === 0) {\n if (event.outcome === 'discarded') {\n return (\n <Panel>\n <PanelBody className=\"p-panel-compact\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n No workflows are subscribed to this event.\n </Text>\n </PanelBody>\n </Panel>\n );\n }\n return null;\n }\n\n if (!workspaceId) {\n return <EventRunsList workspaceSlug={workspaceSlug} projectSlugs={new Map()} event={event} />;\n }\n\n return (\n <EventRunsWithProjects workspaceId={workspaceId} workspaceSlug={workspaceSlug} event={event} />\n );\n}\n\nfunction EventRunsWithProjects({\n workspaceId,\n workspaceSlug,\n event,\n}: {\n workspaceId: string;\n workspaceSlug?: string | undefined;\n event: TriggerEventDetailModel;\n}) {\n const projectsQuery = useProjectsInfiniteQuery(workspaceId);\n const projectSlugs = useMemo(\n () =>\n new Map(\n projectsQuery.data?.pages\n .flatMap((page) => page.projects)\n .map((project) => [project.id, project.slug] as const),\n ),\n [projectsQuery.data],\n );\n return (\n <EventRunsList\n workspaceSlug={workspaceSlug}\n projectSlugs={projectSlugs}\n projectDetailLookupEnabled={!projectsQuery.isPending}\n event={event}\n />\n );\n}\n\nfunction EventRunsList({\n workspaceSlug,\n projectSlugs,\n projectDetailLookupEnabled = false,\n event,\n}: {\n workspaceSlug?: string | undefined;\n projectSlugs: ReadonlyMap<string, string>;\n projectDetailLookupEnabled?: boolean;\n event: TriggerEventDetailModel;\n}) {\n return (\n <Panel>\n <PanelHeader>\n <PanelTitle>Matched workflows</PanelTitle>\n </PanelHeader>\n <PanelBody>\n <ul>\n {event.decisions.map((decision) => (\n <DecisionRow\n key={decision.id}\n workspaceSlug={workspaceSlug}\n projectId={decision.projectId ?? undefined}\n projectSlug={decision.projectId ? projectSlugs.get(decision.projectId) : undefined}\n projectDetailLookupEnabled={projectDetailLookupEnabled}\n decision={decision}\n />\n ))}\n </ul>\n </PanelBody>\n </Panel>\n );\n}\n\nfunction DecisionRow({\n projectId,\n projectSlug,\n workspaceSlug,\n projectDetailLookupEnabled,\n decision,\n}: {\n projectId?: string | undefined;\n projectSlug?: string | undefined;\n workspaceSlug?: string | undefined;\n projectDetailLookupEnabled: boolean;\n decision: TriggerEventMatchedWorkflowResult;\n}) {\n const canRenderRunLink =\n decision.decision === 'triggered' && Boolean(decision.runId && decision.runName);\n const projectQuery = useProjectQuery(\n canRenderRunLink && projectDetailLookupEnabled && !projectSlug ? projectId : undefined,\n );\n const resolvedProjectSlug = projectSlug ?? projectQuery.data?.slug;\n\n if (decision.decision !== 'triggered' || !decision.runId || !decision.runName) {\n return (\n <li className=\"border-b border-border-neutral-base px-row py-row last:border-b-0\">\n <div className=\"flex min-w-0 items-start gap-inline\">\n <Icon\n name=\"cornerDownRightLine\"\n className=\"size-14 shrink-0 text-foreground-neutral-disabled\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Text size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n {decision.reason ? (\n <Text size=\"xs\" className=\"text-foreground-highlight-error\">\n {decision.reason}\n </Text>\n ) : (\n <Text size=\"xs\" className=\"text-foreground-neutral-disabled\">\n No run created\n </Text>\n )}\n </div>\n </div>\n </li>\n );\n }\n\n const row = (\n <>\n <Icon\n name=\"cornerDownRightLine\"\n className=\"size-14 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <span className=\"flex min-w-0 flex-col gap-tight\">\n <Text as=\"span\" size=\"sm\" className=\"min-w-0 truncate text-foreground-neutral-base\">\n {decision.subscriptionName}\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"truncate text-foreground-neutral-muted\">\n {decision.runName}\n </Code>\n </span>\n </>\n );\n const rowClassName =\n 'flex min-w-0 items-start gap-inline px-row py-row hover:bg-background-neutral-hover focus-visible:outline-none focus-visible:shadow-button-neutral-focus';\n\n return (\n <li className=\"border-b border-border-neutral-base last:border-b-0\">\n {workspaceSlug && resolvedProjectSlug ? (\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId\"\n params={{\n workspaceSlug,\n projectSlug: resolvedProjectSlug,\n workflowRunId: decision.runId,\n }}\n className={rowClassName}\n >\n {row}\n </Link>\n ) : (\n <div className={rowClassName}>{row}</div>\n )}\n </li>\n );\n}\n\nfunction EventPayload({payload}: {payload: string}) {\n const data = [{language: 'json', filename: 'payload.json', code: payload}];\n\n return (\n <Panel>\n <PanelHeader>\n <PanelTitle>Payload</PanelTitle>\n </PanelHeader>\n <PanelBody className=\"p-0\">\n <CodeBlock\n data={data}\n className=\"flex h-auto flex-col overflow-visible rounded-none bg-background-contrast-base shadow-none\"\n >\n <CodeBlockHeader className=\"sticky top-0 z-10 shrink-0 border-b border-border-contrast-base bg-background-contrast-base p-tight\">\n <CodeBlockFiles>\n {(item) => (\n <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>\n )}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody className=\"min-h-0 scrollbar\">\n {(item) => (\n <CodeBlockItem\n value={item.filename}\n lineNumbers={false}\n className=\"px-0 pb-0 [&>div]:rounded-none [&>div]:border-0 [&>div]:bg-background-contrast-base [&_code]:!text-foreground-neutral-on-color\"\n >\n <CodeBlockContent language=\"json\" syntaxHighlighting={false}>\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </PanelBody>\n </Panel>\n );\n}\n"],"names":["useProjectQuery","useProjectsInfiniteQuery","Badge","Button","Callout","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","EmptyState","Icon","Panel","PanelBody","PanelHeader","PanelTitle","RelativeTime","Skeleton","Tooltip","TooltipContent","TooltipTrigger","Code","Text","cn","Link","useMemo","useTriggerEventQuery","triggerEventResult","TriggerSourceIcon","DETAIL_RAIL_CLASS","TriggerEventDetail","workspaceId","workspaceSlug","eventId","onBack","query","TriggerEventDetailPlaceholder","data","TriggerEventDetailView","event","isError","TriggerEventDetailError","onRetry","refetch","TriggerEventDetailLoading","result","eventLabel","triggerEventDisplayLabel","fullEventLabel","triggerEventFullLabel","formattedPayload","JSON","stringify","payload","aside","aria-label","className","div","type","variant","size","iconLeft","onClick","asChild","button","provider","source","aria-hidden","as","value","receivedAt","badge","label","EventRuns","EventPayload","id","filter","Boolean","join","icon","title","role","decisions","length","outcome","EventRunsList","projectSlugs","Map","EventRunsWithProjects","projectsQuery","pages","flatMap","page","projects","map","project","slug","projectDetailLookupEnabled","isPending","ul","decision","DecisionRow","projectId","undefined","projectSlug","get","canRenderRunLink","runId","runName","projectQuery","resolvedProjectSlug","li","name","subscriptionName","reason","row","span","rowClassName","to","params","workflowRunId","language","filename","code","item","lineNumbers","syntaxHighlighting"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-page.d.ts","sourceRoot":"","sources":["../../src/pages/events-page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events-page.d.ts","sourceRoot":"","sources":["../../src/pages/events-page.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,mBAAmB,EAAsB,MAAM,wBAAwB,CAAC;AAMrF,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;CAChE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,WAAW,EACX,aAAa,EACb,OAAO,EACP,eAAe,GAChB,EAAE,eAAe,+BA8CjB"}
|