@shipfox/client-workflows 15.0.0 → 17.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/.storybook/preview.css +4 -0
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +41 -0
- package/dist/components/identifier/identifier.js +2 -2
- package/dist/components/identifier/identifier.js.map +1 -1
- package/dist/components/job-detail/agent-config-failure-callout.d.ts.map +1 -1
- package/dist/components/job-detail/agent-config-failure-callout.js +1 -1
- package/dist/components/job-detail/agent-config-failure-callout.js.map +1 -1
- package/dist/components/job-detail/job-context-panel.d.ts +6 -0
- package/dist/components/job-detail/job-context-panel.d.ts.map +1 -0
- package/dist/components/job-detail/job-context-panel.js +224 -0
- package/dist/components/job-detail/job-context-panel.js.map +1 -0
- package/dist/components/job-detail/job-detail-header.d.ts +10 -1
- package/dist/components/job-detail/job-detail-header.d.ts.map +1 -1
- package/dist/components/job-detail/job-detail-header.js +58 -39
- package/dist/components/job-detail/job-detail-header.js.map +1 -1
- package/dist/components/job-detail/job-detail-view.d.ts +1 -1
- package/dist/components/job-detail/job-detail-view.d.ts.map +1 -1
- package/dist/components/job-detail/job-detail-view.js +92 -41
- package/dist/components/job-detail/job-detail-view.js.map +1 -1
- package/dist/components/job-detail/job-empty-states.d.ts.map +1 -1
- package/dist/components/job-detail/job-empty-states.js +19 -10
- package/dist/components/job-detail/job-empty-states.js.map +1 -1
- package/dist/components/job-detail/job-execution-switcher.js +4 -4
- package/dist/components/job-detail/job-execution-switcher.js.map +1 -1
- package/dist/components/job-detail/json-code.d.ts +14 -0
- package/dist/components/job-detail/json-code.d.ts.map +1 -0
- package/dist/components/job-detail/json-code.js +93 -0
- package/dist/components/job-detail/json-code.js.map +1 -0
- package/dist/components/job-detail/step-attempt-log-panel.d.ts.map +1 -1
- package/dist/components/job-detail/step-attempt-log-panel.js +9 -6
- package/dist/components/job-detail/step-attempt-log-panel.js.map +1 -1
- package/dist/components/job-detail/step-troubleshooting.d.ts +18 -0
- package/dist/components/job-detail/step-troubleshooting.d.ts.map +1 -0
- package/dist/components/job-detail/step-troubleshooting.js +493 -0
- package/dist/components/job-detail/step-troubleshooting.js.map +1 -0
- package/dist/components/job-graph/job-graph-content.d.ts.map +1 -1
- package/dist/components/job-graph/job-graph-content.js +5 -4
- package/dist/components/job-graph/job-graph-content.js.map +1 -1
- package/dist/components/job-graph/job-node.js +3 -3
- package/dist/components/job-graph/job-node.js.map +1 -1
- package/dist/components/step-list/index.d.ts +1 -0
- package/dist/components/step-list/index.d.ts.map +1 -1
- package/dist/components/step-list/index.js.map +1 -1
- package/dist/components/step-list/step-list-model.d.ts.map +1 -1
- package/dist/components/step-list/step-list-model.js +5 -0
- package/dist/components/step-list/step-list-model.js.map +1 -1
- package/dist/components/step-list/step-list.d.ts +5 -1
- package/dist/components/step-list/step-list.d.ts.map +1 -1
- package/dist/components/step-list/step-list.js +117 -82
- package/dist/components/step-list/step-list.js.map +1 -1
- package/dist/components/workflow-run-duration-label.js +1 -1
- package/dist/components/workflow-run-duration-label.js.map +1 -1
- package/dist/components/workflow-run-list/job-status-strip.js +6 -6
- package/dist/components/workflow-run-list/job-status-strip.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-filter-menu.js +1 -1
- package/dist/components/workflow-run-list/workflow-run-filter-menu.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-filters.js +4 -4
- package/dist/components/workflow-run-list/workflow-run-filters.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-list-states.js +6 -6
- package/dist/components/workflow-run-list/workflow-run-list-states.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-list-view.js +1 -1
- package/dist/components/workflow-run-list/workflow-run-list-view.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-row.js +7 -7
- package/dist/components/workflow-run-list/workflow-run-row.js.map +1 -1
- package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js +1 -1
- package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js.map +1 -1
- package/dist/components/workflow-run-summary/workflow-run-summary.d.ts +0 -1
- package/dist/components/workflow-run-summary/workflow-run-summary.d.ts.map +1 -1
- package/dist/components/workflow-run-summary/workflow-run-summary.js +9 -13
- package/dist/components/workflow-run-summary/workflow-run-summary.js.map +1 -1
- package/dist/components/workflow-run-tabs/index.d.ts +3 -0
- package/dist/components/workflow-run-tabs/index.d.ts.map +1 -1
- package/dist/components/workflow-run-tabs/index.js +3 -0
- package/dist/components/workflow-run-tabs/index.js.map +1 -1
- package/dist/components/workflow-run-tabs/run-annotation-count-chip.d.ts +16 -0
- package/dist/components/workflow-run-tabs/run-annotation-count-chip.d.ts.map +1 -0
- package/dist/components/workflow-run-tabs/run-annotation-count-chip.js +50 -0
- package/dist/components/workflow-run-tabs/run-annotation-count-chip.js.map +1 -0
- package/dist/components/workflow-run-tabs/run-annotation-item.d.ts +20 -0
- package/dist/components/workflow-run-tabs/run-annotation-item.d.ts.map +1 -0
- package/dist/components/workflow-run-tabs/run-annotation-item.js +102 -0
- package/dist/components/workflow-run-tabs/run-annotation-item.js.map +1 -0
- package/dist/components/workflow-run-tabs/run-annotation-list.d.ts +39 -0
- package/dist/components/workflow-run-tabs/run-annotation-list.d.ts.map +1 -0
- package/dist/components/workflow-run-tabs/run-annotation-list.js +211 -0
- package/dist/components/workflow-run-tabs/run-annotation-list.js.map +1 -0
- package/dist/components/workflow-run-tabs/run-annotation-summary-line.d.ts +1 -1
- package/dist/components/workflow-run-tabs/run-annotation-summary-line.d.ts.map +1 -1
- package/dist/components/workflow-run-tabs/run-annotation-summary-line.js +90 -25
- package/dist/components/workflow-run-tabs/run-annotation-summary-line.js.map +1 -1
- package/dist/components/workflow-run-tabs/severity-visuals.d.ts +20 -0
- package/dist/components/workflow-run-tabs/severity-visuals.d.ts.map +1 -0
- package/dist/components/workflow-run-tabs/severity-visuals.js +31 -0
- package/dist/components/workflow-run-tabs/severity-visuals.js.map +1 -0
- package/dist/components/workflow-run-view/run-workspace-nav.d.ts +1 -1
- package/dist/components/workflow-run-view/run-workspace-nav.d.ts.map +1 -1
- package/dist/components/workflow-run-view/run-workspace-nav.js +16 -10
- package/dist/components/workflow-run-view/run-workspace-nav.js.map +1 -1
- package/dist/components/workflow-run-view/workflow-run-states.js +6 -6
- package/dist/components/workflow-run-view/workflow-run-states.js.map +1 -1
- package/dist/components/workflow-run-view/workflow-run-view.d.ts +1 -3
- package/dist/components/workflow-run-view/workflow-run-view.d.ts.map +1 -1
- package/dist/components/workflow-run-view/workflow-run-view.js +217 -59
- package/dist/components/workflow-run-view/workflow-run-view.js.map +1 -1
- package/dist/core/entities/job-execution.d.ts +7 -0
- package/dist/core/entities/job-execution.d.ts.map +1 -1
- package/dist/core/entities/job-execution.js.map +1 -1
- package/dist/core/entities/job.d.ts +9 -0
- package/dist/core/entities/job.d.ts.map +1 -1
- package/dist/core/entities/job.js.map +1 -1
- package/dist/core/entities/step-attempt.d.ts +29 -0
- package/dist/core/entities/step-attempt.d.ts.map +1 -1
- package/dist/core/entities/step-attempt.js.map +1 -1
- package/dist/core/entities/step.d.ts +3 -1
- package/dist/core/entities/step.d.ts.map +1 -1
- package/dist/core/entities/step.js.map +1 -1
- package/dist/core/run-annotation.d.ts +79 -0
- package/dist/core/run-annotation.d.ts.map +1 -0
- package/dist/core/run-annotation.js +125 -0
- package/dist/core/run-annotation.js.map +1 -0
- package/dist/core/workflow-run.d.ts +1 -1
- package/dist/core/workflow-run.d.ts.map +1 -1
- package/dist/core/workflow-run.js.map +1 -1
- package/dist/hooks/api/annotations.d.ts +63 -0
- package/dist/hooks/api/annotations.d.ts.map +1 -0
- package/dist/hooks/api/annotations.js +145 -0
- package/dist/hooks/api/annotations.js.map +1 -0
- package/dist/hooks/api/run-annotation-mapper.d.ts +10 -0
- package/dist/hooks/api/run-annotation-mapper.d.ts.map +1 -0
- package/dist/hooks/api/run-annotation-mapper.js +22 -0
- package/dist/hooks/api/run-annotation-mapper.js.map +1 -0
- package/dist/hooks/api/run-annotations.d.ts +25 -0
- package/dist/hooks/api/run-annotations.d.ts.map +1 -0
- package/dist/hooks/api/run-annotations.js +78 -0
- package/dist/hooks/api/run-annotations.js.map +1 -0
- package/dist/hooks/api/step-attempt-detail.d.ts +14 -0
- package/dist/hooks/api/step-attempt-detail.d.ts.map +1 -0
- package/dist/hooks/api/step-attempt-detail.js +43 -0
- package/dist/hooks/api/step-attempt-detail.js.map +1 -0
- package/dist/hooks/api/workflow-run-mapper.d.ts +9 -2
- package/dist/hooks/api/workflow-run-mapper.d.ts.map +1 -1
- package/dist/hooks/api/workflow-run-mapper.js +47 -0
- package/dist/hooks/api/workflow-run-mapper.js.map +1 -1
- package/dist/pages/project-workflows-page.js +19 -19
- package/dist/pages/project-workflows-page.js.map +1 -1
- package/dist/pages/workflow-run-list-page.js +1 -1
- package/dist/pages/workflow-run-list-page.js.map +1 -1
- package/dist/routes/inputs.d.ts +7 -2
- package/dist/routes/inputs.d.ts.map +1 -1
- package/dist/routes/inputs.js +5 -6
- package/dist/routes/inputs.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +10 -9
- package/src/components/identifier/identifier.tsx +2 -2
- package/src/components/job-detail/agent-config-failure-callout.tsx +5 -1
- package/src/components/job-detail/job-context-panel.test.tsx +72 -0
- package/src/components/job-detail/job-context-panel.tsx +237 -0
- package/src/components/job-detail/job-detail-header.test.tsx +3 -0
- package/src/components/job-detail/job-detail-header.tsx +65 -34
- package/src/components/job-detail/job-detail-view.stories.tsx +555 -48
- package/src/components/job-detail/job-detail-view.tsx +101 -42
- package/src/components/job-detail/job-empty-states.tsx +23 -10
- package/src/components/job-detail/job-execution-switcher.tsx +5 -5
- package/src/components/job-detail/json-code.tsx +120 -0
- package/src/components/job-detail/step-attempt-log-panel.test.tsx +1 -0
- package/src/components/job-detail/step-attempt-log-panel.tsx +17 -6
- package/src/components/job-detail/step-troubleshooting.stories.tsx +120 -0
- package/src/components/job-detail/step-troubleshooting.test.tsx +337 -0
- package/src/components/job-detail/step-troubleshooting.tsx +537 -0
- package/src/components/job-graph/job-graph-content.tsx +4 -3
- package/src/components/job-graph/job-node.tsx +3 -3
- package/src/components/step-list/index.ts +1 -0
- package/src/components/step-list/step-list-model.ts +5 -0
- package/src/components/step-list/step-list.test.tsx +75 -2
- package/src/components/step-list/step-list.tsx +73 -20
- package/src/components/workflow-run-duration-label.tsx +1 -1
- package/src/components/workflow-run-list/job-status-strip.tsx +6 -6
- package/src/components/workflow-run-list/workflow-run-filter-menu.tsx +1 -1
- package/src/components/workflow-run-list/workflow-run-filters.tsx +4 -4
- package/src/components/workflow-run-list/workflow-run-list-states.tsx +6 -6
- package/src/components/workflow-run-list/workflow-run-list-view.tsx +1 -1
- package/src/components/workflow-run-list/workflow-run-row.tsx +7 -7
- package/src/components/workflow-run-summary/workflow-run-attempt-switcher.tsx +1 -1
- package/src/components/workflow-run-summary/workflow-run-summary.test.tsx +1 -1
- package/src/components/workflow-run-summary/workflow-run-summary.tsx +12 -12
- package/src/components/workflow-run-tabs/index.ts +7 -0
- package/src/components/workflow-run-tabs/run-annotation-count-chip.tsx +63 -0
- package/src/components/workflow-run-tabs/run-annotation-item.tsx +123 -0
- package/src/components/workflow-run-tabs/run-annotation-list.tsx +273 -0
- package/src/components/workflow-run-tabs/run-annotation-summary-line.test.tsx +77 -3
- package/src/components/workflow-run-tabs/run-annotation-summary-line.tsx +95 -20
- package/src/components/workflow-run-tabs/run-annotations.stories.tsx +293 -0
- package/src/components/workflow-run-tabs/severity-visuals.ts +37 -0
- package/src/components/workflow-run-view/run-workspace-nav.test.tsx +44 -0
- package/src/components/workflow-run-view/run-workspace-nav.tsx +22 -9
- package/src/components/workflow-run-view/workflow-run-states.tsx +6 -6
- package/src/components/workflow-run-view/workflow-run-view.test.tsx +246 -20
- package/src/components/workflow-run-view/workflow-run-view.tsx +255 -37
- package/src/core/entities/job-execution.ts +7 -0
- package/src/core/entities/job.ts +9 -0
- package/src/core/entities/step-attempt.ts +33 -0
- package/src/core/entities/step.ts +3 -1
- package/src/core/run-annotation.test.ts +315 -0
- package/src/core/run-annotation.ts +244 -0
- package/src/core/workflow-run.ts +4 -0
- package/src/hooks/api/annotations.test.ts +84 -0
- package/src/hooks/api/annotations.ts +240 -0
- package/src/hooks/api/run-annotation-mapper.ts +30 -0
- package/src/hooks/api/run-annotations.ts +137 -0
- package/src/hooks/api/step-attempt-detail.ts +67 -0
- package/src/hooks/api/workflow-run-mapper.ts +46 -0
- package/src/hooks/api/workflow-runs.test.tsx +61 -1
- package/src/pages/project-workflows-page.tsx +19 -19
- package/src/pages/workflow-job-detail-page.test.tsx +118 -1
- package/src/pages/workflow-run-list-page.tsx +1 -1
- package/src/routes/inputs.ts +7 -2
- package/test/fixtures/workflow-run.ts +7 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/core/workflow-run-tabs.d.ts +0 -9
- package/dist/core/workflow-run-tabs.d.ts.map +0 -1
- package/dist/core/workflow-run-tabs.js +0 -3
- package/dist/core/workflow-run-tabs.js.map +0 -1
- package/src/core/workflow-run-tabs.ts +0 -8
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { TriggerSourceIcon } from '@shipfox/client-triggers';
|
|
3
|
+
import { MetadataSeparator } from '@shipfox/client-ui';
|
|
3
4
|
import { Badge } from '@shipfox/react-ui/badge';
|
|
4
5
|
import { Button } from '@shipfox/react-ui/button';
|
|
5
6
|
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@shipfox/react-ui/dropdown-menu';
|
|
@@ -40,14 +41,14 @@ export function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling
|
|
|
40
41
|
reducedMotionIntervalMs: 10_000,
|
|
41
42
|
children: /*#__PURE__*/ _jsx("section", {
|
|
42
43
|
"aria-labelledby": headingId,
|
|
43
|
-
className: "bg-background-neutral-background px-
|
|
44
|
+
className: "bg-background-neutral-background px-row py-row",
|
|
44
45
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
45
|
-
className: "grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-
|
|
46
|
+
className: "grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-cluster gap-y-inline overflow-hidden max-[480px]:grid-cols-1",
|
|
46
47
|
children: [
|
|
47
48
|
/*#__PURE__*/ _jsx("div", {
|
|
48
49
|
className: "col-start-1 row-start-1 min-w-0 max-[480px]:col-start-auto max-[480px]:row-start-auto",
|
|
49
50
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
50
|
-
className: "flex min-w-0 items-center gap-
|
|
51
|
+
className: "flex min-w-0 items-center gap-inline",
|
|
51
52
|
children: [
|
|
52
53
|
/*#__PURE__*/ _jsx(Badge, {
|
|
53
54
|
variant: status.badge,
|
|
@@ -65,6 +66,7 @@ export function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling
|
|
|
65
66
|
/*#__PURE__*/ _jsx(TooltipTrigger, {
|
|
66
67
|
asChild: true,
|
|
67
68
|
children: /*#__PURE__*/ _jsx(Header, {
|
|
69
|
+
as: "h1",
|
|
68
70
|
id: headingId,
|
|
69
71
|
variant: "h3",
|
|
70
72
|
className: "min-w-0 truncate",
|
|
@@ -89,7 +91,7 @@ export function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling
|
|
|
89
91
|
})
|
|
90
92
|
}),
|
|
91
93
|
hasAction ? /*#__PURE__*/ _jsx("div", {
|
|
92
|
-
className: "col-start-2 row-start-1 flex min-w-max items-center gap-
|
|
94
|
+
className: "col-start-2 row-start-1 flex min-w-max items-center gap-inline justify-self-end max-[480px]:col-start-auto max-[480px]:row-start-auto max-[480px]:justify-self-start",
|
|
93
95
|
children: /*#__PURE__*/ _jsx(WorkflowRunActionSlot, {
|
|
94
96
|
action: action,
|
|
95
97
|
cancelling: cancelling,
|
|
@@ -99,7 +101,7 @@ export function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling
|
|
|
99
101
|
})
|
|
100
102
|
}) : null,
|
|
101
103
|
/*#__PURE__*/ _jsxs("div", {
|
|
102
|
-
className: "col-span-2 row-start-2 flex min-w-0 items-center gap-
|
|
104
|
+
className: "col-span-2 row-start-2 flex min-w-0 items-center gap-cluster overflow-hidden text-foreground-neutral-subtle max-[480px]:col-span-1 max-[480px]:row-start-auto",
|
|
103
105
|
children: [
|
|
104
106
|
run.number !== null ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
105
107
|
children: [
|
|
@@ -127,7 +129,7 @@ export function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling
|
|
|
127
129
|
children: /*#__PURE__*/ _jsxs("button", {
|
|
128
130
|
type: "button",
|
|
129
131
|
"aria-label": run.triggerLabel,
|
|
130
|
-
className: "inline-flex max-w-full min-w-0 cursor-help items-center gap-
|
|
132
|
+
className: "inline-flex max-w-full min-w-0 cursor-help items-center gap-tight rounded-6 border-0 bg-transparent p-0 text-left text-foreground-neutral-subtle outline-none focus-visible:shadow-button-neutral-focus",
|
|
131
133
|
children: [
|
|
132
134
|
/*#__PURE__*/ _jsx(TriggerSourceIcon, {
|
|
133
135
|
provider: run.triggerProvider,
|
|
@@ -175,7 +177,7 @@ export function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling
|
|
|
175
177
|
children: [
|
|
176
178
|
/*#__PURE__*/ _jsx(MetadataSeparator, {}),
|
|
177
179
|
/*#__PURE__*/ _jsxs("span", {
|
|
178
|
-
className: "flex min-w-0 items-center gap-
|
|
180
|
+
className: "flex min-w-0 items-center gap-tight",
|
|
179
181
|
children: [
|
|
180
182
|
/*#__PURE__*/ _jsx(Text, {
|
|
181
183
|
as: "span",
|
|
@@ -279,11 +281,5 @@ function hasFailedOrCancelledJobs(run) {
|
|
|
279
281
|
function workflowRunHasJobs(run) {
|
|
280
282
|
return 'jobs' in run && Array.isArray(run.jobs);
|
|
281
283
|
}
|
|
282
|
-
export function MetadataSeparator() {
|
|
283
|
-
return /*#__PURE__*/ _jsx("span", {
|
|
284
|
-
"aria-hidden": "true",
|
|
285
|
-
className: "h-12 w-px shrink-0 bg-border-neutral-base"
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
284
|
|
|
289
285
|
//# sourceMappingURL=workflow-run-summary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/workflow-run-summary/workflow-run-summary.tsx"],"sourcesContent":["import {TriggerSourceIcon} from '@shipfox/client-triggers';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {useIsTextTruncated} from '@shipfox/react-ui/hooks';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {TimeTickerProvider} from '@shipfox/react-ui/time-ticker';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Header, Text} from '@shipfox/react-ui/typography';\nimport {useId} from 'react';\nimport {WorkflowRunNumberLabel} from '#components/workflow-run-number-label.js';\nimport {\n isWorkflowRunTerminal,\n type Job,\n WORKFLOW_RUN_STATUSES,\n type WorkflowRunDetail,\n type WorkflowRunRerunMode,\n workflowRunBlockingJob,\n workflowRunDetailDisplay,\n} from '#core/workflow-run.js';\nimport {WorkflowRunDurationLabel} from '../workflow-run-duration-label.js';\nimport {getWorkflowStatusVisual} from '../workflow-status/status-visuals.js';\nimport {WorkflowRunAttemptSwitcher} from './workflow-run-attempt-switcher.js';\n\nconst STATUS_BADGE_LABEL_WIDTH_CH = Math.max(\n ...[...WORKFLOW_RUN_STATUSES, 'queued' as const].map(\n (status) => getWorkflowStatusVisual(status).label.length,\n ),\n);\nconst RERUN_BUTTON_SURFACE_CLASS_NAME =\n 'bg-background-neutral-base hover:bg-background-neutral-hover active:bg-background-neutral-pressed';\n\ntype WorkflowRunAction = 'cancel' | 'rerun-all' | 'rerun-menu' | 'none';\n\nexport interface WorkflowRunSummaryProps {\n workspaceSlug?: string | undefined;\n projectSlug?: string | undefined;\n run: WorkflowRunDetail;\n cancelling?: boolean | undefined;\n onCancel?: (() => void) | undefined;\n rerunPending?: boolean | undefined;\n onRerun?: ((mode: WorkflowRunRerunMode) => void) | undefined;\n latestAttempt?: number | undefined;\n}\n\nexport function WorkflowRunSummary({\n workspaceSlug,\n projectSlug,\n run,\n cancelling = false,\n onCancel,\n rerunPending = false,\n onRerun,\n latestAttempt,\n}: WorkflowRunSummaryProps) {\n const headingId = useId();\n const display = workflowRunDetailDisplay(run);\n const status = getWorkflowStatusVisual(display.status);\n const action = workflowRunActionForRun(run);\n const hasAction = canRenderWorkflowRunAction(action, onCancel, onRerun);\n const attemptSwitcher =\n latestAttempt && latestAttempt > 1 && workspaceSlug && projectSlug\n ? {workspaceSlug, projectSlug, latestAttempt}\n : null;\n const displayDuration = display.duration;\n // Named only while the run is waiting and has more than one job: with a single job the rail\n // and the graph already say which one it is.\n const blockingJob =\n display.status === 'queued' && run.jobs.length > 1 ? workflowRunBlockingJob(run.jobs) : null;\n const {ref: headingTextRef, isTruncated: isHeadingTruncated} =\n useIsTextTruncated<HTMLSpanElement>(run.name);\n\n return (\n <TimeTickerProvider intervalMs={1000} reducedMotionIntervalMs={10_000}>\n <section aria-labelledby={headingId} className=\"bg-background-neutral-background px-16 py-12\">\n <div className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-12 gap-y-8 overflow-hidden max-[480px]:grid-cols-1\">\n <div className=\"col-start-1 row-start-1 min-w-0 max-[480px]:col-start-auto max-[480px]:row-start-auto\">\n <div className=\"flex min-w-0 items-center gap-8\">\n <Badge variant={status.badge} size=\"xs\">\n <span className=\"text-center\" style={{width: `${STATUS_BADGE_LABEL_WIDTH_CH}ch`}}>\n {status.label}\n </span>\n </Badge>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Header id={headingId} variant=\"h3\" className=\"min-w-0 truncate\">\n <span ref={headingTextRef} className=\"block min-w-0 truncate\">\n {run.name}\n </span>\n </Header>\n </TooltipTrigger>\n {isHeadingTruncated ? (\n <TooltipContent>\n <Text as=\"span\" size=\"xs\" className=\"max-w-[360px] break-words\">\n {run.name}\n </Text>\n </TooltipContent>\n ) : null}\n </Tooltip>\n </div>\n </div>\n\n {hasAction ? (\n <div className=\"col-start-2 row-start-1 flex min-w-max items-center gap-6 justify-self-end max-[480px]:col-start-auto max-[480px]:row-start-auto max-[480px]:justify-self-start\">\n <WorkflowRunActionSlot\n action={action}\n cancelling={cancelling}\n onCancel={onCancel}\n rerunPending={rerunPending}\n onRerun={onRerun}\n />\n </div>\n ) : null}\n\n <div className=\"col-span-2 row-start-2 flex min-w-0 items-center gap-12 overflow-hidden text-foreground-neutral-subtle max-[480px]:col-span-1 max-[480px]:row-start-auto\">\n {run.number !== null ? (\n <>\n <WorkflowRunNumberLabel run={run} />\n {attemptSwitcher || run.triggerDisplayLabel ? <MetadataSeparator /> : null}\n </>\n ) : null}\n\n {attemptSwitcher ? (\n <WorkflowRunAttemptSwitcher\n workspaceSlug={attemptSwitcher.workspaceSlug}\n projectSlug={attemptSwitcher.projectSlug}\n run={run}\n latestAttempt={attemptSwitcher.latestAttempt}\n />\n ) : null}\n\n {run.triggerDisplayLabel ? (\n <>\n {attemptSwitcher ? <MetadataSeparator /> : null}\n <span className=\"min-w-0\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={run.triggerLabel}\n className=\"inline-flex max-w-full min-w-0 cursor-help items-center gap-4 rounded-6 border-0 bg-transparent p-0 text-left text-foreground-neutral-subtle outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={run.triggerProvider}\n source={run.triggerSource}\n aria-hidden=\"true\"\n className=\"size-12 shrink-0\"\n />\n <Text as=\"span\" size=\"xs\" className=\"min-w-0 truncate\">\n {run.triggerDisplayLabel}\n </Text>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Text as=\"span\" size=\"xs\" className=\"block max-w-[360px] break-words\">\n {run.triggerLabel}\n </Text>\n </TooltipContent>\n </Tooltip>\n </span>\n </>\n ) : null}\n\n {run.number !== null || attemptSwitcher || run.triggerDisplayLabel ? (\n <MetadataSeparator />\n ) : null}\n <RelativeTime\n value={run.runAttempt.createdAt}\n className=\"shrink-0 whitespace-nowrap text-xs leading-20 text-foreground-neutral-subtle\"\n />\n\n {displayDuration ? (\n <>\n <MetadataSeparator />\n <WorkflowRunDurationLabel\n duration={displayDuration}\n className=\"text-foreground-neutral-subtle\"\n />\n </>\n ) : null}\n\n {blockingJob ? (\n <>\n <MetadataSeparator />\n <span className=\"flex min-w-0 items-center gap-4\">\n <Text as=\"span\" size=\"xs\" className=\"shrink-0\">\n waiting on\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"min-w-0 truncate\">\n {blockingJob.displayName}\n </Code>\n </span>\n </>\n ) : null}\n </div>\n </div>\n </section>\n </TimeTickerProvider>\n );\n}\n\nfunction WorkflowRunActionSlot({\n action,\n cancelling,\n onCancel,\n rerunPending,\n onRerun,\n}: {\n action: WorkflowRunAction;\n cancelling: boolean;\n onCancel?: (() => void) | undefined;\n rerunPending: boolean;\n onRerun?: ((mode: WorkflowRunRerunMode) => void) | undefined;\n}) {\n if (action === 'none') return null;\n\n if (action === 'cancel') {\n if (!onCancel) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"danger\"\n size=\"xs\"\n isLoading={cancelling}\n disabled={cancelling}\n onClick={onCancel}\n >\n Cancel workflow\n </Button>\n );\n }\n\n if (action === 'rerun-all') {\n if (!onRerun) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"xs\"\n className={RERUN_BUTTON_SURFACE_CLASS_NAME}\n isLoading={rerunPending}\n disabled={rerunPending}\n onClick={() => onRerun('all')}\n >\n Re-run workflow\n </Button>\n );\n }\n\n if (!onRerun) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"xs\"\n className={RERUN_BUTTON_SURFACE_CLASS_NAME}\n iconRight=\"arrowDownSLine\"\n isLoading={rerunPending}\n disabled={rerunPending}\n >\n Re-run jobs\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem disabled={rerunPending} onSelect={() => onRerun('all')}>\n Re-run all jobs\n </DropdownMenuItem>\n <DropdownMenuItem disabled={rerunPending} onSelect={() => onRerun('failed')}>\n Re-run failed jobs\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction workflowRunActionForRun(run: WorkflowRunDetail): WorkflowRunAction {\n if (run.runAttempt.attempt !== run.currentAttempt) return 'none';\n if (!isWorkflowRunTerminal(run.runAttempt.status)) return 'cancel';\n if (run.runAttempt.status === 'succeeded' || !hasFailedOrCancelledJobs(run)) return 'rerun-all';\n return 'rerun-menu';\n}\n\nfunction canRenderWorkflowRunAction(\n action: WorkflowRunAction,\n onCancel: (() => void) | undefined,\n onRerun: ((mode: WorkflowRunRerunMode) => void) | undefined,\n): boolean {\n if (action === 'cancel') return onCancel !== undefined;\n if (action === 'rerun-all' || action === 'rerun-menu') return onRerun !== undefined;\n return false;\n}\n\nfunction hasFailedOrCancelledJobs(run: WorkflowRunDetail): boolean {\n if (!workflowRunHasJobs(run)) return false;\n\n return run.jobs.some((job) => job.status === 'failed' || job.status === 'cancelled');\n}\n\nfunction workflowRunHasJobs(run: WorkflowRunDetail): run is WorkflowRunDetail & {jobs: Job[]} {\n return 'jobs' in run && Array.isArray(run.jobs);\n}\n\nexport function MetadataSeparator() {\n return <span aria-hidden=\"true\" className=\"h-12 w-px shrink-0 bg-border-neutral-base\" />;\n}\n"],"names":["TriggerSourceIcon","Badge","Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","useIsTextTruncated","RelativeTime","TimeTickerProvider","Tooltip","TooltipContent","TooltipTrigger","Code","Header","Text","useId","WorkflowRunNumberLabel","isWorkflowRunTerminal","WORKFLOW_RUN_STATUSES","workflowRunBlockingJob","workflowRunDetailDisplay","WorkflowRunDurationLabel","getWorkflowStatusVisual","WorkflowRunAttemptSwitcher","STATUS_BADGE_LABEL_WIDTH_CH","Math","max","map","status","label","length","RERUN_BUTTON_SURFACE_CLASS_NAME","WorkflowRunSummary","workspaceSlug","projectSlug","run","cancelling","onCancel","rerunPending","onRerun","latestAttempt","headingId","display","action","workflowRunActionForRun","hasAction","canRenderWorkflowRunAction","attemptSwitcher","displayDuration","duration","blockingJob","jobs","ref","headingTextRef","isTruncated","isHeadingTruncated","name","intervalMs","reducedMotionIntervalMs","section","aria-labelledby","className","div","variant","badge","size","span","style","width","asChild","id","as","WorkflowRunActionSlot","number","triggerDisplayLabel","MetadataSeparator","button","type","aria-label","triggerLabel","provider","triggerProvider","source","triggerSource","aria-hidden","value","runAttempt","createdAt","displayName","isLoading","disabled","onClick","iconRight","align","onSelect","attempt","currentAttempt","hasFailedOrCancelledJobs","undefined","workflowRunHasJobs","some","job","Array","isArray"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/workflow-run-summary/workflow-run-summary.tsx"],"sourcesContent":["import {TriggerSourceIcon} from '@shipfox/client-triggers';\nimport {MetadataSeparator} from '@shipfox/client-ui';\nimport {Badge} from '@shipfox/react-ui/badge';\nimport {Button} from '@shipfox/react-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {useIsTextTruncated} from '@shipfox/react-ui/hooks';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {TimeTickerProvider} from '@shipfox/react-ui/time-ticker';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Code, Header, Text} from '@shipfox/react-ui/typography';\nimport {useId} from 'react';\nimport {WorkflowRunNumberLabel} from '#components/workflow-run-number-label.js';\nimport {\n isWorkflowRunTerminal,\n type Job,\n WORKFLOW_RUN_STATUSES,\n type WorkflowRunDetail,\n type WorkflowRunRerunMode,\n workflowRunBlockingJob,\n workflowRunDetailDisplay,\n} from '#core/workflow-run.js';\nimport {WorkflowRunDurationLabel} from '../workflow-run-duration-label.js';\nimport {getWorkflowStatusVisual} from '../workflow-status/status-visuals.js';\nimport {WorkflowRunAttemptSwitcher} from './workflow-run-attempt-switcher.js';\n\nconst STATUS_BADGE_LABEL_WIDTH_CH = Math.max(\n ...[...WORKFLOW_RUN_STATUSES, 'queued' as const].map(\n (status) => getWorkflowStatusVisual(status).label.length,\n ),\n);\nconst RERUN_BUTTON_SURFACE_CLASS_NAME =\n 'bg-background-neutral-base hover:bg-background-neutral-hover active:bg-background-neutral-pressed';\n\ntype WorkflowRunAction = 'cancel' | 'rerun-all' | 'rerun-menu' | 'none';\n\nexport interface WorkflowRunSummaryProps {\n workspaceSlug?: string | undefined;\n projectSlug?: string | undefined;\n run: WorkflowRunDetail;\n cancelling?: boolean | undefined;\n onCancel?: (() => void) | undefined;\n rerunPending?: boolean | undefined;\n onRerun?: ((mode: WorkflowRunRerunMode) => void) | undefined;\n latestAttempt?: number | undefined;\n}\n\nexport function WorkflowRunSummary({\n workspaceSlug,\n projectSlug,\n run,\n cancelling = false,\n onCancel,\n rerunPending = false,\n onRerun,\n latestAttempt,\n}: WorkflowRunSummaryProps) {\n const headingId = useId();\n const display = workflowRunDetailDisplay(run);\n const status = getWorkflowStatusVisual(display.status);\n const action = workflowRunActionForRun(run);\n const hasAction = canRenderWorkflowRunAction(action, onCancel, onRerun);\n const attemptSwitcher =\n latestAttempt && latestAttempt > 1 && workspaceSlug && projectSlug\n ? {workspaceSlug, projectSlug, latestAttempt}\n : null;\n const displayDuration = display.duration;\n // Named only while the run is waiting and has more than one job: with a single job the rail\n // and the graph already say which one it is.\n const blockingJob =\n display.status === 'queued' && run.jobs.length > 1 ? workflowRunBlockingJob(run.jobs) : null;\n const {ref: headingTextRef, isTruncated: isHeadingTruncated} =\n useIsTextTruncated<HTMLSpanElement>(run.name);\n\n return (\n <TimeTickerProvider intervalMs={1000} reducedMotionIntervalMs={10_000}>\n <section\n aria-labelledby={headingId}\n className=\"bg-background-neutral-background px-row py-row\"\n >\n <div className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-cluster gap-y-inline overflow-hidden max-[480px]:grid-cols-1\">\n <div className=\"col-start-1 row-start-1 min-w-0 max-[480px]:col-start-auto max-[480px]:row-start-auto\">\n <div className=\"flex min-w-0 items-center gap-inline\">\n <Badge variant={status.badge} size=\"xs\">\n <span className=\"text-center\" style={{width: `${STATUS_BADGE_LABEL_WIDTH_CH}ch`}}>\n {status.label}\n </span>\n </Badge>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Header as=\"h1\" id={headingId} variant=\"h3\" className=\"min-w-0 truncate\">\n <span ref={headingTextRef} className=\"block min-w-0 truncate\">\n {run.name}\n </span>\n </Header>\n </TooltipTrigger>\n {isHeadingTruncated ? (\n <TooltipContent>\n <Text as=\"span\" size=\"xs\" className=\"max-w-[360px] break-words\">\n {run.name}\n </Text>\n </TooltipContent>\n ) : null}\n </Tooltip>\n </div>\n </div>\n\n {hasAction ? (\n <div className=\"col-start-2 row-start-1 flex min-w-max items-center gap-inline justify-self-end max-[480px]:col-start-auto max-[480px]:row-start-auto max-[480px]:justify-self-start\">\n <WorkflowRunActionSlot\n action={action}\n cancelling={cancelling}\n onCancel={onCancel}\n rerunPending={rerunPending}\n onRerun={onRerun}\n />\n </div>\n ) : null}\n\n <div className=\"col-span-2 row-start-2 flex min-w-0 items-center gap-cluster overflow-hidden text-foreground-neutral-subtle max-[480px]:col-span-1 max-[480px]:row-start-auto\">\n {run.number !== null ? (\n <>\n <WorkflowRunNumberLabel run={run} />\n {attemptSwitcher || run.triggerDisplayLabel ? <MetadataSeparator /> : null}\n </>\n ) : null}\n\n {attemptSwitcher ? (\n <WorkflowRunAttemptSwitcher\n workspaceSlug={attemptSwitcher.workspaceSlug}\n projectSlug={attemptSwitcher.projectSlug}\n run={run}\n latestAttempt={attemptSwitcher.latestAttempt}\n />\n ) : null}\n\n {run.triggerDisplayLabel ? (\n <>\n {attemptSwitcher ? <MetadataSeparator /> : null}\n <span className=\"min-w-0\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={run.triggerLabel}\n className=\"inline-flex max-w-full min-w-0 cursor-help items-center gap-tight rounded-6 border-0 bg-transparent p-0 text-left text-foreground-neutral-subtle outline-none focus-visible:shadow-button-neutral-focus\"\n >\n <TriggerSourceIcon\n provider={run.triggerProvider}\n source={run.triggerSource}\n aria-hidden=\"true\"\n className=\"size-12 shrink-0\"\n />\n <Text as=\"span\" size=\"xs\" className=\"min-w-0 truncate\">\n {run.triggerDisplayLabel}\n </Text>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <Text as=\"span\" size=\"xs\" className=\"block max-w-[360px] break-words\">\n {run.triggerLabel}\n </Text>\n </TooltipContent>\n </Tooltip>\n </span>\n </>\n ) : null}\n\n {run.number !== null || attemptSwitcher || run.triggerDisplayLabel ? (\n <MetadataSeparator />\n ) : null}\n <RelativeTime\n value={run.runAttempt.createdAt}\n className=\"shrink-0 whitespace-nowrap text-xs leading-20 text-foreground-neutral-subtle\"\n />\n\n {displayDuration ? (\n <>\n <MetadataSeparator />\n <WorkflowRunDurationLabel\n duration={displayDuration}\n className=\"text-foreground-neutral-subtle\"\n />\n </>\n ) : null}\n\n {blockingJob ? (\n <>\n <MetadataSeparator />\n <span className=\"flex min-w-0 items-center gap-tight\">\n <Text as=\"span\" size=\"xs\" className=\"shrink-0\">\n waiting on\n </Text>\n <Code as=\"span\" variant=\"label\" className=\"min-w-0 truncate\">\n {blockingJob.displayName}\n </Code>\n </span>\n </>\n ) : null}\n </div>\n </div>\n </section>\n </TimeTickerProvider>\n );\n}\n\nfunction WorkflowRunActionSlot({\n action,\n cancelling,\n onCancel,\n rerunPending,\n onRerun,\n}: {\n action: WorkflowRunAction;\n cancelling: boolean;\n onCancel?: (() => void) | undefined;\n rerunPending: boolean;\n onRerun?: ((mode: WorkflowRunRerunMode) => void) | undefined;\n}) {\n if (action === 'none') return null;\n\n if (action === 'cancel') {\n if (!onCancel) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"danger\"\n size=\"xs\"\n isLoading={cancelling}\n disabled={cancelling}\n onClick={onCancel}\n >\n Cancel workflow\n </Button>\n );\n }\n\n if (action === 'rerun-all') {\n if (!onRerun) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"xs\"\n className={RERUN_BUTTON_SURFACE_CLASS_NAME}\n isLoading={rerunPending}\n disabled={rerunPending}\n onClick={() => onRerun('all')}\n >\n Re-run workflow\n </Button>\n );\n }\n\n if (!onRerun) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"xs\"\n className={RERUN_BUTTON_SURFACE_CLASS_NAME}\n iconRight=\"arrowDownSLine\"\n isLoading={rerunPending}\n disabled={rerunPending}\n >\n Re-run jobs\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem disabled={rerunPending} onSelect={() => onRerun('all')}>\n Re-run all jobs\n </DropdownMenuItem>\n <DropdownMenuItem disabled={rerunPending} onSelect={() => onRerun('failed')}>\n Re-run failed jobs\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction workflowRunActionForRun(run: WorkflowRunDetail): WorkflowRunAction {\n if (run.runAttempt.attempt !== run.currentAttempt) return 'none';\n if (!isWorkflowRunTerminal(run.runAttempt.status)) return 'cancel';\n if (run.runAttempt.status === 'succeeded' || !hasFailedOrCancelledJobs(run)) return 'rerun-all';\n return 'rerun-menu';\n}\n\nfunction canRenderWorkflowRunAction(\n action: WorkflowRunAction,\n onCancel: (() => void) | undefined,\n onRerun: ((mode: WorkflowRunRerunMode) => void) | undefined,\n): boolean {\n if (action === 'cancel') return onCancel !== undefined;\n if (action === 'rerun-all' || action === 'rerun-menu') return onRerun !== undefined;\n return false;\n}\n\nfunction hasFailedOrCancelledJobs(run: WorkflowRunDetail): boolean {\n if (!workflowRunHasJobs(run)) return false;\n\n return run.jobs.some((job) => job.status === 'failed' || job.status === 'cancelled');\n}\n\nfunction workflowRunHasJobs(run: WorkflowRunDetail): run is WorkflowRunDetail & {jobs: Job[]} {\n return 'jobs' in run && Array.isArray(run.jobs);\n}\n"],"names":["TriggerSourceIcon","MetadataSeparator","Badge","Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","useIsTextTruncated","RelativeTime","TimeTickerProvider","Tooltip","TooltipContent","TooltipTrigger","Code","Header","Text","useId","WorkflowRunNumberLabel","isWorkflowRunTerminal","WORKFLOW_RUN_STATUSES","workflowRunBlockingJob","workflowRunDetailDisplay","WorkflowRunDurationLabel","getWorkflowStatusVisual","WorkflowRunAttemptSwitcher","STATUS_BADGE_LABEL_WIDTH_CH","Math","max","map","status","label","length","RERUN_BUTTON_SURFACE_CLASS_NAME","WorkflowRunSummary","workspaceSlug","projectSlug","run","cancelling","onCancel","rerunPending","onRerun","latestAttempt","headingId","display","action","workflowRunActionForRun","hasAction","canRenderWorkflowRunAction","attemptSwitcher","displayDuration","duration","blockingJob","jobs","ref","headingTextRef","isTruncated","isHeadingTruncated","name","intervalMs","reducedMotionIntervalMs","section","aria-labelledby","className","div","variant","badge","size","span","style","width","asChild","as","id","WorkflowRunActionSlot","number","triggerDisplayLabel","button","type","aria-label","triggerLabel","provider","triggerProvider","source","triggerSource","aria-hidden","value","runAttempt","createdAt","displayName","isLoading","disabled","onClick","iconRight","align","onSelect","attempt","currentAttempt","hasFailedOrCancelledJobs","undefined","workflowRunHasJobs","some","job","Array","isArray"],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
export { RunAnnotationCountChip } from './run-annotation-count-chip.js';
|
|
2
|
+
export { annotationElementId, RunAnnotationItem } from './run-annotation-item.js';
|
|
3
|
+
export { type DerivedRunAnnotation, RunAnnotationList, type RunAnnotationListQuery, } from './run-annotation-list.js';
|
|
1
4
|
export { RunAnnotationSummaryLine } from './run-annotation-summary-line.js';
|
|
2
5
|
export { RunAnnotationsEmpty } from './run-annotations-empty.js';
|
|
3
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAChF,OAAO,EACL,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,wBAAwB,EAAC,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
export { RunAnnotationCountChip } from './run-annotation-count-chip.js';
|
|
2
|
+
export { annotationElementId, RunAnnotationItem } from './run-annotation-item.js';
|
|
3
|
+
export { RunAnnotationList } from './run-annotation-list.js';
|
|
1
4
|
export { RunAnnotationSummaryLine } from './run-annotation-summary-line.js';
|
|
2
5
|
export { RunAnnotationsEmpty } from './run-annotations-empty.js';
|
|
3
6
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/workflow-run-tabs/index.ts"],"sourcesContent":["export {RunAnnotationSummaryLine} from './run-annotation-summary-line.js';\nexport {RunAnnotationsEmpty} from './run-annotations-empty.js';\n"],"names":["RunAnnotationSummaryLine","RunAnnotationsEmpty"],"mappings":"AAAA,SAAQA,wBAAwB,QAAO,mCAAmC;AAC1E,SAAQC,mBAAmB,QAAO,6BAA6B"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/workflow-run-tabs/index.ts"],"sourcesContent":["export {RunAnnotationCountChip} from './run-annotation-count-chip.js';\nexport {annotationElementId, RunAnnotationItem} from './run-annotation-item.js';\nexport {\n type DerivedRunAnnotation,\n RunAnnotationList,\n type RunAnnotationListQuery,\n} from './run-annotation-list.js';\nexport {RunAnnotationSummaryLine} from './run-annotation-summary-line.js';\nexport {RunAnnotationsEmpty} from './run-annotations-empty.js';\n"],"names":["RunAnnotationCountChip","annotationElementId","RunAnnotationItem","RunAnnotationList","RunAnnotationSummaryLine","RunAnnotationsEmpty"],"mappings":"AAAA,SAAQA,sBAAsB,QAAO,iCAAiC;AACtE,SAAQC,mBAAmB,EAAEC,iBAAiB,QAAO,2BAA2B;AAChF,SAEEC,iBAAiB,QAEZ,2BAA2B;AAClC,SAAQC,wBAAwB,QAAO,mCAAmC;AAC1E,SAAQC,mBAAmB,QAAO,6BAA6B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RunAnnotationSummary } from '#core/run-annotation.js';
|
|
2
|
+
export interface RunAnnotationCountChipProps {
|
|
3
|
+
summary: RunAnnotationSummary | undefined;
|
|
4
|
+
workspaceSlug: string;
|
|
5
|
+
projectSlug: string;
|
|
6
|
+
workflowRunId: string;
|
|
7
|
+
runAttempt?: number | undefined;
|
|
8
|
+
/** Scopes the destination list to one job. */
|
|
9
|
+
jobId?: string | undefined;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A bounded reference into the run's Annotations section: a count, its highest severity, and one
|
|
13
|
+
* link. Never a body, so an annotation is rendered exactly once per page.
|
|
14
|
+
*/
|
|
15
|
+
export declare function RunAnnotationCountChip({ summary, workspaceSlug, projectSlug, workflowRunId, runAttempt, jobId, }: RunAnnotationCountChipProps): import("react").JSX.Element | null;
|
|
16
|
+
//# sourceMappingURL=run-annotation-count-chip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-annotation-count-chip.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/run-annotation-count-chip.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA+B,KAAK,oBAAoB,EAAC,MAAM,yBAAyB,CAAC;AAIhG,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,KAAK,GACN,EAAE,2BAA2B,sCAkC7B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from '@shipfox/react-ui/icon';
|
|
3
|
+
import { cn } from '@shipfox/react-ui/utils';
|
|
4
|
+
import { Link } from '@tanstack/react-router';
|
|
5
|
+
import { highestRunAnnotationSeverity } from '#core/run-annotation.js';
|
|
6
|
+
import { workflowRunSearchParams } from '#routes/inputs.js';
|
|
7
|
+
import { SEVERITY_CHIP_TONE, SEVERITY_ICON } from './severity-visuals.js';
|
|
8
|
+
/**
|
|
9
|
+
* A bounded reference into the run's Annotations section: a count, its highest severity, and one
|
|
10
|
+
* link. Never a body, so an annotation is rendered exactly once per page.
|
|
11
|
+
*/ export function RunAnnotationCountChip({ summary, workspaceSlug, projectSlug, workflowRunId, runAttempt, jobId }) {
|
|
12
|
+
if (!summary || summary.total === 0) return null;
|
|
13
|
+
const severity = highestRunAnnotationSeverity(summary);
|
|
14
|
+
const count = `${summary.total}${summary.truncated ? '+' : ''}`;
|
|
15
|
+
const label = `${count} ${summary.total === 1 && !summary.truncated ? 'annotation' : 'annotations'}`;
|
|
16
|
+
const accessibleLabel = severity ? `View ${label}, highest severity ${severity}` : `View ${label}`;
|
|
17
|
+
const search = {
|
|
18
|
+
tab: 'annotations',
|
|
19
|
+
...runAttempt ? {
|
|
20
|
+
runAttempt
|
|
21
|
+
} : {}
|
|
22
|
+
};
|
|
23
|
+
if (jobId) search.jobId = jobId;
|
|
24
|
+
return /*#__PURE__*/ _jsxs(Link, {
|
|
25
|
+
to: "/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId",
|
|
26
|
+
params: {
|
|
27
|
+
workspaceSlug,
|
|
28
|
+
projectSlug,
|
|
29
|
+
workflowRunId
|
|
30
|
+
},
|
|
31
|
+
search: workflowRunSearchParams(search, search),
|
|
32
|
+
"aria-label": accessibleLabel,
|
|
33
|
+
className: cn('inline-flex h-20 shrink-0 items-center gap-tight rounded-4 border px-tight font-code text-xs leading-16 tabular-nums outline-none transition-colors hover:bg-background-neutral-hover focus-visible:shadow-border-interactive-with-active', // The chip stays 20px optically so it sits level with the duration metadata beside it;
|
|
34
|
+
// the hit area grows to the 44px minimum only where the pointer is coarse.
|
|
35
|
+
'[@media(pointer:coarse)]:h-44 [@media(pointer:coarse)]:px-[10px]', severity ? SEVERITY_CHIP_TONE[severity] : 'border-border-neutral-base'),
|
|
36
|
+
children: [
|
|
37
|
+
/*#__PURE__*/ _jsx(Icon, {
|
|
38
|
+
name: severity ? SEVERITY_ICON[severity] : 'fileTextLine',
|
|
39
|
+
size: 12,
|
|
40
|
+
"aria-hidden": "true"
|
|
41
|
+
}),
|
|
42
|
+
/*#__PURE__*/ _jsx("span", {
|
|
43
|
+
className: "text-foreground-neutral-base",
|
|
44
|
+
children: count
|
|
45
|
+
})
|
|
46
|
+
]
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=run-annotation-count-chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/workflow-run-tabs/run-annotation-count-chip.tsx"],"sourcesContent":["import {Icon} from '@shipfox/react-ui/icon';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {highestRunAnnotationSeverity, type RunAnnotationSummary} from '#core/run-annotation.js';\nimport {type WorkflowRunsSearch, workflowRunSearchParams} from '#routes/inputs.js';\nimport {SEVERITY_CHIP_TONE, SEVERITY_ICON} from './severity-visuals.js';\n\nexport interface RunAnnotationCountChipProps {\n summary: RunAnnotationSummary | undefined;\n workspaceSlug: string;\n projectSlug: string;\n workflowRunId: string;\n runAttempt?: number | undefined;\n /** Scopes the destination list to one job. */\n jobId?: string | undefined;\n}\n\n/**\n * A bounded reference into the run's Annotations section: a count, its highest severity, and one\n * link. Never a body, so an annotation is rendered exactly once per page.\n */\nexport function RunAnnotationCountChip({\n summary,\n workspaceSlug,\n projectSlug,\n workflowRunId,\n runAttempt,\n jobId,\n}: RunAnnotationCountChipProps) {\n if (!summary || summary.total === 0) return null;\n\n const severity = highestRunAnnotationSeverity(summary);\n const count = `${summary.total}${summary.truncated ? '+' : ''}`;\n const label = `${count} ${summary.total === 1 && !summary.truncated ? 'annotation' : 'annotations'}`;\n const accessibleLabel = severity\n ? `View ${label}, highest severity ${severity}`\n : `View ${label}`;\n const search: WorkflowRunsSearch = {tab: 'annotations', ...(runAttempt ? {runAttempt} : {})};\n if (jobId) search.jobId = jobId;\n\n return (\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId\"\n params={{workspaceSlug, projectSlug, workflowRunId}}\n search={workflowRunSearchParams(search, search) as never}\n aria-label={accessibleLabel}\n className={cn(\n 'inline-flex h-20 shrink-0 items-center gap-tight rounded-4 border px-tight font-code text-xs leading-16 tabular-nums outline-none transition-colors hover:bg-background-neutral-hover focus-visible:shadow-border-interactive-with-active',\n // The chip stays 20px optically so it sits level with the duration metadata beside it;\n // the hit area grows to the 44px minimum only where the pointer is coarse.\n '[@media(pointer:coarse)]:h-44 [@media(pointer:coarse)]:px-[10px]',\n severity ? SEVERITY_CHIP_TONE[severity] : 'border-border-neutral-base',\n )}\n >\n <Icon\n name={severity ? SEVERITY_ICON[severity] : 'fileTextLine'}\n size={12}\n aria-hidden=\"true\"\n />\n <span className=\"text-foreground-neutral-base\">{count}</span>\n </Link>\n );\n}\n"],"names":["Icon","cn","Link","highestRunAnnotationSeverity","workflowRunSearchParams","SEVERITY_CHIP_TONE","SEVERITY_ICON","RunAnnotationCountChip","summary","workspaceSlug","projectSlug","workflowRunId","runAttempt","jobId","total","severity","count","truncated","label","accessibleLabel","search","tab","to","params","aria-label","className","name","size","aria-hidden","span"],"mappings":";AAAA,SAAQA,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,EAAE,QAAO,0BAA0B;AAC3C,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,4BAA4B,QAAkC,0BAA0B;AAChG,SAAiCC,uBAAuB,QAAO,oBAAoB;AACnF,SAAQC,kBAAkB,EAAEC,aAAa,QAAO,wBAAwB;AAYxE;;;CAGC,GACD,OAAO,SAASC,uBAAuB,EACrCC,OAAO,EACPC,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,UAAU,EACVC,KAAK,EACuB;IAC5B,IAAI,CAACL,WAAWA,QAAQM,KAAK,KAAK,GAAG,OAAO;IAE5C,MAAMC,WAAWZ,6BAA6BK;IAC9C,MAAMQ,QAAQ,GAAGR,QAAQM,KAAK,GAAGN,QAAQS,SAAS,GAAG,MAAM,IAAI;IAC/D,MAAMC,QAAQ,GAAGF,MAAM,CAAC,EAAER,QAAQM,KAAK,KAAK,KAAK,CAACN,QAAQS,SAAS,GAAG,eAAe,eAAe;IACpG,MAAME,kBAAkBJ,WACpB,CAAC,KAAK,EAAEG,MAAM,mBAAmB,EAAEH,UAAU,GAC7C,CAAC,KAAK,EAAEG,OAAO;IACnB,MAAME,SAA6B;QAACC,KAAK;QAAe,GAAIT,aAAa;YAACA;QAAU,IAAI,CAAC,CAAC;IAAC;IAC3F,IAAIC,OAAOO,OAAOP,KAAK,GAAGA;IAE1B,qBACE,MAACX;QACCoB,IAAG;QACHC,QAAQ;YAACd;YAAeC;YAAaC;QAAa;QAClDS,QAAQhB,wBAAwBgB,QAAQA;QACxCI,cAAYL;QACZM,WAAWxB,GACT,6OACA,uFAAuF;QACvF,2EAA2E;QAC3E,oEACAc,WAAWV,kBAAkB,CAACU,SAAS,GAAG;;0BAG5C,KAACf;gBACC0B,MAAMX,WAAWT,aAAa,CAACS,SAAS,GAAG;gBAC3CY,MAAM;gBACNC,eAAY;;0BAEd,KAACC;gBAAKJ,WAAU;0BAAgCT;;;;AAGtD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RunAnnotationEntry } from '#core/run-annotation.js';
|
|
2
|
+
export interface RunAnnotationItemProps {
|
|
3
|
+
entry: RunAnnotationEntry;
|
|
4
|
+
workspaceSlug?: string | undefined;
|
|
5
|
+
projectSlug?: string | undefined;
|
|
6
|
+
workflowRunId: string;
|
|
7
|
+
runAttempt?: number | undefined;
|
|
8
|
+
/** Deep-link target from `?annotation=`, which takes focus rather than only being scrolled to. */
|
|
9
|
+
selected?: boolean | undefined;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* One annotation, and the only place in the product that renders an annotation body.
|
|
13
|
+
*
|
|
14
|
+
* The title is the annotation's `context`, which is what the emitting step named the block.
|
|
15
|
+
* Everything below it exists so a reader can get from a diagnostic back to its cause.
|
|
16
|
+
*/
|
|
17
|
+
export declare function RunAnnotationItem({ entry, workspaceSlug, projectSlug, workflowRunId, runAttempt, selected, }: RunAnnotationItemProps): import("react").JSX.Element;
|
|
18
|
+
/** Stable element id so `?annotation=<id>` can scroll to and highlight one annotation. */
|
|
19
|
+
export declare function annotationElementId(annotationId: string): string;
|
|
20
|
+
//# sourceMappingURL=run-annotation-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-annotation-item.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/run-annotation-item.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAGhE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,kGAAkG;IAClG,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,QAAgB,GACjB,EAAE,sBAAsB,+BAuExB;AAeD,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AnnotationCard } from '@shipfox/client-ui';
|
|
3
|
+
import { Button } from '@shipfox/react-ui/button';
|
|
4
|
+
import { Icon } from '@shipfox/react-ui/icon';
|
|
5
|
+
import { Text } from '@shipfox/react-ui/typography';
|
|
6
|
+
import { cn } from '@shipfox/react-ui/utils';
|
|
7
|
+
import { Link } from '@tanstack/react-router';
|
|
8
|
+
import { useEffect, useRef } from 'react';
|
|
9
|
+
import { workflowJobSearchParams } from '#routes/inputs.js';
|
|
10
|
+
/**
|
|
11
|
+
* One annotation, and the only place in the product that renders an annotation body.
|
|
12
|
+
*
|
|
13
|
+
* The title is the annotation's `context`, which is what the emitting step named the block.
|
|
14
|
+
* Everything below it exists so a reader can get from a diagnostic back to its cause.
|
|
15
|
+
*/ export function RunAnnotationItem({ entry, workspaceSlug, projectSlug, workflowRunId, runAttempt, selected = false }) {
|
|
16
|
+
const { annotation, origin } = entry;
|
|
17
|
+
const canLink = Boolean(origin && workspaceSlug && projectSlug);
|
|
18
|
+
const itemRef = useRef(null);
|
|
19
|
+
const focusedRef = useRef(false);
|
|
20
|
+
useEffect(()=>{
|
|
21
|
+
if (!selected) {
|
|
22
|
+
focusedRef.current = false;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (focusedRef.current) return;
|
|
26
|
+
// A deep link that only scrolls leaves a keyboard or screen-reader user at the document
|
|
27
|
+
// start while the page moves under them.
|
|
28
|
+
focusedRef.current = true;
|
|
29
|
+
itemRef.current?.focus({
|
|
30
|
+
preventScroll: true
|
|
31
|
+
});
|
|
32
|
+
itemRef.current?.scrollIntoView({
|
|
33
|
+
block: 'nearest'
|
|
34
|
+
});
|
|
35
|
+
}, [
|
|
36
|
+
selected
|
|
37
|
+
]);
|
|
38
|
+
return /*#__PURE__*/ _jsx("li", {
|
|
39
|
+
ref: itemRef,
|
|
40
|
+
tabIndex: -1,
|
|
41
|
+
"aria-current": selected ? 'true' : undefined,
|
|
42
|
+
className: cn('rounded-8 outline-none focus-visible:shadow-border-interactive-with-active', selected && 'shadow-border-interactive-with-active'),
|
|
43
|
+
children: /*#__PURE__*/ _jsx(AnnotationCard, {
|
|
44
|
+
id: annotationElementId(annotation.id),
|
|
45
|
+
style: annotation.style,
|
|
46
|
+
title: annotation.context,
|
|
47
|
+
titleAs: "h3",
|
|
48
|
+
provenance: /*#__PURE__*/ _jsx(RunAnnotationProvenance, {
|
|
49
|
+
entry: entry
|
|
50
|
+
}),
|
|
51
|
+
body: annotation.body,
|
|
52
|
+
action: canLink && origin ? /*#__PURE__*/ _jsx(Button, {
|
|
53
|
+
asChild: true,
|
|
54
|
+
size: "xs",
|
|
55
|
+
variant: "transparent",
|
|
56
|
+
className: "[@media(pointer:coarse)]:min-h-44",
|
|
57
|
+
children: /*#__PURE__*/ _jsxs(Link, {
|
|
58
|
+
to: "/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId/jobs/$jobId",
|
|
59
|
+
params: {
|
|
60
|
+
workspaceSlug: workspaceSlug ?? '',
|
|
61
|
+
projectSlug: projectSlug ?? '',
|
|
62
|
+
workflowRunId,
|
|
63
|
+
jobId: origin.jobId
|
|
64
|
+
},
|
|
65
|
+
search: workflowJobSearchParams({
|
|
66
|
+
jobExecutionId: origin.jobExecutionId,
|
|
67
|
+
stepId: origin.stepId,
|
|
68
|
+
stepAttemptId: origin.stepAttemptId,
|
|
69
|
+
runAttempt
|
|
70
|
+
}),
|
|
71
|
+
children: [
|
|
72
|
+
"Open step",
|
|
73
|
+
/*#__PURE__*/ _jsx(Icon, {
|
|
74
|
+
name: "arrowRightLine",
|
|
75
|
+
size: 12,
|
|
76
|
+
"aria-hidden": "true"
|
|
77
|
+
})
|
|
78
|
+
]
|
|
79
|
+
})
|
|
80
|
+
}) : null
|
|
81
|
+
})
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** `job · execution #2 · run tests · attempt 1`, dropping any part the run no longer resolves. */ function RunAnnotationProvenance({ entry }) {
|
|
85
|
+
const parts = [
|
|
86
|
+
entry.jobName,
|
|
87
|
+
entry.executionLabel,
|
|
88
|
+
entry.stepLabel,
|
|
89
|
+
entry.attemptLabel
|
|
90
|
+
].filter((part)=>Boolean(part));
|
|
91
|
+
return /*#__PURE__*/ _jsx(Text, {
|
|
92
|
+
as: "p",
|
|
93
|
+
size: "xs",
|
|
94
|
+
className: "min-w-0 break-words font-code text-foreground-neutral-subtle",
|
|
95
|
+
children: parts.join(' · ')
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** Stable element id so `?annotation=<id>` can scroll to and highlight one annotation. */ export function annotationElementId(annotationId) {
|
|
99
|
+
return `run-annotation-${annotationId}`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=run-annotation-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/workflow-run-tabs/run-annotation-item.tsx"],"sourcesContent":["import {AnnotationCard} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useEffect, useRef} from 'react';\nimport type {RunAnnotationEntry} from '#core/run-annotation.js';\nimport {workflowJobSearchParams} from '#routes/inputs.js';\n\nexport interface RunAnnotationItemProps {\n entry: RunAnnotationEntry;\n workspaceSlug?: string | undefined;\n projectSlug?: string | undefined;\n workflowRunId: string;\n runAttempt?: number | undefined;\n /** Deep-link target from `?annotation=`, which takes focus rather than only being scrolled to. */\n selected?: boolean | undefined;\n}\n\n/**\n * One annotation, and the only place in the product that renders an annotation body.\n *\n * The title is the annotation's `context`, which is what the emitting step named the block.\n * Everything below it exists so a reader can get from a diagnostic back to its cause.\n */\nexport function RunAnnotationItem({\n entry,\n workspaceSlug,\n projectSlug,\n workflowRunId,\n runAttempt,\n selected = false,\n}: RunAnnotationItemProps) {\n const {annotation, origin} = entry;\n const canLink = Boolean(origin && workspaceSlug && projectSlug);\n const itemRef = useRef<HTMLLIElement>(null);\n const focusedRef = useRef(false);\n\n useEffect(() => {\n if (!selected) {\n focusedRef.current = false;\n return;\n }\n if (focusedRef.current) return;\n\n // A deep link that only scrolls leaves a keyboard or screen-reader user at the document\n // start while the page moves under them.\n focusedRef.current = true;\n itemRef.current?.focus({preventScroll: true});\n itemRef.current?.scrollIntoView({block: 'nearest'});\n }, [selected]);\n\n return (\n <li\n ref={itemRef}\n tabIndex={-1}\n aria-current={selected ? 'true' : undefined}\n className={cn(\n 'rounded-8 outline-none focus-visible:shadow-border-interactive-with-active',\n selected && 'shadow-border-interactive-with-active',\n )}\n >\n <AnnotationCard\n id={annotationElementId(annotation.id)}\n style={annotation.style}\n title={annotation.context}\n titleAs=\"h3\"\n provenance={<RunAnnotationProvenance entry={entry} />}\n body={annotation.body}\n action={\n canLink && origin ? (\n <Button\n asChild\n size=\"xs\"\n variant=\"transparent\"\n className=\"[@media(pointer:coarse)]:min-h-44\"\n >\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId/jobs/$jobId\"\n params={{\n workspaceSlug: workspaceSlug ?? '',\n projectSlug: projectSlug ?? '',\n workflowRunId,\n jobId: origin.jobId,\n }}\n search={\n workflowJobSearchParams({\n jobExecutionId: origin.jobExecutionId,\n stepId: origin.stepId,\n stepAttemptId: origin.stepAttemptId,\n runAttempt,\n }) as never\n }\n >\n Open step\n <Icon name=\"arrowRightLine\" size={12} aria-hidden=\"true\" />\n </Link>\n </Button>\n ) : null\n }\n />\n </li>\n );\n}\n\n/** `job · execution #2 · run tests · attempt 1`, dropping any part the run no longer resolves. */\nfunction RunAnnotationProvenance({entry}: {entry: RunAnnotationEntry}) {\n const parts = [entry.jobName, entry.executionLabel, entry.stepLabel, entry.attemptLabel].filter(\n (part): part is string => Boolean(part),\n );\n\n return (\n <Text as=\"p\" size=\"xs\" className=\"min-w-0 break-words font-code text-foreground-neutral-subtle\">\n {parts.join(' · ')}\n </Text>\n );\n}\n\n/** Stable element id so `?annotation=<id>` can scroll to and highlight one annotation. */\nexport function annotationElementId(annotationId: string): string {\n return `run-annotation-${annotationId}`;\n}\n"],"names":["AnnotationCard","Button","Icon","Text","cn","Link","useEffect","useRef","workflowJobSearchParams","RunAnnotationItem","entry","workspaceSlug","projectSlug","workflowRunId","runAttempt","selected","annotation","origin","canLink","Boolean","itemRef","focusedRef","current","focus","preventScroll","scrollIntoView","block","li","ref","tabIndex","aria-current","undefined","className","id","annotationElementId","style","title","context","titleAs","provenance","RunAnnotationProvenance","body","action","asChild","size","variant","to","params","jobId","search","jobExecutionId","stepId","stepAttemptId","name","aria-hidden","parts","jobName","executionLabel","stepLabel","attemptLabel","filter","part","as","join","annotationId"],"mappings":";AAAA,SAAQA,cAAc,QAAO,qBAAqB;AAClD,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,EAAE,QAAO,0BAA0B;AAC3C,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,SAAS,EAAEC,MAAM,QAAO,QAAQ;AAExC,SAAQC,uBAAuB,QAAO,oBAAoB;AAY1D;;;;;CAKC,GACD,OAAO,SAASC,kBAAkB,EAChCC,KAAK,EACLC,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,UAAU,EACVC,WAAW,KAAK,EACO;IACvB,MAAM,EAACC,UAAU,EAAEC,MAAM,EAAC,GAAGP;IAC7B,MAAMQ,UAAUC,QAAQF,UAAUN,iBAAiBC;IACnD,MAAMQ,UAAUb,OAAsB;IACtC,MAAMc,aAAad,OAAO;IAE1BD,UAAU;QACR,IAAI,CAACS,UAAU;YACbM,WAAWC,OAAO,GAAG;YACrB;QACF;QACA,IAAID,WAAWC,OAAO,EAAE;QAExB,wFAAwF;QACxF,yCAAyC;QACzCD,WAAWC,OAAO,GAAG;QACrBF,QAAQE,OAAO,EAAEC,MAAM;YAACC,eAAe;QAAI;QAC3CJ,QAAQE,OAAO,EAAEG,eAAe;YAACC,OAAO;QAAS;IACnD,GAAG;QAACX;KAAS;IAEb,qBACE,KAACY;QACCC,KAAKR;QACLS,UAAU,CAAC;QACXC,gBAAcf,WAAW,SAASgB;QAClCC,WAAW5B,GACT,8EACAW,YAAY;kBAGd,cAAA,KAACf;YACCiC,IAAIC,oBAAoBlB,WAAWiB,EAAE;YACrCE,OAAOnB,WAAWmB,KAAK;YACvBC,OAAOpB,WAAWqB,OAAO;YACzBC,SAAQ;YACRC,0BAAY,KAACC;gBAAwB9B,OAAOA;;YAC5C+B,MAAMzB,WAAWyB,IAAI;YACrBC,QACExB,WAAWD,uBACT,KAAChB;gBACC0C,OAAO;gBACPC,MAAK;gBACLC,SAAQ;gBACRb,WAAU;0BAEV,cAAA,MAAC3B;oBACCyC,IAAG;oBACHC,QAAQ;wBACNpC,eAAeA,iBAAiB;wBAChCC,aAAaA,eAAe;wBAC5BC;wBACAmC,OAAO/B,OAAO+B,KAAK;oBACrB;oBACAC,QACEzC,wBAAwB;wBACtB0C,gBAAgBjC,OAAOiC,cAAc;wBACrCC,QAAQlC,OAAOkC,MAAM;wBACrBC,eAAenC,OAAOmC,aAAa;wBACnCtC;oBACF;;wBAEH;sCAEC,KAACZ;4BAAKmD,MAAK;4BAAiBT,MAAM;4BAAIU,eAAY;;;;iBAGpD;;;AAKd;AAEA,gGAAgG,GAChG,SAASd,wBAAwB,EAAC9B,KAAK,EAA8B;IACnE,MAAM6C,QAAQ;QAAC7C,MAAM8C,OAAO;QAAE9C,MAAM+C,cAAc;QAAE/C,MAAMgD,SAAS;QAAEhD,MAAMiD,YAAY;KAAC,CAACC,MAAM,CAC7F,CAACC,OAAyB1C,QAAQ0C;IAGpC,qBACE,KAAC1D;QAAK2D,IAAG;QAAIlB,MAAK;QAAKZ,WAAU;kBAC9BuB,MAAMQ,IAAI,CAAC;;AAGlB;AAEA,wFAAwF,GACxF,OAAO,SAAS7B,oBAAoB8B,YAAoB;IACtD,OAAO,CAAC,eAAe,EAAEA,cAAc;AACzC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type QueryLoadErrorQuery } from '@shipfox/client-ui';
|
|
2
|
+
import type { RunAnnotationEntry, RunAnnotationStyle } from '#core/run-annotation.js';
|
|
3
|
+
export interface RunAnnotationListQuery extends QueryLoadErrorQuery {
|
|
4
|
+
isPending: boolean;
|
|
5
|
+
hasNextPage: boolean;
|
|
6
|
+
isFetchingNextPage: boolean;
|
|
7
|
+
fetchNextPage: () => unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface RunAnnotationListProps {
|
|
10
|
+
query: RunAnnotationListQuery;
|
|
11
|
+
entries: RunAnnotationEntry[] | undefined;
|
|
12
|
+
/** Synthetic terminal-job diagnostics for jobs that never created an execution record. */
|
|
13
|
+
derivedAnnotations?: readonly DerivedRunAnnotation[] | undefined;
|
|
14
|
+
workflowRunId: string;
|
|
15
|
+
workspaceSlug?: string | undefined;
|
|
16
|
+
projectSlug?: string | undefined;
|
|
17
|
+
runAttempt?: number | undefined;
|
|
18
|
+
/** Name of the job the list is filtered to, used only for empty-state copy. */
|
|
19
|
+
filteredJobName?: string | undefined;
|
|
20
|
+
/** Active severity filter, named in the empty state so the reader knows what to clear. */
|
|
21
|
+
filteredSeverity?: string | undefined;
|
|
22
|
+
filtered: boolean;
|
|
23
|
+
onClearFilters?: (() => void) | undefined;
|
|
24
|
+
/** Annotation id from `?annotation=`, which the matching card scrolls to and focuses. */
|
|
25
|
+
selectedAnnotationId?: string | undefined;
|
|
26
|
+
}
|
|
27
|
+
export interface DerivedRunAnnotation {
|
|
28
|
+
id: string;
|
|
29
|
+
style: RunAnnotationStyle;
|
|
30
|
+
body: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The annotations list.
|
|
34
|
+
*
|
|
35
|
+
* Loading, empty, error, and stale are four distinct renderings on purpose: coalescing a failed
|
|
36
|
+
* fetch into an empty result tells a reader their run is clean when the truth is unknown.
|
|
37
|
+
*/
|
|
38
|
+
export declare function RunAnnotationList({ query, entries, derivedAnnotations, workflowRunId, workspaceSlug, projectSlug, runAttempt, filteredJobName, filteredSeverity, filtered, onClearFilters, selectedAnnotationId, }: RunAnnotationListProps): import("react").JSX.Element;
|
|
39
|
+
//# sourceMappingURL=run-annotation-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-annotation-list.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/run-annotation-list.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAO5F,OAAO,KAAK,EAAC,kBAAkB,EAAE,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAIpF,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,kBAAkB,EAAE,GAAG,SAAS,CAAC;IAC1C,0FAA0F;IAC1F,kBAAkB,CAAC,EAAE,SAAS,oBAAoB,EAAE,GAAG,SAAS,CAAC;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1C,yFAAyF;IACzF,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAWD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,OAAO,EACP,kBAAuB,EACvB,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,oBAAoB,GACrB,EAAE,sBAAsB,+BAoFxB"}
|