@shipfox/client-workflows 12.0.2 → 14.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.
Files changed (325) hide show
  1. package/.storybook/main.ts +16 -1
  2. package/.storybook/preview.tsx +3 -3
  3. package/.storybook/workspace-source.ts +31 -0
  4. package/.turbo/turbo-build.log +1 -1
  5. package/CHANGELOG.md +79 -0
  6. package/dist/components/job-graph/job-duration-format.d.ts +2 -2
  7. package/dist/components/job-graph/job-duration-format.d.ts.map +1 -1
  8. package/dist/components/job-graph/job-duration-format.js +4 -2
  9. package/dist/components/job-graph/job-duration-format.js.map +1 -1
  10. package/dist/components/job-graph/job-duration-label.js +1 -1
  11. package/dist/components/job-graph/job-duration-label.js.map +1 -1
  12. package/dist/components/job-graph/job-graph-content.d.ts +2 -1
  13. package/dist/components/job-graph/job-graph-content.d.ts.map +1 -1
  14. package/dist/components/job-graph/job-graph-content.js +3 -3
  15. package/dist/components/job-graph/job-graph-content.js.map +1 -1
  16. package/dist/components/job-graph/job-graph-view.d.ts +2 -1
  17. package/dist/components/job-graph/job-graph-view.d.ts.map +1 -1
  18. package/dist/components/job-graph/job-graph-view.js +2 -2
  19. package/dist/components/job-graph/job-graph-view.js.map +1 -1
  20. package/dist/components/job-graph/job-node.d.ts +1 -1
  21. package/dist/components/job-graph/job-node.d.ts.map +1 -1
  22. package/dist/components/job-graph/job-node.js +10 -9
  23. package/dist/components/job-graph/job-node.js.map +1 -1
  24. package/dist/components/job-graph/types.d.ts +2 -1
  25. package/dist/components/job-graph/types.d.ts.map +1 -1
  26. package/dist/components/job-graph/types.js.map +1 -1
  27. package/dist/components/step-list/step-list.d.ts +2 -2
  28. package/dist/components/step-list/step-list.d.ts.map +1 -1
  29. package/dist/components/step-list/step-list.js.map +1 -1
  30. package/dist/components/workflow-run-duration-label.js +1 -1
  31. package/dist/components/workflow-run-duration-label.js.map +1 -1
  32. package/dist/components/workflow-run-list/job-status-strip.d.ts +21 -0
  33. package/dist/components/workflow-run-list/job-status-strip.d.ts.map +1 -0
  34. package/dist/components/workflow-run-list/job-status-strip.js +185 -0
  35. package/dist/components/workflow-run-list/job-status-strip.js.map +1 -0
  36. package/dist/components/workflow-run-list/run-display.d.ts +27 -3
  37. package/dist/components/workflow-run-list/run-display.d.ts.map +1 -1
  38. package/dist/components/workflow-run-list/run-display.js +78 -7
  39. package/dist/components/workflow-run-list/run-display.js.map +1 -1
  40. package/dist/components/workflow-run-list/types.d.ts +23 -24
  41. package/dist/components/workflow-run-list/types.d.ts.map +1 -1
  42. package/dist/components/workflow-run-list/types.js.map +1 -1
  43. package/dist/components/workflow-run-list/workflow-run-filter-menu.d.ts +22 -0
  44. package/dist/components/workflow-run-list/workflow-run-filter-menu.d.ts.map +1 -0
  45. package/dist/components/workflow-run-list/workflow-run-filter-menu.js +68 -0
  46. package/dist/components/workflow-run-list/workflow-run-filter-menu.js.map +1 -0
  47. package/dist/components/workflow-run-list/workflow-run-filters.d.ts +18 -0
  48. package/dist/components/workflow-run-list/workflow-run-filters.d.ts.map +1 -0
  49. package/dist/components/workflow-run-list/workflow-run-filters.js +236 -0
  50. package/dist/components/workflow-run-list/workflow-run-filters.js.map +1 -0
  51. package/dist/components/workflow-run-list/workflow-run-list-content.d.ts +8 -4
  52. package/dist/components/workflow-run-list/workflow-run-list-content.d.ts.map +1 -1
  53. package/dist/components/workflow-run-list/workflow-run-list-content.js +40 -12
  54. package/dist/components/workflow-run-list/workflow-run-list-content.js.map +1 -1
  55. package/dist/components/workflow-run-list/workflow-run-list-states.d.ts +29 -2
  56. package/dist/components/workflow-run-list/workflow-run-list-states.d.ts.map +1 -1
  57. package/dist/components/workflow-run-list/workflow-run-list-states.js +103 -44
  58. package/dist/components/workflow-run-list/workflow-run-list-states.js.map +1 -1
  59. package/dist/components/workflow-run-list/workflow-run-list-view.d.ts +1 -1
  60. package/dist/components/workflow-run-list/workflow-run-list-view.d.ts.map +1 -1
  61. package/dist/components/workflow-run-list/workflow-run-list-view.js +60 -43
  62. package/dist/components/workflow-run-list/workflow-run-list-view.js.map +1 -1
  63. package/dist/components/workflow-run-list/workflow-run-list.d.ts +1 -1
  64. package/dist/components/workflow-run-list/workflow-run-list.d.ts.map +1 -1
  65. package/dist/components/workflow-run-list/workflow-run-list.js +20 -8
  66. package/dist/components/workflow-run-list/workflow-run-list.js.map +1 -1
  67. package/dist/components/workflow-run-list/workflow-run-row.d.ts +19 -9
  68. package/dist/components/workflow-run-list/workflow-run-row.d.ts.map +1 -1
  69. package/dist/components/workflow-run-list/workflow-run-row.js +179 -112
  70. package/dist/components/workflow-run-list/workflow-run-row.js.map +1 -1
  71. package/dist/components/workflow-run-number-label.d.ts +15 -0
  72. package/dist/components/workflow-run-number-label.d.ts.map +1 -0
  73. package/dist/components/workflow-run-number-label.js +41 -0
  74. package/dist/components/workflow-run-number-label.js.map +1 -0
  75. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.d.ts +3 -3
  76. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.d.ts.map +1 -1
  77. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js +10 -9
  78. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js.map +1 -1
  79. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts +4 -9
  80. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts.map +1 -1
  81. package/dist/components/workflow-run-summary/workflow-run-summary.js +107 -74
  82. package/dist/components/workflow-run-summary/workflow-run-summary.js.map +1 -1
  83. package/dist/components/workflow-run-tabs/index.d.ts +6 -0
  84. package/dist/components/workflow-run-tabs/index.d.ts.map +1 -0
  85. package/dist/components/workflow-run-tabs/index.js +7 -0
  86. package/dist/components/workflow-run-tabs/index.js.map +1 -0
  87. package/dist/components/workflow-run-tabs/run-annotation-summary-line.d.ts +11 -0
  88. package/dist/components/workflow-run-tabs/run-annotation-summary-line.d.ts.map +1 -0
  89. package/dist/components/workflow-run-tabs/run-annotation-summary-line.js +71 -0
  90. package/dist/components/workflow-run-tabs/run-annotation-summary-line.js.map +1 -0
  91. package/dist/components/workflow-run-tabs/run-annotations-empty.d.ts +2 -0
  92. package/dist/components/workflow-run-tabs/run-annotations-empty.d.ts.map +1 -0
  93. package/dist/components/workflow-run-tabs/run-annotations-empty.js +11 -0
  94. package/dist/components/workflow-run-tabs/run-annotations-empty.js.map +1 -0
  95. package/dist/components/workflow-run-tabs/run-jobs-list.d.ts +18 -0
  96. package/dist/components/workflow-run-tabs/run-jobs-list.d.ts.map +1 -0
  97. package/dist/components/workflow-run-tabs/run-jobs-list.js +107 -0
  98. package/dist/components/workflow-run-tabs/run-jobs-list.js.map +1 -0
  99. package/dist/components/workflow-run-tabs/run-tab-count.d.ts +6 -0
  100. package/dist/components/workflow-run-tabs/run-tab-count.d.ts.map +1 -0
  101. package/dist/components/workflow-run-tabs/run-tab-count.js +27 -0
  102. package/dist/components/workflow-run-tabs/run-tab-count.js.map +1 -0
  103. package/dist/components/workflow-run-tabs/run-tab-strip.d.ts +8 -0
  104. package/dist/components/workflow-run-tabs/run-tab-strip.d.ts.map +1 -0
  105. package/dist/components/workflow-run-tabs/run-tab-strip.js +82 -0
  106. package/dist/components/workflow-run-tabs/run-tab-strip.js.map +1 -0
  107. package/dist/components/workflow-run-view/agent-config-failure-callout.d.ts +2 -2
  108. package/dist/components/workflow-run-view/agent-config-failure-callout.d.ts.map +1 -1
  109. package/dist/components/workflow-run-view/agent-config-failure-callout.js +4 -4
  110. package/dist/components/workflow-run-view/agent-config-failure-callout.js.map +1 -1
  111. package/dist/components/workflow-run-view/job-card.d.ts +2 -2
  112. package/dist/components/workflow-run-view/job-card.d.ts.map +1 -1
  113. package/dist/components/workflow-run-view/job-card.js +51 -32
  114. package/dist/components/workflow-run-view/job-card.js.map +1 -1
  115. package/dist/components/workflow-run-view/job-execution-switcher.d.ts +1 -1
  116. package/dist/components/workflow-run-view/job-execution-switcher.d.ts.map +1 -1
  117. package/dist/components/workflow-run-view/job-execution-switcher.js +20 -8
  118. package/dist/components/workflow-run-view/job-execution-switcher.js.map +1 -1
  119. package/dist/components/workflow-run-view/workflow-run-selection.d.ts.map +1 -1
  120. package/dist/components/workflow-run-view/workflow-run-selection.js +40 -1
  121. package/dist/components/workflow-run-view/workflow-run-selection.js.map +1 -1
  122. package/dist/components/workflow-run-view/workflow-run-states.d.ts +1 -0
  123. package/dist/components/workflow-run-view/workflow-run-states.d.ts.map +1 -1
  124. package/dist/components/workflow-run-view/workflow-run-states.js +10 -1
  125. package/dist/components/workflow-run-view/workflow-run-states.js.map +1 -1
  126. package/dist/components/workflow-run-view/workflow-run-view.d.ts +10 -5
  127. package/dist/components/workflow-run-view/workflow-run-view.d.ts.map +1 -1
  128. package/dist/components/workflow-run-view/workflow-run-view.js +136 -85
  129. package/dist/components/workflow-run-view/workflow-run-view.js.map +1 -1
  130. package/dist/components/workflow-source-panel/index.d.ts +1 -0
  131. package/dist/components/workflow-source-panel/index.d.ts.map +1 -1
  132. package/dist/components/workflow-source-panel/index.js +1 -0
  133. package/dist/components/workflow-source-panel/index.js.map +1 -1
  134. package/dist/components/workflow-source-panel/workflow-source-content.d.ts +12 -0
  135. package/dist/components/workflow-source-panel/workflow-source-content.d.ts.map +1 -0
  136. package/dist/components/workflow-source-panel/workflow-source-content.js +53 -0
  137. package/dist/components/workflow-source-panel/workflow-source-content.js.map +1 -0
  138. package/dist/components/workflow-source-panel/workflow-source-panel.d.ts +1 -1
  139. package/dist/components/workflow-source-panel/workflow-source-panel.d.ts.map +1 -1
  140. package/dist/components/workflow-source-panel/workflow-source-panel.js +7 -54
  141. package/dist/components/workflow-source-panel/workflow-source-panel.js.map +1 -1
  142. package/dist/components/workflow-status/status-visuals.d.ts +4 -4
  143. package/dist/components/workflow-status/status-visuals.d.ts.map +1 -1
  144. package/dist/components/workflow-status/status-visuals.js +7 -0
  145. package/dist/components/workflow-status/status-visuals.js.map +1 -1
  146. package/dist/components/workflow-status/workflow-status-icon.d.ts +3 -4
  147. package/dist/components/workflow-status/workflow-status-icon.d.ts.map +1 -1
  148. package/dist/components/workflow-status/workflow-status-icon.js +6 -4
  149. package/dist/components/workflow-status/workflow-status-icon.js.map +1 -1
  150. package/dist/core/entities/job-execution.d.ts +10 -0
  151. package/dist/core/entities/job-execution.d.ts.map +1 -1
  152. package/dist/core/entities/job-execution.js +11 -0
  153. package/dist/core/entities/job-execution.js.map +1 -1
  154. package/dist/core/entities/job.d.ts +4 -2
  155. package/dist/core/entities/job.d.ts.map +1 -1
  156. package/dist/core/entities/job.js +8 -1
  157. package/dist/core/entities/job.js.map +1 -1
  158. package/dist/core/entities/step.d.ts +1 -1
  159. package/dist/core/entities/step.d.ts.map +1 -1
  160. package/dist/core/entities/step.js +2 -0
  161. package/dist/core/entities/step.js.map +1 -1
  162. package/dist/core/entities/workflow-run.d.ts +52 -4
  163. package/dist/core/entities/workflow-run.d.ts.map +1 -1
  164. package/dist/core/entities/workflow-run.js +22 -3
  165. package/dist/core/entities/workflow-run.js.map +1 -1
  166. package/dist/core/workflow-run-tabs.d.ts +9 -0
  167. package/dist/core/workflow-run-tabs.d.ts.map +1 -0
  168. package/dist/core/workflow-run-tabs.js +3 -0
  169. package/dist/core/workflow-run-tabs.js.map +1 -0
  170. package/dist/core/workflow-run.d.ts +6 -6
  171. package/dist/core/workflow-run.d.ts.map +1 -1
  172. package/dist/core/workflow-run.js +3 -3
  173. package/dist/core/workflow-run.js.map +1 -1
  174. package/dist/feature.d.ts +7 -7
  175. package/dist/feature.js +5 -5
  176. package/dist/feature.js.map +1 -1
  177. package/dist/hooks/api/workflow-run-mapper.d.ts +4 -3
  178. package/dist/hooks/api/workflow-run-mapper.d.ts.map +1 -1
  179. package/dist/hooks/api/workflow-run-mapper.js +31 -3
  180. package/dist/hooks/api/workflow-run-mapper.js.map +1 -1
  181. package/dist/hooks/api/workflow-runs.d.ts +4 -4
  182. package/dist/hooks/api/workflow-runs.d.ts.map +1 -1
  183. package/dist/hooks/api/workflow-runs.js +12 -4
  184. package/dist/hooks/api/workflow-runs.js.map +1 -1
  185. package/dist/index.d.ts +4 -3
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +3 -2
  188. package/dist/index.js.map +1 -1
  189. package/dist/pages/project-workflows-page.js +46 -1
  190. package/dist/pages/project-workflows-page.js.map +1 -1
  191. package/dist/pages/workflow-run-detail-page.d.ts +11 -0
  192. package/dist/pages/workflow-run-detail-page.d.ts.map +1 -0
  193. package/dist/pages/workflow-run-detail-page.js +52 -0
  194. package/dist/pages/workflow-run-detail-page.js.map +1 -0
  195. package/dist/pages/workflow-run-list-page.d.ts +10 -0
  196. package/dist/pages/workflow-run-list-page.d.ts.map +1 -0
  197. package/dist/pages/workflow-run-list-page.js +43 -0
  198. package/dist/pages/workflow-run-list-page.js.map +1 -0
  199. package/dist/routes/inputs.d.ts +94 -5
  200. package/dist/routes/inputs.d.ts.map +1 -1
  201. package/dist/routes/inputs.js +199 -13
  202. package/dist/routes/inputs.js.map +1 -1
  203. package/dist/routes/project-route.d.ts +6 -0
  204. package/dist/routes/project-route.d.ts.map +1 -0
  205. package/dist/routes/project-route.js +25 -0
  206. package/dist/routes/project-route.js.map +1 -0
  207. package/dist/routes/run-detail.d.ts.map +1 -1
  208. package/dist/routes/run-detail.js +12 -7
  209. package/dist/routes/run-detail.js.map +1 -1
  210. package/dist/routes/runs.d.ts.map +1 -1
  211. package/dist/routes/runs.js +11 -6
  212. package/dist/routes/runs.js.map +1 -1
  213. package/dist/routes/workflows.d.ts.map +1 -1
  214. package/dist/routes/workflows.js +6 -5
  215. package/dist/routes/workflows.js.map +1 -1
  216. package/dist/tsconfig.test.tsbuildinfo +1 -1
  217. package/package.json +9 -9
  218. package/src/components/job-graph/job-duration-format.ts +11 -2
  219. package/src/components/job-graph/job-duration-label.tsx +5 -1
  220. package/src/components/job-graph/job-graph-content.tsx +7 -4
  221. package/src/components/job-graph/job-graph-view.test.tsx +19 -8
  222. package/src/components/job-graph/job-graph-view.tsx +6 -3
  223. package/src/components/job-graph/job-graph.stories.tsx +24 -20
  224. package/src/components/job-graph/job-node.stories.tsx +11 -6
  225. package/src/components/job-graph/job-node.test.tsx +82 -12
  226. package/src/components/job-graph/job-node.tsx +22 -15
  227. package/src/components/job-graph/types.ts +5 -1
  228. package/src/components/step-list/step-list.stories.tsx +2 -3
  229. package/src/components/step-list/step-list.tsx +3 -2
  230. package/src/components/workflow-run-duration-label.tsx +1 -1
  231. package/src/components/workflow-run-list/job-status-strip.tsx +189 -0
  232. package/src/components/workflow-run-list/run-display.test.ts +169 -30
  233. package/src/components/workflow-run-list/run-display.ts +116 -9
  234. package/src/components/workflow-run-list/types.ts +21 -17
  235. package/src/components/workflow-run-list/workflow-run-filter-menu.tsx +100 -0
  236. package/src/components/workflow-run-list/workflow-run-filters.tsx +243 -0
  237. package/src/components/workflow-run-list/workflow-run-list-content.tsx +44 -16
  238. package/src/components/workflow-run-list/workflow-run-list-states.tsx +128 -27
  239. package/src/components/workflow-run-list/workflow-run-list-view.test.tsx +441 -104
  240. package/src/components/workflow-run-list/workflow-run-list-view.tsx +73 -43
  241. package/src/components/workflow-run-list/workflow-run-list.stories.tsx +140 -20
  242. package/src/components/workflow-run-list/workflow-run-list.tsx +20 -10
  243. package/src/components/workflow-run-list/workflow-run-row.tsx +173 -106
  244. package/src/components/workflow-run-number-label.test.tsx +45 -0
  245. package/src/components/workflow-run-number-label.tsx +47 -0
  246. package/src/components/workflow-run-summary/workflow-run-attempt-switcher.test.tsx +7 -8
  247. package/src/components/workflow-run-summary/workflow-run-attempt-switcher.tsx +15 -14
  248. package/src/components/workflow-run-summary/workflow-run-summary.stories.tsx +29 -38
  249. package/src/components/workflow-run-summary/workflow-run-summary.test.tsx +30 -24
  250. package/src/components/workflow-run-summary/workflow-run-summary.tsx +102 -77
  251. package/src/components/workflow-run-tabs/index.ts +5 -0
  252. package/src/components/workflow-run-tabs/run-annotation-summary-line.test.tsx +69 -0
  253. package/src/components/workflow-run-tabs/run-annotation-summary-line.tsx +97 -0
  254. package/src/components/workflow-run-tabs/run-annotations-empty.tsx +11 -0
  255. package/src/components/workflow-run-tabs/run-jobs-list.tsx +151 -0
  256. package/src/components/workflow-run-tabs/run-tab-count.tsx +28 -0
  257. package/src/components/workflow-run-tabs/run-tab-strip.stories.tsx +52 -0
  258. package/src/components/workflow-run-tabs/run-tab-strip.test.tsx +117 -0
  259. package/src/components/workflow-run-tabs/run-tab-strip.tsx +97 -0
  260. package/src/components/workflow-run-view/agent-config-failure-callout.stories.tsx +2 -3
  261. package/src/components/workflow-run-view/agent-config-failure-callout.tsx +4 -4
  262. package/src/components/workflow-run-view/job-card.stories.tsx +11 -10
  263. package/src/components/workflow-run-view/job-card.test.tsx +115 -0
  264. package/src/components/workflow-run-view/job-card.tsx +74 -35
  265. package/src/components/workflow-run-view/job-execution-switcher.tsx +31 -9
  266. package/src/components/workflow-run-view/workflow-run-selection.test.ts +48 -0
  267. package/src/components/workflow-run-view/workflow-run-selection.ts +48 -1
  268. package/src/components/workflow-run-view/workflow-run-states.tsx +12 -1
  269. package/src/components/workflow-run-view/workflow-run-view.test.tsx +152 -94
  270. package/src/components/workflow-run-view/workflow-run-view.tsx +219 -95
  271. package/src/components/workflow-source-panel/index.ts +1 -0
  272. package/src/components/workflow-source-panel/workflow-source-content.tsx +84 -0
  273. package/src/components/workflow-source-panel/workflow-source-panel.tsx +14 -81
  274. package/src/components/workflow-status/status-visuals.test.ts +9 -0
  275. package/src/components/workflow-status/status-visuals.ts +6 -4
  276. package/src/components/workflow-status/workflow-status-icon.stories.tsx +10 -2
  277. package/src/components/workflow-status/workflow-status-icon.test.tsx +18 -0
  278. package/src/components/workflow-status/workflow-status-icon.tsx +17 -24
  279. package/src/core/entities/job-execution.ts +22 -0
  280. package/src/core/entities/job-status.test.ts +104 -0
  281. package/src/core/entities/job.ts +18 -3
  282. package/src/core/entities/step.ts +4 -0
  283. package/src/core/entities/workflow-run.ts +76 -7
  284. package/src/core/workflow-run-tabs.ts +8 -0
  285. package/src/core/workflow-run.test.ts +24 -9
  286. package/src/core/workflow-run.ts +17 -2
  287. package/src/feature.ts +5 -5
  288. package/src/hooks/api/workflow-run-mapper.ts +30 -3
  289. package/src/hooks/api/workflow-runs.test.tsx +2 -0
  290. package/src/hooks/api/workflow-runs.ts +12 -7
  291. package/src/index.ts +7 -2
  292. package/src/page-harness-budget.test.ts +1 -1
  293. package/src/pages/project-workflows-page.test.tsx +59 -5
  294. package/src/pages/project-workflows-page.tsx +34 -1
  295. package/src/pages/workflow-run-detail-page.tsx +72 -0
  296. package/src/pages/workflow-run-list-page.tsx +65 -0
  297. package/src/pages/workflow-run-pages.test.tsx +823 -0
  298. package/src/routes/inputs.test.ts +240 -12
  299. package/src/routes/inputs.ts +215 -11
  300. package/src/routes/project-route.tsx +25 -0
  301. package/src/routes/run-detail.tsx +15 -8
  302. package/src/routes/runs.tsx +14 -7
  303. package/src/routes/workflows.tsx +5 -4
  304. package/src/storybook-config.test.ts +27 -0
  305. package/test/fixtures/workflow-run.ts +76 -7
  306. package/test/pages.tsx +18 -8
  307. package/test/render.tsx +8 -2
  308. package/tsconfig.build.tsbuildinfo +1 -1
  309. package/tsconfig.test.json +7 -1
  310. package/dist/components/workflow-run-list/workflow-run-list-header.d.ts +0 -10
  311. package/dist/components/workflow-run-list/workflow-run-list-header.d.ts.map +0 -1
  312. package/dist/components/workflow-run-list/workflow-run-list-header.js +0 -55
  313. package/dist/components/workflow-run-list/workflow-run-list-header.js.map +0 -1
  314. package/dist/pages/workflow-run-first-time-use.d.ts +0 -6
  315. package/dist/pages/workflow-run-first-time-use.d.ts.map +0 -1
  316. package/dist/pages/workflow-run-first-time-use.js +0 -17
  317. package/dist/pages/workflow-run-first-time-use.js.map +0 -1
  318. package/dist/pages/workflow-run-page.d.ts +0 -10
  319. package/dist/pages/workflow-run-page.d.ts.map +0 -1
  320. package/dist/pages/workflow-run-page.js +0 -90
  321. package/dist/pages/workflow-run-page.js.map +0 -1
  322. package/src/components/workflow-run-list/workflow-run-list-header.tsx +0 -53
  323. package/src/pages/workflow-run-first-time-use.tsx +0 -17
  324. package/src/pages/workflow-run-page.test.tsx +0 -519
  325. package/src/pages/workflow-run-page.tsx +0 -94
@@ -0,0 +1,151 @@
1
+ import {EmptyState} from '@shipfox/react-ui/empty-state';
2
+ import {useTimeTick} from '@shipfox/react-ui/time-ticker';
3
+ import {cn} from '@shipfox/react-ui/utils';
4
+ import {
5
+ defaultJobExecution,
6
+ deriveJobDisplayStatus,
7
+ deriveJobExecutionDisplayStatus,
8
+ type Job,
9
+ } from '#core/workflow-run.js';
10
+ import {formatJobDurationAccessibleLabel} from '../job-graph/job-duration-format.js';
11
+ import {JobDurationLabel} from '../job-graph/job-duration-label.js';
12
+ import {JobCard} from '../workflow-run-view/job-card.js';
13
+ import {WorkflowStatusIcon} from '../workflow-status/workflow-status-icon.js';
14
+
15
+ export interface RunJobsListProps {
16
+ jobs: Job[];
17
+ selectedJobId?: string | undefined;
18
+ onSelectedJobChange: (jobId: string | undefined) => void;
19
+ workspaceSlug?: string | undefined;
20
+ selectedJobExecution: ReturnType<typeof defaultJobExecution>;
21
+ selectedAttemptId: string | null | undefined;
22
+ onSelectedJobExecutionChange: ((jobExecutionId: string | undefined) => void) | undefined;
23
+ onSelectedAttemptChange: ((attemptId: string | undefined) => void) | undefined;
24
+ sourcePanelId?: string | undefined;
25
+ sourceAvailable?: boolean | undefined;
26
+ focusedSourceStepId?: string | null | undefined;
27
+ onOpenStepSource?: Parameters<typeof JobCard>[0]['onOpenStepSource'];
28
+ }
29
+
30
+ export function RunJobsList({
31
+ jobs,
32
+ selectedJobId,
33
+ onSelectedJobChange,
34
+ workspaceSlug,
35
+ selectedJobExecution,
36
+ selectedAttemptId,
37
+ onSelectedJobExecutionChange,
38
+ onSelectedAttemptChange,
39
+ sourcePanelId,
40
+ sourceAvailable,
41
+ focusedSourceStepId,
42
+ onOpenStepSource,
43
+ }: RunJobsListProps) {
44
+ useTimeTick();
45
+
46
+ if (jobs.length === 0) {
47
+ return (
48
+ <section
49
+ aria-label="Workflow jobs"
50
+ className="rounded-8 border border-border-neutral-base bg-background-components-base"
51
+ >
52
+ <div className="min-h-160">
53
+ <RunJobsEmptyState />
54
+ </div>
55
+ </section>
56
+ );
57
+ }
58
+
59
+ const orderedJobs = [...jobs].sort(compareJobs);
60
+
61
+ return (
62
+ <section aria-label="Workflow jobs" className="flex min-w-0 flex-col gap-8">
63
+ <ul aria-label="Run jobs" className="m-0 flex min-w-0 list-none flex-col gap-8 p-0">
64
+ {orderedJobs.map((job) => {
65
+ const selected = job.id === selectedJobId;
66
+ const status = deriveJobDisplayStatus(job);
67
+ const execution = defaultJobExecution(job);
68
+ const durationLabel = formatJobDurationAccessibleLabel(
69
+ job.displayDuration,
70
+ execution ? deriveJobExecutionDisplayStatus(execution) : undefined,
71
+ );
72
+ const rowLabel = [
73
+ job.displayName,
74
+ statusLabel(status),
75
+ durationLabel,
76
+ job.carriedOver ? 'reused' : undefined,
77
+ ]
78
+ .filter((part): part is string => Boolean(part))
79
+ .join(', ');
80
+
81
+ return (
82
+ <li key={job.id} className="min-w-0">
83
+ <button
84
+ type="button"
85
+ aria-expanded={selected}
86
+ aria-controls={selected ? `job-card-${job.id}` : undefined}
87
+ aria-label={rowLabel}
88
+ onClick={() => onSelectedJobChange(selected ? undefined : job.id)}
89
+ className={cn(
90
+ 'relative flex min-h-44 w-full min-w-0 items-center gap-8 rounded-8 bg-background-neutral-base px-12 text-left shadow-button-neutral outline-none transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus',
91
+ selected &&
92
+ 'bg-background-components-hover hover:bg-background-components-pressed',
93
+ )}
94
+ >
95
+ {selected ? (
96
+ <span
97
+ aria-hidden="true"
98
+ className="absolute inset-y-6 left-0 w-px rounded-full bg-border-highlights-interactive"
99
+ />
100
+ ) : null}
101
+ <WorkflowStatusIcon status={status} size={14} tooltip={false} />
102
+ <span className="min-w-0 flex-1 truncate text-sm font-medium text-foreground-neutral-base">
103
+ {job.displayName}
104
+ </span>
105
+ <JobDurationLabel duration={job.displayDuration} />
106
+ </button>
107
+ {selected ? (
108
+ <div id={`job-card-${job.id}`} className="mt-8">
109
+ <JobCard
110
+ workspaceSlug={workspaceSlug}
111
+ job={job}
112
+ selectedJobExecution={selectedJobExecution}
113
+ selectedAttemptId={job.carriedOver ? undefined : selectedAttemptId}
114
+ onSelectedJobExecutionChange={onSelectedJobExecutionChange}
115
+ onSelectedAttemptChange={onSelectedAttemptChange}
116
+ sourcePanelId={sourcePanelId}
117
+ sourceAvailable={sourceAvailable}
118
+ focusedSourceStepId={focusedSourceStepId}
119
+ onOpenStepSource={onOpenStepSource}
120
+ />
121
+ </div>
122
+ ) : null}
123
+ </li>
124
+ );
125
+ })}
126
+ </ul>
127
+ </section>
128
+ );
129
+ }
130
+
131
+ function RunJobsEmptyState() {
132
+ return (
133
+ <EmptyState
134
+ icon="componentLine"
135
+ title="No jobs yet"
136
+ description="This run has not materialized jobs."
137
+ />
138
+ );
139
+ }
140
+
141
+ function compareJobs(left: Job, right: Job): number {
142
+ return (
143
+ left.position - right.position ||
144
+ left.displayName.localeCompare(right.displayName) ||
145
+ left.id.localeCompare(right.id)
146
+ );
147
+ }
148
+
149
+ function statusLabel(status: ReturnType<typeof deriveJobDisplayStatus>): string {
150
+ return status === 'listening' ? 'Listening' : status.charAt(0).toUpperCase() + status.slice(1);
151
+ }
@@ -0,0 +1,28 @@
1
+ import {Badge} from '@shipfox/react-ui/badge';
2
+
3
+ export function RunTabCount({
4
+ count,
5
+ alertCount = 0,
6
+ alertLabel,
7
+ }: {
8
+ count: number | undefined;
9
+ alertCount?: number | undefined;
10
+ alertLabel: string;
11
+ }) {
12
+ if (count === undefined && alertCount <= 0) return null;
13
+
14
+ return (
15
+ <>
16
+ {count === undefined ? null : (
17
+ <Badge size="2xs" variant="neutral" aria-hidden="true">
18
+ {count}
19
+ </Badge>
20
+ )}
21
+ {alertCount > 0 ? (
22
+ <Badge size="2xs" variant="error" aria-hidden="true">
23
+ {alertCount} {alertLabel}
24
+ </Badge>
25
+ ) : null}
26
+ </>
27
+ );
28
+ }
@@ -0,0 +1,52 @@
1
+ import {Tabs} from '@shipfox/react-ui/tabs';
2
+ import type {Meta, StoryObj} from '@storybook/react';
3
+ import type {RunAnnotationSummary} from '#core/workflow-run-tabs.js';
4
+ import {RunTabStrip} from './run-tab-strip.js';
5
+
6
+ const ANNOTATION_SUMMARY: RunAnnotationSummary = {
7
+ total: 8,
8
+ error: 2,
9
+ warning: 3,
10
+ info: 2,
11
+ success: 1,
12
+ };
13
+
14
+ const meta = {
15
+ title: 'Workflows/RunTabStrip',
16
+ component: RunTabStrip,
17
+ parameters: {layout: 'fullscreen'},
18
+ render: (args) => (
19
+ <div className="bg-background-neutral-background">
20
+ <Tabs defaultValue="summary">
21
+ <RunTabStrip {...args} />
22
+ </Tabs>
23
+ </div>
24
+ ),
25
+ args: {
26
+ jobCount: 6,
27
+ jobsFailed: 1,
28
+ annotationSummary: ANNOTATION_SUMMARY,
29
+ },
30
+ } satisfies Meta<typeof RunTabStrip>;
31
+
32
+ export default meta;
33
+ type Story = StoryObj<typeof meta>;
34
+
35
+ export const Playground: Story = {};
36
+
37
+ export const NoCounts: Story = {
38
+ args: {
39
+ jobCount: undefined,
40
+ annotationSummary: undefined,
41
+ },
42
+ };
43
+
44
+ export const NarrowLayout: Story = {
45
+ decorators: [
46
+ (Story) => (
47
+ <div className="w-[360px] max-w-full overflow-hidden border">
48
+ <Story />
49
+ </div>
50
+ ),
51
+ ],
52
+ };
@@ -0,0 +1,117 @@
1
+ import {Tabs} from '@shipfox/react-ui/tabs';
2
+ import {
3
+ createMemoryHistory,
4
+ createRootRoute,
5
+ createRoute,
6
+ createRouter,
7
+ Outlet,
8
+ RouterProvider,
9
+ } from '@tanstack/react-router';
10
+ import {act, render, screen, within} from '@testing-library/react';
11
+ import userEvent from '@testing-library/user-event';
12
+ import type {RunAnnotationSummary} from '#core/workflow-run-tabs.js';
13
+ import {RunTabStrip} from './run-tab-strip.js';
14
+
15
+ const ANNOTATION_SUMMARY: RunAnnotationSummary = {
16
+ total: 5,
17
+ error: 2,
18
+ warning: 1,
19
+ info: 2,
20
+ success: 0,
21
+ };
22
+
23
+ describe('RunTabStrip', () => {
24
+ test('exposes tab counts and keyboard navigation', async () => {
25
+ const user = userEvent.setup();
26
+
27
+ await renderStrip({annotationSummary: ANNOTATION_SUMMARY, jobCount: 3, jobsFailed: 1});
28
+
29
+ const jobsTab = screen.getByRole('tab', {name: 'Jobs, 3 jobs, 1 failed'});
30
+ const annotationsTab = screen.getByRole('tab', {
31
+ name: 'Annotations, 5 annotations, 2 errors',
32
+ });
33
+ expect(within(jobsTab).getByText('3')).toHaveClass('bg-tag-neutral-bg');
34
+ expect(within(jobsTab).getByText('1 failed')).toHaveClass('bg-tag-error-bg');
35
+ expect(within(annotationsTab).getByText('5')).toHaveClass('bg-tag-neutral-bg');
36
+ expect(within(annotationsTab).getByText('2 errors')).toHaveClass('bg-tag-error-bg');
37
+ expect(screen.queryByRole('link', {name: '2 errors'})).not.toBeInTheDocument();
38
+ expect(screen.getByRole('tab', {name: 'Source'})).toHaveClass(
39
+ 'data-[state=inactive]:text-foreground-neutral-subtle',
40
+ 'data-[state=inactive]:hover:text-foreground-neutral-base',
41
+ );
42
+
43
+ const summary = screen.getByRole('tab', {name: 'Summary'});
44
+ expect(screen.getByRole('tablist', {name: 'Run sections'})).toHaveClass('min-w-full', 'px-16');
45
+ expect(summary.parentElement?.parentElement).toHaveClass('bg-background-neutral-background');
46
+ summary.focus();
47
+ await user.keyboard('{ArrowRight}');
48
+
49
+ expect(screen.getByRole('tab', {name: 'Jobs, 3 jobs, 1 failed'})).toHaveAttribute(
50
+ 'aria-selected',
51
+ 'true',
52
+ );
53
+ expect(screen.getByRole('tab', {name: 'Summary'})).toHaveAttribute('tabindex', '-1');
54
+ });
55
+
56
+ test('does not reserve count space when data is absent', async () => {
57
+ await renderStrip({annotationSummary: undefined, jobCount: undefined});
58
+
59
+ const jobsTab = screen.getByRole('tab', {name: 'Jobs'});
60
+ const annotationsTab = screen.getByRole('tab', {name: 'Annotations'});
61
+
62
+ expect(jobsTab).toBeInTheDocument();
63
+ expect(annotationsTab).toBeInTheDocument();
64
+ expect(jobsTab.querySelector('[data-slot="badge"]')).toBeNull();
65
+ expect(annotationsTab.querySelector('[data-slot="badge"]')).toBeNull();
66
+ expect(screen.queryByText('5 annotations')).not.toBeInTheDocument();
67
+ });
68
+
69
+ test('singularizes accessible count labels', async () => {
70
+ await renderStrip({
71
+ annotationSummary: {total: 1, error: 1, warning: 0, info: 0, success: 0},
72
+ jobCount: 1,
73
+ jobsFailed: 1,
74
+ });
75
+
76
+ expect(screen.getByRole('tab', {name: 'Jobs, 1 job, 1 failed'})).toBeInTheDocument();
77
+ expect(
78
+ screen.getByRole('tab', {name: 'Annotations, 1 annotation, 1 error'}),
79
+ ).toBeInTheDocument();
80
+ });
81
+ });
82
+
83
+ async function renderStrip({
84
+ annotationSummary,
85
+ jobCount,
86
+ jobsFailed = 0,
87
+ }: {
88
+ annotationSummary?: RunAnnotationSummary | undefined;
89
+ jobCount?: number | undefined;
90
+ jobsFailed?: number | undefined;
91
+ } = {}) {
92
+ const rootRoute = createRootRoute({component: Outlet});
93
+ const runRoute = createRoute({
94
+ getParentRoute: () => rootRoute,
95
+ path: '/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId',
96
+ component: () => (
97
+ <Tabs defaultValue="summary">
98
+ <RunTabStrip
99
+ jobCount={jobCount}
100
+ jobsFailed={jobsFailed}
101
+ annotationSummary={annotationSummary}
102
+ />
103
+ </Tabs>
104
+ ),
105
+ });
106
+ const router = createRouter({
107
+ history: createMemoryHistory({initialEntries: ['/w/acme/p/project/runs/run-1']}),
108
+ routeTree: rootRoute.addChildren([runRoute]),
109
+ });
110
+ await router.load();
111
+ let result: ReturnType<typeof render> | undefined;
112
+ await act(() => {
113
+ result = render(<RouterProvider router={router} />);
114
+ });
115
+ if (!result) throw new Error('Run tab strip did not render.');
116
+ return result;
117
+ }
@@ -0,0 +1,97 @@
1
+ import {TabsList, TabsTrigger} from '@shipfox/react-ui/tabs';
2
+ import type {RunAnnotationSummary} from '#core/workflow-run-tabs.js';
3
+ import {RunTabCount} from './run-tab-count.js';
4
+
5
+ export interface RunTabStripProps {
6
+ jobCount?: number | undefined;
7
+ jobsFailed?: number | undefined;
8
+ annotationSummary?: RunAnnotationSummary | undefined;
9
+ }
10
+
11
+ export function RunTabStrip({jobCount, jobsFailed = 0, annotationSummary}: RunTabStripProps) {
12
+ const annotationCount = annotationSummary?.total;
13
+ const annotationErrors = annotationSummary?.error ?? 0;
14
+
15
+ return (
16
+ <div className="min-w-0 overflow-x-auto border-b border-border-neutral-base bg-background-neutral-background [scrollbar-width:none] [&::-webkit-scrollbar]:hidden">
17
+ <TabsList
18
+ aria-label="Run sections"
19
+ className="h-40 min-h-40 w-max min-w-full gap-16 px-16 [@media(pointer:coarse)]:h-44 [@media(pointer:coarse)]:min-h-44"
20
+ >
21
+ <TabsTrigger
22
+ value="summary"
23
+ className="h-40 min-h-40 py-0 text-xs data-[state=inactive]:text-foreground-neutral-subtle data-[state=inactive]:hover:text-foreground-neutral-base [@media(pointer:coarse)]:h-44 [@media(pointer:coarse)]:min-h-44"
24
+ >
25
+ Summary
26
+ </TabsTrigger>
27
+ <TabsTrigger
28
+ value="jobs"
29
+ aria-label={runTabAccessibleName({
30
+ label: 'Jobs',
31
+ total: jobCount,
32
+ totalSingular: 'job',
33
+ totalPlural: 'jobs',
34
+ alertCount: jobsFailed,
35
+ alertSingular: 'failed',
36
+ alertPlural: 'failed',
37
+ })}
38
+ className="h-40 min-h-40 gap-6 py-0 text-xs data-[state=inactive]:text-foreground-neutral-subtle data-[state=inactive]:hover:text-foreground-neutral-base [@media(pointer:coarse)]:h-44 [@media(pointer:coarse)]:min-h-44"
39
+ >
40
+ <span>Jobs</span>
41
+ <RunTabCount count={jobCount} alertCount={jobsFailed} alertLabel="failed" />
42
+ </TabsTrigger>
43
+ <TabsTrigger
44
+ value="annotations"
45
+ aria-label={runTabAccessibleName({
46
+ label: 'Annotations',
47
+ total: annotationCount,
48
+ totalSingular: 'annotation',
49
+ totalPlural: 'annotations',
50
+ alertCount: annotationErrors,
51
+ alertSingular: 'error',
52
+ alertPlural: 'errors',
53
+ })}
54
+ className="h-40 min-h-40 gap-6 py-0 text-xs data-[state=inactive]:text-foreground-neutral-subtle data-[state=inactive]:hover:text-foreground-neutral-base [@media(pointer:coarse)]:h-44 [@media(pointer:coarse)]:min-h-44"
55
+ >
56
+ <span>Annotations</span>
57
+ <RunTabCount
58
+ count={annotationCount}
59
+ alertCount={annotationErrors}
60
+ alertLabel={annotationErrors === 1 ? 'error' : 'errors'}
61
+ />
62
+ </TabsTrigger>
63
+ <TabsTrigger
64
+ value="source"
65
+ className="h-40 min-h-40 py-0 text-xs data-[state=inactive]:text-foreground-neutral-subtle data-[state=inactive]:hover:text-foreground-neutral-base [@media(pointer:coarse)]:h-44 [@media(pointer:coarse)]:min-h-44"
66
+ >
67
+ Source
68
+ </TabsTrigger>
69
+ </TabsList>
70
+ </div>
71
+ );
72
+ }
73
+
74
+ function runTabAccessibleName({
75
+ label,
76
+ total,
77
+ totalSingular,
78
+ totalPlural,
79
+ alertCount,
80
+ alertSingular,
81
+ alertPlural,
82
+ }: {
83
+ label: string;
84
+ total: number | undefined;
85
+ totalSingular: string;
86
+ totalPlural: string;
87
+ alertCount: number;
88
+ alertSingular: string;
89
+ alertPlural: string;
90
+ }): string {
91
+ const parts = [label];
92
+
93
+ if (total !== undefined) parts.push(`${total} ${total === 1 ? totalSingular : totalPlural}`);
94
+ if (alertCount > 0) parts.push(`${alertCount} ${alertCount === 1 ? alertSingular : alertPlural}`);
95
+
96
+ return parts.join(', ');
97
+ }
@@ -12,7 +12,6 @@ import {within} from 'storybook/test';
12
12
  import type {AgentStepConfig, StepError} from '#core/workflow-run.js';
13
13
  import {AgentConfigFailureCallout} from './agent-config-failure-callout.js';
14
14
 
15
- const WORKSPACE_ID = '44444444-4444-4444-8444-444444444444';
16
15
  const AGENTS_LINK_NAME = 'Configure Agents';
17
16
 
18
17
  const config: AgentStepConfig = {
@@ -42,7 +41,7 @@ const meta = {
42
41
  });
43
42
  const agentSettingsRoute = createRoute({
44
43
  getParentRoute: () => rootRoute,
45
- path: '/workspaces/$wid/settings/agents',
44
+ path: '/w/$workspaceSlug/settings/agents',
46
45
  component: () => null,
47
46
  });
48
47
  const router = createRouter({
@@ -54,7 +53,7 @@ const meta = {
54
53
  },
55
54
  ],
56
55
  args: {
57
- workspaceId: WORKSPACE_ID,
56
+ workspaceSlug: 'acme',
58
57
  config,
59
58
  error: makeError('provider_not_configured'),
60
59
  },
@@ -10,11 +10,11 @@ import {Link} from '@tanstack/react-router';
10
10
  import type {AgentStepConfig, StepError} from '#core/workflow-run.js';
11
11
 
12
12
  export function AgentConfigFailureCallout({
13
- workspaceId,
13
+ workspaceSlug,
14
14
  config,
15
15
  error,
16
16
  }: {
17
- workspaceId: string;
17
+ workspaceSlug?: string | undefined;
18
18
  config: AgentStepConfig | null;
19
19
  error: StepError | null;
20
20
  }) {
@@ -25,10 +25,10 @@ export function AgentConfigFailureCallout({
25
25
  <AlertContent>
26
26
  <AlertTitle>{copy.title}</AlertTitle>
27
27
  <AlertDescription>{copy.description}</AlertDescription>
28
- {copy.showProviderCta ? (
28
+ {copy.showProviderCta && workspaceSlug ? (
29
29
  <AlertActions>
30
30
  <Button asChild size="2xs" variant="secondary" iconRight="chevronRight">
31
- <Link to="/workspaces/$wid/settings/agents" params={{wid: workspaceId}}>
31
+ <Link to="/w/$workspaceSlug/settings/agents" params={{workspaceSlug}}>
32
32
  Configure Agents
33
33
  </Link>
34
34
  </Button>
@@ -18,7 +18,6 @@ import {
18
18
  import type {StepExpandedContext} from '../step-list/index.js';
19
19
  import {JobCard} from './job-card.js';
20
20
 
21
- const WORKSPACE_ID = '44444444-4444-4444-8444-444444444444';
22
21
  const SWITCH_EXECUTION_PATTERN = /Switch job execution/;
23
22
  const EXECUTION_FIVE_PATTERN = /#5/;
24
23
 
@@ -41,7 +40,6 @@ const meta = {
41
40
  ),
42
41
  ],
43
42
  args: {
44
- workspaceId: WORKSPACE_ID,
45
43
  job: singleExecutionJob(),
46
44
  selectedJobExecution: singleExecutionJob().jobExecutions[0],
47
45
  selectedAttemptId: null,
@@ -73,7 +71,7 @@ export const States: Story = {
73
71
  <StorySection label="single execution">
74
72
  <JobCardStory job={singleExecutionJob()} />
75
73
  </StorySection>
76
- <StorySection label="display name fallback">
74
+ <StorySection label="execution name with missing job name">
77
75
  <JobCardStory job={keyFallbackJob()} />
78
76
  </StorySection>
79
77
  <StorySection label="queueing execution">
@@ -126,13 +124,13 @@ export const ListeningProgression: Story = {
126
124
  <StorySection label="pending, no executions">
127
125
  <JobCardStory job={listeningJobPending()} />
128
126
  </StorySection>
129
- <StorySection label="running, 0 executions">
127
+ <StorySection label="listening, 0 executions">
130
128
  <JobCardStory job={listeningJobNoExecutions()} />
131
129
  </StorySection>
132
- <StorySection label="running, 1 running execution">
130
+ <StorySection label="listening, 1 running execution">
133
131
  <JobCardStory job={listeningJobOneExecution()} initialJobExecutionId="exec-listen-one-1" />
134
132
  </StorySection>
135
- <StorySection label="running, mixed executions">
133
+ <StorySection label="listening, mixed executions">
136
134
  <JobCardStory job={listeningJobMixedExecutions()} initialJobExecutionId="exec-listen-6" />
137
135
  </StorySection>
138
136
  <StorySection label="failed, resolved">
@@ -145,19 +143,19 @@ export const ListeningProgression: Story = {
145
143
  export const ManyExecutions: Story = {
146
144
  render: () => (
147
145
  <div className="flex flex-col gap-16">
148
- <StorySection label="running, 64 executions, short name">
146
+ <StorySection label="listening, 64 executions, short name">
149
147
  <JobCardStory
150
148
  job={manyExecutionsListeningJob('gate', 'job-many-short')}
151
149
  initialJobExecutionId="exec-many-job-many-short-64"
152
150
  />
153
151
  </StorySection>
154
- <StorySection label="running, 64 executions, medium name">
152
+ <StorySection label="listening, 64 executions, medium name">
155
153
  <JobCardStory
156
154
  job={manyExecutionsListeningJob('release-gates', 'job-many-medium')}
157
155
  initialJobExecutionId="exec-many-job-many-medium-64"
158
156
  />
159
157
  </StorySection>
160
- <StorySection label="running, 64 executions, long name">
158
+ <StorySection label="listening, 64 executions, long name">
161
159
  <JobCardStory
162
160
  job={manyExecutionsListeningJob(
163
161
  'release-production-multi-region-with-canary-validation',
@@ -233,7 +231,6 @@ function JobCardStory({
233
231
 
234
232
  return (
235
233
  <JobCard
236
- workspaceId={WORKSPACE_ID}
237
234
  job={job}
238
235
  selectedJobExecution={selectedJobExecution}
239
236
  selectedAttemptId={selectedAttemptId}
@@ -715,6 +712,10 @@ function makeTriggerEvent(
715
712
  event,
716
713
  delivery_id: `delivery-${sequence}`,
717
714
  received_at: listeningTimestamp(sequence, 1),
715
+ project: null,
716
+ repository: null,
717
+ ref: null,
718
+ commit: null,
718
719
  data: {sequence},
719
720
  };
720
721
  }