@shipfox/client-workflows 4.0.0 → 6.0.1

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.
Files changed (125) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +68 -0
  3. package/dist/components/workflow-run-list/types.d.ts +12 -0
  4. package/dist/components/workflow-run-list/types.d.ts.map +1 -1
  5. package/dist/components/workflow-run-list/types.js.map +1 -1
  6. package/dist/components/workflow-run-list/workflow-run-list-view.d.ts +1 -1
  7. package/dist/components/workflow-run-list/workflow-run-list-view.d.ts.map +1 -1
  8. package/dist/components/workflow-run-list/workflow-run-list-view.js +32 -11
  9. package/dist/components/workflow-run-list/workflow-run-list-view.js.map +1 -1
  10. package/dist/components/workflow-run-list/workflow-run-list.d.ts +1 -1
  11. package/dist/components/workflow-run-list/workflow-run-list.d.ts.map +1 -1
  12. package/dist/components/workflow-run-list/workflow-run-list.js +7 -2
  13. package/dist/components/workflow-run-list/workflow-run-list.js.map +1 -1
  14. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts +2 -3
  15. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts.map +1 -1
  16. package/dist/components/workflow-run-summary/workflow-run-summary.js.map +1 -1
  17. package/dist/components/workflow-run-view/job-card.d.ts.map +1 -1
  18. package/dist/components/workflow-run-view/job-card.js +9 -8
  19. package/dist/components/workflow-run-view/job-card.js.map +1 -1
  20. package/dist/components/workflow-run-view/workflow-run-view.js.map +1 -1
  21. package/dist/core/entities/job-execution.d.ts +11 -6
  22. package/dist/core/entities/job-execution.d.ts.map +1 -1
  23. package/dist/core/entities/job-execution.js +0 -19
  24. package/dist/core/entities/job-execution.js.map +1 -1
  25. package/dist/core/entities/job.d.ts +32 -10
  26. package/dist/core/entities/job.d.ts.map +1 -1
  27. package/dist/core/entities/job.js +0 -22
  28. package/dist/core/entities/job.js.map +1 -1
  29. package/dist/core/entities/step-attempt.d.ts +28 -3
  30. package/dist/core/entities/step-attempt.d.ts.map +1 -1
  31. package/dist/core/entities/step-attempt.js +0 -17
  32. package/dist/core/entities/step-attempt.js.map +1 -1
  33. package/dist/core/entities/step.d.ts +6 -6
  34. package/dist/core/entities/step.d.ts.map +1 -1
  35. package/dist/core/entities/step.js +19 -49
  36. package/dist/core/entities/step.js.map +1 -1
  37. package/dist/core/entities/workflow-run-attempt.d.ts +0 -2
  38. package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
  39. package/dist/core/entities/workflow-run-attempt.js +0 -12
  40. package/dist/core/entities/workflow-run-attempt.js.map +1 -1
  41. package/dist/core/entities/workflow-run.d.ts +6 -7
  42. package/dist/core/entities/workflow-run.d.ts.map +1 -1
  43. package/dist/core/entities/workflow-run.js +1 -67
  44. package/dist/core/entities/workflow-run.js.map +1 -1
  45. package/dist/core/workflow-run.d.ts +9 -9
  46. package/dist/core/workflow-run.d.ts.map +1 -1
  47. package/dist/core/workflow-run.js +6 -6
  48. package/dist/core/workflow-run.js.map +1 -1
  49. package/dist/feature.d.ts +23 -0
  50. package/dist/feature.d.ts.map +1 -1
  51. package/dist/feature.js +22 -9
  52. package/dist/feature.js.map +1 -1
  53. package/dist/hooks/api/workflow-run-mapper.d.ts +12 -0
  54. package/dist/hooks/api/workflow-run-mapper.d.ts.map +1 -0
  55. package/dist/hooks/api/workflow-run-mapper.js +207 -0
  56. package/dist/hooks/api/workflow-run-mapper.js.map +1 -0
  57. package/dist/hooks/api/workflow-runs.d.ts +25 -55
  58. package/dist/hooks/api/workflow-runs.d.ts.map +1 -1
  59. package/dist/hooks/api/workflow-runs.js +95 -51
  60. package/dist/hooks/api/workflow-runs.js.map +1 -1
  61. package/dist/index.d.ts +3 -2
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +2 -1
  64. package/dist/index.js.map +1 -1
  65. package/dist/pages/project-workflows-page.d.ts +4 -0
  66. package/dist/pages/project-workflows-page.d.ts.map +1 -0
  67. package/dist/pages/project-workflows-page.js +479 -0
  68. package/dist/pages/project-workflows-page.js.map +1 -0
  69. package/dist/pages/workflow-run-page.d.ts +3 -1
  70. package/dist/pages/workflow-run-page.d.ts.map +1 -1
  71. package/dist/pages/workflow-run-page.js +21 -14
  72. package/dist/pages/workflow-run-page.js.map +1 -1
  73. package/dist/routes/inputs.d.ts +22 -0
  74. package/dist/routes/inputs.d.ts.map +1 -0
  75. package/dist/routes/inputs.js +76 -0
  76. package/dist/routes/inputs.js.map +1 -0
  77. package/dist/routes/run-detail.d.ts +2 -0
  78. package/dist/routes/run-detail.d.ts.map +1 -1
  79. package/dist/routes/run-detail.js +6 -6
  80. package/dist/routes/run-detail.js.map +1 -1
  81. package/dist/routes/runs.d.ts +2 -0
  82. package/dist/routes/runs.d.ts.map +1 -1
  83. package/dist/routes/runs.js +6 -6
  84. package/dist/routes/runs.js.map +1 -1
  85. package/dist/routes/workflows.d.ts +5 -0
  86. package/dist/routes/workflows.d.ts.map +1 -0
  87. package/dist/routes/workflows.js +14 -0
  88. package/dist/routes/workflows.js.map +1 -0
  89. package/dist/tsconfig.test.tsbuildinfo +1 -1
  90. package/package.json +13 -12
  91. package/src/components/workflow-run-list/types.ts +6 -0
  92. package/src/components/workflow-run-list/workflow-run-list-view.tsx +27 -11
  93. package/src/components/workflow-run-list/workflow-run-list.tsx +6 -0
  94. package/src/components/workflow-run-summary/workflow-run-attempt-switcher.test.tsx +5 -6
  95. package/src/components/workflow-run-summary/workflow-run-summary.tsx +3 -3
  96. package/src/components/workflow-run-view/job-card.tsx +20 -11
  97. package/src/components/workflow-run-view/workflow-run-view.test.tsx +3 -3
  98. package/src/components/workflow-run-view/workflow-run-view.tsx +2 -2
  99. package/src/core/entities/job-execution.ts +12 -28
  100. package/src/core/entities/job.ts +44 -45
  101. package/src/core/entities/step-attempt.ts +9 -20
  102. package/src/core/entities/step.ts +38 -66
  103. package/src/core/entities/workflow-run-attempt.ts +0 -14
  104. package/src/core/entities/workflow-run.ts +8 -86
  105. package/src/core/workflow-run.test.ts +13 -11
  106. package/src/core/workflow-run.ts +8 -13
  107. package/src/feature.ts +24 -10
  108. package/src/hooks/api/workflow-run-mapper.ts +246 -0
  109. package/src/hooks/api/workflow-runs.test.tsx +57 -59
  110. package/src/hooks/api/workflow-runs.ts +187 -88
  111. package/src/index.ts +5 -0
  112. package/src/page-harness-budget.test.ts +1 -0
  113. package/src/pages/project-workflows-page.test.tsx +247 -0
  114. package/src/pages/project-workflows-page.tsx +448 -0
  115. package/src/pages/workflow-run-page.test.tsx +4 -2
  116. package/src/pages/workflow-run-page.tsx +22 -17
  117. package/src/routes/inputs.test.ts +22 -0
  118. package/src/routes/inputs.ts +58 -0
  119. package/src/routes/run-detail.tsx +12 -8
  120. package/src/routes/runs.tsx +11 -4
  121. package/src/routes/workflows.tsx +10 -0
  122. package/test/fixtures/workflow-run.ts +9 -7
  123. package/test/pages.tsx +48 -6
  124. package/tsconfig.build.tsbuildinfo +1 -1
  125. package/vercel.json +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,IAAI,EACJ,WAAW,EACX,0BAA0B,EAC1B,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,GAAG,EACH,YAAY,EACZ,8BAA8B,EAC9B,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,2BAA2B,EAChC,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,2BAA2B,EAC3B,mBAAmB,EACnB,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,IAAI,EACJ,WAAW,EACX,0BAA0B,EAC1B,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,GAAG,EACH,YAAY,EACZ,8BAA8B,EAC9B,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,2BAA2B,EAChC,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,2BAA2B,EAC3B,mBAAmB,EACnB,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { isWorkflowRunTerminal, isWorkflowStatus, Job, JobExecution, TERMINAL_WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_STATUSES, workflowRunShortId, workflowRunTriggerLabel } from '#core/workflow-run.js';
2
- export { fireManualWorkflow, useCancelWorkflowRunMutation, useFireManualWorkflowMutation, useWorkflowRunAttemptsQuery, useWorkflowRunQuery, useWorkflowRunsInfiniteQuery, workflowRunsQueryKeys } from './hooks/api/workflow-runs.js';
2
+ export { fireManualWorkflow, useCancelWorkflowRunMutation, useFireManualWorkflowMutation, useWorkflowRunAttemptsQuery, useWorkflowRunQuery, useWorkflowRunsInfiniteQuery, workflowRunAttemptsQueryOptions, workflowRunQueryOptions, workflowRunsInfiniteQueryOptions, workflowRunsQueryKeys } from './hooks/api/workflow-runs.js';
3
+ export { ProjectWorkflowsPage } from './pages/project-workflows-page.js';
3
4
  export { WorkflowRunPage } from './pages/workflow-run-page.js';
4
5
 
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {\n AgentConfigIssue,\n JobDisplayDuration,\n JobExecutionDisplayDuration,\n JobExecutionStatus,\n JobExecutionTime,\n JobStatus,\n Step,\n StepAttempt,\n StepAttemptDisplayDuration,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepGateResult,\n StepSourceLocation,\n WorkflowRun,\n WorkflowRunAttempt,\n WorkflowRunDetail,\n WorkflowRunListPage,\n WorkflowRunStatus,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from '#core/workflow-run.js';\nexport {\n isWorkflowRunTerminal,\n isWorkflowStatus,\n Job,\n JobExecution,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunShortId,\n workflowRunTriggerLabel,\n} from '#core/workflow-run.js';\nexport {\n type FireManualWorkflowVariables,\n fireManualWorkflow,\n useCancelWorkflowRunMutation,\n useFireManualWorkflowMutation,\n useWorkflowRunAttemptsQuery,\n useWorkflowRunQuery,\n useWorkflowRunsInfiniteQuery,\n type WorkflowRunFilters,\n workflowRunsQueryKeys,\n} from './hooks/api/workflow-runs.js';\nexport {WorkflowRunPage} from './pages/workflow-run-page.js';\n"],"names":["isWorkflowRunTerminal","isWorkflowStatus","Job","JobExecution","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunShortId","workflowRunTriggerLabel","fireManualWorkflow","useCancelWorkflowRunMutation","useFireManualWorkflowMutation","useWorkflowRunAttemptsQuery","useWorkflowRunQuery","useWorkflowRunsInfiniteQuery","workflowRunsQueryKeys","WorkflowRunPage"],"mappings":"AAuBA,SACEA,qBAAqB,EACrBC,gBAAgB,EAChBC,GAAG,EACHC,YAAY,EACZC,8BAA8B,EAC9BC,qBAAqB,EACrBC,kBAAkB,EAClBC,uBAAuB,QAClB,wBAAwB;AAC/B,SAEEC,kBAAkB,EAClBC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,mBAAmB,EACnBC,4BAA4B,EAE5BC,qBAAqB,QAChB,+BAA+B;AACtC,SAAQC,eAAe,QAAO,+BAA+B"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {\n AgentConfigIssue,\n JobDisplayDuration,\n JobExecutionDisplayDuration,\n JobExecutionStatus,\n JobExecutionTime,\n JobStatus,\n ManualWorkflowLaunch,\n Step,\n StepAttempt,\n StepAttemptDisplayDuration,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepGateResult,\n StepSourceLocation,\n WorkflowRun,\n WorkflowRunAttempt,\n WorkflowRunDetail,\n WorkflowRunListPage,\n WorkflowRunStatus,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from '#core/workflow-run.js';\nexport {\n isWorkflowRunTerminal,\n isWorkflowStatus,\n Job,\n JobExecution,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunShortId,\n workflowRunTriggerLabel,\n} from '#core/workflow-run.js';\nexport {\n type FireManualWorkflowVariables,\n fireManualWorkflow,\n useCancelWorkflowRunMutation,\n useFireManualWorkflowMutation,\n useWorkflowRunAttemptsQuery,\n useWorkflowRunQuery,\n useWorkflowRunsInfiniteQuery,\n type WorkflowRunFilters,\n workflowRunAttemptsQueryOptions,\n workflowRunQueryOptions,\n workflowRunsInfiniteQueryOptions,\n workflowRunsQueryKeys,\n} from './hooks/api/workflow-runs.js';\nexport {ProjectWorkflowsPage} from './pages/project-workflows-page.js';\nexport {WorkflowRunPage} from './pages/workflow-run-page.js';\n"],"names":["isWorkflowRunTerminal","isWorkflowStatus","Job","JobExecution","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunShortId","workflowRunTriggerLabel","fireManualWorkflow","useCancelWorkflowRunMutation","useFireManualWorkflowMutation","useWorkflowRunAttemptsQuery","useWorkflowRunQuery","useWorkflowRunsInfiniteQuery","workflowRunAttemptsQueryOptions","workflowRunQueryOptions","workflowRunsInfiniteQueryOptions","workflowRunsQueryKeys","ProjectWorkflowsPage","WorkflowRunPage"],"mappings":"AAwBA,SACEA,qBAAqB,EACrBC,gBAAgB,EAChBC,GAAG,EACHC,YAAY,EACZC,8BAA8B,EAC9BC,qBAAqB,EACrBC,kBAAkB,EAClBC,uBAAuB,QAClB,wBAAwB;AAC/B,SAEEC,kBAAkB,EAClBC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,mBAAmB,EACnBC,4BAA4B,EAE5BC,+BAA+B,EAC/BC,uBAAuB,EACvBC,gCAAgC,EAChCC,qBAAqB,QAChB,+BAA+B;AACtC,SAAQC,oBAAoB,QAAO,oCAAoC;AACvE,SAAQC,eAAe,QAAO,+BAA+B"}
@@ -0,0 +1,4 @@
1
+ export declare function ProjectWorkflowsPage({ projectId }: {
2
+ projectId: string;
3
+ }): import("react").JSX.Element;
4
+ //# sourceMappingURL=project-workflows-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-workflows-page.d.ts","sourceRoot":"","sources":["../../src/pages/project-workflows-page.tsx"],"names":[],"mappings":"AAqCA,wBAAgB,oBAAoB,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,+BAMpE"}
@@ -0,0 +1,479 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { ApiError } from '@shipfox/client-api';
3
+ import { SourceStrip, useDefinitionsInfiniteQuery, useProjectQuery } from '@shipfox/client-projects';
4
+ import { QueryLoadError } from '@shipfox/client-ui';
5
+ import { Button } from '@shipfox/react-ui/button';
6
+ import { Callout } from '@shipfox/react-ui/callout';
7
+ import { EmptyState } from '@shipfox/react-ui/empty-state';
8
+ import { Icon } from '@shipfox/react-ui/icon';
9
+ import { LoadErrorState } from '@shipfox/react-ui/load-error-state';
10
+ import { RelativeTime, RelativeTimeProvider } from '@shipfox/react-ui/relative-time';
11
+ import { Sheet, SheetBody, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@shipfox/react-ui/sheet';
12
+ import { Skeleton } from '@shipfox/react-ui/skeleton';
13
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@shipfox/react-ui/table';
14
+ import { toast } from '@shipfox/react-ui/toast';
15
+ import { Code, Header, Text } from '@shipfox/react-ui/typography';
16
+ import { useState } from 'react';
17
+ import { useFireManualWorkflowMutation } from '#hooks/api/workflow-runs.js';
18
+ export function ProjectWorkflowsPage({ projectId }) {
19
+ return /*#__PURE__*/ _jsx(RelativeTimeProvider, {
20
+ children: /*#__PURE__*/ _jsx(ProjectWorkflowsPageInner, {
21
+ projectId: projectId
22
+ })
23
+ });
24
+ }
25
+ function ProjectWorkflowsPageInner({ projectId }) {
26
+ const projectQuery = useProjectQuery(projectId);
27
+ const definitionsQuery = useDefinitionsInfiniteQuery(projectId);
28
+ const fireManual = useFireManualWorkflowMutation();
29
+ const [selectedDefinition, setSelectedDefinition] = useState(null);
30
+ const [runError, setRunError] = useState(null);
31
+ const definitions = definitionsQuery.data?.pages.flatMap((page)=>page.definitions) ?? [];
32
+ const sync = definitionsQuery.data?.pages[0]?.sync;
33
+ async function handleRun(definition) {
34
+ setRunError(null);
35
+ if (!definition.manualTrigger) return;
36
+ try {
37
+ await fireManual.mutateAsync({
38
+ projectId,
39
+ definitionId: definition.id
40
+ });
41
+ toast.success('Run queued');
42
+ } catch (error) {
43
+ const message = errorMessage(error, 'Could not queue run.');
44
+ setRunError({
45
+ definitionId: definition.id,
46
+ message
47
+ });
48
+ toast.error(message);
49
+ }
50
+ }
51
+ return /*#__PURE__*/ _jsxs("div", {
52
+ className: "flex w-full flex-col gap-24",
53
+ children: [
54
+ projectQuery.isPending ? /*#__PURE__*/ _jsxs("div", {
55
+ className: "flex flex-col gap-12",
56
+ children: [
57
+ /*#__PURE__*/ _jsx(Skeleton, {
58
+ className: "h-28 w-1/3"
59
+ }),
60
+ /*#__PURE__*/ _jsx(Skeleton, {
61
+ className: "h-18 w-1/2"
62
+ })
63
+ ]
64
+ }) : null,
65
+ projectQuery.isError && projectQuery.data === undefined ? projectQuery.error instanceof ApiError && projectQuery.error.status === 404 ? /*#__PURE__*/ _jsx(EmptyState, {
66
+ icon: "errorWarningLine",
67
+ title: "Project not found",
68
+ description: "This project doesn't exist, or you don't have access to it."
69
+ }) : /*#__PURE__*/ _jsx(QueryLoadError, {
70
+ query: projectQuery,
71
+ subject: "project"
72
+ }) : null,
73
+ projectQuery.data ? /*#__PURE__*/ _jsxs(_Fragment, {
74
+ children: [
75
+ /*#__PURE__*/ _jsxs("header", {
76
+ className: "flex flex-col gap-4",
77
+ children: [
78
+ /*#__PURE__*/ _jsx(Header, {
79
+ variant: "h2",
80
+ children: "Workflows"
81
+ }),
82
+ /*#__PURE__*/ _jsx(Text, {
83
+ size: "sm",
84
+ className: "text-foreground-neutral-muted",
85
+ children: "Synced workflow definitions for this project source."
86
+ })
87
+ ]
88
+ }),
89
+ /*#__PURE__*/ _jsx(SourceStrip, {
90
+ connectionId: projectQuery.data.source.connectionId,
91
+ externalRepositoryId: projectQuery.data.source.externalRepositoryId,
92
+ sync: sync,
93
+ isPending: definitionsQuery.isPending
94
+ }),
95
+ /*#__PURE__*/ _jsx(WorkflowSyncAlert, {
96
+ sync: sync
97
+ }),
98
+ /*#__PURE__*/ _jsx(WorkflowDefinitionsList, {
99
+ definitions: definitions,
100
+ isPending: definitionsQuery.isPending,
101
+ isError: definitionsQuery.isError,
102
+ sync: sync ?? null,
103
+ runError: runError,
104
+ runningDefinitionId: fireManual.isPending && fireManual.variables ? fireManual.variables.definitionId : null,
105
+ hasNextPage: definitionsQuery.hasNextPage,
106
+ isFetchingNextPage: definitionsQuery.isFetchingNextPage,
107
+ isFetchNextPageError: definitionsQuery.isFetchNextPageError,
108
+ onRetry: ()=>definitionsQuery.refetch(),
109
+ onLoadMore: ()=>definitionsQuery.fetchNextPage(),
110
+ onOpenDefinition: setSelectedDefinition,
111
+ onRun: (definition)=>{
112
+ void handleRun(definition);
113
+ }
114
+ })
115
+ ]
116
+ }) : null,
117
+ /*#__PURE__*/ _jsx(DefinitionSheet, {
118
+ definition: selectedDefinition,
119
+ onOpenChange: (open)=>{
120
+ if (!open) setSelectedDefinition(null);
121
+ }
122
+ })
123
+ ]
124
+ });
125
+ }
126
+ function WorkflowDefinitionsList({ definitions, isPending, isError, sync, runError, runningDefinitionId, hasNextPage, isFetchingNextPage, isFetchNextPageError, onRetry, onLoadMore, onOpenDefinition, onRun }) {
127
+ if (isPending) {
128
+ return /*#__PURE__*/ _jsxs("div", {
129
+ className: "flex flex-col gap-8",
130
+ children: [
131
+ /*#__PURE__*/ _jsx(Skeleton, {
132
+ className: "h-40 w-full"
133
+ }),
134
+ /*#__PURE__*/ _jsx(Skeleton, {
135
+ className: "h-40 w-full"
136
+ }),
137
+ /*#__PURE__*/ _jsx(Skeleton, {
138
+ className: "h-40 w-full"
139
+ })
140
+ ]
141
+ });
142
+ }
143
+ if (isError && definitions.length === 0) {
144
+ return /*#__PURE__*/ _jsx(LoadErrorState, {
145
+ title: "Couldn't load workflows",
146
+ description: "Definitions could not be loaded. Source metadata remains visible.",
147
+ onRetry: onRetry,
148
+ retryLabel: "Retry loading workflows"
149
+ });
150
+ }
151
+ if (definitions.length === 0) {
152
+ return /*#__PURE__*/ _jsx(WorkflowEmptyState, {
153
+ sync: sync
154
+ });
155
+ }
156
+ return /*#__PURE__*/ _jsxs(_Fragment, {
157
+ children: [
158
+ /*#__PURE__*/ _jsx("div", {
159
+ className: "hidden rounded-8 border border-border-neutral-base md:block",
160
+ children: /*#__PURE__*/ _jsxs(Table, {
161
+ children: [
162
+ /*#__PURE__*/ _jsx(TableHeader, {
163
+ children: /*#__PURE__*/ _jsxs(TableRow, {
164
+ children: [
165
+ /*#__PURE__*/ _jsx(TableHead, {
166
+ className: "w-40"
167
+ }),
168
+ /*#__PURE__*/ _jsx(TableHead, {
169
+ children: "Workflow"
170
+ }),
171
+ /*#__PURE__*/ _jsx(TableHead, {
172
+ className: "w-180",
173
+ children: "Updated"
174
+ }),
175
+ /*#__PURE__*/ _jsx(TableHead, {
176
+ className: "w-80 text-right"
177
+ })
178
+ ]
179
+ })
180
+ }),
181
+ /*#__PURE__*/ _jsx(TableBody, {
182
+ children: definitions.map((definition)=>{
183
+ const runErrorMessage = runError?.definitionId === definition.id ? runError.message : null;
184
+ const isRunning = runningDefinitionId === definition.id;
185
+ return(// The workflow-name cell holds a `<button>` so the row is
186
+ // keyboard-reachable (Tab focuses, Enter/Space activates
187
+ // via native button semantics). The TableRow itself is no
188
+ // longer clickable — a row-level onClick would be invisible
189
+ // to keyboard users and require custom keydown handling.
190
+ // The `group` class on the row still drives the Run button
191
+ // reveal on hover or focus-within.
192
+ /*#__PURE__*/ _jsxs(TableRow, {
193
+ className: "group",
194
+ children: [
195
+ /*#__PURE__*/ _jsx(TableCell, {
196
+ children: /*#__PURE__*/ _jsx(Icon, {
197
+ name: sourceIcon(definition.source),
198
+ className: "size-16 text-foreground-neutral-muted",
199
+ "aria-hidden": "true"
200
+ })
201
+ }),
202
+ /*#__PURE__*/ _jsx(TableCell, {
203
+ className: "max-w-260",
204
+ children: /*#__PURE__*/ _jsxs("div", {
205
+ className: "flex min-w-0 flex-col gap-2",
206
+ children: [
207
+ /*#__PURE__*/ _jsxs("button", {
208
+ type: "button",
209
+ onClick: ()=>onOpenDefinition(definition),
210
+ className: "flex min-w-0 flex-col gap-2 text-left outline-none focus-visible:shadow-border-interactive-with-active rounded-4",
211
+ children: [
212
+ /*#__PURE__*/ _jsx(Text, {
213
+ size: "sm",
214
+ bold: true,
215
+ className: "truncate",
216
+ children: definition.name
217
+ }),
218
+ /*#__PURE__*/ _jsx(Code, {
219
+ className: "truncate text-foreground-neutral-muted",
220
+ children: definition.configPath ?? 'Manual definition'
221
+ })
222
+ ]
223
+ }),
224
+ runErrorMessage ? /*#__PURE__*/ _jsx(Text, {
225
+ size: "xs",
226
+ className: "text-tag-error-text",
227
+ children: runErrorMessage
228
+ }) : null
229
+ ]
230
+ })
231
+ }),
232
+ /*#__PURE__*/ _jsx(TableCell, {
233
+ className: "text-foreground-neutral-muted",
234
+ children: /*#__PURE__*/ _jsx(RelativeTime, {
235
+ value: definition.updatedAt
236
+ })
237
+ }),
238
+ /*#__PURE__*/ _jsx(TableCell, {
239
+ children: definition.manualTrigger ? /*#__PURE__*/ _jsx("div", {
240
+ className: "flex justify-end opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",
241
+ children: /*#__PURE__*/ _jsx(Button, {
242
+ size: "xs",
243
+ isLoading: isRunning,
244
+ onClick: ()=>onRun(definition),
245
+ children: "Run"
246
+ })
247
+ }) : null
248
+ })
249
+ ]
250
+ }, definition.id));
251
+ })
252
+ })
253
+ ]
254
+ })
255
+ }),
256
+ /*#__PURE__*/ _jsx("div", {
257
+ className: "flex flex-col rounded-8 border border-border-neutral-base md:hidden",
258
+ children: definitions.map((definition)=>{
259
+ const runErrorMessage = runError?.definitionId === definition.id ? runError.message : null;
260
+ const isRunning = runningDefinitionId === definition.id;
261
+ return /*#__PURE__*/ _jsxs("div", {
262
+ className: "flex flex-col gap-10 border-b border-border-neutral-base p-12 last:border-b-0",
263
+ children: [
264
+ /*#__PURE__*/ _jsxs("button", {
265
+ type: "button",
266
+ className: "flex min-w-0 items-start gap-10 text-left",
267
+ onClick: ()=>onOpenDefinition(definition),
268
+ children: [
269
+ /*#__PURE__*/ _jsx(Icon, {
270
+ name: sourceIcon(definition.source),
271
+ className: "size-16 shrink-0 text-foreground-neutral-muted",
272
+ "aria-hidden": "true"
273
+ }),
274
+ /*#__PURE__*/ _jsxs("div", {
275
+ className: "flex min-w-0 flex-col gap-4",
276
+ children: [
277
+ /*#__PURE__*/ _jsx(Text, {
278
+ size: "sm",
279
+ bold: true,
280
+ className: "break-words",
281
+ children: definition.name
282
+ }),
283
+ /*#__PURE__*/ _jsx(Code, {
284
+ className: "break-words text-foreground-neutral-muted",
285
+ children: definition.configPath ?? 'Manual definition'
286
+ })
287
+ ]
288
+ })
289
+ ]
290
+ }),
291
+ /*#__PURE__*/ _jsxs("div", {
292
+ className: "flex items-center justify-between gap-8",
293
+ children: [
294
+ /*#__PURE__*/ _jsxs(Text, {
295
+ size: "xs",
296
+ className: "text-foreground-neutral-muted",
297
+ children: [
298
+ "Updated ",
299
+ /*#__PURE__*/ _jsx(RelativeTime, {
300
+ value: definition.updatedAt
301
+ })
302
+ ]
303
+ }),
304
+ definition.manualTrigger ? /*#__PURE__*/ _jsx(Button, {
305
+ size: "sm",
306
+ isLoading: isRunning,
307
+ onClick: ()=>onRun(definition),
308
+ children: "Run"
309
+ }) : null
310
+ ]
311
+ }),
312
+ runErrorMessage ? /*#__PURE__*/ _jsx(Text, {
313
+ size: "xs",
314
+ className: "text-tag-error-text",
315
+ children: runErrorMessage
316
+ }) : null
317
+ ]
318
+ }, definition.id);
319
+ })
320
+ }),
321
+ isFetchNextPageError ? /*#__PURE__*/ _jsx(Callout, {
322
+ role: "alert",
323
+ type: "error",
324
+ children: /*#__PURE__*/ _jsxs("div", {
325
+ className: "flex items-center justify-between gap-12",
326
+ children: [
327
+ /*#__PURE__*/ _jsx(Text, {
328
+ size: "sm",
329
+ children: "Could not load more workflows."
330
+ }),
331
+ /*#__PURE__*/ _jsx(Button, {
332
+ size: "sm",
333
+ variant: "secondary",
334
+ onClick: onLoadMore,
335
+ children: "Retry"
336
+ })
337
+ ]
338
+ })
339
+ }) : null,
340
+ hasNextPage ? /*#__PURE__*/ _jsx("div", {
341
+ className: "flex justify-center",
342
+ children: /*#__PURE__*/ _jsx(Button, {
343
+ size: "sm",
344
+ variant: "secondary",
345
+ isLoading: isFetchingNextPage,
346
+ onClick: onLoadMore,
347
+ children: "Load more"
348
+ })
349
+ }) : null
350
+ ]
351
+ });
352
+ }
353
+ function sourceIcon(source) {
354
+ return source === 'vcs' ? 'gitBranchLine' : 'terminalLine';
355
+ }
356
+ function WorkflowEmptyState({ sync }) {
357
+ const message = sync?.status === 'failed' && sync.lastErrorCode === 'no-workflow-files' ? 'No workflow files found under .shipfox/workflows/.' : sync?.status === 'failed' ? sync.lastErrorMessage ?? 'Workflow definitions could not be synced.' : sync?.status === 'syncing' ? 'Workflow definitions are being discovered.' : sync?.status === 'succeeded' ? 'No workflow definitions found.' : 'Workflow sync has not reported yet.';
358
+ return /*#__PURE__*/ _jsx(EmptyState, {
359
+ icon: "flowChart",
360
+ title: "No workflows",
361
+ description: message
362
+ });
363
+ }
364
+ function WorkflowSyncAlert({ sync }) {
365
+ if (sync?.status !== 'failed') return null;
366
+ return /*#__PURE__*/ _jsx(Callout, {
367
+ role: "alert",
368
+ type: "error",
369
+ children: /*#__PURE__*/ _jsxs("div", {
370
+ className: "flex flex-col gap-4",
371
+ children: [
372
+ /*#__PURE__*/ _jsx(Text, {
373
+ size: "sm",
374
+ bold: true,
375
+ children: "Workflow sync failed"
376
+ }),
377
+ /*#__PURE__*/ _jsx(Text, {
378
+ size: "sm",
379
+ children: sync.lastErrorMessage ?? 'The latest workflow sync failed before definitions updated.'
380
+ })
381
+ ]
382
+ })
383
+ });
384
+ }
385
+ function DefinitionSheet({ definition, onOpenChange }) {
386
+ const normalizedJson = definition ? JSON.stringify({
387
+ workflow_document: definition.workflowDocument,
388
+ workflow_model: definition.workflowModel
389
+ }, null, 2) : '';
390
+ return /*#__PURE__*/ _jsx(Sheet, {
391
+ open: Boolean(definition),
392
+ onOpenChange: onOpenChange,
393
+ children: /*#__PURE__*/ _jsx(SheetContent, {
394
+ className: "w-full sm:max-w-[560px]",
395
+ children: definition ? /*#__PURE__*/ _jsxs(_Fragment, {
396
+ children: [
397
+ /*#__PURE__*/ _jsxs(SheetHeader, {
398
+ children: [
399
+ /*#__PURE__*/ _jsx(SheetTitle, {
400
+ children: definition.name
401
+ }),
402
+ /*#__PURE__*/ _jsx(SheetDescription, {
403
+ children: definition.configPath ?? 'Manual workflow definition'
404
+ })
405
+ ]
406
+ }),
407
+ /*#__PURE__*/ _jsxs(SheetBody, {
408
+ className: "gap-18",
409
+ children: [
410
+ /*#__PURE__*/ _jsxs("div", {
411
+ className: "grid w-full gap-10",
412
+ children: [
413
+ /*#__PURE__*/ _jsx(Metadata, {
414
+ label: "Definition id",
415
+ value: definition.id
416
+ }),
417
+ /*#__PURE__*/ _jsx(Metadata, {
418
+ label: "Source",
419
+ value: definition.source
420
+ }),
421
+ /*#__PURE__*/ _jsx(Metadata, {
422
+ label: "Ref",
423
+ value: definition.ref ?? 'Not set'
424
+ }),
425
+ /*#__PURE__*/ _jsx(Metadata, {
426
+ label: "SHA",
427
+ value: definition.sha ?? 'Not set'
428
+ })
429
+ ]
430
+ }),
431
+ /*#__PURE__*/ _jsxs("div", {
432
+ className: "flex w-full flex-col gap-8",
433
+ children: [
434
+ /*#__PURE__*/ _jsx(Text, {
435
+ size: "sm",
436
+ bold: true,
437
+ children: "Normalized definition"
438
+ }),
439
+ /*#__PURE__*/ _jsx("pre", {
440
+ className: "max-h-[52vh] w-full overflow-auto rounded-8 border border-border-neutral-base bg-background-neutral-subtle p-12 scrollbar",
441
+ children: /*#__PURE__*/ _jsx(Code, {
442
+ as: "code",
443
+ className: "whitespace-pre text-foreground-neutral-base",
444
+ children: normalizedJson
445
+ })
446
+ })
447
+ ]
448
+ })
449
+ ]
450
+ })
451
+ ]
452
+ }) : null
453
+ })
454
+ });
455
+ }
456
+ function Metadata({ label, value }) {
457
+ return /*#__PURE__*/ _jsxs("div", {
458
+ className: "min-w-0 py-12 first:pt-0 last:pb-0",
459
+ children: [
460
+ /*#__PURE__*/ _jsx(Text, {
461
+ size: "xs",
462
+ className: "text-foreground-neutral-muted",
463
+ children: label
464
+ }),
465
+ /*#__PURE__*/ _jsx(Text, {
466
+ size: "sm",
467
+ className: "break-words",
468
+ children: value
469
+ })
470
+ ]
471
+ });
472
+ }
473
+ function errorMessage(error, fallback) {
474
+ if (error instanceof ApiError && error.message) return error.message;
475
+ if (error instanceof Error && error.message) return error.message;
476
+ return fallback;
477
+ }
478
+
479
+ //# sourceMappingURL=project-workflows-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/pages/project-workflows-page.tsx"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\nimport {\n type Definition,\n type DefinitionSyncSummary,\n SourceStrip,\n useDefinitionsInfiniteQuery,\n useProjectQuery,\n} from '@shipfox/client-projects';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon, type IconName} from '@shipfox/react-ui/icon';\nimport {LoadErrorState} from '@shipfox/react-ui/load-error-state';\nimport {RelativeTime, RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@shipfox/react-ui/sheet';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@shipfox/react-ui/table';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Code, Header, Text} from '@shipfox/react-ui/typography';\nimport {useState} from 'react';\nimport {useFireManualWorkflowMutation} from '#hooks/api/workflow-runs.js';\n\nexport function ProjectWorkflowsPage({projectId}: {projectId: string}) {\n return (\n <RelativeTimeProvider>\n <ProjectWorkflowsPageInner projectId={projectId} />\n </RelativeTimeProvider>\n );\n}\n\nfunction ProjectWorkflowsPageInner({projectId}: {projectId: string}) {\n const projectQuery = useProjectQuery(projectId);\n const definitionsQuery = useDefinitionsInfiniteQuery(projectId);\n const fireManual = useFireManualWorkflowMutation();\n const [selectedDefinition, setSelectedDefinition] = useState<Definition | null>(null);\n const [runError, setRunError] = useState<{definitionId: string; message: string} | null>(null);\n const definitions = definitionsQuery.data?.pages.flatMap((page) => page.definitions) ?? [];\n const sync = definitionsQuery.data?.pages[0]?.sync;\n\n async function handleRun(definition: Definition) {\n setRunError(null);\n if (!definition.manualTrigger) return;\n try {\n await fireManual.mutateAsync({projectId, definitionId: definition.id});\n toast.success('Run queued');\n } catch (error) {\n const message = errorMessage(error, 'Could not queue run.');\n setRunError({definitionId: definition.id, message});\n toast.error(message);\n }\n }\n\n return (\n <div className=\"flex w-full flex-col gap-24\">\n {projectQuery.isPending ? (\n <div className=\"flex flex-col gap-12\">\n <Skeleton className=\"h-28 w-1/3\" />\n <Skeleton className=\"h-18 w-1/2\" />\n </div>\n ) : null}\n\n {projectQuery.isError && projectQuery.data === undefined ? (\n projectQuery.error instanceof ApiError && projectQuery.error.status === 404 ? (\n <EmptyState\n icon=\"errorWarningLine\"\n title=\"Project not found\"\n description=\"This project doesn't exist, or you don't have access to it.\"\n />\n ) : (\n <QueryLoadError query={projectQuery} subject=\"project\" />\n )\n ) : null}\n\n {projectQuery.data ? (\n <>\n <header className=\"flex flex-col gap-4\">\n <Header variant=\"h2\">Workflows</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Synced workflow definitions for this project source.\n </Text>\n </header>\n\n <SourceStrip\n connectionId={projectQuery.data.source.connectionId}\n externalRepositoryId={projectQuery.data.source.externalRepositoryId}\n sync={sync}\n isPending={definitionsQuery.isPending}\n />\n\n <WorkflowSyncAlert sync={sync} />\n\n <WorkflowDefinitionsList\n definitions={definitions}\n isPending={definitionsQuery.isPending}\n isError={definitionsQuery.isError}\n sync={sync ?? null}\n runError={runError}\n runningDefinitionId={\n fireManual.isPending && fireManual.variables\n ? fireManual.variables.definitionId\n : null\n }\n hasNextPage={definitionsQuery.hasNextPage}\n isFetchingNextPage={definitionsQuery.isFetchingNextPage}\n isFetchNextPageError={definitionsQuery.isFetchNextPageError}\n onRetry={() => definitionsQuery.refetch()}\n onLoadMore={() => definitionsQuery.fetchNextPage()}\n onOpenDefinition={setSelectedDefinition}\n onRun={(definition) => {\n void handleRun(definition);\n }}\n />\n </>\n ) : null}\n\n <DefinitionSheet\n definition={selectedDefinition}\n onOpenChange={(open) => {\n if (!open) setSelectedDefinition(null);\n }}\n />\n </div>\n );\n}\n\nfunction WorkflowDefinitionsList({\n definitions,\n isPending,\n isError,\n sync,\n runError,\n runningDefinitionId,\n hasNextPage,\n isFetchingNextPage,\n isFetchNextPageError,\n onRetry,\n onLoadMore,\n onOpenDefinition,\n onRun,\n}: {\n definitions: Definition[];\n isPending: boolean;\n isError: boolean;\n sync: DefinitionSyncSummary | null;\n runError: {definitionId: string; message: string} | null;\n runningDefinitionId: string | null;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n isFetchNextPageError: boolean;\n onRetry: () => void;\n onLoadMore: () => void;\n onOpenDefinition: (definition: Definition) => void;\n onRun: (definition: Definition) => void;\n}) {\n if (isPending) {\n return (\n <div className=\"flex flex-col gap-8\">\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n );\n }\n\n if (isError && definitions.length === 0) {\n return (\n <LoadErrorState\n title=\"Couldn't load workflows\"\n description=\"Definitions could not be loaded. Source metadata remains visible.\"\n onRetry={onRetry}\n retryLabel=\"Retry loading workflows\"\n />\n );\n }\n\n if (definitions.length === 0) {\n return <WorkflowEmptyState sync={sync} />;\n }\n\n return (\n <>\n <div className=\"hidden rounded-8 border border-border-neutral-base md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-40\"></TableHead>\n <TableHead>Workflow</TableHead>\n <TableHead className=\"w-180\">Updated</TableHead>\n <TableHead className=\"w-80 text-right\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {definitions.map((definition) => {\n const runErrorMessage =\n runError?.definitionId === definition.id ? runError.message : null;\n const isRunning = runningDefinitionId === definition.id;\n\n return (\n // The workflow-name cell holds a `<button>` so the row is\n // keyboard-reachable (Tab focuses, Enter/Space activates\n // via native button semantics). The TableRow itself is no\n // longer clickable — a row-level onClick would be invisible\n // to keyboard users and require custom keydown handling.\n // The `group` class on the row still drives the Run button\n // reveal on hover or focus-within.\n <TableRow key={definition.id} className=\"group\">\n <TableCell>\n <Icon\n name={sourceIcon(definition.source)}\n className=\"size-16 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n </TableCell>\n <TableCell className=\"max-w-260\">\n <div className=\"flex min-w-0 flex-col gap-2\">\n <button\n type=\"button\"\n onClick={() => onOpenDefinition(definition)}\n className=\"flex min-w-0 flex-col gap-2 text-left outline-none focus-visible:shadow-border-interactive-with-active rounded-4\"\n >\n <Text size=\"sm\" bold className=\"truncate\">\n {definition.name}\n </Text>\n <Code className=\"truncate text-foreground-neutral-muted\">\n {definition.configPath ?? 'Manual definition'}\n </Code>\n </button>\n {runErrorMessage ? (\n <Text size=\"xs\" className=\"text-tag-error-text\">\n {runErrorMessage}\n </Text>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-foreground-neutral-muted\">\n <RelativeTime value={definition.updatedAt} />\n </TableCell>\n <TableCell>\n {definition.manualTrigger ? (\n <div className=\"flex justify-end opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n <Button size=\"xs\" isLoading={isRunning} onClick={() => onRun(definition)}>\n Run\n </Button>\n </div>\n ) : null}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n\n <div className=\"flex flex-col rounded-8 border border-border-neutral-base md:hidden\">\n {definitions.map((definition) => {\n const runErrorMessage =\n runError?.definitionId === definition.id ? runError.message : null;\n const isRunning = runningDefinitionId === definition.id;\n\n return (\n <div\n key={definition.id}\n className=\"flex flex-col gap-10 border-b border-border-neutral-base p-12 last:border-b-0\"\n >\n <button\n type=\"button\"\n className=\"flex min-w-0 items-start gap-10 text-left\"\n onClick={() => onOpenDefinition(definition)}\n >\n <Icon\n name={sourceIcon(definition.source)}\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Text size=\"sm\" bold className=\"break-words\">\n {definition.name}\n </Text>\n <Code className=\"break-words text-foreground-neutral-muted\">\n {definition.configPath ?? 'Manual definition'}\n </Code>\n </div>\n </button>\n <div className=\"flex items-center justify-between gap-8\">\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n Updated <RelativeTime value={definition.updatedAt} />\n </Text>\n {definition.manualTrigger ? (\n <Button size=\"sm\" isLoading={isRunning} onClick={() => onRun(definition)}>\n Run\n </Button>\n ) : null}\n </div>\n {runErrorMessage ? (\n <Text size=\"xs\" className=\"text-tag-error-text\">\n {runErrorMessage}\n </Text>\n ) : null}\n </div>\n );\n })}\n </div>\n\n {isFetchNextPageError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-12\">\n <Text size=\"sm\">Could not load more workflows.</Text>\n <Button size=\"sm\" variant=\"secondary\" onClick={onLoadMore}>\n Retry\n </Button>\n </div>\n </Callout>\n ) : null}\n\n {hasNextPage ? (\n <div className=\"flex justify-center\">\n <Button size=\"sm\" variant=\"secondary\" isLoading={isFetchingNextPage} onClick={onLoadMore}>\n Load more\n </Button>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction sourceIcon(source: 'manual' | 'vcs'): IconName {\n return source === 'vcs' ? ('gitBranchLine' as IconName) : ('terminalLine' as IconName);\n}\n\nfunction WorkflowEmptyState({sync}: {sync: DefinitionSyncSummary | null}) {\n const message =\n sync?.status === 'failed' && sync.lastErrorCode === 'no-workflow-files'\n ? 'No workflow files found under .shipfox/workflows/.'\n : sync?.status === 'failed'\n ? (sync.lastErrorMessage ?? 'Workflow definitions could not be synced.')\n : sync?.status === 'syncing'\n ? 'Workflow definitions are being discovered.'\n : sync?.status === 'succeeded'\n ? 'No workflow definitions found.'\n : 'Workflow sync has not reported yet.';\n\n return <EmptyState icon=\"flowChart\" title=\"No workflows\" description={message} />;\n}\n\nfunction WorkflowSyncAlert({sync}: {sync: DefinitionSyncSummary | null | undefined}) {\n if (sync?.status !== 'failed') return null;\n\n return (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-4\">\n <Text size=\"sm\" bold>\n Workflow sync failed\n </Text>\n <Text size=\"sm\">\n {sync.lastErrorMessage ?? 'The latest workflow sync failed before definitions updated.'}\n </Text>\n </div>\n </Callout>\n );\n}\n\nfunction DefinitionSheet({\n definition,\n onOpenChange,\n}: {\n definition: Definition | null;\n onOpenChange: (open: boolean) => void;\n}) {\n const normalizedJson = definition\n ? JSON.stringify(\n {\n workflow_document: definition.workflowDocument,\n workflow_model: definition.workflowModel,\n },\n null,\n 2,\n )\n : '';\n\n return (\n <Sheet open={Boolean(definition)} onOpenChange={onOpenChange}>\n <SheetContent className=\"w-full sm:max-w-[560px]\">\n {definition ? (\n <>\n <SheetHeader>\n <SheetTitle>{definition.name}</SheetTitle>\n <SheetDescription>\n {definition.configPath ?? 'Manual workflow definition'}\n </SheetDescription>\n </SheetHeader>\n <SheetBody className=\"gap-18\">\n <div className=\"grid w-full gap-10\">\n <Metadata label=\"Definition id\" value={definition.id} />\n <Metadata label=\"Source\" value={definition.source} />\n <Metadata label=\"Ref\" value={definition.ref ?? 'Not set'} />\n <Metadata label=\"SHA\" value={definition.sha ?? 'Not set'} />\n </div>\n <div className=\"flex w-full flex-col gap-8\">\n <Text size=\"sm\" bold>\n Normalized definition\n </Text>\n <pre className=\"max-h-[52vh] w-full overflow-auto rounded-8 border border-border-neutral-base bg-background-neutral-subtle p-12 scrollbar\">\n <Code as=\"code\" className=\"whitespace-pre text-foreground-neutral-base\">\n {normalizedJson}\n </Code>\n </pre>\n </div>\n </SheetBody>\n </>\n ) : null}\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction Metadata({label, value}: {label: string; value: string}) {\n return (\n <div className=\"min-w-0 py-12 first:pt-0 last:pb-0\">\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n {label}\n </Text>\n <Text size=\"sm\" className=\"break-words\">\n {value}\n </Text>\n </div>\n );\n}\n\nfunction errorMessage(error: unknown, fallback: string) {\n if (error instanceof ApiError && error.message) return error.message;\n if (error instanceof Error && error.message) return error.message;\n return fallback;\n}\n"],"names":["ApiError","SourceStrip","useDefinitionsInfiniteQuery","useProjectQuery","QueryLoadError","Button","Callout","EmptyState","Icon","LoadErrorState","RelativeTime","RelativeTimeProvider","Sheet","SheetBody","SheetContent","SheetDescription","SheetHeader","SheetTitle","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","toast","Code","Header","Text","useState","useFireManualWorkflowMutation","ProjectWorkflowsPage","projectId","ProjectWorkflowsPageInner","projectQuery","definitionsQuery","fireManual","selectedDefinition","setSelectedDefinition","runError","setRunError","definitions","data","pages","flatMap","page","sync","handleRun","definition","manualTrigger","mutateAsync","definitionId","id","success","error","message","errorMessage","div","className","isPending","isError","undefined","status","icon","title","description","query","subject","header","variant","size","connectionId","source","externalRepositoryId","WorkflowSyncAlert","WorkflowDefinitionsList","runningDefinitionId","variables","hasNextPage","isFetchingNextPage","isFetchNextPageError","onRetry","refetch","onLoadMore","fetchNextPage","onOpenDefinition","onRun","DefinitionSheet","onOpenChange","open","length","retryLabel","WorkflowEmptyState","map","runErrorMessage","isRunning","name","sourceIcon","aria-hidden","button","type","onClick","bold","configPath","value","updatedAt","isLoading","role","lastErrorCode","lastErrorMessage","normalizedJson","JSON","stringify","workflow_document","workflowDocument","workflow_model","workflowModel","Boolean","Metadata","label","ref","sha","pre","as","fallback","Error"],"mappings":"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"}
@@ -1,8 +1,10 @@
1
+ import { type WorkflowRunsSearch } from '#routes/inputs.js';
1
2
  interface WorkflowRunPageProps {
2
3
  workspaceId: string;
3
4
  projectId: string;
4
5
  workflowRunId?: string | undefined;
6
+ search?: WorkflowRunsSearch;
5
7
  }
6
- export declare function WorkflowRunPage({ workspaceId, projectId, workflowRunId }: WorkflowRunPageProps): import("react").JSX.Element;
8
+ export declare function WorkflowRunPage({ workspaceId, projectId, workflowRunId, search, }: WorkflowRunPageProps): import("react").JSX.Element;
7
9
  export {};
8
10
  //# sourceMappingURL=workflow-run-page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-run-page.d.ts","sourceRoot":"","sources":["../../src/pages/workflow-run-page.tsx"],"names":[],"mappings":"AAaA,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAoCD,wBAAgB,eAAe,CAAC,EAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAC,EAAE,oBAAoB,+BAmC5F"}
1
+ {"version":3,"file":"workflow-run-page.d.ts","sourceRoot":"","sources":["../../src/pages/workflow-run-page.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAC,KAAK,kBAAkB,EAA0B,MAAM,mBAAmB,CAAC;AAGnF,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAoCD,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,SAAS,EACT,aAAa,EACb,MAAW,GACZ,EAAE,oBAAoB,+BAsCtB"}