@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/workflow-run-summary/workflow-run-attempt-switcher.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useState} from 'react';\nimport type {WorkflowRunAttempt, WorkflowRunDetail} from '#core/workflow-run.js';\nimport {withoutWorkflowRunSelectionSearch} from '#core/workflow-run-url-state.js';\nimport {useWorkflowRunAttemptsQuery} from '#hooks/api/workflow-runs.js';\nimport {WorkflowStatusIcon} from '../workflow-status/workflow-status-icon.js';\n\nexport interface WorkflowRunAttemptSwitcherProps {\n workspaceId: string;\n projectId: string;\n run: WorkflowRunDetail;\n latestAttempt: number;\n}\n\nexport function WorkflowRunAttemptSwitcher({\n workspaceId,\n projectId,\n run,\n latestAttempt,\n}: WorkflowRunAttemptSwitcherProps) {\n const [open, setOpen] = useState(false);\n const attemptsQuery = useWorkflowRunAttemptsQuery({\n workflowRunId: run.id,\n enabled: open,\n });\n\n if (latestAttempt <= 1) return null;\n\n const attempts = attemptsQuery.data ?? [];\n const latestLoadedAttempt = Math.max(0, ...attempts.map((attempt) => attempt.attempt));\n const maxAttempt = Math.max(latestAttempt, run.runAttempt.attempt, latestLoadedAttempt);\n const isLoadingMissingAttempt =\n attempts.length > 0 && attemptsQuery.isFetching && latestLoadedAttempt < maxAttempt;\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"2xs\"\n iconRight=\"arrowDownSLine\"\n aria-label={`Switch attempt, currently ${run.runAttempt.attempt} of ${maxAttempt}`}\n className=\"h-20 px-4 text-foreground-neutral-muted hover:text-foreground-neutral-base\"\n >\n <Text as=\"span\" size=\"xs\" className=\"text-inherit\">\n Attempt {run.runAttempt.attempt} of {maxAttempt}\n </Text>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" size=\"lg\">\n {attemptsQuery.isPending && attempts.length === 0 ? <LoadingRow /> : null}\n {isLoadingMissingAttempt ? <LoadingRow /> : null}\n {attemptsQuery.isError && attempts.length === 0 ? (\n <ErrorRow onRetry={() => void attemptsQuery.refetch()} />\n ) : null}\n {attempts.length > 0\n ? [...attempts]\n .sort((left, right) => right.attempt - left.attempt)\n .map((attempt) => (\n <AttemptItem\n key={attempt.id}\n attempt={attempt}\n current={attempt.id === run.runAttempt.id}\n workflowRunId={run.id}\n workspaceId={workspaceId}\n projectId={projectId}\n />\n ))\n : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction LoadingRow() {\n return (\n <DropdownMenuItem disabled>\n <Text as=\"span\" size=\"sm\" className=\"text-foreground-neutral-muted\">\n Loading attempts...\n </Text>\n </DropdownMenuItem>\n );\n}\n\nfunction ErrorRow({onRetry}: {onRetry: () => void}) {\n return (\n <DropdownMenuItem closeOnSelect={false} onSelect={onRetry}>\n <Text as=\"span\" size=\"sm\" className=\"text-foreground-highlight-error\">\n Could not load attempts. Retry\n </Text>\n </DropdownMenuItem>\n );\n}\n\nfunction AttemptItem({\n attempt,\n current,\n workflowRunId,\n workspaceId,\n projectId,\n}: {\n attempt: WorkflowRunAttempt;\n current: boolean;\n workflowRunId: string;\n workspaceId: string;\n projectId: string;\n}) {\n return (\n <DropdownMenuItem asChild className={cn(current && 'text-foreground-neutral-base')}>\n <Link\n to=\"/workspaces/$wid/projects/$pid/runs/$workflowRunId\"\n params={{wid: workspaceId, pid: projectId, workflowRunId}}\n search={\n ((previous: Record<string, unknown>) => {\n if (current) return previous;\n return {\n ...withoutWorkflowRunSelectionSearch(previous),\n runAttempt: attempt.attempt,\n };\n }) as never\n }\n aria-current={current ? 'page' : undefined}\n >\n <WorkflowStatusIcon status={attempt.status} size={14} tooltip={false} />\n <Code as=\"span\" variant=\"label\" className=\"min-w-0 flex-1 truncate text-inherit\">\n Attempt {attempt.attempt}\n </Code>\n <RelativeTime\n value={attempt.createdAt}\n className=\"shrink-0 whitespace-nowrap font-code text-xs leading-20 text-foreground-neutral-muted\"\n />\n </Link>\n </DropdownMenuItem>\n );\n}\n"],"names":["Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","RelativeTime","Code","Text","cn","Link","useState","withoutWorkflowRunSelectionSearch","useWorkflowRunAttemptsQuery","WorkflowStatusIcon","WorkflowRunAttemptSwitcher","workspaceId","projectId","run","latestAttempt","open","setOpen","attemptsQuery","workflowRunId","id","enabled","attempts","data","latestLoadedAttempt","Math","max","map","attempt","maxAttempt","runAttempt","isLoadingMissingAttempt","length","isFetching","onOpenChange","asChild","type","variant","size","iconRight","aria-label","className","as","align","isPending","LoadingRow","isError","ErrorRow","onRetry","refetch","sort","left","right","AttemptItem","current","disabled","closeOnSelect","onSelect","to","params","wid","pid","search","previous","aria-current","undefined","status","tooltip","value","createdAt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/workflow-run-summary/workflow-run-attempt-switcher.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport {useState} from 'react';\nimport type {WorkflowRunAttempt, WorkflowRunDetail} from '#core/workflow-run.js';\nimport {withoutWorkflowRunSelectionSearch} from '#core/workflow-run-url-state.js';\nimport {useWorkflowRunAttemptsQuery} from '#hooks/api/workflow-runs.js';\nimport {WorkflowStatusIcon} from '../workflow-status/workflow-status-icon.js';\n\nexport interface WorkflowRunAttemptSwitcherProps {\n workspaceSlug?: string | undefined;\n projectSlug?: string | undefined;\n run: WorkflowRunDetail;\n latestAttempt: number;\n}\n\nexport function WorkflowRunAttemptSwitcher({\n workspaceSlug,\n projectSlug,\n run,\n latestAttempt,\n}: WorkflowRunAttemptSwitcherProps) {\n const [open, setOpen] = useState(false);\n const attemptsQuery = useWorkflowRunAttemptsQuery({\n workflowRunId: run.id,\n enabled: open,\n });\n\n if (latestAttempt <= 1) return null;\n if (!workspaceSlug || !projectSlug) return null;\n\n const attempts = attemptsQuery.data ?? [];\n const latestLoadedAttempt = Math.max(0, ...attempts.map((attempt) => attempt.attempt));\n const maxAttempt = Math.max(latestAttempt, run.runAttempt.attempt, latestLoadedAttempt);\n const isLoadingMissingAttempt =\n attempts.length > 0 && attemptsQuery.isFetching && latestLoadedAttempt < maxAttempt;\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"transparentMuted\"\n size=\"2xs\"\n iconRight=\"arrowDownSLine\"\n aria-label={`Switch attempt, currently ${run.runAttempt.attempt} of ${maxAttempt}`}\n className=\"h-20 px-4 text-foreground-neutral-subtle hover:text-foreground-neutral-base\"\n >\n <Text as=\"span\" size=\"xs\" className=\"text-inherit\">\n Attempt {run.runAttempt.attempt} of {maxAttempt}\n </Text>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" size=\"lg\">\n {attemptsQuery.isPending && attempts.length === 0 ? <LoadingRow /> : null}\n {isLoadingMissingAttempt ? <LoadingRow /> : null}\n {attemptsQuery.isError && attempts.length === 0 ? (\n <ErrorRow onRetry={() => void attemptsQuery.refetch()} />\n ) : null}\n {attempts.length > 0\n ? [...attempts]\n .sort((left, right) => right.attempt - left.attempt)\n .map((attempt) => (\n <AttemptItem\n key={attempt.id}\n attempt={attempt}\n current={attempt.id === run.runAttempt.id}\n workflowRunId={run.id}\n workspaceSlug={workspaceSlug}\n projectSlug={projectSlug}\n />\n ))\n : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction LoadingRow() {\n return (\n <DropdownMenuItem disabled>\n <Text as=\"span\" size=\"sm\" className=\"text-foreground-neutral-muted\">\n Loading attempts...\n </Text>\n </DropdownMenuItem>\n );\n}\n\nfunction ErrorRow({onRetry}: {onRetry: () => void}) {\n return (\n <DropdownMenuItem closeOnSelect={false} onSelect={onRetry}>\n <Text as=\"span\" size=\"sm\" className=\"text-foreground-highlight-error\">\n Could not load attempts. Retry\n </Text>\n </DropdownMenuItem>\n );\n}\n\nfunction AttemptItem({\n attempt,\n current,\n workflowRunId,\n workspaceSlug,\n projectSlug,\n}: {\n attempt: WorkflowRunAttempt;\n current: boolean;\n workflowRunId: string;\n workspaceSlug?: string | undefined;\n projectSlug?: string | undefined;\n}) {\n return (\n <DropdownMenuItem asChild className={cn(current && 'text-foreground-neutral-base')}>\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId\"\n params={{workspaceSlug, projectSlug, workflowRunId}}\n search={\n ((previous: Record<string, unknown>) => {\n if (current) return previous;\n return {\n ...withoutWorkflowRunSelectionSearch(previous),\n runAttempt: attempt.attempt,\n };\n }) as never\n }\n aria-current={current ? 'page' : undefined}\n >\n <WorkflowStatusIcon status={attempt.status} size={14} tooltip={false} />\n <Code as=\"span\" variant=\"label\" className=\"min-w-0 flex-1 truncate text-inherit\">\n Attempt {attempt.attempt}\n </Code>\n <RelativeTime\n value={attempt.createdAt}\n className=\"shrink-0 whitespace-nowrap font-code text-xs leading-20 text-foreground-neutral-subtle\"\n />\n </Link>\n </DropdownMenuItem>\n );\n}\n"],"names":["Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","RelativeTime","Code","Text","cn","Link","useState","withoutWorkflowRunSelectionSearch","useWorkflowRunAttemptsQuery","WorkflowStatusIcon","WorkflowRunAttemptSwitcher","workspaceSlug","projectSlug","run","latestAttempt","open","setOpen","attemptsQuery","workflowRunId","id","enabled","attempts","data","latestLoadedAttempt","Math","max","map","attempt","maxAttempt","runAttempt","isLoadingMissingAttempt","length","isFetching","onOpenChange","asChild","type","variant","size","iconRight","aria-label","className","as","align","isPending","LoadingRow","isError","ErrorRow","onRetry","refetch","sort","left","right","AttemptItem","current","disabled","closeOnSelect","onSelect","to","params","search","previous","aria-current","undefined","status","tooltip","value","createdAt"],"mappings":";AAAA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SACEC,YAAY,EACZC,mBAAmB,EACnBC,gBAAgB,EAChBC,mBAAmB,QACd,kCAAkC;AACzC,SAAQC,YAAY,QAAO,kCAAkC;AAC7D,SAAQC,IAAI,EAAEC,IAAI,QAAO,+BAA+B;AACxD,SAAQC,EAAE,QAAO,0BAA0B;AAC3C,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,QAAQ,QAAO,QAAQ;AAE/B,SAAQC,iCAAiC,QAAO,kCAAkC;AAClF,SAAQC,2BAA2B,QAAO,8BAA8B;AACxE,SAAQC,kBAAkB,QAAO,6CAA6C;AAS9E,OAAO,SAASC,2BAA2B,EACzCC,aAAa,EACbC,WAAW,EACXC,GAAG,EACHC,aAAa,EACmB;IAChC,MAAM,CAACC,MAAMC,QAAQ,GAAGV,SAAS;IACjC,MAAMW,gBAAgBT,4BAA4B;QAChDU,eAAeL,IAAIM,EAAE;QACrBC,SAASL;IACX;IAEA,IAAID,iBAAiB,GAAG,OAAO;IAC/B,IAAI,CAACH,iBAAiB,CAACC,aAAa,OAAO;IAE3C,MAAMS,WAAWJ,cAAcK,IAAI,IAAI,EAAE;IACzC,MAAMC,sBAAsBC,KAAKC,GAAG,CAAC,MAAMJ,SAASK,GAAG,CAAC,CAACC,UAAYA,QAAQA,OAAO;IACpF,MAAMC,aAAaJ,KAAKC,GAAG,CAACX,eAAeD,IAAIgB,UAAU,CAACF,OAAO,EAAEJ;IACnE,MAAMO,0BACJT,SAASU,MAAM,GAAG,KAAKd,cAAce,UAAU,IAAIT,sBAAsBK;IAE3E,qBACE,MAAC/B;QAAakB,MAAMA;QAAMkB,cAAcjB;;0BACtC,KAAChB;gBAAoBkC,OAAO;0BAC1B,cAAA,KAACtC;oBACCuC,MAAK;oBACLC,SAAQ;oBACRC,MAAK;oBACLC,WAAU;oBACVC,cAAY,CAAC,0BAA0B,EAAE1B,IAAIgB,UAAU,CAACF,OAAO,CAAC,IAAI,EAAEC,YAAY;oBAClFY,WAAU;8BAEV,cAAA,MAACrC;wBAAKsC,IAAG;wBAAOJ,MAAK;wBAAKG,WAAU;;4BAAe;4BACxC3B,IAAIgB,UAAU,CAACF,OAAO;4BAAC;4BAAKC;;;;;0BAI3C,MAAC9B;gBAAoB4C,OAAM;gBAAQL,MAAK;;oBACrCpB,cAAc0B,SAAS,IAAItB,SAASU,MAAM,KAAK,kBAAI,KAACa,kBAAgB;oBACpEd,wCAA0B,KAACc,kBAAgB;oBAC3C3B,cAAc4B,OAAO,IAAIxB,SAASU,MAAM,KAAK,kBAC5C,KAACe;wBAASC,SAAS,IAAM,KAAK9B,cAAc+B,OAAO;yBACjD;oBACH3B,SAASU,MAAM,GAAG,IACf;2BAAIV;qBAAS,CACV4B,IAAI,CAAC,CAACC,MAAMC,QAAUA,MAAMxB,OAAO,GAAGuB,KAAKvB,OAAO,EAClDD,GAAG,CAAC,CAACC,wBACJ,KAACyB;4BAECzB,SAASA;4BACT0B,SAAS1B,QAAQR,EAAE,KAAKN,IAAIgB,UAAU,CAACV,EAAE;4BACzCD,eAAeL,IAAIM,EAAE;4BACrBR,eAAeA;4BACfC,aAAaA;2BALRe,QAAQR,EAAE,KAQrB;;;;;AAIZ;AAEA,SAASyB;IACP,qBACE,KAAC7C;QAAiBuD,QAAQ;kBACxB,cAAA,KAACnD;YAAKsC,IAAG;YAAOJ,MAAK;YAAKG,WAAU;sBAAgC;;;AAK1E;AAEA,SAASM,SAAS,EAACC,OAAO,EAAwB;IAChD,qBACE,KAAChD;QAAiBwD,eAAe;QAAOC,UAAUT;kBAChD,cAAA,KAAC5C;YAAKsC,IAAG;YAAOJ,MAAK;YAAKG,WAAU;sBAAkC;;;AAK5E;AAEA,SAASY,YAAY,EACnBzB,OAAO,EACP0B,OAAO,EACPnC,aAAa,EACbP,aAAa,EACbC,WAAW,EAOZ;IACC,qBACE,KAACb;QAAiBmC,OAAO;QAACM,WAAWpC,GAAGiD,WAAW;kBACjD,cAAA,MAAChD;YACCoD,IAAG;YACHC,QAAQ;gBAAC/C;gBAAeC;gBAAaM;YAAa;YAClDyC,QACG,CAACC;gBACA,IAAIP,SAAS,OAAOO;gBACpB,OAAO;oBACL,GAAGrD,kCAAkCqD,SAAS;oBAC9C/B,YAAYF,QAAQA,OAAO;gBAC7B;YACF;YAEFkC,gBAAcR,UAAU,SAASS;;8BAEjC,KAACrD;oBAAmBsD,QAAQpC,QAAQoC,MAAM;oBAAE1B,MAAM;oBAAI2B,SAAS;;8BAC/D,MAAC9D;oBAAKuC,IAAG;oBAAOL,SAAQ;oBAAQI,WAAU;;wBAAuC;wBACtEb,QAAQA,OAAO;;;8BAE1B,KAAC1B;oBACCgE,OAAOtC,QAAQuC,SAAS;oBACxB1B,WAAU;;;;;AAKpB"}
@@ -1,19 +1,14 @@
1
- import type { Ref } from 'react';
2
1
  import { type WorkflowRunDetail, type WorkflowRunRerunMode } from '#core/workflow-run.js';
3
2
  export interface WorkflowRunSummaryProps {
4
- workspaceId?: string | undefined;
5
- projectId?: string | undefined;
3
+ workspaceSlug?: string | undefined;
4
+ projectSlug?: string | undefined;
6
5
  run: WorkflowRunDetail;
7
- sourceAvailable?: boolean | undefined;
8
- sourceOpen?: boolean | undefined;
9
- sourcePanelId?: string | undefined;
10
- sourceButtonRef?: Ref<HTMLButtonElement> | undefined;
11
- onSourceToggle?: (() => void) | undefined;
12
6
  cancelling?: boolean | undefined;
13
7
  onCancel?: (() => void) | undefined;
14
8
  rerunPending?: boolean | undefined;
15
9
  onRerun?: ((mode: WorkflowRunRerunMode) => void) | undefined;
16
10
  latestAttempt?: number | undefined;
17
11
  }
18
- export declare function WorkflowRunSummary({ workspaceId, projectId, run, sourceAvailable, sourceOpen, sourcePanelId, sourceButtonRef, onSourceToggle, cancelling, onCancel, rerunPending, onRerun, latestAttempt, }: WorkflowRunSummaryProps): import("react").JSX.Element;
12
+ export declare function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling, onCancel, rerunPending, onRerun, latestAttempt, }: WorkflowRunSummaryProps): import("react").JSX.Element;
13
+ export declare function MetadataSeparator(): import("react").JSX.Element;
19
14
  //# sourceMappingURL=workflow-run-summary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-run-summary.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-summary/workflow-run-summary.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAW/B,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,GAAG,EAAE,iBAAiB,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;IACrD,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1C,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7D,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,SAAS,EACT,GAAG,EACH,eAAuB,EACvB,UAAkB,EAClB,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAkB,EAClB,QAAQ,EACR,YAAoB,EACpB,OAAO,EACP,aAAa,GACd,EAAE,uBAAuB,+BAqIzB"}
1
+ {"version":3,"file":"workflow-run-summary.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-summary/workflow-run-summary.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAY/B,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,GAAG,EAAE,iBAAiB,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7D,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,aAAa,EACb,WAAW,EACX,GAAG,EACH,UAAkB,EAClB,QAAQ,EACR,YAAoB,EACpB,OAAO,EACP,aAAa,GACd,EAAE,uBAAuB,+BA4JzB;AA0GD,wBAAgB,iBAAiB,gCAEhC"}
@@ -8,19 +8,23 @@ import { RelativeTime } from '@shipfox/react-ui/relative-time';
8
8
  import { TimeTickerProvider } from '@shipfox/react-ui/time-ticker';
9
9
  import { Tooltip, TooltipContent, TooltipTrigger } from '@shipfox/react-ui/tooltip';
10
10
  import { Header, Text } from '@shipfox/react-ui/typography';
11
+ import { Link } from '@tanstack/react-router';
11
12
  import { useId } from 'react';
13
+ import { WorkflowRunNumberLabel } from '#components/workflow-run-number-label.js';
12
14
  import { isWorkflowRunTerminal, WORKFLOW_RUN_STATUSES } from '#core/workflow-run.js';
15
+ import { validateWorkflowRunsSearch, workflowRunListSearchParams } from '#routes/inputs.js';
13
16
  import { WorkflowRunDurationLabel } from '../workflow-run-duration-label.js';
14
17
  import { getWorkflowStatusVisual } from '../workflow-status/status-visuals.js';
15
18
  import { WorkflowRunAttemptSwitcher } from './workflow-run-attempt-switcher.js';
16
19
  const STATUS_BADGE_LABEL_WIDTH_CH = Math.max(...WORKFLOW_RUN_STATUSES.map((status)=>getWorkflowStatusVisual(status).label.length));
17
- export function WorkflowRunSummary({ workspaceId, projectId, run, sourceAvailable = false, sourceOpen = false, sourcePanelId, sourceButtonRef, onSourceToggle, cancelling = false, onCancel, rerunPending = false, onRerun, latestAttempt }) {
20
+ export function WorkflowRunSummary({ workspaceSlug, projectSlug, run, cancelling = false, onCancel, rerunPending = false, onRerun, latestAttempt }) {
18
21
  const headingId = useId();
19
22
  const status = getWorkflowStatusVisual(run.runAttempt.status);
20
23
  const action = workflowRunActionForRun(run);
21
- const attemptSwitcher = latestAttempt && latestAttempt > 1 && workspaceId && projectId ? {
22
- workspaceId,
23
- projectId,
24
+ const hasAction = canRenderWorkflowRunAction(action, onCancel, onRerun);
25
+ const attemptSwitcher = latestAttempt && latestAttempt > 1 && workspaceSlug && projectSlug ? {
26
+ workspaceSlug,
27
+ projectSlug,
24
28
  latestAttempt
25
29
  } : null;
26
30
  const displayDuration = run.runAttempt.displayDuration;
@@ -30,80 +34,104 @@ export function WorkflowRunSummary({ workspaceId, projectId, run, sourceAvailabl
30
34
  reducedMotionIntervalMs: 10_000,
31
35
  children: /*#__PURE__*/ _jsx("section", {
32
36
  "aria-labelledby": headingId,
33
- className: "border-b border-border-neutral-base bg-background-subtle-base px-16 py-8",
37
+ className: "bg-background-neutral-background px-16 py-12",
34
38
  children: /*#__PURE__*/ _jsxs("div", {
35
- className: "grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-12 gap-y-4 overflow-hidden",
39
+ 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",
36
40
  children: [
37
- /*#__PURE__*/ _jsxs("div", {
38
- className: "col-start-1 row-start-1 flex min-w-0 items-center gap-8",
39
- children: [
40
- /*#__PURE__*/ _jsx(Badge, {
41
- variant: status.badge,
42
- size: "xs",
43
- children: /*#__PURE__*/ _jsx("span", {
44
- className: "text-center",
45
- style: {
46
- width: `${STATUS_BADGE_LABEL_WIDTH_CH}ch`
47
- },
48
- children: status.label
49
- })
50
- }),
51
- /*#__PURE__*/ _jsxs(Tooltip, {
52
- children: [
53
- /*#__PURE__*/ _jsx(TooltipTrigger, {
54
- asChild: true,
55
- children: /*#__PURE__*/ _jsx(Header, {
56
- id: headingId,
57
- variant: "h3",
58
- className: "min-w-0 truncate",
41
+ /*#__PURE__*/ _jsx("nav", {
42
+ "aria-label": "Breadcrumb",
43
+ className: "col-start-1 row-start-1 min-w-0 max-[480px]:col-start-auto max-[480px]:row-start-auto",
44
+ children: /*#__PURE__*/ _jsxs("ol", {
45
+ className: "flex min-w-0 items-center gap-8",
46
+ children: [
47
+ workspaceSlug && projectSlug ? /*#__PURE__*/ _jsx("li", {
48
+ className: "shrink-0",
49
+ children: /*#__PURE__*/ _jsx(Link, {
50
+ to: "/w/$workspaceSlug/p/$projectSlug/runs",
51
+ params: {
52
+ workspaceSlug,
53
+ projectSlug
54
+ },
55
+ search: (previous)=>workflowRunListSearchParams(validateWorkflowRunsSearch(previous)),
56
+ className: "rounded-4 text-xs font-medium text-foreground-neutral-subtle underline decoration-border-neutral-strong underline-offset-4 outline-none hover:text-foreground-neutral-base focus-visible:shadow-border-interactive-with-active",
57
+ children: "Runs"
58
+ })
59
+ }) : null,
60
+ workspaceSlug && projectSlug ? /*#__PURE__*/ _jsx("li", {
61
+ "aria-hidden": "true",
62
+ className: "shrink-0 text-xs text-foreground-neutral-subtle",
63
+ children: "/"
64
+ }) : null,
65
+ /*#__PURE__*/ _jsxs("li", {
66
+ "aria-current": "page",
67
+ className: "flex min-w-0 items-center gap-8",
68
+ children: [
69
+ /*#__PURE__*/ _jsx(Badge, {
70
+ variant: status.badge,
71
+ size: "xs",
59
72
  children: /*#__PURE__*/ _jsx("span", {
60
- ref: headingTextRef,
61
- title: isHeadingTruncated ? run.name : undefined,
62
- className: "block min-w-0 truncate",
63
- children: run.name
73
+ className: "text-center",
74
+ style: {
75
+ width: `${STATUS_BADGE_LABEL_WIDTH_CH}ch`
76
+ },
77
+ children: status.label
64
78
  })
79
+ }),
80
+ /*#__PURE__*/ _jsxs(Tooltip, {
81
+ children: [
82
+ /*#__PURE__*/ _jsx(TooltipTrigger, {
83
+ asChild: true,
84
+ children: /*#__PURE__*/ _jsx(Header, {
85
+ id: headingId,
86
+ variant: "h3",
87
+ className: "min-w-0 truncate",
88
+ children: /*#__PURE__*/ _jsx("span", {
89
+ ref: headingTextRef,
90
+ title: isHeadingTruncated ? run.name : undefined,
91
+ className: "block min-w-0 truncate",
92
+ children: run.name
93
+ })
94
+ })
95
+ }),
96
+ isHeadingTruncated ? /*#__PURE__*/ _jsx(TooltipContent, {
97
+ children: /*#__PURE__*/ _jsx(Text, {
98
+ as: "span",
99
+ size: "xs",
100
+ className: "max-w-[360px] break-words",
101
+ children: run.name
102
+ })
103
+ }) : null
104
+ ]
65
105
  })
66
- }),
67
- isHeadingTruncated ? /*#__PURE__*/ _jsx(TooltipContent, {
68
- children: /*#__PURE__*/ _jsx(Text, {
69
- as: "span",
70
- size: "xs",
71
- className: "max-w-[360px] break-words",
72
- children: run.name
73
- })
74
- }) : null
75
- ]
76
- })
77
- ]
78
- }),
79
- /*#__PURE__*/ _jsxs("div", {
80
- className: "col-start-2 row-start-1 flex min-w-max items-center gap-6 justify-self-end",
81
- children: [
82
- /*#__PURE__*/ _jsx(WorkflowRunActionSlot, {
83
- action: action,
84
- cancelling: cancelling,
85
- onCancel: onCancel,
86
- rerunPending: rerunPending,
87
- onRerun: onRerun
88
- }),
89
- sourceAvailable ? /*#__PURE__*/ _jsx(Button, {
90
- ref: sourceButtonRef,
91
- type: "button",
92
- variant: "secondary",
93
- size: "xs",
94
- "aria-controls": sourcePanelId,
95
- "aria-expanded": sourceOpen,
96
- onClick: onSourceToggle,
97
- children: "View source"
98
- }) : null
99
- ]
106
+ ]
107
+ })
108
+ ]
109
+ })
100
110
  }),
111
+ hasAction ? /*#__PURE__*/ _jsx("div", {
112
+ 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",
113
+ children: /*#__PURE__*/ _jsx(WorkflowRunActionSlot, {
114
+ action: action,
115
+ cancelling: cancelling,
116
+ onCancel: onCancel,
117
+ rerunPending: rerunPending,
118
+ onRerun: onRerun
119
+ })
120
+ }) : null,
101
121
  /*#__PURE__*/ _jsxs("div", {
102
- className: "col-span-2 row-start-2 flex min-w-0 items-center gap-12 overflow-hidden text-foreground-neutral-muted",
122
+ 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",
103
123
  children: [
124
+ run.number !== null ? /*#__PURE__*/ _jsxs(_Fragment, {
125
+ children: [
126
+ /*#__PURE__*/ _jsx(WorkflowRunNumberLabel, {
127
+ run: run
128
+ }),
129
+ attemptSwitcher || run.triggerDisplayLabel ? /*#__PURE__*/ _jsx(MetadataSeparator, {}) : null
130
+ ]
131
+ }) : null,
104
132
  attemptSwitcher ? /*#__PURE__*/ _jsx(WorkflowRunAttemptSwitcher, {
105
- workspaceId: attemptSwitcher.workspaceId,
106
- projectId: attemptSwitcher.projectId,
133
+ workspaceSlug: attemptSwitcher.workspaceSlug,
134
+ projectSlug: attemptSwitcher.projectSlug,
107
135
  run: run,
108
136
  latestAttempt: attemptSwitcher.latestAttempt
109
137
  }) : null,
@@ -119,7 +147,7 @@ export function WorkflowRunSummary({ workspaceId, projectId, run, sourceAvailabl
119
147
  children: /*#__PURE__*/ _jsxs("button", {
120
148
  type: "button",
121
149
  "aria-label": run.triggerLabel,
122
- className: "inline-flex max-w-full min-w-0 items-center gap-4 rounded-6 border-0 bg-transparent p-0 text-left text-foreground-neutral-muted outline-none focus-visible:shadow-button-neutral-focus",
150
+ 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",
123
151
  children: [
124
152
  /*#__PURE__*/ _jsx(TriggerSourceIcon, {
125
153
  provider: run.triggerProvider,
@@ -149,17 +177,17 @@ export function WorkflowRunSummary({ workspaceId, projectId, run, sourceAvailabl
149
177
  })
150
178
  ]
151
179
  }) : null,
152
- attemptSwitcher || run.triggerDisplayLabel ? /*#__PURE__*/ _jsx(MetadataSeparator, {}) : null,
180
+ run.number !== null || attemptSwitcher || run.triggerDisplayLabel ? /*#__PURE__*/ _jsx(MetadataSeparator, {}) : null,
153
181
  /*#__PURE__*/ _jsx(RelativeTime, {
154
182
  value: run.runAttempt.createdAt,
155
- className: "shrink-0 whitespace-nowrap text-xs leading-20 text-foreground-neutral-muted"
183
+ className: "shrink-0 whitespace-nowrap text-xs leading-20 text-foreground-neutral-subtle"
156
184
  }),
157
185
  displayDuration ? /*#__PURE__*/ _jsxs(_Fragment, {
158
186
  children: [
159
187
  /*#__PURE__*/ _jsx(MetadataSeparator, {}),
160
188
  /*#__PURE__*/ _jsx(WorkflowRunDurationLabel, {
161
189
  duration: displayDuration,
162
- className: "text-foreground-neutral-muted"
190
+ className: "text-foreground-neutral-subtle"
163
191
  })
164
192
  ]
165
193
  }) : null
@@ -235,6 +263,11 @@ function workflowRunActionForRun(run) {
235
263
  if (run.runAttempt.status === 'succeeded' || !hasFailedOrCancelledJobs(run)) return 'rerun-all';
236
264
  return 'rerun-menu';
237
265
  }
266
+ function canRenderWorkflowRunAction(action, onCancel, onRerun) {
267
+ if (action === 'cancel') return onCancel !== undefined;
268
+ if (action === 'rerun-all' || action === 'rerun-menu') return onRerun !== undefined;
269
+ return false;
270
+ }
238
271
  function hasFailedOrCancelledJobs(run) {
239
272
  if (!workflowRunHasJobs(run)) return false;
240
273
  return run.jobs.some((job)=>job.status === 'failed' || job.status === 'cancelled');
@@ -242,7 +275,7 @@ function hasFailedOrCancelledJobs(run) {
242
275
  function workflowRunHasJobs(run) {
243
276
  return 'jobs' in run && Array.isArray(run.jobs);
244
277
  }
245
- function MetadataSeparator() {
278
+ export function MetadataSeparator() {
246
279
  return /*#__PURE__*/ _jsx("span", {
247
280
  "aria-hidden": "true",
248
281
  className: "h-12 w-px shrink-0 bg-border-neutral-base"
@@ -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 {Header, Text} from '@shipfox/react-ui/typography';\nimport type {Ref} from 'react';\nimport {useId} from 'react';\nimport {\n isWorkflowRunTerminal,\n type Job,\n WORKFLOW_RUN_STATUSES,\n type WorkflowRunDetail,\n type WorkflowRunRerunMode,\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.map((status) => getWorkflowStatusVisual(status).label.length),\n);\n\ntype WorkflowRunAction = 'cancel' | 'rerun-all' | 'rerun-menu' | 'none';\n\nexport interface WorkflowRunSummaryProps {\n workspaceId?: string | undefined;\n projectId?: string | undefined;\n run: WorkflowRunDetail;\n sourceAvailable?: boolean | undefined;\n sourceOpen?: boolean | undefined;\n sourcePanelId?: string | undefined;\n sourceButtonRef?: Ref<HTMLButtonElement> | undefined;\n onSourceToggle?: (() => void) | undefined;\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 workspaceId,\n projectId,\n run,\n sourceAvailable = false,\n sourceOpen = false,\n sourcePanelId,\n sourceButtonRef,\n onSourceToggle,\n cancelling = false,\n onCancel,\n rerunPending = false,\n onRerun,\n latestAttempt,\n}: WorkflowRunSummaryProps) {\n const headingId = useId();\n const status = getWorkflowStatusVisual(run.runAttempt.status);\n const action = workflowRunActionForRun(run);\n const attemptSwitcher =\n latestAttempt && latestAttempt > 1 && workspaceId && projectId\n ? {workspaceId, projectId, latestAttempt}\n : null;\n const displayDuration = run.runAttempt.displayDuration;\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=\"border-b border-border-neutral-base bg-background-subtle-base px-16 py-8\"\n >\n <div className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-12 gap-y-4 overflow-hidden\">\n <div className=\"col-start-1 row-start-1 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\n ref={headingTextRef}\n title={isHeadingTruncated ? run.name : undefined}\n className=\"block min-w-0 truncate\"\n >\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\n <div className=\"col-start-2 row-start-1 flex min-w-max items-center gap-6 justify-self-end\">\n <WorkflowRunActionSlot\n action={action}\n cancelling={cancelling}\n onCancel={onCancel}\n rerunPending={rerunPending}\n onRerun={onRerun}\n />\n {sourceAvailable ? (\n <Button\n ref={sourceButtonRef}\n type=\"button\"\n variant=\"secondary\"\n size=\"xs\"\n aria-controls={sourcePanelId}\n aria-expanded={sourceOpen}\n onClick={onSourceToggle}\n >\n View source\n </Button>\n ) : null}\n </div>\n\n <div className=\"col-span-2 row-start-2 flex min-w-0 items-center gap-12 overflow-hidden text-foreground-neutral-muted\">\n {attemptSwitcher ? (\n <WorkflowRunAttemptSwitcher\n workspaceId={attemptSwitcher.workspaceId}\n projectId={attemptSwitcher.projectId}\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 items-center gap-4 rounded-6 border-0 bg-transparent p-0 text-left text-foreground-neutral-muted 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 {attemptSwitcher || run.triggerDisplayLabel ? <MetadataSeparator /> : null}\n <RelativeTime\n value={run.runAttempt.createdAt}\n className=\"shrink-0 whitespace-nowrap text-xs leading-20 text-foreground-neutral-muted\"\n />\n\n {displayDuration ? (\n <>\n <MetadataSeparator />\n <WorkflowRunDurationLabel\n duration={displayDuration}\n className=\"text-foreground-neutral-muted\"\n />\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 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 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 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\nfunction 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","Header","Text","useId","isWorkflowRunTerminal","WORKFLOW_RUN_STATUSES","WorkflowRunDurationLabel","getWorkflowStatusVisual","WorkflowRunAttemptSwitcher","STATUS_BADGE_LABEL_WIDTH_CH","Math","max","map","status","label","length","WorkflowRunSummary","workspaceId","projectId","run","sourceAvailable","sourceOpen","sourcePanelId","sourceButtonRef","onSourceToggle","cancelling","onCancel","rerunPending","onRerun","latestAttempt","headingId","runAttempt","action","workflowRunActionForRun","attemptSwitcher","displayDuration","ref","headingTextRef","isTruncated","isHeadingTruncated","name","intervalMs","reducedMotionIntervalMs","section","aria-labelledby","className","div","variant","badge","size","span","style","width","asChild","id","title","undefined","as","WorkflowRunActionSlot","type","aria-controls","aria-expanded","onClick","triggerDisplayLabel","MetadataSeparator","button","aria-label","triggerLabel","provider","triggerProvider","source","triggerSource","aria-hidden","value","createdAt","duration","isLoading","disabled","iconRight","align","onSelect","attempt","currentAttempt","hasFailedOrCancelledJobs","workflowRunHasJobs","jobs","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 {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 {Header, Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\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} from '#core/workflow-run.js';\nimport {validateWorkflowRunsSearch, workflowRunListSearchParams} from '#routes/inputs.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.map((status) => getWorkflowStatusVisual(status).label.length),\n);\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 status = getWorkflowStatusVisual(run.runAttempt.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 = run.runAttempt.displayDuration;\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 <nav\n aria-label=\"Breadcrumb\"\n className=\"col-start-1 row-start-1 min-w-0 max-[480px]:col-start-auto max-[480px]:row-start-auto\"\n >\n <ol className=\"flex min-w-0 items-center gap-8\">\n {workspaceSlug && projectSlug ? (\n <li className=\"shrink-0\">\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs\"\n params={{workspaceSlug, projectSlug}}\n search={\n ((previous: Record<string, unknown>) =>\n workflowRunListSearchParams(validateWorkflowRunsSearch(previous))) as never\n }\n className=\"rounded-4 text-xs font-medium text-foreground-neutral-subtle underline decoration-border-neutral-strong underline-offset-4 outline-none hover:text-foreground-neutral-base focus-visible:shadow-border-interactive-with-active\"\n >\n Runs\n </Link>\n </li>\n ) : null}\n {workspaceSlug && projectSlug ? (\n <li aria-hidden=\"true\" className=\"shrink-0 text-xs text-foreground-neutral-subtle\">\n /\n </li>\n ) : null}\n <li aria-current=\"page\" 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\n ref={headingTextRef}\n title={isHeadingTruncated ? run.name : undefined}\n className=\"block min-w-0 truncate\"\n >\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 </li>\n </ol>\n </nav>\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 </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 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 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","Header","Text","Link","useId","WorkflowRunNumberLabel","isWorkflowRunTerminal","WORKFLOW_RUN_STATUSES","validateWorkflowRunsSearch","workflowRunListSearchParams","WorkflowRunDurationLabel","getWorkflowStatusVisual","WorkflowRunAttemptSwitcher","STATUS_BADGE_LABEL_WIDTH_CH","Math","max","map","status","label","length","WorkflowRunSummary","workspaceSlug","projectSlug","run","cancelling","onCancel","rerunPending","onRerun","latestAttempt","headingId","runAttempt","action","workflowRunActionForRun","hasAction","canRenderWorkflowRunAction","attemptSwitcher","displayDuration","ref","headingTextRef","isTruncated","isHeadingTruncated","name","intervalMs","reducedMotionIntervalMs","section","aria-labelledby","className","div","nav","aria-label","ol","li","to","params","search","previous","aria-hidden","aria-current","variant","badge","size","span","style","width","asChild","id","title","undefined","as","WorkflowRunActionSlot","number","triggerDisplayLabel","MetadataSeparator","button","type","triggerLabel","provider","triggerProvider","source","triggerSource","value","createdAt","duration","isLoading","disabled","onClick","iconRight","align","onSelect","attempt","currentAttempt","hasFailedOrCancelledJobs","workflowRunHasJobs","jobs","some","job","Array","isArray"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { RunAnnotationSummaryLine } from './run-annotation-summary-line.js';
2
+ export { RunAnnotationsEmpty } from './run-annotations-empty.js';
3
+ export { RunJobsList } from './run-jobs-list.js';
4
+ export { RunTabCount } from './run-tab-count.js';
5
+ export { RunTabStrip } from './run-tab-strip.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAC/D,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { RunAnnotationSummaryLine } from './run-annotation-summary-line.js';
2
+ export { RunAnnotationsEmpty } from './run-annotations-empty.js';
3
+ export { RunJobsList } from './run-jobs-list.js';
4
+ export { RunTabCount } from './run-tab-count.js';
5
+ export { RunTabStrip } from './run-tab-strip.js';
6
+
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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';\nexport {RunJobsList} from './run-jobs-list.js';\nexport {RunTabCount} from './run-tab-count.js';\nexport {RunTabStrip} from './run-tab-strip.js';\n"],"names":["RunAnnotationSummaryLine","RunAnnotationsEmpty","RunJobsList","RunTabCount","RunTabStrip"],"mappings":"AAAA,SAAQA,wBAAwB,QAAO,mCAAmC;AAC1E,SAAQC,mBAAmB,QAAO,6BAA6B;AAC/D,SAAQC,WAAW,QAAO,qBAAqB;AAC/C,SAAQC,WAAW,QAAO,qBAAqB;AAC/C,SAAQC,WAAW,QAAO,qBAAqB"}
@@ -0,0 +1,11 @@
1
+ import type { RunAnnotationSummary } from '#core/workflow-run-tabs.js';
2
+ import { type WorkflowRunsSearch } from '#routes/inputs.js';
3
+ export interface RunAnnotationSummaryLineProps {
4
+ summary?: RunAnnotationSummary | undefined;
5
+ workspaceSlug?: string | undefined;
6
+ projectSlug?: string | undefined;
7
+ workflowRunId?: string | undefined;
8
+ search?: WorkflowRunsSearch | undefined;
9
+ }
10
+ export declare function RunAnnotationSummaryLine({ summary, workspaceSlug, projectSlug, workflowRunId, search, }: RunAnnotationSummaryLineProps): import("react").JSX.Element | null;
11
+ //# sourceMappingURL=run-annotation-summary-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-annotation-summary-line.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/run-annotation-summary-line.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CACzC;AAED,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,aAAa,EACb,WAAW,EACX,aAAa,EACb,MAAW,GACZ,EAAE,6BAA6B,sCA2B/B"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Text } from '@shipfox/react-ui/typography';
3
+ import { Link } from '@tanstack/react-router';
4
+ import { WORKFLOW_RUN_ANNOTATION_SEVERITIES, workflowRunSearchParams } from '#routes/inputs.js';
5
+ import { MetadataSeparator } from '../workflow-run-summary/workflow-run-summary.js';
6
+ export function RunAnnotationSummaryLine({ summary, workspaceSlug, projectSlug, workflowRunId, search = {} }) {
7
+ if (!summary) return null;
8
+ const visibleSeverities = WORKFLOW_RUN_ANNOTATION_SEVERITIES.filter((severity)=>summary[severity] > 0);
9
+ return /*#__PURE__*/ _jsxs("div", {
10
+ className: "flex flex-wrap items-center gap-x-8 gap-y-4 text-foreground-neutral-subtle",
11
+ children: [
12
+ /*#__PURE__*/ _jsxs(Text, {
13
+ as: "span",
14
+ size: "xs",
15
+ className: "shrink-0 text-foreground-neutral-subtle",
16
+ children: [
17
+ summary.total,
18
+ " ",
19
+ pluralize('annotation', summary.total)
20
+ ]
21
+ }),
22
+ visibleSeverities.map((severity)=>/*#__PURE__*/ _jsxs("span", {
23
+ className: "inline-flex shrink-0 items-center gap-8",
24
+ children: [
25
+ /*#__PURE__*/ _jsx(MetadataSeparator, {}),
26
+ /*#__PURE__*/ _jsx(SeverityLink, {
27
+ count: summary[severity],
28
+ severity: severity,
29
+ workspaceSlug: workspaceSlug,
30
+ projectSlug: projectSlug,
31
+ workflowRunId: workflowRunId,
32
+ search: search
33
+ })
34
+ ]
35
+ }, severity))
36
+ ]
37
+ });
38
+ }
39
+ function SeverityLink({ count, severity, workspaceSlug, projectSlug, workflowRunId, search }) {
40
+ const label = `${count} ${pluralize(severity, count)}`;
41
+ if (!workspaceSlug || !projectSlug || !workflowRunId) {
42
+ return /*#__PURE__*/ _jsx("span", {
43
+ className: "text-foreground-highlight-interactive",
44
+ children: label
45
+ });
46
+ }
47
+ const searchWithoutAnnotation = {
48
+ ...search
49
+ };
50
+ delete searchWithoutAnnotation.annotation;
51
+ return /*#__PURE__*/ _jsx(Link, {
52
+ to: "/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId",
53
+ params: {
54
+ workspaceSlug,
55
+ projectSlug,
56
+ workflowRunId
57
+ },
58
+ search: workflowRunSearchParams({
59
+ ...searchWithoutAnnotation,
60
+ tab: 'annotations',
61
+ severity
62
+ }, search),
63
+ className: "text-foreground-highlight-interactive outline-none hover:underline focus-visible:shadow-border-interactive-with-active",
64
+ children: label
65
+ });
66
+ }
67
+ function pluralize(word, count) {
68
+ return count === 1 ? word : `${word}s`;
69
+ }
70
+
71
+ //# sourceMappingURL=run-annotation-summary-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/workflow-run-tabs/run-annotation-summary-line.tsx"],"sourcesContent":["import {Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\nimport type {RunAnnotationSummary} from '#core/workflow-run-tabs.js';\nimport {\n WORKFLOW_RUN_ANNOTATION_SEVERITIES,\n type WorkflowRunAnnotationSeverity,\n type WorkflowRunsSearch,\n workflowRunSearchParams,\n} from '#routes/inputs.js';\nimport {MetadataSeparator} from '../workflow-run-summary/workflow-run-summary.js';\n\nexport interface RunAnnotationSummaryLineProps {\n summary?: RunAnnotationSummary | undefined;\n workspaceSlug?: string | undefined;\n projectSlug?: string | undefined;\n workflowRunId?: string | undefined;\n search?: WorkflowRunsSearch | undefined;\n}\n\nexport function RunAnnotationSummaryLine({\n summary,\n workspaceSlug,\n projectSlug,\n workflowRunId,\n search = {},\n}: RunAnnotationSummaryLineProps) {\n if (!summary) return null;\n\n const visibleSeverities = WORKFLOW_RUN_ANNOTATION_SEVERITIES.filter(\n (severity) => summary[severity] > 0,\n );\n\n return (\n <div className=\"flex flex-wrap items-center gap-x-8 gap-y-4 text-foreground-neutral-subtle\">\n <Text as=\"span\" size=\"xs\" className=\"shrink-0 text-foreground-neutral-subtle\">\n {summary.total} {pluralize('annotation', summary.total)}\n </Text>\n {visibleSeverities.map((severity) => (\n <span key={severity} className=\"inline-flex shrink-0 items-center gap-8\">\n <MetadataSeparator />\n <SeverityLink\n count={summary[severity]}\n severity={severity}\n workspaceSlug={workspaceSlug}\n projectSlug={projectSlug}\n workflowRunId={workflowRunId}\n search={search}\n />\n </span>\n ))}\n </div>\n );\n}\n\nfunction SeverityLink({\n count,\n severity,\n workspaceSlug,\n projectSlug,\n workflowRunId,\n search,\n}: {\n count: number;\n severity: WorkflowRunAnnotationSeverity;\n workspaceSlug?: string | undefined;\n projectSlug?: string | undefined;\n workflowRunId?: string | undefined;\n search: WorkflowRunsSearch;\n}) {\n const label = `${count} ${pluralize(severity, count)}`;\n if (!workspaceSlug || !projectSlug || !workflowRunId) {\n return <span className=\"text-foreground-highlight-interactive\">{label}</span>;\n }\n\n const searchWithoutAnnotation = {...search};\n delete searchWithoutAnnotation.annotation;\n\n return (\n <Link\n to=\"/w/$workspaceSlug/p/$projectSlug/runs/$workflowRunId\"\n params={{workspaceSlug, projectSlug, workflowRunId}}\n search={\n workflowRunSearchParams(\n {...searchWithoutAnnotation, tab: 'annotations', severity},\n search,\n ) as never\n }\n className=\"text-foreground-highlight-interactive outline-none hover:underline focus-visible:shadow-border-interactive-with-active\"\n >\n {label}\n </Link>\n );\n}\n\nfunction pluralize(word: string, count: number): string {\n return count === 1 ? word : `${word}s`;\n}\n"],"names":["Text","Link","WORKFLOW_RUN_ANNOTATION_SEVERITIES","workflowRunSearchParams","MetadataSeparator","RunAnnotationSummaryLine","summary","workspaceSlug","projectSlug","workflowRunId","search","visibleSeverities","filter","severity","div","className","as","size","total","pluralize","map","span","SeverityLink","count","label","searchWithoutAnnotation","annotation","to","params","tab","word"],"mappings":";AAAA,SAAQA,IAAI,QAAO,+BAA+B;AAClD,SAAQC,IAAI,QAAO,yBAAyB;AAE5C,SACEC,kCAAkC,EAGlCC,uBAAuB,QAClB,oBAAoB;AAC3B,SAAQC,iBAAiB,QAAO,kDAAkD;AAUlF,OAAO,SAASC,yBAAyB,EACvCC,OAAO,EACPC,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,SAAS,CAAC,CAAC,EACmB;IAC9B,IAAI,CAACJ,SAAS,OAAO;IAErB,MAAMK,oBAAoBT,mCAAmCU,MAAM,CACjE,CAACC,WAAaP,OAAO,CAACO,SAAS,GAAG;IAGpC,qBACE,MAACC;QAAIC,WAAU;;0BACb,MAACf;gBAAKgB,IAAG;gBAAOC,MAAK;gBAAKF,WAAU;;oBACjCT,QAAQY,KAAK;oBAAC;oBAAEC,UAAU,cAAcb,QAAQY,KAAK;;;YAEvDP,kBAAkBS,GAAG,CAAC,CAACP,yBACtB,MAACQ;oBAAoBN,WAAU;;sCAC7B,KAACX;sCACD,KAACkB;4BACCC,OAAOjB,OAAO,CAACO,SAAS;4BACxBA,UAAUA;4BACVN,eAAeA;4BACfC,aAAaA;4BACbC,eAAeA;4BACfC,QAAQA;;;mBARDG;;;AAcnB;AAEA,SAASS,aAAa,EACpBC,KAAK,EACLV,QAAQ,EACRN,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,MAAM,EAQP;IACC,MAAMc,QAAQ,GAAGD,MAAM,CAAC,EAAEJ,UAAUN,UAAUU,QAAQ;IACtD,IAAI,CAAChB,iBAAiB,CAACC,eAAe,CAACC,eAAe;QACpD,qBAAO,KAACY;YAAKN,WAAU;sBAAyCS;;IAClE;IAEA,MAAMC,0BAA0B;QAAC,GAAGf,MAAM;IAAA;IAC1C,OAAOe,wBAAwBC,UAAU;IAEzC,qBACE,KAACzB;QACC0B,IAAG;QACHC,QAAQ;YAACrB;YAAeC;YAAaC;QAAa;QAClDC,QACEP,wBACE;YAAC,GAAGsB,uBAAuB;YAAEI,KAAK;YAAehB;QAAQ,GACzDH;QAGJK,WAAU;kBAETS;;AAGP;AAEA,SAASL,UAAUW,IAAY,EAAEP,KAAa;IAC5C,OAAOA,UAAU,IAAIO,OAAO,GAAGA,KAAK,CAAC,CAAC;AACxC"}
@@ -0,0 +1,2 @@
1
+ export declare function RunAnnotationsEmpty(): import("react").JSX.Element;
2
+ //# sourceMappingURL=run-annotations-empty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-annotations-empty.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/run-annotations-empty.tsx"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,gCAQlC"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { EmptyState } from '@shipfox/react-ui/empty-state';
3
+ export function RunAnnotationsEmpty() {
4
+ return /*#__PURE__*/ _jsx(EmptyState, {
5
+ icon: "fileDamageLine",
6
+ title: "No annotations",
7
+ description: "This run has no annotations to show."
8
+ });
9
+ }
10
+
11
+ //# sourceMappingURL=run-annotations-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/workflow-run-tabs/run-annotations-empty.tsx"],"sourcesContent":["import {EmptyState} from '@shipfox/react-ui/empty-state';\n\nexport function RunAnnotationsEmpty() {\n return (\n <EmptyState\n icon=\"fileDamageLine\"\n title=\"No annotations\"\n description=\"This run has no annotations to show.\"\n />\n );\n}\n"],"names":["EmptyState","RunAnnotationsEmpty","icon","title","description"],"mappings":";AAAA,SAAQA,UAAU,QAAO,gCAAgC;AAEzD,OAAO,SAASC;IACd,qBACE,KAACD;QACCE,MAAK;QACLC,OAAM;QACNC,aAAY;;AAGlB"}
@@ -0,0 +1,18 @@
1
+ import { defaultJobExecution, type Job } from '#core/workflow-run.js';
2
+ import { JobCard } from '../workflow-run-view/job-card.js';
3
+ export interface RunJobsListProps {
4
+ jobs: Job[];
5
+ selectedJobId?: string | undefined;
6
+ onSelectedJobChange: (jobId: string | undefined) => void;
7
+ workspaceSlug?: string | undefined;
8
+ selectedJobExecution: ReturnType<typeof defaultJobExecution>;
9
+ selectedAttemptId: string | null | undefined;
10
+ onSelectedJobExecutionChange: ((jobExecutionId: string | undefined) => void) | undefined;
11
+ onSelectedAttemptChange: ((attemptId: string | undefined) => void) | undefined;
12
+ sourcePanelId?: string | undefined;
13
+ sourceAvailable?: boolean | undefined;
14
+ focusedSourceStepId?: string | null | undefined;
15
+ onOpenStepSource?: Parameters<typeof JobCard>[0]['onOpenStepSource'];
16
+ }
17
+ export declare function RunJobsList({ jobs, selectedJobId, onSelectedJobChange, workspaceSlug, selectedJobExecution, selectedAttemptId, onSelectedJobExecutionChange, onSelectedAttemptChange, sourcePanelId, sourceAvailable, focusedSourceStepId, onOpenStepSource, }: RunJobsListProps): import("react").JSX.Element;
18
+ //# sourceMappingURL=run-jobs-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-jobs-list.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-run-tabs/run-jobs-list.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,mBAAmB,EAGnB,KAAK,GAAG,EACT,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAC,OAAO,EAAC,MAAM,kCAAkC,CAAC;AAGzD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACzD,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,oBAAoB,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IAC7D,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,4BAA4B,EAAE,CAAC,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACzF,uBAAuB,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/E,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,gBAAgB,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;CACtE;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,4BAA4B,EAC5B,uBAAuB,EACvB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,EAAE,gBAAgB,+BAsFlB"}