prefect 3.6.16.dev5__py3-none-any.whl → 3.6.16.dev7__py3-none-any.whl

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 (286) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/cli/__init__.py +1 -0
  3. prefect/cli/cloud/asset.py +135 -0
  4. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js +2 -0
  5. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js.map +1 -0
  6. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js +2 -0
  7. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js.map +1 -0
  8. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js +2 -0
  9. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js.map +1 -0
  10. prefect/server/ui-v2/assets/automation._id-CEHa-X0X.js +2 -0
  11. prefect/server/ui-v2/assets/{automation._id-CMiura1b.js.map → automation._id-CEHa-X0X.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js → automation_._id.edit-BRWAsELa.js} +2 -2
  13. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js.map → automation_._id.edit-BRWAsELa.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js → automations-header-Dr6v5dPp.js} +2 -2
  15. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js.map → automations-header-Dr6v5dPp.js.map} +1 -1
  16. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js +2 -0
  17. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js.map +1 -0
  18. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js +2 -0
  19. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js.map +1 -0
  20. prefect/server/ui-v2/assets/block-type-logo-scnMsyY5.js +2 -0
  21. prefect/server/ui-v2/assets/{block-type-logo-DuvU7goV.js.map → block-type-logo-scnMsyY5.js.map} +1 -1
  22. prefect/server/ui-v2/assets/block._id-BY42cyjR.js +2 -0
  23. prefect/server/ui-v2/assets/block._id-BY42cyjR.js.map +1 -0
  24. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js → block_._id.edit-n2jwU5yr.js} +2 -2
  25. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js.map → block_._id.edit-n2jwU5yr.js.map} +1 -1
  26. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js +2 -0
  27. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js.map +1 -0
  28. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js +2 -0
  29. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js.map +1 -0
  30. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js → catalog_._slug_.create-rboQmoyW.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js.map → catalog_._slug_.create-rboQmoyW.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js → collapsible-Lk7MRvBH.js} +2 -2
  33. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js.map → collapsible-Lk7MRvBH.js.map} +1 -1
  34. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js +2 -0
  35. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js.map +1 -0
  36. prefect/server/ui-v2/assets/create-CtsA2QIl.js +2 -0
  37. prefect/server/ui-v2/assets/{create-BrNwbpVu.js.map → create-CtsA2QIl.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{create-DWgkh2HT.js → create-DJPAEZ93.js} +2 -2
  39. prefect/server/ui-v2/assets/create-DJPAEZ93.js.map +1 -0
  40. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js → data-table-bk-0xKWT.js} +2 -2
  41. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js.map → data-table-bk-0xKWT.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js → delete-confirmation-dialog-BZg9EOfN.js} +2 -2
  43. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js.map → delete-confirmation-dialog-BZg9EOfN.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js → deployment-action-header-DwuMPgVg.js} +2 -2
  45. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js.map → deployment-action-header-DwuMPgVg.js.map} +1 -1
  46. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js +3 -0
  47. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js.map +1 -0
  48. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js → deployment-links-B67P-6Ph.js} +2 -2
  49. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js.map → deployment-links-B67P-6Ph.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment._id-DXrb6frJ.js → deployment._id-BVOBfMVf.js} +2 -2
  51. prefect/server/ui-v2/assets/deployment._id-BVOBfMVf.js.map +1 -0
  52. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js +2 -0
  53. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js.map +1 -0
  54. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js +2 -0
  55. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js.map +1 -0
  56. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js +2 -0
  57. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js.map +1 -0
  58. prefect/server/ui-v2/assets/deployment_._id.run-DFVA4Xhx.js +2 -0
  59. prefect/server/ui-v2/assets/{deployment_._id.run-CnacOmhY.js.map → deployment_._id.run-DFVA4Xhx.js.map} +1 -1
  60. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js → dropdown-menu-fRiq5bS-.js} +2 -2
  61. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js.map → dropdown-menu-fRiq5bS-.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js → event-resource-display-C1ZAey-o.js} +2 -2
  63. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js.map → event-resource-display-C1ZAey-o.js.map} +1 -1
  64. prefect/server/ui-v2/assets/event._eventDate._eventId-CcbtP9Ag.js +2 -0
  65. prefect/server/ui-v2/assets/{event._eventDate._eventId-CKTuT_8S.js.map → event._eventDate._eventId-CcbtP9Ag.js.map} +1 -1
  66. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js +2 -0
  67. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js.map +1 -0
  68. prefect/server/ui-v2/assets/{flow-run._id-BKv9Meqc.js → flow-run._id-Dn9R_Tjy.js} +2 -2
  69. prefect/server/ui-v2/assets/flow-run._id-Dn9R_Tjy.js.map +1 -0
  70. prefect/server/ui-v2/assets/{flow-run._id-ZTkjj6bM.js → flow-run._id-Dwx7ojcj.js} +2 -2
  71. prefect/server/ui-v2/assets/flow-run._id-Dwx7ojcj.js.map +1 -0
  72. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js +4 -0
  73. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js.map +1 -0
  74. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js +2 -0
  75. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js.map +1 -0
  76. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js +2 -0
  77. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js.map +1 -0
  78. prefect/server/ui-v2/assets/{form-DOdmIC3A.js → form-Cl5Hk9bq.js} +2 -2
  79. prefect/server/ui-v2/assets/{form-DOdmIC3A.js.map → form-Cl5Hk9bq.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{header-DcIuN5UN.js → header-BuI436ik.js} +2 -2
  81. prefect/server/ui-v2/assets/{header-DcIuN5UN.js.map → header-BuI436ik.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{header-CnBwASd-.js → header-DcAQCxQl.js} +2 -2
  83. prefect/server/ui-v2/assets/{header-CnBwASd-.js.map → header-DcAQCxQl.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-DxE-NzAK.js → header-qlcK4NLD.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-DxE-NzAK.js.map → header-qlcK4NLD.js.map} +1 -1
  86. prefect/server/ui-v2/assets/index--Z69UYXV.js +2 -0
  87. prefect/server/ui-v2/assets/index--Z69UYXV.js.map +1 -0
  88. prefect/server/ui-v2/assets/{index-D0R9_LIL.js → index-BO4Qqsm8.js} +2 -2
  89. prefect/server/ui-v2/assets/index-BO4Qqsm8.js.map +1 -0
  90. prefect/server/ui-v2/assets/index-Bg45XS_V.js +2 -0
  91. prefect/server/ui-v2/assets/index-Bg45XS_V.js.map +1 -0
  92. prefect/server/ui-v2/assets/{index-BIBIJufF.js → index-BleYpDoN.js} +2 -2
  93. prefect/server/ui-v2/assets/index-BleYpDoN.js.map +1 -0
  94. prefect/server/ui-v2/assets/{index-DyOAqIOp.js → index-C63VUjOh.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-DyOAqIOp.js.map → index-C63VUjOh.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-DfKXdmko.js → index-C6LgWyJb.js} +2 -2
  97. prefect/server/ui-v2/assets/index-C6LgWyJb.js.map +1 -0
  98. prefect/server/ui-v2/assets/index-CE-bVgqj.js +2 -0
  99. prefect/server/ui-v2/assets/{index-DlAHvqFx.js.map → index-CE-bVgqj.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{index-V_xTKaEb.js → index-CPpeVt8m.js} +13 -13
  101. prefect/server/ui-v2/assets/index-CPpeVt8m.js.map +1 -0
  102. prefect/server/ui-v2/assets/index-CYaUe0Ym.js +2 -0
  103. prefect/server/ui-v2/assets/index-CYaUe0Ym.js.map +1 -0
  104. prefect/server/ui-v2/assets/{index-C5RMFRyZ.js → index-Clbms0kg.js} +2 -2
  105. prefect/server/ui-v2/assets/index-Clbms0kg.js.map +1 -0
  106. prefect/server/ui-v2/assets/index-D13YFoYA.js +2 -0
  107. prefect/server/ui-v2/assets/index-D13YFoYA.js.map +1 -0
  108. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js → index-D73a_nGu.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js.map → index-D73a_nGu.js.map} +1 -1
  110. prefect/server/ui-v2/assets/index-DJXBzX1E.css +1 -0
  111. prefect/server/ui-v2/assets/{index-BO60ehN6.js → index-DPPPaOr_.js} +2 -2
  112. prefect/server/ui-v2/assets/index-DPPPaOr_.js.map +1 -0
  113. prefect/server/ui-v2/assets/{index-DP8W-xJo.js → index-DU9ShbqW.js} +2 -2
  114. prefect/server/ui-v2/assets/index-DU9ShbqW.js.map +1 -0
  115. prefect/server/ui-v2/assets/index-DdR1lzZk.js +2 -0
  116. prefect/server/ui-v2/assets/index-DdR1lzZk.js.map +1 -0
  117. prefect/server/ui-v2/assets/{index-B9ttjsyu.js → index-ELo08q04.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-B9ttjsyu.js.map → index-ELo08q04.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{index-BTL1xHS9.js → index-cp6PTdHp.js} +2 -2
  120. prefect/server/ui-v2/assets/{index-BTL1xHS9.js.map → index-cp6PTdHp.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{index-D6G96ToY.js → index-kM_g8J0u.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-D6G96ToY.js.map → index-kM_g8J0u.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-q5Y3hlDT.js → index-mYcm9Rkr.js} +2 -2
  124. prefect/server/ui-v2/assets/index-mYcm9Rkr.js.map +1 -0
  125. prefect/server/ui-v2/assets/{index-D9cOtoSU.js → index-yavn_NBp.js} +2 -2
  126. prefect/server/ui-v2/assets/index-yavn_NBp.js.map +1 -0
  127. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js → json-input-iUzf6BvZ.js} +2 -2
  128. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js.map → json-input-iUzf6BvZ.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js → key-value-DI27Dv4P.js} +2 -2
  130. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js.map → key-value-DI27Dv4P.js.map} +1 -1
  131. prefect/server/ui-v2/assets/key._key-C-nk2nld.js +2 -0
  132. prefect/server/ui-v2/assets/key._key-C-nk2nld.js.map +1 -0
  133. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js → lazy-markdown-D_y73qoD.js} +2 -2
  134. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js.map → lazy-markdown-D_y73qoD.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js → login-DR_xuMmg.js} +2 -2
  136. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js.map → login-DR_xuMmg.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js → markdown-input-hzlzpUdj.js} +2 -2
  138. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js.map → markdown-input-hzlzpUdj.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js → python-example-snippet-d8bTNJ0J.js} +3 -3
  140. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js.map → python-example-snippet-d8bTNJ0J.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{python-input-niCawr8m.js → python-input-Bxdnzvx3.js} +2 -2
  142. prefect/server/ui-v2/assets/{python-input-niCawr8m.js.map → python-input-Bxdnzvx3.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js → radio-group-0oOEMJCS.js} +2 -2
  144. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js.map → radio-group-0oOEMJCS.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js → route-error-state-BqbnZCc-.js} +2 -2
  146. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js.map → route-error-state-BqbnZCc-.js.map} +1 -1
  147. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js → schema-form-BD-WM4S0.js} +2 -2
  148. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js.map → schema-form-BD-WM4S0.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js → schema-form-input-string-format-datetime-Dg3zVAp5.js} +4 -4
  150. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js.map → schema-form-input-string-format-datetime-Dg3zVAp5.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js → settings-Dm6yMLix.js} +2 -2
  152. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js.map → settings-Dm6yMLix.js.map} +1 -1
  153. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js → sort-filter-X6JyRc0-.js} +2 -2
  154. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js.map → sort-filter-X6JyRc0-.js.map} +1 -1
  155. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js → table-Xyel2BEw.js} +2 -2
  156. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js.map → table-Xyel2BEw.js.map} +1 -1
  157. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js → tags-input-DqZ8v99z.js} +2 -2
  158. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js.map → tags-input-DqZ8v99z.js.map} +1 -1
  159. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js} +2 -2
  160. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js.map → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js.map} +1 -1
  161. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js → task-run._id-9DcrUEGz.js} +3 -3
  162. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js.map → task-run._id-9DcrUEGz.js.map} +1 -1
  163. prefect/server/ui-v2/assets/{task-run._id-CQGeAiBh.js → task-run._id-DJkoLl_e.js} +2 -2
  164. prefect/server/ui-v2/assets/task-run._id-DJkoLl_e.js.map +1 -0
  165. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js +2 -0
  166. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js.map +1 -0
  167. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js → textarea-DFEOJJdc.js} +2 -2
  168. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js.map → textarea-DFEOJJdc.js.map} +1 -1
  169. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js → timezone-select-NViFNNLz.js} +2 -2
  170. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js.map → timezone-select-NViFNNLz.js.map} +1 -1
  171. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js → toggle-group-EMgSOoYH.js} +2 -2
  172. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js.map → toggle-group-EMgSOoYH.js.map} +1 -1
  173. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js +2 -0
  174. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js.map +1 -0
  175. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js → use-delete-block-document-confirmation-dialog-CxRkBKPg.js} +2 -2
  176. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js.map → use-delete-block-document-confirmation-dialog-CxRkBKPg.js.map} +1 -1
  177. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js +2 -0
  178. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js.map +1 -0
  179. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js → use-get-artifacts-flow-task-runs-D7Djt53s.js} +2 -2
  180. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js.map → use-get-artifacts-flow-task-runs-D7Djt53s.js.map} +1 -1
  181. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js → use-quick-run-Cpy0t7dX.js} +2 -2
  182. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js.map → use-quick-run-Cpy0t7dX.js.map} +1 -1
  183. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js → use-state-favicon-CMsL9s6j.js} +2 -2
  184. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js.map → use-state-favicon-CMsL9s6j.js.map} +1 -1
  185. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js +2 -0
  186. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js.map +1 -0
  187. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js → utilities-D9BfvLg5.js} +2 -2
  188. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js.map → utilities-D9BfvLg5.js.map} +1 -1
  189. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js +2 -0
  190. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js.map +1 -0
  191. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js → work-pool-queue-toggle-f_-cTWxB.js} +2 -2
  192. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js.map → work-pool-queue-toggle-f_-cTWxB.js.map} +1 -1
  193. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js → work-pool._workPoolName-zBqgkYLT.js} +2 -2
  194. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js.map → work-pool._workPoolName-zBqgkYLT.js.map} +1 -1
  195. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js → work-pool_._workPoolName.edit-B-8_CnfA.js} +2 -2
  196. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js.map → work-pool_._workPoolName.edit-B-8_CnfA.js.map} +1 -1
  197. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js → work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js} +2 -2
  198. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js.map +1 -0
  199. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js → work-queue-icon-text-BqqQ413o.js} +2 -2
  200. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js.map → work-queue-icon-text-BqqQ413o.js.map} +1 -1
  201. prefect/server/ui-v2/index.html +2 -2
  202. prefect/task_engine.py +26 -12
  203. prefect/workers/base.py +18 -1
  204. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/METADATA +1 -1
  205. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/RECORD +208 -207
  206. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js +0 -2
  207. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js.map +0 -1
  208. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js +0 -2
  209. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js.map +0 -1
  210. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js +0 -2
  211. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js.map +0 -1
  212. prefect/server/ui-v2/assets/automation._id-CMiura1b.js +0 -2
  213. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js +0 -2
  214. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js.map +0 -1
  215. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js +0 -2
  216. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js.map +0 -1
  217. prefect/server/ui-v2/assets/block-type-logo-DuvU7goV.js +0 -2
  218. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js +0 -2
  219. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js.map +0 -1
  220. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js +0 -2
  221. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js.map +0 -1
  222. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js +0 -2
  223. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js.map +0 -1
  224. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js +0 -2
  225. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js.map +0 -1
  226. prefect/server/ui-v2/assets/create-BrNwbpVu.js +0 -2
  227. prefect/server/ui-v2/assets/create-DWgkh2HT.js.map +0 -1
  228. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js +0 -3
  229. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js.map +0 -1
  230. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js +0 -2
  231. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js.map +0 -1
  232. prefect/server/ui-v2/assets/deployment._id-DXrb6frJ.js.map +0 -1
  233. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js +0 -2
  234. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js.map +0 -1
  235. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js +0 -2
  236. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js.map +0 -1
  237. prefect/server/ui-v2/assets/deployment_._id.run-CnacOmhY.js +0 -2
  238. prefect/server/ui-v2/assets/event._eventDate._eventId-CKTuT_8S.js +0 -2
  239. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js +0 -2
  240. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js.map +0 -1
  241. prefect/server/ui-v2/assets/flow-run._id-BKv9Meqc.js.map +0 -1
  242. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js +0 -4
  243. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js.map +0 -1
  244. prefect/server/ui-v2/assets/flow-run._id-ZTkjj6bM.js.map +0 -1
  245. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js +0 -2
  246. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js.map +0 -1
  247. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js +0 -2
  248. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js.map +0 -1
  249. prefect/server/ui-v2/assets/index-BIBIJufF.js.map +0 -1
  250. prefect/server/ui-v2/assets/index-BO60ehN6.js.map +0 -1
  251. prefect/server/ui-v2/assets/index-BS7fbJ2s.js +0 -2
  252. prefect/server/ui-v2/assets/index-BS7fbJ2s.js.map +0 -1
  253. prefect/server/ui-v2/assets/index-C5RMFRyZ.js.map +0 -1
  254. prefect/server/ui-v2/assets/index-D0R9_LIL.js.map +0 -1
  255. prefect/server/ui-v2/assets/index-D9cOtoSU.js.map +0 -1
  256. prefect/server/ui-v2/assets/index-DEpWUeaO.js +0 -2
  257. prefect/server/ui-v2/assets/index-DEpWUeaO.js.map +0 -1
  258. prefect/server/ui-v2/assets/index-DP8W-xJo.js.map +0 -1
  259. prefect/server/ui-v2/assets/index-DfKXdmko.js.map +0 -1
  260. prefect/server/ui-v2/assets/index-DiVKp6rW.js +0 -2
  261. prefect/server/ui-v2/assets/index-DiVKp6rW.js.map +0 -1
  262. prefect/server/ui-v2/assets/index-DlAHvqFx.js +0 -2
  263. prefect/server/ui-v2/assets/index-VNFzALsC.js +0 -2
  264. prefect/server/ui-v2/assets/index-VNFzALsC.js.map +0 -1
  265. prefect/server/ui-v2/assets/index-V_xTKaEb.js.map +0 -1
  266. prefect/server/ui-v2/assets/index-WIq8QUNT.js +0 -2
  267. prefect/server/ui-v2/assets/index-WIq8QUNT.js.map +0 -1
  268. prefect/server/ui-v2/assets/index-m9O-nIOl.css +0 -1
  269. prefect/server/ui-v2/assets/index-q5Y3hlDT.js.map +0 -1
  270. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js +0 -2
  271. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js.map +0 -1
  272. prefect/server/ui-v2/assets/task-run._id-CQGeAiBh.js.map +0 -1
  273. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js +0 -2
  274. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js.map +0 -1
  275. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js +0 -2
  276. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js.map +0 -1
  277. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js +0 -2
  278. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js.map +0 -1
  279. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js +0 -2
  280. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js.map +0 -1
  281. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js +0 -2
  282. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js.map +0 -1
  283. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js.map +0 -1
  284. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/WHEEL +0 -0
  285. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/entry_points.txt +0 -0
  286. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["STUCK_STATES","TERMINAL_STATES","isStuckState","stateType","isRunningState","isPausedState","isTerminalState","FlowRunGraphLazy","lazy","mod","FlowRunGraph","props","jsx","Suspense","Skeleton","ErrorBoundary","Component","error","fallback","TabErrorState","onRetry","isRetrying","jsxs","AlertCircle","Button","RefreshCw","cn","FlowRunArtifacts","flowRun","view","setView","useState","artifacts","useSuspenseQuery","buildListArtifactsQuery","Card","CardContent","ToggleGroup","value","ToggleGroupItem","LayoutGrid","Rows3","artifact","ArtifactCard","FlowRunDetails","KeyValue","FormattedDate","TagBadgeGroup","Fragment","CancelFlowRunDialog","open","onOpenChange","cancelSubFlows","setCancelSubFlows","setFlowRunState","isPending","useSetFlowRunState","subFlowRuns","useQuery","buildFilterFlowRunsQuery","hasSubFlows","cancelSubFlowRuns","errors","subFlow","handleCancel","toast","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","StateBadge","Checkbox","checked","Label","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","e","PauseFlowRunDialog","timeout","setTimeout","handlePause","pauseTimeout","isValidTimeout","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","secondsToApproximateString","DialogFooter","ResumeFlowRunDialog","runInputKeyset","ResumeDialogSkeleton","ResumeDialogWithInput","ResumeDialogSimple","resumeFlowRun","useResumeFlowRun","handleResume","keyset","values","setValues","validateForm","useSchemaForm","schema","buildGetFlowRunInputQuery","data","description","useEffect","LazyMarkdown","LazySchemaForm","RetryFlowRunDialog","handleRetry","FlowRunHeader","onDeleteClick","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","isCancelOpen","setIsCancelOpen","isPauseOpen","setIsPauseOpen","isResumeOpen","setIsResumeOpen","isRetryOpen","setIsRetryOpen","isChangingState","canChangeState","canCancel","canPause","canResume","canRetry","handleChangeState","newState","deployment","buildDeploymentDetailsQuery","taskRunCount","buildCountTaskRunsQuery","parentFlowRuns","parentFlowRun","formatTaskRunCount","count","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","Badge","Icon","formatDate","FlowIconText","Link","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DeleteConfirmationDialog","ChangeStateDialog","FlowRunLogsDownloadButton","isDownloading","setIsDownloading","handleDownload","response","getQueryService","url","link","filename","Tooltip","TooltipTrigger","TooltipContent","FlowRunLogs","virtualize","levelFilter","setLevelFilter","sortOrder","setSortOrder","queryOptions","useMemo","buildInfiniteFilterLogsQuery","logs","hasNextPage","fetchNextPage","isFetchingNextPage","useSuspenseInfiniteQuery","noLogs","message","LogLevelFilter","LogSortOrder","RunLogs","LEVEL_FILTER_OPTIONS","Select","SelectTrigger","option","SelectContent","SelectItem","SelectValue","FlowRunSubflows","parentFlowRunId","queryClient","useQueryClient","search","setSearch","stateFilter","setStateFilter","sort","setSort","pagination","setPagination","debouncedSearch","useDebounce","countFilter","countData","buildCountFlowRunsQuery","paginateFilter","paginatedData","buildPaginateFlowRunsQuery","flowIds","flows","buildListFlowsQuery","flowRunsWithFlows","flowMap","flow","handleSearchChange","prev","handleStateFilterChange","newFilters","handleSortChange","newSort","handleClearFilters","handlePrefetchPage","page","hasFilters","SearchInput","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","MAX_FILTERS_DISPLAYED","TaskRunStateFilter","selectedFilters","onSelectFilter","className","setOpen","isAllButScheduled","flowRunStatesNoScheduleSet","FLOW_RUN_STATES_NO_SCHEDULED","filter","handleSelectAllExceptScheduled","handleSelectAllRunState","handleSelectFilter","updatedFilters","renderSelectedTags","selected","visible","extraCount","FLOW_RUN_STATES_MAP","filterKey","FlowRunTaskRuns","flowRunId","tagsFilter","setTagsFilter","buildPaginateTaskRunsQuery","handleTagsFilterChange","tags","newTags","stateSummary","stateCounts","taskRun","stateName","name","TagsInput","TaskRunsSortFilter","TaskRunsList","TaskRunsPagination","FlowRunDetailsPage","id","tab","onTabChange","refetchInterval","setRefetchInterval","fullscreen","setFullscreen","buildGetFlowRunDetailsQuery","deleteFlowRun","useDeleteFlowRun","navigate","useRouter","useStateFavicon","onDeleteRunClicked","retryLogs","useCallback","logsQueryKeyFactory","retryTaskRuns","taskRunsQueryKeyFactory","retrySubflows","flowRunsQueryKeyFactory","retryArtifacts","artifactsQueryKeyFactory","TabsLayout","LogsSkeleton","TaskRunsSkeleton","SubflowsSkeleton","ArtifactsSkeleton","DetailsSkeleton","LazyJsonInput","currentTab","logsContent","taskRunsContent","subflowRunsContent","artifactsContent","detailsContent","parametersContent","jobVariablesContent","Tabs","TabsList","TabsTrigger","TabsContent","z","default","catch","RouteComponent","Route","useParams","useSearch","useNavigate","to"],"ignoreList":[],"sources":["../../src/api/flow-runs/state-utilities.ts","../../src/components/flow-runs/flow-run-graph/index.tsx","../../src/components/ui/error-boundary.tsx","../../src/components/ui/tab-error-state.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-artifacts.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-details.tsx","../../src/components/flow-runs/flow-run-actions/cancel-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/pause-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/resume-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/retry-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-header.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-logs-download-button.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-logs.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-subflows.tsx","../../src/components/task-runs/task-run-state-filter.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-task-runs.tsx","../../src/components/flow-runs/flow-run-details-page/index.tsx","../../src/routes/runs/flow-run.$id.tsx?tsr-split=component"],"sourcesContent":["import type { components } from \"@/api/prefect\";\n\ntype StateType = components[\"schemas\"][\"StateType\"];\n\n/**\n * States that can be cancelled - flow runs that are \"stuck\" or in-progress\n */\nexport const STUCK_STATES: StateType[] = [\n\t\"RUNNING\",\n\t\"SCHEDULED\",\n\t\"PENDING\",\n\t\"PAUSED\",\n];\n\n/**\n * States that are terminal - flow runs that have completed execution\n */\nexport const TERMINAL_STATES: StateType[] = [\n\t\"COMPLETED\",\n\t\"FAILED\",\n\t\"CANCELLED\",\n\t\"CRASHED\",\n];\n\n/**\n * Check if a flow run can be cancelled (is in a stuck/cancellable state)\n */\nexport function isStuckState(stateType: StateType | null | undefined): boolean {\n\treturn stateType != null && STUCK_STATES.includes(stateType);\n}\n\n/**\n * Check if a flow run can be paused (is currently running)\n */\nexport function isRunningState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"RUNNING\";\n}\n\n/**\n * Check if a flow run can be resumed (is currently paused)\n */\nexport function isPausedState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"PAUSED\";\n}\n\n/**\n * Check if a flow run is in a terminal state\n */\nexport function isTerminalState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType != null && TERMINAL_STATES.includes(stateType);\n}\n","import type { GraphItemSelection, ViewportDateRange } from \"@prefecthq/graphs\";\nimport type { CSSProperties } from \"react\";\nimport { lazy, Suspense } from \"react\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\nconst FlowRunGraphLazy = lazy(() =>\n\timport(\"./flow-run-graph\").then((mod) => ({ default: mod.FlowRunGraph })),\n);\n\ntype FlowRunGraphProps = {\n\tflowRunId: string;\n\tstateType?: string;\n\tviewport?: ViewportDateRange;\n\tonViewportChange?: (viewport: ViewportDateRange) => void;\n\tselected?: GraphItemSelection;\n\tonSelectedChange?: (selected: GraphItemSelection | undefined) => void;\n\tfullscreen?: boolean;\n\tonFullscreenChange?: (fullscreen: boolean) => void;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n};\n\nexport function FlowRunGraph(props: FlowRunGraphProps) {\n\treturn (\n\t\t<Suspense fallback={<Skeleton className=\"h-[500px] w-full\" />}>\n\t\t\t<FlowRunGraphLazy {...props} />\n\t\t</Suspense>\n\t);\n}\n\nexport type { GraphItemSelection, ViewportDateRange } from \"@prefecthq/graphs\";\n","import { Component, type ReactNode } from \"react\";\n\ntype ErrorBoundaryProps = {\n\tchildren: ReactNode;\n\tfallback: ReactNode | ((error: Error) => ReactNode);\n};\n\ntype ErrorBoundaryState = {\n\thasError: boolean;\n\terror: Error | null;\n};\n\nexport class ErrorBoundary extends Component<\n\tErrorBoundaryProps,\n\tErrorBoundaryState\n> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): ErrorBoundaryState {\n\t\treturn { hasError: true, error };\n\t}\n\n\trender() {\n\t\tif (this.state.hasError) {\n\t\t\tconst { fallback } = this.props;\n\t\t\tif (typeof fallback === \"function\") {\n\t\t\t\treturn fallback(this.state.error ?? new Error(\"Unknown error\"));\n\t\t\t}\n\t\t\treturn fallback;\n\t\t}\n\t\treturn this.props.children;\n\t}\n}\n","import { AlertCircle, RefreshCw } from \"lucide-react\";\nimport type { ServerError } from \"@/api/error-utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/utils\";\n\ntype TabErrorStateProps = {\n\terror: ServerError;\n\tonRetry?: () => void;\n\tisRetrying?: boolean;\n};\n\nexport function TabErrorState({\n\terror,\n\tonRetry,\n\tisRetrying,\n}: TabErrorStateProps) {\n\treturn (\n\t\t<div className=\"flex flex-col items-center justify-center py-8 text-center\">\n\t\t\t<div className=\"rounded-full bg-destructive/10 p-2 mb-3\">\n\t\t\t\t<AlertCircle className=\"size-6 text-destructive\" />\n\t\t\t</div>\n\t\t\t<div className=\"space-y-1 mb-4\">\n\t\t\t\t<p className=\"font-medium\">{error.message}</p>\n\t\t\t\t{error.details && (\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground max-w-sm\">\n\t\t\t\t\t\t{error.details}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{onRetry && (\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\tdisabled={isRetrying}\n\t\t\t\t\tclassName=\"gap-2\"\n\t\t\t\t>\n\t\t\t\t\t<RefreshCw className={cn(\"size-3\", isRetrying && \"animate-spin\")} />\n\t\t\t\t\t{isRetrying ? \"Retrying...\" : \"Retry\"}\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { LayoutGrid, Rows3 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport { ArtifactCard } from \"@/components/artifacts/artifact-card\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/utils\";\n\ntype FlowRunArtifactsProps = {\n\tflowRun: FlowRun;\n};\n\nexport const FlowRunArtifacts = ({ flowRun }: FlowRunArtifactsProps) => {\n\tconst [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: {\n\t\t\t\t\tany_: [flowRun.id],\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"ID_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\tif (artifacts.length === 0) {\n\t\treturn (\n\t\t\t<Card>\n\t\t\t\t<CardContent className=\"text-center\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis flow run did not produce any artifacts; for more information on\n\t\t\t\t\t\tcreating artifacts, see the{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://docs.prefect.io/v3/develop/artifacts\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-blue-500\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tvalue={view}\n\t\t\t\t\tonValueChange={(value) => setView(value as \"grid\" | \"list\")}\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"grid\" aria-label=\"Grid view\">\n\t\t\t\t\t\t<LayoutGrid className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"list\" aria-label=\"List view\">\n\t\t\t\t\t\t<Rows3 className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid\",\n\t\t\t\t\tview === \"grid\"\n\t\t\t\t\t\t? \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\"\n\t\t\t\t\t\t: \"grid-cols-1\",\n\t\t\t\t\t\"gap-4\",\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"flow-run-artifacts-grid\"\n\t\t\t>\n\t\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t\t<ArtifactCard\n\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tcompact={view === \"list\"}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { FlowRun } from \"@/api/flow-runs\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\n\ntype FlowRunDetailsProps = {\n\tflowRun: FlowRun | null | undefined;\n};\n\nexport function FlowRunDetails({ flowRun }: FlowRunDetailsProps) {\n\tif (!flowRun) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 bg-gray-100 p-4 rounded-md\">\n\t\t\t\t<span className=\"text-gray-500\">No flow run details available</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<KeyValue label=\"Run Count\" value={flowRun.run_count} />\n\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Created\"\n\t\t\t\tvalue={<FormattedDate date={flowRun.created} />}\n\t\t\t/>\n\n\t\t\t{flowRun.created_by?.display_value && (\n\t\t\t\t<KeyValue label=\"Created By\" value={flowRun.created_by.display_value} />\n\t\t\t)}\n\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\tvalue={<FormattedDate date={flowRun.updated} />}\n\t\t\t/>\n\n\t\t\t{flowRun.idempotency_key && (\n\t\t\t\t<KeyValue label=\"Idempotency Key\" value={flowRun.idempotency_key} />\n\t\t\t)}\n\n\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t<KeyValue label=\"Tags\" value={<TagBadgeGroup tags={flowRun.tags} />} />\n\t\t\t)}\n\n\t\t\t<KeyValue label=\"Flow Run ID\" value={flowRun.id} copyable />\n\n\t\t\t{flowRun.state?.message && (\n\t\t\t\t<KeyValue label=\"State Message\" value={flowRun.state.message} />\n\t\t\t)}\n\n\t\t\t{flowRun.flow_version && (\n\t\t\t\t<KeyValue label=\"Flow Version\" value={flowRun.flow_version} />\n\t\t\t)}\n\n\t\t\t{flowRun.empirical_policy?.retries != null && (\n\t\t\t\t<>\n\t\t\t\t\t<KeyValue label=\"Retries\" value={flowRun.empirical_policy.retries} />\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"Retry Delay\"\n\t\t\t\t\t\tvalue={flowRun.empirical_policy.retry_delay}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype CancelFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const CancelFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: CancelFlowRunDialogProps) => {\n\tconst [cancelSubFlows, setCancelSubFlows] = useState(false);\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst { data: subFlowRuns = [] } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: { operator: \"and_\", any_: [flowRun.id] },\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttype: { any_: [\"RUNNING\", \"SCHEDULED\", \"PENDING\", \"PAUSED\"] },\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t\tenabled: open,\n\t});\n\n\tconst hasSubFlows = subFlowRuns.length > 0;\n\n\tconst cancelSubFlowRuns = (errors: string[]) => {\n\t\tfor (const subFlow of subFlowRuns) {\n\t\t\tsetFlowRunState(\n\t\t\t\t{\n\t\t\t\t\tid: subFlow.id,\n\t\t\t\t\tstate: { type: \"CANCELLING\", name: \"Cancelling\" },\n\t\t\t\t\tforce: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\terrors.push(subFlow.name ?? subFlow.id);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleCancel = () => {\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: \"CANCELLING\",\n\t\t\t\t\tname: \"Cancelling\",\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tif (cancelSubFlows && subFlowRuns.length > 0) {\n\t\t\t\t\t\tconst errors: string[] = [];\n\t\t\t\t\t\tcancelSubFlowRuns(errors);\n\t\t\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\t\t`Failed to cancel some sub-flows: ${errors.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttoast.success(\n\t\t\t\t\t\t\t\t`Flow run and ${subFlowRuns.length} sub-flow${subFlowRuns.length === 1 ? \"\" : \"s\"} cancelled`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttoast.success(\"Flow run cancelled\");\n\t\t\t\t\t}\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to cancel flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Cancel Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tAre you sure you want to cancel{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"CANCELLING\" name=\"Cancelling\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t{hasSubFlows && (\n\t\t\t\t\t<div className=\"flex items-center space-x-2 py-2\">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tid=\"cancel-subflows\"\n\t\t\t\t\t\t\tchecked={cancelSubFlows}\n\t\t\t\t\t\t\tonCheckedChange={(checked) => setCancelSubFlows(checked === true)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Label htmlFor=\"cancel-subflows\" className=\"text-sm cursor-pointer\">\n\t\t\t\t\t\t\tAlso cancel {subFlowRuns.length} sub-flow run\n\t\t\t\t\t\t\t{subFlowRuns.length === 1 ? \"\" : \"s\"}\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid handleCancel();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Cancelling...\" : \"Cancel Flow Run\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { secondsToApproximateString } from \"@/utils\";\n\ntype PauseFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const PauseFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: PauseFlowRunDialogProps) => {\n\tconst [timeout, setTimeout] = useState(300); // 5 minutes default\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handlePause = () => {\n\t\tconst pauseTimeout = new Date(Date.now() + timeout * 1000).toISOString();\n\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: \"PAUSED\",\n\t\t\t\t\tname: \"Suspended\",\n\t\t\t\t\tstate_details: {\n\t\t\t\t\t\tpause_timeout: pauseTimeout,\n\t\t\t\t\t\tpause_reschedule: true,\n\t\t\t\t\t\tdeferred: false,\n\t\t\t\t\t\tuntrackable_result: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run paused\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to pause flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst isValidTimeout = timeout >= 5;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Pause Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tPause <span className=\"font-medium\">{flowRun.name}</span> for a\n\t\t\t\t\t\t\t\tspecified duration. The flow will automatically resume after the\n\t\t\t\t\t\t\t\ttimeout.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"PAUSED\" name=\"Suspended\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<div className=\"space-y-2 py-4\">\n\t\t\t\t\t<Label htmlFor=\"timeout\">Timeout (seconds)</Label>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tid=\"timeout\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin={5}\n\t\t\t\t\t\tvalue={timeout}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tsetTimeout(Number.parseInt(e.target.value, 10) || 5)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\tWill pause for {secondsToApproximateString(timeout)}. Minimum 5\n\t\t\t\t\t\tseconds.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handlePause}\n\t\t\t\t\t\tdisabled={isPending || !isValidTimeout}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tPause Flow Run\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Suspense, useEffect } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetFlowRunInputQuery,\n\ttype FlowRun,\n\tuseResumeFlowRun,\n} from \"@/api/flow-runs\";\nimport {\n\tLazySchemaForm,\n\ttype PrefectSchemaObject,\n\tuseSchemaForm,\n} from \"@/components/schemas\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype ResumeFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const ResumeFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\t// Check if this flow run requires input on resume\n\tconst runInputKeyset = flowRun.state?.state_details?.run_input_keyset as\n\t\t| Record<string, string>\n\t\t| undefined;\n\tconst requiresInput = runInputKeyset && runInputKeyset.schema;\n\n\tif (requiresInput) {\n\t\treturn (\n\t\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t\t<DialogContent className=\"max-w-2xl max-h-[80vh] overflow-y-auto\">\n\t\t\t\t\t<Suspense fallback={<ResumeDialogSkeleton />}>\n\t\t\t\t\t\t<ResumeDialogWithInput\n\t\t\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\t\t\tkeyset={runInputKeyset}\n\t\t\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ResumeDialogSimple\n\t\t\tflowRun={flowRun}\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t/>\n\t);\n};\n\n/**\n * Simple resume dialog for flows that don't require input\n */\nconst ResumeDialogSimple = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\n\tconst handleResume = () => {\n\t\tresumeFlowRun(\n\t\t\t{ id: flowRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tResume the paused flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handleResume}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tResume\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n\n/**\n * Resume dialog with schema-based input form\n */\ntype ResumeDialogWithInputProps = {\n\tflowRun: FlowRun;\n\tkeyset: Record<string, string>;\n\tonOpenChange: (open: boolean) => void;\n};\n\nconst ResumeDialogWithInput = ({\n\tflowRun,\n\tkeyset,\n\tonOpenChange,\n}: ResumeDialogWithInputProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\tconst { values, setValues, errors, validateForm } = useSchemaForm();\n\n\t// Fetch schema and description\n\tconst { data: schema } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.schema),\n\t\tselect: (data) => data as PrefectSchemaObject | undefined,\n\t});\n\n\tconst { data: description } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.description ?? \"\"),\n\t\tenabled: Boolean(keyset.description),\n\t\tselect: (data) => data as string | undefined,\n\t});\n\n\t// Reset form when dialog opens\n\tuseEffect(() => {\n\t\tsetValues({});\n\t}, [setValues]);\n\n\tconst handleResume = async () => {\n\t\tif (!schema) return;\n\n\t\ttry {\n\t\t\t// Validate the form before submitting\n\t\t\tawait validateForm({ schema: values });\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresumeFlowRun(\n\t\t\t\t{ id: flowRun.id, runInput: values },\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t} catch {\n\t\t\ttoast.error(\"Failed to validate input\");\n\t\t}\n\t};\n\n\tif (!schema) {\n\t\treturn <ResumeDialogSkeleton />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<DialogHeader>\n\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tProvide input to resume{\" \"}\n\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</DialogDescription>\n\t\t\t</DialogHeader>\n\n\t\t\t{description && (\n\t\t\t\t<div className=\"prose prose-sm dark:prose-invert max-w-none py-2 px-3 bg-muted/50 rounded-md\">\n\t\t\t\t\t<LazyMarkdown>{description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"py-4\">\n\t\t\t\t<LazySchemaForm\n\t\t\t\t\tschema={schema}\n\t\t\t\t\tvalues={values}\n\t\t\t\t\tonValuesChange={setValues}\n\t\t\t\t\terrors={errors}\n\t\t\t\t\tkinds={[\"json\"]}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<DialogFooter>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => void handleResume()}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\tloading={isPending}\n\t\t\t\t>\n\t\t\t\t\tResume\n\t\t\t\t</Button>\n\t\t\t</DialogFooter>\n\t\t</>\n\t);\n};\n\nconst ResumeDialogSkeleton = () => (\n\t<div className=\"flex flex-col gap-4\">\n\t\t<Skeleton className=\"h-6 w-48\" />\n\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t<div className=\"flex justify-end gap-2\">\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t</div>\n\t</div>\n);\n","import { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype RetryFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const RetryFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: RetryFlowRunDialogProps) => {\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handleRetry = () => {\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: \"SCHEDULED\",\n\t\t\t\t\tname: \"AwaitingRetry\",\n\t\t\t\t\tmessage: \"Retry from the UI\",\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run scheduled for retry\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to retry flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Retry Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tRetry the flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"SCHEDULED\" name=\"AwaitingRetry\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tTask runs with persisted results will use cached values. Task\n\t\t\t\t\t\t\t\truns without persisted results will be re-executed.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleRetry();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Retrying...\" : \"Retry\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tisPausedState,\n\tisRunningState,\n\tisStuckState,\n\tisTerminalState,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\nimport {\n\tCancelFlowRunDialog,\n\tPauseFlowRunDialog,\n\tResumeFlowRunDialog,\n\tRetryFlowRunDialog,\n} from \"@/components/flow-runs/flow-run-actions\";\nimport { FlowIconText } from \"@/components/flows/flow-icon-text\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tChangeStateDialog,\n\tuseChangeStateDialog,\n} from \"@/components/ui/change-state-dialog\";\nimport {\n\tDeleteConfirmationDialog,\n\tuseDeleteConfirmationDialog,\n} from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { formatDate, secondsToApproximateString } from \"@/utils\";\n\ntype FlowRunHeaderProps = {\n\tflowRun: FlowRun;\n\tonDeleteClick: () => void;\n};\n\nexport function FlowRunHeader({ flowRun, onDeleteClick }: FlowRunHeaderProps) {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\tconst {\n\t\topen: isChangeStateOpen,\n\t\tonOpenChange: setChangeStateOpen,\n\t\topenDialog: openChangeState,\n\t} = useChangeStateDialog();\n\tconst [isCancelOpen, setIsCancelOpen] = useState(false);\n\tconst [isPauseOpen, setIsPauseOpen] = useState(false);\n\tconst [isResumeOpen, setIsResumeOpen] = useState(false);\n\tconst [isRetryOpen, setIsRetryOpen] = useState(false);\n\tconst { setFlowRunState, isPending: isChangingState } = useSetFlowRunState();\n\n\tconst canChangeState =\n\t\tflowRun.state_type &&\n\t\t[\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"].includes(\n\t\t\tflowRun.state_type,\n\t\t);\n\n\tconst canCancel = isStuckState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canPause = isRunningState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canResume = isPausedState(flowRun.state_type);\n\tconst canRetry = isTerminalState(flowRun.state_type) && flowRun.deployment_id;\n\n\tconst handleChangeState = (newState: { type: string; message?: string }) => {\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: newState.type as\n\t\t\t\t\t\t| \"COMPLETED\"\n\t\t\t\t\t\t| \"FAILED\"\n\t\t\t\t\t\t| \"CANCELLED\"\n\t\t\t\t\t\t| \"CRASHED\",\n\t\t\t\t\tname: newState.type.charAt(0) + newState.type.slice(1).toLowerCase(),\n\t\t\t\t\tmessage: newState.message,\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run state changed\");\n\t\t\t\t\tsetChangeStateOpen(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to change state\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst { data: deployment } = useQuery({\n\t\t...buildDeploymentDetailsQuery(flowRun.deployment_id ?? \"\"),\n\t\tenabled: !!flowRun.deployment_id,\n\t});\n\n\tconst { data: taskRunCount } = useQuery({\n\t\t...buildCountTaskRunsQuery({\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRun.id], is_null_: false },\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst { data: parentFlowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: [flowRun.parent_task_run_id ?? \"\"] },\n\t\t\t},\n\t\t}),\n\t\tenabled: !!flowRun.parent_task_run_id,\n\t});\n\tconst parentFlowRun = parentFlowRuns?.[0];\n\n\tconst formatTaskRunCount = (count: number | undefined) => {\n\t\tif (count === undefined) return \"...\";\n\t\tif (count === 0) return \"None\";\n\t\treturn `${count} Task run${count === 1 ? \"\" : \"s\"}`;\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t{/* Row 1 - Breadcrumb */}\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbLink to=\"/runs\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\t\tRuns\n\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t\t\t<BreadcrumbPage className=\"font-semibold\">\n\t\t\t\t\t\t\t\t{flowRun.name}\n\t\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t\t{flowRun.work_pool_name && (\n\t\t\t\t\t\t\t\t<Badge variant=\"outline\" className=\"ml-2\">\n\t\t\t\t\t\t\t\t\t{flowRun.work_pool_name}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t\t\t\t\t<div className=\"ml-2\">\n\t\t\t\t\t\t\t\t\t<TagBadgeGroup tags={flowRun.tags} maxTagsDisplayed={3} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\n\t\t\t\t{/* Row 2 - Meta */}\n\t\t\t\t<div className=\"flex items-center gap-4 text-sm text-muted-foreground\">\n\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t<StateBadge type={flowRun.state_type} name={flowRun.state_name} />\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.start_time && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span>{formatDate(flowRun.start_time, \"dateTimeNumeric\")}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"size-4\" />\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{secondsToApproximateString(flowRun.total_run_time ?? 0)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`flex items-center gap-1 ${taskRunCount === 0 ? \"text-muted-foreground/60\" : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"ListTodo\" className=\"size-4\" />\n\t\t\t\t\t\t<span>{formatTaskRunCount(taskRunCount)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Row 3 - Relationships */}\n\t\t\t\t<div className=\"flex items-center gap-4 text-sm flex-wrap\">\n\t\t\t\t\t{flowRun.flow_id && <FlowIconText flowId={flowRun.flow_id} />}\n\t\t\t\t\t{flowRun.deployment_id && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/deployments/deployment/$id\"\n\t\t\t\t\t\t\tparams={{ id: flowRun.deployment_id }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Rocket\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Deployment</span>\n\t\t\t\t\t\t\t<span>{deployment?.name ?? \"...\"}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.work_pool_name && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName\"\n\t\t\t\t\t\t\tparams={{ workPoolName: flowRun.work_pool_name }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Server\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Work Pool</span>\n\t\t\t\t\t\t\t<span>{flowRun.work_pool_name}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.work_pool_name && flowRun.work_queue_name && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName\"\n\t\t\t\t\t\t\tparams={{ workPoolName: flowRun.work_pool_name }}\n\t\t\t\t\t\t\tsearch={{ tab: \"Work Queues\" }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"ListOrdered\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Work Queue</span>\n\t\t\t\t\t\t\t<span>{flowRun.work_queue_name}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{parentFlowRun && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: parentFlowRun.id }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Workflow\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Parent Run</span>\n\t\t\t\t\t\t\t<span>{parentFlowRun.name ?? \"...\"}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"p-2\">\n\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent>\n\t\t\t\t\t{canCancel && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsCancelOpen(true)}>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canPause && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsPauseOpen(true)}>\n\t\t\t\t\t\t\tPause\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canResume && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsResumeOpen(true)}>\n\t\t\t\t\t\t\tResume\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canRetry && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsRetryOpen(true)}>\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canChangeState && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={openChangeState}>\n\t\t\t\t\t\t\tChange state\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{(canCancel ||\n\t\t\t\t\t\tcanPause ||\n\t\t\t\t\t\tcanResume ||\n\t\t\t\t\t\tcanRetry ||\n\t\t\t\t\t\tcanChangeState) && <DropdownMenuSeparator />}\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(flowRun.id);\n\t\t\t\t\t\t\ttoast.success(\"Copied flow run ID to clipboard\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tconfirmDelete({\n\t\t\t\t\t\t\t\ttitle: \"Delete Flow Run\",\n\t\t\t\t\t\t\t\tdescription: `Are you sure you want to delete flow run ${flowRun.name}?`,\n\t\t\t\t\t\t\t\tonConfirm: onDeleteClick,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t\t<ChangeStateDialog\n\t\t\t\topen={isChangeStateOpen}\n\t\t\t\tonOpenChange={setChangeStateOpen}\n\t\t\t\tcurrentState={\n\t\t\t\t\tflowRun.state\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: flowRun.state.type,\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\tflowRun.state.name ??\n\t\t\t\t\t\t\t\t\tflowRun.state.type.charAt(0) +\n\t\t\t\t\t\t\t\t\t\tflowRun.state.type.slice(1).toLowerCase(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel=\"Flow Run\"\n\t\t\t\tonConfirm={handleChangeState}\n\t\t\t\tisLoading={isChangingState}\n\t\t\t/>\n\t\t\t<CancelFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isCancelOpen}\n\t\t\t\tonOpenChange={setIsCancelOpen}\n\t\t\t/>\n\t\t\t<PauseFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isPauseOpen}\n\t\t\t\tonOpenChange={setIsPauseOpen}\n\t\t\t/>\n\t\t\t<ResumeFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isResumeOpen}\n\t\t\t\tonOpenChange={setIsResumeOpen}\n\t\t\t/>\n\t\t\t<RetryFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isRetryOpen}\n\t\t\t\tonOpenChange={setIsRetryOpen}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { components } from \"@/api/prefect\";\nimport { getQueryService } from \"@/api/service\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ntype FlowRunLogsDownloadButtonProps = {\n\tflowRun: components[\"schemas\"][\"FlowRunResponse\"];\n};\n\nexport function FlowRunLogsDownloadButton({\n\tflowRun,\n}: FlowRunLogsDownloadButtonProps) {\n\tconst [isDownloading, setIsDownloading] = useState(false);\n\n\tconst handleDownload = async () => {\n\t\tsetIsDownloading(true);\n\t\ttry {\n\t\t\tconst service = await getQueryService();\n\t\t\tconst response = await service.GET(\"/flow_runs/{id}/logs/download\", {\n\t\t\t\tparams: { path: { id: flowRun.id } },\n\t\t\t\tparseAs: \"blob\",\n\t\t\t});\n\n\t\t\tif (!response.data) {\n\t\t\t\tthrow new Error(\"No data received from server\");\n\t\t\t}\n\n\t\t\tconst url = URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tconst filename = flowRun.name ?? \"logs\";\n\n\t\t\tlink.href = url;\n\t\t\tlink.setAttribute(\"download\", `${filename}.csv`);\n\t\t\tlink.click();\n\n\t\t\tURL.revokeObjectURL(url);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\ttoast.error(\"Failed to download logs\");\n\t\t} finally {\n\t\t\tsetIsDownloading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={() => void handleDownload()}\n\t\t\t\t\tdisabled={isDownloading}\n\t\t\t\t\taria-label=\"Download logs\"\n\t\t\t\t>\n\t\t\t\t\t{isDownloading ? (\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Icon id=\"Download\" className=\"size-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>Download all logs as CSV</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n","import { useSuspenseInfiniteQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport type { components } from \"@/api/prefect\";\nimport { RunLogs } from \"@/components/ui/run-logs\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { FlowRunLogsDownloadButton } from \"./flow-run-logs-download-button\";\n\ntype FlowRunLogsProps = {\n\tflowRun: components[\"schemas\"][\"FlowRunResponse\"];\n\tvirtualize?: boolean;\n};\n\nexport const FlowRunLogs = ({\n\tflowRun,\n\tvirtualize = true,\n}: FlowRunLogsProps) => {\n\tconst [levelFilter, setLevelFilter] = useState<number>(0);\n\tconst [sortOrder, setSortOrder] = useState<\n\t\t\"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\"\n\t>(\"TIMESTAMP_ASC\");\n\n\tconst queryOptions = useMemo(\n\t\t() => ({\n\t\t\t...buildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: sortOrder,\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: { ge_: levelFilter },\n\t\t\t\t\tflow_run_id: { any_: [flowRun.id] },\n\t\t\t\t},\n\t\t\t}),\n\t\t\trefetchInterval:\n\t\t\t\tflowRun.state_type === \"RUNNING\" ? 5000 : (false as const),\n\t\t}),\n\t\t[levelFilter, sortOrder, flowRun.id, flowRun.state_type],\n\t);\n\n\tconst {\n\t\tdata: logs,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSuspenseInfiniteQuery(queryOptions);\n\n\tconst noLogs = logs.pages.length === 1 && logs.pages[0].length === 0;\n\tlet message = \"This run did not produce any logs.\";\n\tif (noLogs) {\n\t\tif (levelFilter > 0) {\n\t\t\tmessage = \"No logs match your filter criteria\";\n\t\t} else if (\n\t\t\tflowRun.state_type === \"SCHEDULED\" &&\n\t\t\tflowRun.state_name === \"Scheduled\"\n\t\t) {\n\t\t\tmessage = \"Run has not yet started. Check back soon for logs.\";\n\t\t} else if (flowRun.state_type === \"RUNNING\") {\n\t\t\tmessage = \"Waiting for logs...\";\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<LogLevelFilter\n\t\t\t\t\tlevelFilter={levelFilter}\n\t\t\t\t\tsetLevelFilter={setLevelFilter}\n\t\t\t\t/>\n\t\t\t\t<LogSortOrder sortOrder={sortOrder} setSortOrder={setSortOrder} />\n\t\t\t\t<FlowRunLogsDownloadButton flowRun={flowRun} />\n\t\t\t</div>\n\t\t\t{noLogs ? (\n\t\t\t\t<div className=\"flex flex-col gap-2 text-center bg-muted p-2 rounded-md\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">{message}</span>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"rounded-md\">\n\t\t\t\t\t<RunLogs\n\t\t\t\t\t\tlogs={logs.pages.flat()}\n\t\t\t\t\t\tonBottomReached={() => {\n\t\t\t\t\t\t\tif (hasNextPage && !isFetchingNextPage) {\n\t\t\t\t\t\t\t\tfetchNextPage().catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"max-h-[85vh]\"\n\t\t\t\t\t\tvirtualize={virtualize}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst LEVEL_FILTER_OPTIONS = [\n\t{ label: \"All\", value: 0 },\n\t{ label: \"Critical only\", value: 50 },\n\t{ label: \"Error and above\", value: 40 },\n\t{ label: \"Warning and above\", value: 30 },\n\t{ label: \"Info and above\", value: 20 },\n\t{ label: \"Debug and above\", value: 10 },\n] as const;\n\nconst LogLevelFilter = ({\n\tlevelFilter,\n\tsetLevelFilter,\n}: {\n\tlevelFilter: number;\n\tsetLevelFilter: (level: number) => void;\n}) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={levelFilter.toString()}\n\t\t\tonValueChange={(value) => setLevelFilter(Number(value))}\n\t\t>\n\t\t\t<SelectTrigger aria-label=\"log level filter\">\n\t\t\t\t<span>\n\t\t\t\t\t{`Level:\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tLEVEL_FILTER_OPTIONS.find(\n\t\t\t\t\t\t\t\t\t(option) => option.value === levelFilter,\n\t\t\t\t\t\t\t\t)?.label\n\t\t\t\t\t\t\t}`}\n\t\t\t\t</span>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{LEVEL_FILTER_OPTIONS.map((option) => (\n\t\t\t\t\t<SelectItem key={option.value} value={option.value.toString()}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nconst LogSortOrder = ({\n\tsortOrder,\n\tsetSortOrder,\n}: {\n\tsortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\";\n\tsetSortOrder: (sortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\") => void;\n}) => (\n\t<Select\n\t\tvalue={sortOrder}\n\t\tonValueChange={(value) =>\n\t\t\tsetSortOrder(value as \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\")\n\t\t}\n\t>\n\t\t<SelectTrigger aria-label=\"log sort order\">\n\t\t\t<SelectValue placeholder=\"Sort log order\" />\n\t\t</SelectTrigger>\n\t\t<SelectContent>\n\t\t\t<SelectItem value=\"TIMESTAMP_ASC\">Oldest to newest</SelectItem>\n\t\t\t<SelectItem value=\"TIMESTAMP_DESC\">Newest to oldest</SelectItem>\n\t\t</SelectContent>\n\t</Select>\n);\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsCountFilter,\n\ttype FlowRunsPaginateFilter,\n\ttype FlowRunWithFlow,\n} from \"@/api/flow-runs\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport { FlowRunsList } from \"@/components/flow-runs/flow-runs-list\";\nimport { SortFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter\";\nimport type { SortFilters } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter.constants\";\nimport { StateFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filter\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport {\n\tFlowRunsPagination,\n\ttype PaginationState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype FlowRunSubflowsProps = {\n\tparentFlowRunId: string;\n};\n\nexport const FlowRunSubflows = ({ parentFlowRunId }: FlowRunSubflowsProps) => {\n\tconst queryClient = useQueryClient();\n\tconst [search, setSearch] = useState(\"\");\n\tconst [stateFilter, setStateFilter] = useState<Set<FlowRunState>>(new Set());\n\tconst [sort, setSort] = useState<SortFilters>(\"START_TIME_DESC\");\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpage: 1,\n\t\tlimit: 10,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 300);\n\n\tconst countFilter: FlowRunsCountFilter = useMemo(() => {\n\t\treturn {\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tany_: [parentFlowRunId],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}, [parentFlowRunId]);\n\n\tconst { data: countData } = useSuspenseQuery(\n\t\tbuildCountFlowRunsQuery(countFilter, 30_000),\n\t);\n\n\tconst paginateFilter: FlowRunsPaginateFilter = useMemo(() => {\n\t\tconst baseFilter: FlowRunsPaginateFilter = {\n\t\t\tpage: pagination.page,\n\t\t\tlimit: pagination.limit,\n\t\t\tsort,\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tany_: [parentFlowRunId],\n\t\t\t\t},\n\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\tstate:\n\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t};\n\t\treturn baseFilter;\n\t}, [parentFlowRunId, pagination, sort, debouncedSearch, stateFilter]);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateFlowRunsQuery(paginateFilter, 30_000),\n\t);\n\n\tconst flowIds = useMemo(\n\t\t() => [\n\t\t\t...new Set(\n\t\t\t\t(paginatedData?.results ?? []).map((flowRun) => flowRun.flow_id),\n\t\t\t),\n\t\t],\n\t\t[paginatedData?.results],\n\t);\n\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: { any_: flowIds },\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst flowRunsWithFlows = useMemo(() => {\n\t\tif (!paginatedData?.results) return [];\n\t\tconst flowMap = new Map(flows?.map((flow: Flow) => [flow.id, flow]) ?? []);\n\t\treturn paginatedData.results\n\t\t\t.map((flowRun) => {\n\t\t\t\tconst flow = flowMap.get(flowRun.flow_id);\n\t\t\t\tif (!flow) return { ...flowRun, flow: undefined };\n\t\t\t\treturn {\n\t\t\t\t\t...flowRun,\n\t\t\t\t\tflow,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter((flowRun) => flowRun !== null) as FlowRunWithFlow[];\n\t}, [paginatedData?.results, flows]);\n\n\tconst handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearch(e.target.value);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleStateFilterChange = (newFilters: Set<FlowRunState>) => {\n\t\tsetStateFilter(newFilters);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleSortChange = (newSort: SortFilters) => {\n\t\tsetSort(newSort);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleClearFilters = () => {\n\t\tsetSearch(\"\");\n\t\tsetStateFilter(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handlePrefetchPage = (page: number) => {\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\t{\n\t\t\t\t\t...paginateFilter,\n\t\t\t\t\tpage,\n\t\t\t\t},\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst hasFilters = search || stateFilter.size > 0;\n\n\tif (countData === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center justify-center h-48 border rounded-lg bg-muted/50\">\n\t\t\t\t<p className=\"text-base text-muted-foreground\">\n\t\t\t\t\tNo subflow runs found for this flow run.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"grid grid-cols-12 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-2\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{countData} Subflow run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"xl:col-span-4 col-span-12 md:order-1 order-0\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\taria-label=\"Search by run name\"\n\t\t\t\t\t\tdebounceMs={300}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-3 md:col-span-6 col-span-12 md:order-2 order-1\">\n\t\t\t\t\t<StateFilter\n\t\t\t\t\t\tselectedFilters={stateFilter}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-3 order-3\">\n\t\t\t\t\t<SortFilter value={sort} onSelect={handleSortChange} />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<FlowRunsList\n\t\t\t\tflowRuns={flowRunsWithFlows}\n\t\t\t\tonClearFilters={hasFilters ? handleClearFilters : undefined}\n\t\t\t/>\n\n\t\t\t{paginatedData && paginatedData.pages > 0 && (\n\t\t\t\t<FlowRunsPagination\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonChangePagination={setPagination}\n\t\t\t\t\tcount={paginatedData.count}\n\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\tonPrefetchPage={handlePrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useMemo, useState } from \"react\";\nimport {\n\tFLOW_RUN_STATES_MAP,\n\tFLOW_RUN_STATES_NO_SCHEDULED,\n\ttype FlowRunState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { cn } from \"@/utils\";\n\nconst MAX_FILTERS_DISPLAYED = 2;\n\ntype TaskRunStateFilterProps = {\n\tselectedFilters: Set<string>;\n\tonSelectFilter: (filters: Set<string>) => void;\n\tclassName?: string;\n};\n\nexport const TaskRunStateFilter = ({\n\tselectedFilters,\n\tonSelectFilter,\n\tclassName,\n}: TaskRunStateFilterProps) => {\n\tconst [open, setOpen] = useState(false);\n\n\tconst isAllButScheduled = useMemo(() => {\n\t\tconst flowRunStatesNoScheduleSet = new Set<string>(\n\t\t\tFLOW_RUN_STATES_NO_SCHEDULED,\n\t\t);\n\t\tif (\n\t\t\tselectedFilters.has(\"Scheduled\") ||\n\t\t\tflowRunStatesNoScheduleSet.size !== selectedFilters.size\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Array.from(selectedFilters).every((filter) =>\n\t\t\tflowRunStatesNoScheduleSet.has(filter),\n\t\t);\n\t}, [selectedFilters]);\n\n\tconst handleSelectAllExceptScheduled = () => {\n\t\tonSelectFilter(new Set(FLOW_RUN_STATES_NO_SCHEDULED));\n\t};\n\n\tconst handleSelectAllRunState = () => {\n\t\tonSelectFilter(new Set());\n\t};\n\n\tconst handleSelectFilter = (filter: string) => {\n\t\tif (isAllButScheduled) {\n\t\t\tonSelectFilter(new Set([filter]));\n\t\t\treturn;\n\t\t}\n\t\tconst updatedFilters = new Set(selectedFilters);\n\t\tif (selectedFilters.has(filter)) {\n\t\t\tupdatedFilters.delete(filter);\n\t\t} else {\n\t\t\tupdatedFilters.add(filter);\n\t\t}\n\t\tonSelectFilter(updatedFilters);\n\t};\n\n\tconst renderSelectedTags = () => {\n\t\tif (selectedFilters.size === 0) {\n\t\t\treturn \"All run states\";\n\t\t}\n\t\tif (isAllButScheduled) {\n\t\t\treturn \"All except scheduled\";\n\t\t}\n\n\t\tconst selected = Array.from(selectedFilters);\n\t\tconst visible = selected.slice(0, MAX_FILTERS_DISPLAYED);\n\t\tconst extraCount = selected.length - MAX_FILTERS_DISPLAYED;\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t{visible.map((filter) => (\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tkey={filter}\n\t\t\t\t\t\t\tname={filter}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filter as FlowRunState]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && <p className=\"text-sm shrink-0\">+ {extraCount}</p>}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<DropdownMenu open={open} onOpenChange={setOpen}>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tclassName={cn(\"justify-between w-full\", className)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"flex-1 min-w-0\">{renderSelectedTags()}</span>\n\t\t\t\t\t<Icon id=\"ChevronDown\" className=\"ml-2 size-4 shrink-0\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"max-h-96 overflow-x-hidden overflow-y-auto\">\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllExceptScheduled();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={isAllButScheduled} className=\"mr-2\" />\n\t\t\t\t\tAll except scheduled\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllRunState();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={selectedFilters.size === 0} className=\"mr-2\" />\n\t\t\t\t\tAll run states\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t{Object.keys(FLOW_RUN_STATES_MAP).map((filterKey) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\tkey={filterKey}\n\t\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleSelectFilter(filterKey);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\t\tclassName=\"mr-2\"\n\t\t\t\t\t\t\tchecked={!isAllButScheduled && selectedFilters.has(filterKey)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tname={filterKey}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filterKey as FlowRunState]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport type { ChangeEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildPaginateTaskRunsQuery,\n} from \"@/api/task-runs\";\nimport { TaskRunStateFilter } from \"@/components/task-runs/task-run-state-filter\";\nimport {\n\ttype TaskRunSortFilters,\n\tTaskRunsList,\n\tTaskRunsPagination,\n\tTaskRunsSortFilter,\n} from \"@/components/task-runs/task-runs-list\";\nimport type { PaginationState } from \"@/components/task-runs/task-runs-list/task-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype FlowRunTaskRunsProps = {\n\tflowRunId: string;\n};\n\nexport const FlowRunTaskRuns = ({ flowRunId }: FlowRunTaskRunsProps) => {\n\tconst queryClient = useQueryClient();\n\tconst [search, setSearch] = useState(\"\");\n\tconst [stateFilter, setStateFilter] = useState<Set<string>>(new Set());\n\tconst [tagsFilter, setTagsFilter] = useState<Set<string>>(new Set());\n\tconst [sort, setSort] = useState<TaskRunSortFilters>(\n\t\t\"EXPECTED_START_TIME_DESC\",\n\t);\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpage: 1,\n\t\tlimit: 20,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 300);\n\n\tconst { data: countData } = useSuspenseQuery(\n\t\tbuildCountTaskRunsQuery(\n\t\t\t{\n\t\t\t\ttask_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t},\n\t\t\t},\n\t\t\t30_000,\n\t\t),\n\t);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateTaskRunsQuery(\n\t\t\t{\n\t\t\t\ttask_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\t\tstate:\n\t\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\ttags:\n\t\t\t\t\t\ttagsFilter.size > 0\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tall_: Array.from(tagsFilter),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t},\n\t\t\t\tsort,\n\t\t\t\tpage: pagination.page,\n\t\t\t\tlimit: pagination.limit,\n\t\t\t},\n\t\t\t30_000,\n\t\t),\n\t);\n\n\tconst handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearch(e.target.value);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleStateFilterChange = (newFilters: Set<string>) => {\n\t\tsetStateFilter(newFilters);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleSortChange = (newSort: TaskRunSortFilters) => {\n\t\tsetSort(newSort);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleTagsFilterChange = (\n\t\ttags: string[] | ChangeEvent<HTMLInputElement>,\n\t) => {\n\t\tconst newTags = Array.isArray(tags) ? tags : [];\n\t\tsetTagsFilter(new Set(newTags));\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleClearFilters = () => {\n\t\tsetSearch(\"\");\n\t\tsetStateFilter(new Set());\n\t\tsetTagsFilter(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handlePrefetchPage = (page: number) => {\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateTaskRunsQuery(\n\t\t\t\t{\n\t\t\t\t\ttask_runs: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\tany_: [flowRunId],\n\t\t\t\t\t\t\tis_null_: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\t\t\tstate:\n\t\t\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\ttags:\n\t\t\t\t\t\t\ttagsFilter.size > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tall_: Array.from(tagsFilter),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t\tsort,\n\t\t\t\t\tpage,\n\t\t\t\t\tlimit: pagination.limit,\n\t\t\t\t},\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst hasFilters = search || stateFilter.size > 0 || tagsFilter.size > 0;\n\n\t// Calculate state summary from paginated results\n\tconst stateSummary = useMemo(() => {\n\t\tif (!paginatedData?.results) return null;\n\t\tconst stateCounts = new Map<string, number>();\n\t\tfor (const taskRun of paginatedData.results) {\n\t\t\tconst stateName = String(taskRun.state?.name ?? \"Unknown\");\n\t\t\tstateCounts.set(stateName, (stateCounts.get(stateName) ?? 0) + 1);\n\t\t}\n\t\treturn Array.from(stateCounts.entries())\n\t\t\t.map(([name, count]) => `${count} ${name}`)\n\t\t\t.join(\", \");\n\t}, [paginatedData?.results]);\n\n\tif (countData === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center justify-center h-48 border rounded-lg bg-muted/50\">\n\t\t\t\t<p className=\"text-base text-muted-foreground\">\n\t\t\t\t\tNo task runs found for this flow run.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t{/* Mobile: controls on top, count/sort on bottom. Desktop: count | controls | sort */}\n\t\t\t<div className=\"grid grid-cols-12 items-center gap-2\">\n\t\t\t\t{/* Count - first column */}\n\t\t\t\t<div className=\"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-3\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{countData} Task run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</p>\n\t\t\t\t\t{stateSummary && (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground text-xs capitalize\">\n\t\t\t\t\t\t\t({stateSummary})\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Controls - middle column */}\n\t\t\t\t<div className=\"xl:col-span-3 md:col-span-6 col-span-12 md:order-1 order-0\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\taria-label=\"Search by run name\"\n\t\t\t\t\t\tdebounceMs={300}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-2 md:col-span-6 col-span-12 md:order-2 order-1\">\n\t\t\t\t\t<TaskRunStateFilter\n\t\t\t\t\t\tselectedFilters={stateFilter}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-2 md:col-span-6 col-span-12 md:order-3 order-2\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tvalue={Array.from(tagsFilter)}\n\t\t\t\t\t\tonChange={handleTagsFilterChange}\n\t\t\t\t\t\tplaceholder=\"All tags\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{/* Sort - last column with left border on desktop */}\n\t\t\t\t<div className=\"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-4 order-4\">\n\t\t\t\t\t<TaskRunsSortFilter value={sort} onSelect={handleSortChange} />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<TaskRunsList\n\t\t\t\ttaskRuns={paginatedData?.results}\n\t\t\t\tonClearFilters={hasFilters ? handleClearFilters : undefined}\n\t\t\t/>\n\n\t\t\t{paginatedData && paginatedData.pages > 0 && (\n\t\t\t\t<TaskRunsPagination\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonChangePagination={setPagination}\n\t\t\t\t\tcount={paginatedData.count}\n\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\tonPrefetchPage={handlePrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQueryClient, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport { Suspense, useCallback, useEffect, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { queryKeyFactory as artifactsQueryKeyFactory } from \"@/api/artifacts\";\nimport {\n\tbuildGetFlowRunDetailsQuery,\n\ttype FlowRun,\n\tqueryKeyFactory as flowRunsQueryKeyFactory,\n\tuseDeleteFlowRun,\n} from \"@/api/flow-runs\";\nimport { queryKeyFactory as logsQueryKeyFactory } from \"@/api/logs\";\nimport { queryKeyFactory as taskRunsQueryKeyFactory } from \"@/api/task-runs\";\nimport { FlowRunGraph } from \"@/components/flow-runs/flow-run-graph\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ErrorBoundary } from \"@/components/ui/error-boundary\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { TabErrorState } from \"@/components/ui/tab-error-state\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { useStateFavicon } from \"@/hooks/use-state-favicon\";\nimport { FlowRunArtifacts } from \"./flow-run-artifacts\";\nimport { FlowRunDetails } from \"./flow-run-details\";\nimport { FlowRunHeader } from \"./flow-run-header\";\nimport { FlowRunLogs } from \"./flow-run-logs\";\nimport { FlowRunSubflows } from \"./flow-run-subflows\";\nimport { FlowRunTaskRuns } from \"./flow-run-task-runs\";\n\ntype FlowRunDetailsTabOptions =\n\t| \"Logs\"\n\t| \"TaskRuns\"\n\t| \"SubflowRuns\"\n\t| \"Artifacts\"\n\t| \"Details\"\n\t| \"Parameters\"\n\t| \"JobVariables\";\n\ntype FlowRunDetailsPageProps = {\n\tid: string;\n\ttab: FlowRunDetailsTabOptions;\n\tonTabChange: (tab: FlowRunDetailsTabOptions) => void;\n};\n\nexport const FlowRunDetailsPage = ({\n\tid,\n\ttab,\n\tonTabChange,\n}: FlowRunDetailsPageProps) => {\n\tconst [refetchInterval, setRefetchInterval] = useState<number | false>(false);\n\tconst [fullscreen, setFullscreen] = useState(false);\n\tconst queryClient = useQueryClient();\n\tconst { data: flowRun } = useSuspenseQuery({\n\t\t...buildGetFlowRunDetailsQuery(id),\n\t\trefetchInterval,\n\t});\n\tconst { deleteFlowRun } = useDeleteFlowRun();\n\tconst { navigate } = useRouter();\n\tconst isPending = flowRun.state_type === \"PENDING\";\n\n\t// Set favicon based on flow run state\n\tuseStateFavicon(flowRun?.state_type);\n\n\tuseEffect(() => {\n\t\tif (flowRun.state_type === \"RUNNING\" || flowRun.state_type === \"PENDING\") {\n\t\t\tsetRefetchInterval(5000);\n\t\t} else {\n\t\t\tsetRefetchInterval(false);\n\t\t}\n\t}, [flowRun]);\n\n\tconst onDeleteRunClicked = () => {\n\t\tdeleteFlowRun(flowRun.id, {\n\t\t\tonSuccess: () => {\n\t\t\t\tsetRefetchInterval(false);\n\t\t\t\ttoast.success(\"Flow run deleted\");\n\t\t\t\tvoid navigate({ to: \"/runs\", replace: true });\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while deleting flow run.\";\n\t\t\t\ttoast.error(message);\n\t\t\t},\n\t\t});\n\t};\n\n\tconst retryLogs = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: logsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retryTaskRuns = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: taskRunsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retrySubflows = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: flowRunsQueryKeyFactory.lists(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retryArtifacts = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: artifactsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<FlowRunHeader flowRun={flowRun} onDeleteClick={onDeleteRunClicked} />\n\t\t\t</div>\n\t\t\t{!isPending && (\n\t\t\t\t<Card className=\"py-0\">\n\t\t\t\t\t<CardContent className=\"p-0\">\n\t\t\t\t\t\t<FlowRunGraph\n\t\t\t\t\t\t\tflowRunId={flowRun.id}\n\t\t\t\t\t\t\tstateType={flowRun.state_type ?? undefined}\n\t\t\t\t\t\t\tfullscreen={fullscreen}\n\t\t\t\t\t\t\tonFullscreenChange={setFullscreen}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<TabsLayout\n\t\t\t\t\tcurrentTab={tab}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\tlogsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load logs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading log data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryLogs}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<LogsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunLogs flowRun={flowRun} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\ttaskRunsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load task runs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading task run data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryTaskRuns}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<TaskRunsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunTaskRuns flowRunId={id} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tsubflowRunsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load subflow runs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading subflow run data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retrySubflows}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<SubflowsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunSubflows parentFlowRunId={id} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tartifactsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load artifacts\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading artifact data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryArtifacts}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<ArtifactsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunArtifacts flowRun={flowRun} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tdetailsContent={\n\t\t\t\t\t\t<Suspense fallback={<DetailsSkeleton />}>\n\t\t\t\t\t\t\t<FlowRunDetails flowRun={flowRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\tparametersContent={\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\ttoast.success(\"Copied parameters to clipboard\");\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(flowRun.parameters ?? {}, null, 2),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-4 mr-2\" />\n\t\t\t\t\t\t\t\t\tCopy parameters\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<LazyJsonInput\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(flowRun.parameters ?? {}, null, 2)}\n\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\tjobVariablesContent={\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\ttoast.success(\"Copied job variables to clipboard\");\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(flowRun.job_variables ?? {}, null, 2),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-4 mr-2\" />\n\t\t\t\t\t\t\t\t\tCopy job variables\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<LazyJsonInput\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(flowRun.job_variables ?? {}, null, 2)}\n\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst TabsLayout = ({\n\tcurrentTab,\n\tonTabChange,\n\tflowRun,\n\tlogsContent,\n\ttaskRunsContent,\n\tsubflowRunsContent,\n\tartifactsContent,\n\tdetailsContent,\n\tparametersContent,\n\tjobVariablesContent,\n}: {\n\tcurrentTab: FlowRunDetailsTabOptions;\n\tonTabChange: (tab: FlowRunDetailsTabOptions) => void;\n\tflowRun: FlowRun;\n\tlogsContent: React.ReactNode;\n\ttaskRunsContent: React.ReactNode;\n\tsubflowRunsContent: React.ReactNode;\n\tartifactsContent: React.ReactNode;\n\tdetailsContent: React.ReactNode;\n\tparametersContent: React.ReactNode;\n\tjobVariablesContent: React.ReactNode;\n}) => {\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value) => onTabChange(value as FlowRunDetailsTabOptions)}\n\t\t>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger value=\"Details\">Details</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Logs\">Logs</TabsTrigger>\n\t\t\t\t{flowRun.state_type !== \"PENDING\" && (\n\t\t\t\t\t<TabsTrigger value=\"TaskRuns\">Task Runs</TabsTrigger>\n\t\t\t\t)}\n\t\t\t\t{flowRun.state_type !== \"PENDING\" && (\n\t\t\t\t\t<TabsTrigger value=\"SubflowRuns\">Subflow Runs</TabsTrigger>\n\t\t\t\t)}\n\t\t\t\t<TabsTrigger value=\"Artifacts\">Artifacts</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Parameters\">Parameters</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"JobVariables\">Job Variables</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Logs\">{logsContent}</TabsContent>\n\t\t\t<TabsContent value=\"TaskRuns\">{taskRunsContent}</TabsContent>\n\t\t\t<TabsContent value=\"SubflowRuns\">{subflowRunsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Artifacts\">{artifactsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Parameters\">{parametersContent}</TabsContent>\n\t\t\t<TabsContent value=\"JobVariables\">{jobVariablesContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n\nconst LogsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-25\" />\n\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t\t<Skeleton className=\"h-8 w-8\" /> {/* Download button placeholder */}\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-32\" />\n\t\t</div>\n\t);\n};\n\nconst TaskRunsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-2\">\n\t\t\t\t<Skeleton className=\"h-9 flex-1\" />\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<Skeleton className=\"h-9 w-48\" />\n\t\t\t\t\t<Skeleton className=\"h-9 w-40\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst ArtifactsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-12\" />\n\t\t\t</div>\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3\">\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst SubflowsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-2\">\n\t\t\t\t<Skeleton className=\"h-9 flex-1\" />\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<Skeleton className=\"h-9 w-48\" />\n\t\t\t\t\t<Skeleton className=\"h-9 w-40\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst DetailsSkeleton = () => {\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t<Skeleton className=\"h-5 w-12\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-16\" />\n\t\t\t\t<Skeleton className=\"h-5 w-32\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t<Skeleton className=\"h-5 w-32\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t<Skeleton className=\"h-5 w-64\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, notFound, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildGetFlowRunDetailsQuery } from \"@/api/flow-runs\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildPaginateTaskRunsQuery } from \"@/api/task-runs\";\nimport { FlowRunDetailsPage } from \"@/components/flow-runs/flow-run-details-page\";\nimport { FlowRunNotFound } from \"@/components/flow-runs/flow-run-not-found\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\n\t\t\t\"Logs\",\n\t\t\t\"TaskRuns\",\n\t\t\t\"SubflowRuns\",\n\t\t\t\"Artifacts\",\n\t\t\t\"Details\",\n\t\t\t\"Parameters\",\n\t\t\t\"JobVariables\",\n\t\t])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type FlowRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction FlowRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load flow run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Flow Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/flow-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateTaskRunsQuery({\n\t\t\t\tpage: 1,\n\t\t\t\tsort: \"EXPECTED_START_TIME_DESC\",\n\t\t\t\tflow_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\ttry {\n\t\t\tawait queryClient.ensureQueryData(buildGetFlowRunDetailsQuery(params.id));\n\t\t} catch (error) {\n\t\t\t// Only treat \"not found\" errors as 404, rethrow other errors\n\t\t\tif (error instanceof Error && /not found/i.test(error.message)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/only-throw-error\n\t\t\t\tthrow notFound();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\n\terrorComponent: FlowRunErrorComponent,\n\tnotFoundComponent: FlowRunNotFound,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: FlowRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <FlowRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"file":"flow-run._id-YzRd5jrC.js"}
@@ -0,0 +1,2 @@
1
+ import{r as v,j as e}from"./vendor-tanstack-BdLtprmr.js";import{cv as P,q as E,I as L,ao as N,cw as f,at as k,cQ as C,C as T,b8 as h,S as _,a as y,b as B,c as O,e as z,b9 as R,ba as U,bb as m,cE as F,bc as V,bd as W,cF as q}from"./index-CPpeVt8m.js";import{D as G,a as H,b as Q,d as g}from"./dropdown-menu-fRiq5bS-.js";const A=2,K=({defaultValue:c,selectedFilters:l=c||new Set,onSelectFilter:s})=>{const[t,r]=v.useState(!1),d=v.useMemo(()=>{const a=new Set(P);return l.has("Scheduled")||a.size!==l.size?!1:Array.from(l).every(n=>a.has(n))},[l]),u=()=>{s(new Set(P))},j=()=>{s(new Set)},S=a=>{if(d){s(new Set([a]));return}const n=new Set(l);l.has(a)?n.delete(a):n.add(a),s(n)},p=()=>{if(l.size===0)return"All run states";if(d)return"All except scheduled";const a=Array.from(l),n=a.slice(0,A),o=a.length-A;return e.jsxs("div",{className:"flex flex-1 min-w-0 items-center gap-2",children:[e.jsx("div",{className:"flex flex-1 min-w-0 items-center gap-2 overflow-hidden",children:n.map(i=>e.jsx(k,{name:i,type:f[i]},i))}),o>0&&e.jsxs("p",{className:"text-sm shrink-0",children:["+ ",o]})]})};return e.jsxs(G,{open:t,onOpenChange:r,children:[e.jsx(H,{asChild:!0,children:e.jsxs(E,{variant:"outline",className:"justify-between w-full bg-card dark:bg-background",children:[e.jsx("span",{className:"flex-1 min-w-0",children:p()}),e.jsx(L,{id:"ChevronDown",className:"ml-2 size-4 shrink-0"})]})}),e.jsxs(Q,{className:"max-h-96 overflow-x-hidden overflow-y-auto",children:[e.jsxs(g,{onSelect:a=>{a.preventDefault(),u()},children:[e.jsx(N,{checked:d,className:"mr-2"}),"All except scheduled"]}),e.jsxs(g,{onSelect:a=>{a.preventDefault(),j()},children:[e.jsx(N,{checked:l.size===0,className:"mr-2"}),"All run states"]}),Object.keys(f).map(a=>e.jsxs(g,{"aria-label":a,onSelect:n=>{n.preventDefault(),S(a)},children:[e.jsx(N,{"aria-label":a,className:"mr-2",checked:!d&&l.has(a)}),e.jsx(k,{name:a,type:f[a]})]},a))]})]})},ee=({flowRuns:c,onClearFilters:l,...s})=>c?c.length===0?e.jsx("div",{className:"flex justify-center py-4",children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("p",{className:"text-base",children:"No runs found"}),l&&e.jsx(E,{onClick:l,children:"Clear Filters"})]})}):e.jsx("ul",{className:"flex flex-col gap-2",children:c.map(t=>"onSelect"in s&&"selectedRows"in s?e.jsx("li",{children:e.jsx(C,{flowRun:t,checked:s.selectedRows.has(t.id),onCheckedChange:r=>s.onSelect(t.id,r)})},t.id):e.jsx("li",{children:e.jsx(C,{flowRun:t})},t.id))}):e.jsx(X,{numSkeletons:5}),X=({numSkeletons:c=1})=>e.jsx("ul",{className:"flex flex-col gap-1",children:Array.from({length:c}).map((l,s)=>e.jsx("li",{children:e.jsxs(T,{className:"flex flex-col gap-2 p-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(h,{className:"h-4 w-[350px]"}),e.jsx(h,{className:"h-4 w-[400px]"})]}),e.jsx(h,{className:"h-4 w-[400px]"}),e.jsx(h,{className:"h-4 w-[200px]"})]})},s))}),Y=[5,10,25,50,100],se=({count:c,pages:l,pagination:s,onChangePagination:t,onPrefetchPage:r})=>{const d=()=>t({limit:s.limit,page:1}),u=()=>t({limit:s.limit,page:s.page-1}),j=()=>t({limit:s.limit,page:s.page+1}),S=()=>t({limit:s.limit,page:l}),p=()=>{s.page>1&&r?.(1)},a=()=>{s.page>1&&r?.(s.page-1)},n=()=>{s.page<l&&r?.(s.page+1)},o=()=>{s.page<l&&r?.(l)},i=s.page<=1,w=s.page>=l,M=x=>{const b=Number(x),D=Math.ceil(c/b),I=Math.min(s.page,D);t({limit:b,page:I})};return e.jsxs("div",{className:"flex flex-row justify-between items-center",children:[e.jsxs("div",{className:"flex flex-row items-center gap-2 text-xs text-muted-foreground",children:[e.jsx("span",{className:"whitespace-nowrap",children:"Items per page"}),e.jsxs(_,{value:String(s.limit),onValueChange:M,children:[e.jsx(y,{"aria-label":"Items per page",children:e.jsx(B,{placeholder:"Theme"})}),e.jsx(O,{children:Y.map(x=>e.jsx(z,{value:String(x),children:x},x))})]})]}),e.jsx(R,{className:"justify-end",children:e.jsxs(U,{children:[e.jsxs(m,{children:[e.jsx(F,{onClick:d,onMouseEnter:p,disabled:i}),e.jsx(V,{onClick:u,onMouseEnter:a,disabled:i})]}),e.jsxs(m,{className:"text-sm",children:["Page ",l===0?0:s.page," of ",l]}),e.jsx(m,{children:e.jsx(W,{onClick:j,onMouseEnter:n,disabled:w})}),e.jsx(m,{children:e.jsx(q,{onClick:S,onMouseEnter:o,disabled:w})})]})})]})};export{se as F,K as S,ee as a};
2
+ //# sourceMappingURL=flow-runs-pagination-DMLZFM1m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-runs-pagination-DMLZFM1m.js","sources":["../../src/components/flow-runs/flow-runs-list/flow-runs-filters/state-filter.tsx","../../src/components/flow-runs/flow-runs-list/flow-runs-list.tsx","../../src/components/flow-runs/flow-runs-list/flow-runs-pagination.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport {\n\tFLOW_RUN_STATES_MAP,\n\tFLOW_RUN_STATES_NO_SCHEDULED,\n\ttype FlowRunState,\n} from \"./state-filters.constants\";\n\nconst MAX_FILTERS_DISPLAYED = 2;\n\ntype StateFilterProps = {\n\tdefaultValue?: Set<FlowRunState>;\n\tselectedFilters: Set<FlowRunState> | undefined;\n\tonSelectFilter: (filters: Set<FlowRunState>) => void;\n};\n\nexport const StateFilter = ({\n\tdefaultValue,\n\tselectedFilters = defaultValue || new Set(),\n\tonSelectFilter,\n}: StateFilterProps) => {\n\tconst [open, setOpen] = useState(false);\n\n\tconst isAllButScheduled = useMemo(() => {\n\t\tconst flowRunStatesNoScheduleSet = new Set<FlowRunState>(\n\t\t\tFLOW_RUN_STATES_NO_SCHEDULED,\n\t\t);\n\t\tif (\n\t\t\tselectedFilters.has(\"Scheduled\") ||\n\t\t\tflowRunStatesNoScheduleSet.size !== selectedFilters.size\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Array.from(selectedFilters).every((filter) =>\n\t\t\tflowRunStatesNoScheduleSet.has(filter),\n\t\t);\n\t}, [selectedFilters]);\n\n\tconst handleSelectAllExceptScheduled = () => {\n\t\tonSelectFilter(new Set(FLOW_RUN_STATES_NO_SCHEDULED));\n\t};\n\n\tconst handleSelectAllRunState = () => {\n\t\tonSelectFilter(new Set());\n\t};\n\n\tconst handleSelectFilter = (filter: FlowRunState) => {\n\t\t// if all but scheduled is already selected, create a new set with the single filter\n\t\tif (isAllButScheduled) {\n\t\t\tonSelectFilter(new Set([filter]));\n\t\t\treturn;\n\t\t}\n\t\tconst updatedFilters = new Set(selectedFilters);\n\t\tif (selectedFilters.has(filter)) {\n\t\t\tupdatedFilters.delete(filter);\n\t\t} else {\n\t\t\tupdatedFilters.add(filter);\n\t\t}\n\t\tonSelectFilter(updatedFilters);\n\t};\n\n\tconst renderSelectedTags = () => {\n\t\tif (selectedFilters.size === 0) {\n\t\t\treturn \"All run states\";\n\t\t}\n\t\tif (isAllButScheduled) {\n\t\t\treturn \"All except scheduled\";\n\t\t}\n\n\t\tconst selected = Array.from(selectedFilters);\n\t\tconst visible = selected.slice(0, MAX_FILTERS_DISPLAYED);\n\t\tconst extraCount = selected.length - MAX_FILTERS_DISPLAYED;\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t{visible.map((filter) => (\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tkey={filter}\n\t\t\t\t\t\t\tname={filter}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filter]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && <p className=\"text-sm shrink-0\">+ {extraCount}</p>}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<DropdownMenu open={open} onOpenChange={setOpen}>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tclassName=\"justify-between w-full bg-card dark:bg-background\"\n\t\t\t\t>\n\t\t\t\t\t<span className=\"flex-1 min-w-0\">{renderSelectedTags()}</span>\n\t\t\t\t\t<Icon id=\"ChevronDown\" className=\"ml-2 size-4 shrink-0\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"max-h-96 overflow-x-hidden overflow-y-auto\">\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllExceptScheduled();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={isAllButScheduled} className=\"mr-2\" />\n\t\t\t\t\tAll except scheduled\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllRunState();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={selectedFilters.size === 0} className=\"mr-2\" />\n\t\t\t\t\tAll run states\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t{Object.keys(FLOW_RUN_STATES_MAP).map((filterKey) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\tkey={filterKey}\n\t\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleSelectFilter(filterKey as FlowRunState);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\t\tclassName=\"mr-2\"\n\t\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\t\t!isAllButScheduled &&\n\t\t\t\t\t\t\t\tselectedFilters.has(filterKey as FlowRunState)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tname={filterKey}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filterKey as FlowRunState]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import {\n\tFlowRunCard,\n\ttype FlowRunCardData,\n} from \"@/components/flow-runs/flow-run-card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\ntype FlowRunCardProps =\n\t| {\n\t\t\tflowRuns: Array<FlowRunCardData> | undefined;\n\t\t\tonClearFilters?: () => void;\n\t }\n\t| {\n\t\t\tflowRuns: Array<FlowRunCardData> | undefined;\n\t\t\tonSelect: (id: string, checked: boolean) => void;\n\t\t\tselectedRows: Set<string>;\n\t\t\tonClearFilters?: () => void;\n\t };\n\nexport const FlowRunsList = ({\n\tflowRuns,\n\tonClearFilters,\n\t...props\n}: FlowRunCardProps) => {\n\tif (!flowRuns) {\n\t\treturn <LoadingSkeleton numSkeletons={5} />;\n\t}\n\n\tif (flowRuns.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex justify-center py-4\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<p className=\"text-base\">No runs found</p>\n\t\t\t\t\t{onClearFilters && (\n\t\t\t\t\t\t<Button onClick={onClearFilters}>Clear Filters</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t{flowRuns.map((flowRun) => {\n\t\t\t\t// Variant for selectable list\n\t\t\t\tif (\"onSelect\" in props && \"selectedRows\" in props) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={flowRun.id}>\n\t\t\t\t\t\t\t<FlowRunCard\n\t\t\t\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\t\t\t\tchecked={props.selectedRows.has(flowRun.id)}\n\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\tprops.onSelect(flowRun.id, checked)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<li key={flowRun.id}>\n\t\t\t\t\t\t<FlowRunCard flowRun={flowRun} />\n\t\t\t\t\t</li>\n\t\t\t\t);\n\t\t\t})}\n\t\t</ul>\n\t);\n};\n\ntype LoadingSkeletonProps = {\n\tnumSkeletons?: number;\n};\nconst LoadingSkeleton = ({ numSkeletons = 1 }: LoadingSkeletonProps) => (\n\t<ul className=\"flex flex-col gap-1\">\n\t\t{Array.from({ length: numSkeletons }).map((_, i) => (\n\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: okay for static skeleton list\n\t\t\t<li key={i}>\n\t\t\t\t<Card className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t<Skeleton className=\"h-4 w-[350px]\" />\n\t\t\t\t\t\t<Skeleton className=\"h-4 w-[400px]\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Skeleton className=\"h-4 w-[400px]\" />\n\t\t\t\t\t<Skeleton className=\"h-4 w-[200px]\" />\n\t\t\t\t</Card>\n\t\t\t</li>\n\t\t))}\n\t</ul>\n);\n","import {\n\tPagination,\n\tPaginationContent,\n\tPaginationFirstButton,\n\tPaginationItem,\n\tPaginationLastButton,\n\tPaginationNextButton,\n\tPaginationPreviousButton,\n} from \"@/components/ui/pagination\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst PAGINATION_INCREMENTS = [5, 10, 25, 50, 100];\n\nexport type PaginationState = {\n\tlimit: number;\n\tpage: number;\n};\nexport type PaginationStateUpdater = (\n\tprevState: PaginationState,\n) => PaginationState;\n\ntype FlowRunsPaginationProps = {\n\tcount: number;\n\tpages: number;\n\tpagination: PaginationState;\n\tonChangePagination: (pagination: PaginationState) => void;\n\tonPrefetchPage?: (page: number) => void;\n};\nexport const FlowRunsPagination = ({\n\tcount,\n\tpages,\n\tpagination,\n\tonChangePagination,\n\tonPrefetchPage,\n}: FlowRunsPaginationProps) => {\n\tconst handleFirstPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: 1 });\n\tconst handlePreviousPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pagination.page - 1 });\n\tconst handleNextPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pagination.page + 1 });\n\n\tconst handleLastPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pages });\n\n\tconst handlePrefetchFirstPage = () => {\n\t\tif (pagination.page > 1) onPrefetchPage?.(1);\n\t};\n\tconst handlePrefetchPreviousPage = () => {\n\t\tif (pagination.page > 1) onPrefetchPage?.(pagination.page - 1);\n\t};\n\tconst handlePrefetchNextPage = () => {\n\t\tif (pagination.page < pages) onPrefetchPage?.(pagination.page + 1);\n\t};\n\tconst handlePrefetchLastPage = () => {\n\t\tif (pagination.page < pages) onPrefetchPage?.(pages);\n\t};\n\n\tconst disablePreviousPage = pagination.page <= 1;\n\tconst disableNextPage = pagination.page >= pages;\n\n\tconst handleChangeLimit = (value: string) => {\n\t\tconst newLimit = Number(value);\n\t\tconst newTotalPages = Math.ceil(count / newLimit);\n\t\tconst newPage = Math.min(pagination.page, newTotalPages);\n\t\tonChangePagination({\n\t\t\tlimit: newLimit,\n\t\t\tpage: newPage,\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between items-center\">\n\t\t\t<div className=\"flex flex-row items-center gap-2 text-xs text-muted-foreground\">\n\t\t\t\t<span className=\"whitespace-nowrap\">Items per page</span>\n\t\t\t\t<Select\n\t\t\t\t\tvalue={String(pagination.limit)}\n\t\t\t\t\tonValueChange={handleChangeLimit}\n\t\t\t\t>\n\t\t\t\t\t<SelectTrigger aria-label=\"Items per page\">\n\t\t\t\t\t\t<SelectValue placeholder=\"Theme\" />\n\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t{PAGINATION_INCREMENTS.map((increment) => (\n\t\t\t\t\t\t\t<SelectItem key={increment} value={String(increment)}>\n\t\t\t\t\t\t\t\t{increment}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectContent>\n\t\t\t\t</Select>\n\t\t\t</div>\n\t\t\t<Pagination className=\"justify-end\">\n\t\t\t\t<PaginationContent>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationFirstButton\n\t\t\t\t\t\t\tonClick={handleFirstPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchFirstPage}\n\t\t\t\t\t\t\tdisabled={disablePreviousPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<PaginationPreviousButton\n\t\t\t\t\t\t\tonClick={handlePreviousPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchPreviousPage}\n\t\t\t\t\t\t\tdisabled={disablePreviousPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem className=\"text-sm\">\n\t\t\t\t\t\tPage {pages === 0 ? 0 : pagination.page} of {pages}\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationNextButton\n\t\t\t\t\t\t\tonClick={handleNextPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchNextPage}\n\t\t\t\t\t\t\tdisabled={disableNextPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationLastButton\n\t\t\t\t\t\t\tonClick={handleLastPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchLastPage}\n\t\t\t\t\t\t\tdisabled={disableNextPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t</PaginationContent>\n\t\t\t</Pagination>\n\t\t</div>\n\t);\n};\n"],"names":["MAX_FILTERS_DISPLAYED","StateFilter","defaultValue","selectedFilters","onSelectFilter","open","setOpen","useState","isAllButScheduled","useMemo","flowRunStatesNoScheduleSet","FLOW_RUN_STATES_NO_SCHEDULED","filter","handleSelectAllExceptScheduled","handleSelectAllRunState","handleSelectFilter","updatedFilters","renderSelectedTags","selected","visible","extraCount","jsxs","jsx","StateBadge","FLOW_RUN_STATES_MAP","DropdownMenu","DropdownMenuTrigger","Button","Icon","DropdownMenuContent","DropdownMenuItem","e","Checkbox","filterKey","FlowRunsList","flowRuns","onClearFilters","props","flowRun","FlowRunCard","checked","LoadingSkeleton","numSkeletons","_","i","Card","Skeleton","PAGINATION_INCREMENTS","FlowRunsPagination","count","pages","pagination","onChangePagination","onPrefetchPage","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePrefetchFirstPage","handlePrefetchPreviousPage","handlePrefetchNextPage","handlePrefetchLastPage","disablePreviousPage","disableNextPage","handleChangeLimit","value","newLimit","newTotalPages","newPage","Select","SelectTrigger","SelectValue","SelectContent","increment","SelectItem","Pagination","PaginationContent","PaginationItem","PaginationFirstButton","PaginationPreviousButton","PaginationNextButton","PaginationLastButton"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{d as le,j as e,r as o,t as z,C as De,D as Se,E as G,n as we}from"./vendor-tanstack-BdLtprmr.js";import{aV as Ne,y as H,bP as oe,aQ as re,aU as ie,ao as U,q as E,I as ce,cG as Re,bQ as Fe,V as de,S as Te,a as ke,b as _e,c as Ae,e as Ee,c6 as ue,a2 as Pe,a3 as Oe,a4 as Be,a5 as Ie,a6 as Me,a7 as Le,bO as $,B as ze,g as He,h as q,bv as Qe,bE as Ge,bG as Ke,aG as O,cH as We,cI as Ve,cJ as Ue,cK as $e,cL as qe,cM as Ye,C as me,m as pe,n as he,o as ge,a_ as Ze,aF as Je,cN as Xe,cO as es,b8 as ss,az as as,aA as ts,aB as M,aC as L,cP as m,ar as ns,bh as ls,aH as Y,aK as Z,aO as os}from"./index-CPpeVt8m.js";import{S as rs}from"./sort-filter-X6JyRc0-.js";import{S as is,a as cs,F as ds}from"./flow-runs-pagination-DMLZFM1m.js";import{u as us,F as ms}from"./use-flow-runs-selected-rows-Ck8nwx2q.js";import{D as ps}from"./delete-confirmation-dialog-BZg9EOfN.js";import{D as hs}from"./data-table-bk-0xKWT.js";import{T as gs}from"./tags-input-DqZ8v99z.js";import{D as xe,a as fe,b as je,d as Q,c as xs}from"./dropdown-menu-fRiq5bS-.js";import{S as fs}from"./index-cp6PTdHp.js";import{S as js}from"./index-ELo08q04.js";import{s as ys,U as bs,_ as vs}from"./vendor-date-Cl1Jav-N.js";import{A as Cs,b as J}from"./vendor-recharts-CY3PKigC.js";import{u as Ds}from"./use-page-title-ar2vyvpx.js";import{o as Ss,e as B,a as X,s as I,n as _,d as ee}from"./vendor-forms-BlFSCfFw.js";import"./vendor-react-HBv6Kpyp.js";import"./vendor-radix-CJc458uP.js";import"./use-delete-confirmation-dialog-CkL-rSsp.js";import"./table-Xyel2BEw.js";import"./cronstrue-p-STK_QW.js";import"./use-is-overflowing-CDFKqB6i.js";const ws=({flow:s,open:a,onOpenChange:t,onDeleted:n})=>{const l=le(),{deleteFlow:r,isPending:c}=Ne(),d=()=>{r(s.id,{onSuccess:()=>{H.success("Flow deleted"),n?.(),l({to:"/flows"})},onError:()=>{H.error("Failed to delete flow")}})};return e.jsx(ps,{isOpen:a,title:"Delete Flow",description:`Are you sure you want to delete ${s.name}? This action cannot be undone.`,isLoading:c,loadingText:"Deleting...",onConfirm:d,onClose:()=>t(!1)})},se=4,Ns=2,Rs=({deploymentId:s})=>{const[a,t]=o.useState(0),n=oe(a,150),l=o.useCallback(u=>{if(!u)return;const p=()=>{const h=u.getBoundingClientRect().width;t(Math.floor(h/(se+Ns)))};p();const x=new ResizeObserver(p);return x.observe(u),()=>{x.disconnect()}},[]),r=n||a,{data:c}=z(re({deployments:{operator:"and_",id:{any_:[s]}},limit:Math.min(60,r||60),sort:"START_TIME_DESC",offset:0})),d=c?.map(u=>({...u}))??[];return e.jsx("div",{className:"w-full",ref:l,children:e.jsx(ie,{enrichedFlowRuns:d,startDate:ys(new Date,bs),endDate:new Date,barWidth:se,numberOfBars:r,className:"h-8 w-full",chartId:`deployment-${s}`})})},Fs=[{id:"select",header:({table:s})=>e.jsx(U,{checked:s.getIsAllPageRowsSelected(),onCheckedChange:a=>s.toggleAllPageRowsSelected(!!a),"aria-label":"Select all"}),cell:({row:s})=>e.jsx(U,{checked:s.getIsSelected(),onCheckedChange:a=>s.toggleSelected(!!a),"aria-label":"Select row"}),enableSorting:!1,enableHiding:!1,maxSize:20,minSize:20},{accessorKey:"name",header:"Name",cell:({row:s})=>s.original.name},{accessorKey:"status",header:"Status",cell:({row:s})=>{const a=s.original.paused?"PAUSED":s.original.status??"NOT_READY";return e.jsx(js,{status:a})}},{accessorKey:"tags",header:"Tags",cell:({row:s})=>e.jsx("div",{className:"flex flex-wrap gap-1",children:s.original.tags?.map(a=>e.jsx("span",{className:"bg-gray-100 text-gray-800 text-xs font-medium px-2 py-0.5 rounded",children:a},a))})},{accessorKey:"schedules",header:"Schedules",cell:({row:s})=>{const a=s.original.schedules;return!a||a.length===0?null:e.jsx(fs,{schedules:a})},size:150},{accessorKey:"activity",header:"Activity",cell:({row:s})=>s.original.id?e.jsx(Rs,{deploymentId:s.original.id}):null},{id:"actions",cell:({row:s})=>s.original.id?e.jsxs(xe,{children:[e.jsx(fe,{asChild:!0,children:e.jsxs(E,{variant:"ghost",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(ce,{id:"MoreHorizontal",className:"size-4"})]})}),e.jsx(je,{align:"end",children:e.jsx(Q,{onClick:()=>{navigator.clipboard.writeText(s.original.id)},children:"Copy ID"})})]}):null,minSize:30,maxSize:30}],Ts=[{label:"Created",value:"CREATED_DESC"},{label:"A to Z",value:"NAME_ASC"},{label:"Z to A",value:"NAME_DESC"}],ks=({deployments:s,deploymentsCount:a,deploymentsPages:t,deploymentSearch:n,onDeploymentSearchChange:l,deploymentTags:r,onDeploymentTagsChange:c,deploymentSort:d,onDeploymentSortChange:u,deploymentPagination:p,onDeploymentPaginationChange:x})=>{const[h,j]=o.useState({}),[g,f]=o.useState(!1),{deleteDeployment:y}=Re(),b=o.useCallback(i=>{const v={pageIndex:p.page-1,pageSize:p.limit},w=typeof i=="function"?i(v):i;x({page:w.pageIndex+1,limit:w.pageSize}),j({})},[p,x]),R=De({data:s,columns:Fs,getCoreRowModel:Se(),manualPagination:!0,pageCount:t,state:{rowSelection:h,pagination:{pageIndex:p.page-1,pageSize:p.limit}},onRowSelectionChange:j,onPaginationChange:b,getRowId:i=>i.id}),C=Object.keys(h).length,D=o.useCallback(()=>{const i=Object.keys(h);for(const v of i)y(v);j({}),f(!1)},[h,y]),S=o.useCallback(i=>{Array.isArray(i)&&c(i)},[c]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"grid grid-cols-12 items-center gap-2",children:[e.jsx("div",{className:"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-3",children:C>0?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:[C," selected"]}),e.jsx(E,{variant:"ghost",size:"icon",className:"h-6 w-6 text-destructive hover:text-destructive",onClick:()=>f(!0),"aria-label":"Delete selected deployments",children:e.jsx(Fe,{className:"h-4 w-4"})})]}):e.jsxs("p",{className:"text-sm text-muted-foreground",children:[a," Deployment",a!==1?"s":""]})}),e.jsx("div",{className:"xl:col-span-4 md:col-span-6 col-span-12 md:order-1 order-0",children:e.jsx(de,{placeholder:"Search deployments...",value:n??"",onChange:i=>l(i.target.value),"aria-label":"Search deployments",debounceMs:300})}),e.jsx("div",{className:"xl:col-span-3 md:col-span-6 col-span-12 md:order-2 order-1",children:e.jsx(gs,{placeholder:"Filter by tags",value:r,onChange:S})}),e.jsx("div",{className:"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-3 order-2",children:e.jsxs(Te,{value:d,onValueChange:i=>u(i),children:[e.jsx(ke,{className:"w-full","aria-label":"Sort deployments",children:e.jsx(_e,{placeholder:"Sort by"})}),e.jsx(Ae,{children:Ts.map(i=>e.jsx(Ee,{value:i.value,children:i.label},i.value))})]})})]}),e.jsx(ue,{children:e.jsx("div",{className:"[&_[data-slot=table-container]]:overflow-visible",children:e.jsx(hs,{table:R})})}),e.jsx(Pe,{open:g,onOpenChange:f,children:e.jsxs(Oe,{children:[e.jsxs(Be,{children:[e.jsx(Ie,{children:"Delete Deployments"}),e.jsxs(Me,{children:["Are you sure you want to delete ",C," deployment",C!==1?"s":"","? This action cannot be undone."]})]}),e.jsxs(Le,{children:[e.jsx(E,{variant:"outline",onClick:()=>f(!1),children:"Cancel"}),e.jsx(E,{variant:"destructive",onClick:D,children:"Delete"})]})]})})]})},_s=({flow:s})=>e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("dl",{className:"flex flex-col gap-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Flow ID"}),e.jsx("dd",{className:"text-sm font-medium leading-none font-mono",children:s.id})]}),e.jsxs("dl",{className:"flex flex-col gap-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Created"}),e.jsx("dd",{className:"text-sm font-medium leading-none font-mono",children:s.created?e.jsx($,{date:s.created,format:"absolute"}):"N/A"})]}),e.jsxs("dl",{className:"flex flex-col gap-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Updated"}),e.jsx("dd",{className:"text-sm font-medium leading-none font-mono",children:s.updated?e.jsx($,{date:s.updated,format:"absolute"}):"N/A"})]})]}),As=({flow:s,onDelete:a})=>{const t=()=>{navigator.clipboard.writeText(s.id),H.success("ID copied")};return e.jsxs(xe,{children:[e.jsx(fe,{asChild:!0,children:e.jsxs(E,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(ce,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(je,{align:"end",children:[e.jsx(xs,{children:"Actions"}),e.jsx(Q,{onClick:t,children:"Copy ID"}),e.jsx(Q,{variant:"destructive",onClick:a,children:"Delete"})]})]})};function Es({flow:s,onDelete:a}){return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(ze,{children:e.jsxs(He,{children:[e.jsx(q,{children:e.jsx(Qe,{to:"/flows",className:"text-xl font-semibold",children:"Flows"})}),e.jsx(Ge,{}),e.jsx(q,{className:"text-xl font-semibold",children:e.jsx(Ke,{children:s.name})})]})}),e.jsx(As,{flow:s,onDelete:a})]})}const A=3e4,Ps={completed:{label:"Completed",color:"hsl(142.1 76.2% 36.3%)"},failed:{label:"Failed",color:"hsl(0 84.2% 60.2%)"}},Os=s=>{const a=[];let t=0,n=0;for(const l of s){let r=0,c=0;for(const d of l.states)d.state_type==="COMPLETED"?r+=d.count_runs:(d.state_type==="FAILED"||d.state_type==="CRASHED")&&(c+=d.count_runs);t+=r,n+=c,a.push({timestamp:l.interval_start,completed:t,failed:n})}return a};function Bs({flowId:s}){const[{data:a},{data:t},{data:n},{data:l},{data:r}]=G({queries:[O(Ve(s),A),O(Ue(s),A),O($e(s),A),O(qe(s),A),We(Ye(s),A)]}),c=o.useMemo(()=>Os(r),[r]),d=c.some(h=>h.failed>0),u=a-l,p=u>0?(t/u*100).toFixed(0):"0",x=u>0?(n/u*100).toFixed(1):"0";return e.jsxs(me,{className:"flex-1 relative overflow-hidden pb-20",children:[e.jsx(pe,{className:"pb-2",children:e.jsx(he,{children:"Task Runs"})}),e.jsx(ge,{children:e.jsxs("div",{className:"grid gap-1",children:[e.jsx("div",{className:"inline-flex items-end gap-1 text-base",children:e.jsx("span",{className:"font-semibold",children:a})}),l>0&&e.jsxs("div",{className:"inline-flex items-end gap-1 text-sm",children:[e.jsx("span",{className:"font-semibold text-blue-600",children:l}),e.jsx("span",{className:"text-muted-foreground",children:"Running"})]}),e.jsxs("div",{className:"inline-flex items-end gap-1 text-sm",children:[e.jsx("span",{className:"font-semibold text-green-600",children:t}),e.jsx("span",{className:"text-muted-foreground",children:"Completed"}),e.jsxs("span",{className:"text-green-600",children:[p,"%"]})]}),n>0&&e.jsxs("div",{className:"inline-flex items-end gap-1 text-sm",children:[e.jsx("span",{className:"font-semibold text-red-600",children:n}),e.jsx("span",{className:"text-muted-foreground",children:"Failed"}),e.jsxs("span",{className:"text-red-600",children:[x,"%"]})]})]})}),e.jsx("div",{className:"absolute bottom-4 left-0 right-0 h-16",children:e.jsx(Ze,{config:Ps,className:"h-full w-full",children:e.jsxs(Cs,{data:c,margin:{top:0,right:0,bottom:0,left:0},children:[e.jsxs("defs",{children:[e.jsxs("linearGradient",{id:"completedGradientFlow",x1:"0",y1:"1",x2:"0",y2:"0",children:[e.jsx("stop",{offset:"0%",stopColor:"var(--color-completed)",stopOpacity:0}),e.jsx("stop",{offset:"100%",stopColor:"var(--color-completed)",stopOpacity:.3})]}),e.jsxs("linearGradient",{id:"failedGradientFlow",x1:"0",y1:"1",x2:"0",y2:"0",children:[e.jsx("stop",{offset:"0%",stopColor:"var(--color-failed)",stopOpacity:0}),e.jsx("stop",{offset:"100%",stopColor:"var(--color-failed)",stopOpacity:.3})]})]}),d&&e.jsx(J,{type:"monotone",dataKey:"failed",stroke:"var(--color-failed)",strokeWidth:2,activeDot:!1,fill:"url(#failedGradientFlow)",dot:!1,isAnimationActive:!1}),e.jsx(J,{type:"monotone",dataKey:"completed",stroke:"var(--color-completed)",strokeWidth:2,activeDot:!1,fill:"url(#completedGradientFlow)",dot:!1,isAnimationActive:!1})]})})})]})}const ae=8,Is=4,te=3e4;function Ms({flowId:s,flow:a}){const[t,n]=o.useState(0),l=oe(t,150),r=o.useCallback(g=>{if(!g)return;const f=()=>{const b=g.getBoundingClientRect().width;n(Math.floor(b/(ae+Is)))};f();const y=new ResizeObserver(f);return y.observe(g),()=>y.disconnect()},[]),c=l||t,d=60,[{data:u},{data:p}]=G({queries:[re(Xe(s,d),te),Je(es(s),te)]}),x=o.useMemo(()=>u.map(g=>({...g,flow:a})),[u,a]),{startDate:h,endDate:j}=o.useMemo(()=>{const g=new Date;return{startDate:vs(g),endDate:g}},[]);return e.jsxs(me,{className:"flex-1",children:[e.jsxs(pe,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(he,{children:"Flow Runs"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[p," total"]})]}),e.jsx(ge,{children:e.jsx("div",{className:"h-24",ref:r,children:c===0?e.jsx(ss,{className:"h-full w-full"}):e.jsx(ue,{children:e.jsx(ie,{enrichedFlowRuns:x,startDate:h,endDate:j,numberOfBars:c,barWidth:ae,className:"h-full w-full"})})})})]})}function Ls({flowId:s,flow:a}){return e.jsxs("div",{className:"grid gap-5 md:grid-cols-[2fr_1fr]",children:[e.jsx(Ms,{flowId:s,flow:a}),e.jsx(Bs,{flowId:s})]})}function zs({flow:s,flowRuns:a,flowRunsCount:t,flowRunsPages:n,deployments:l,deploymentsCount:r,deploymentsPages:c,tab:d="runs",pagination:u,onPaginationChange:p,onPrefetchPage:x,sort:h,onSortChange:j,flowRunSearch:g,onFlowRunSearchChange:f,selectedStates:y,onSelectFilter:b,deploymentSearch:R,onDeploymentSearchChange:C,deploymentTags:D,onDeploymentTagsChange:S,deploymentSort:i,onDeploymentSortChange:v,deploymentPagination:w,onDeploymentPaginationChange:N}){const F=le(),[K,T]=o.useState(!1),[P,ye,{onSelectRow:be,clearSet:W}]=us(),V=a.map(k=>({...k,flow:s})),ve=o.useCallback(()=>{f(""),b(new Set),W()},[f,b,W]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"container mx-auto flex flex-col gap-4",children:[e.jsx(Es,{flow:s,onDelete:()=>T(!0)}),e.jsx(Ls,{flowId:s.id,flow:s}),e.jsxs(as,{value:d,onValueChange:k=>{F({to:".",search:Ce=>({...Ce,tab:k})})},children:[e.jsxs(ts,{children:[e.jsx(M,{value:"runs",children:"Runs"}),e.jsx(M,{value:"deployments",children:"Deployments"}),e.jsx(M,{value:"details",children:"Details"})]}),e.jsxs(L,{value:"runs",className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(ms,{count:t,results:V,selectedRows:P,setSelectedRows:ye}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(de,{placeholder:"Search by run name",value:g??"",onChange:k=>f(k.target.value),className:"w-64"}),e.jsx(is,{selectedFilters:y,onSelectFilter:b}),e.jsx(rs,{value:h,onSelect:j})]})]}),e.jsx(cs,{flowRuns:V,selectedRows:P,onSelect:be,onClearFilters:ve}),e.jsx(ds,{count:t,pages:n,pagination:u,onChangePagination:p,onPrefetchPage:x})]}),e.jsx(L,{value:"deployments",children:e.jsx(ks,{deployments:l,deploymentsCount:r,deploymentsPages:c,deploymentSearch:R,onDeploymentSearchChange:C,deploymentTags:D,onDeploymentTagsChange:S,deploymentSort:i,onDeploymentSortChange:v,deploymentPagination:w,onDeploymentPaginationChange:N})}),e.jsx(L,{value:"details",children:e.jsx(_s,{flow:s})})]})]}),e.jsx(ws,{flow:s,open:K,onOpenChange:T})]})}Ss({tab:B(["runs","deployments","details"]).optional().default("runs"),"runs.page":_().int().positive().optional().default(1),"runs.limit":_().int().positive().max(100).optional().default(10),"runs.sort":B(os).optional().default("START_TIME_DESC"),"runs.flowRuns.nameLike":I().optional().default(""),"runs.flowRuns.state.name":X(I()).optional(),type:B(["span","range"]).optional(),seconds:_().int().positive().optional(),startDateTime:ee().optional(),endDateTime:ee().optional(),"deployments.page":_().int().positive().optional().default(1),"deployments.limit":_().int().positive().optional().default(10),"deployments.nameLike":I().optional(),"deployments.tags":X(I()).optional(),"deployments.sort":B(["CREATED_DESC","UPDATED_DESC","NAME_ASC","NAME_DESC"]).optional().default("NAME_ASC")}).optional().default({});const ne=(s,a)=>{const t=s["runs.flowRuns.nameLike"],n=s["runs.flowRuns.state.name"]??[],r=t||n.length>0?{operator:"and_",...t&&{name:{like_:t}},...n.length>0&&{state:{operator:"and_",name:{any_:n}}}}:void 0;return{page:s["runs.page"],limit:s["runs.limit"],sort:s["runs.sort"],flow_runs:r,flows:{operator:"and_",id:{any_:[a]}}}},Hs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useMemo(()=>({page:s["runs.page"],limit:s["runs.limit"]}),[s["runs.page"],s["runs.limit"]]),n=o.useCallback(l=>{a({to:".",search:r=>({...r,"runs.page":l.page,"runs.limit":l.limit}),replace:!0})},[a]);return[t,n]},Qs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"runs.sort":n,"runs.page":1}),replace:!0})},[a]);return[s["runs.sort"],t]},Gs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"runs.flowRuns.nameLike":n,"runs.page":1}),replace:!0})},[a]);return[s["runs.flowRuns.nameLike"],t]},Ks=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useMemo(()=>new Set(s["runs.flowRuns.state.name"]||[]),[s["runs.flowRuns.state.name"]]),n=o.useCallback(l=>{a({to:".",search:r=>({...r,"runs.flowRuns.state.name":Array.from(l),"runs.page":1}),replace:!0})},[a]);return{selectedStates:t,onSelectFilter:n}},Ws=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"deployments.nameLike":n||void 0,"deployments.page":1}),replace:!0})},[a]);return[s["deployments.nameLike"],t]},Vs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"deployments.tags":n.length>0?n:void 0,"deployments.page":1}),replace:!0})},[a]);return[s["deployments.tags"]??[],t]},Us=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"deployments.sort":n,"deployments.page":1}),replace:!0})},[a]);return[s["deployments.sort"],t]},$s=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useMemo(()=>({page:s["deployments.page"],limit:s["deployments.limit"]}),[s["deployments.page"],s["deployments.limit"]]),n=o.useCallback(l=>{a({to:".",search:r=>({...r,"deployments.page":l.page,"deployments.limit":l.limit}),replace:!0})},[a]);return[t,n]},xa=()=>{const s=we(),{id:a}=m.useParams(),t=m.useSearch(),[n,l]=Hs(),[r,c]=Qs(),[d,u]=Gs(),{selectedStates:p,onSelectFilter:x}=Ks(),[h,j]=Ws(),[g,f]=Vs(),[y,b]=Us(),[R,C]=$s(),[{data:D}]=G({queries:[ns(a)]}),{data:S}=z(ls({sort:t["deployments.sort"],page:t["deployments.page"],limit:t["deployments.limit"],flows:{operator:"and_",id:{any_:[a]}},deployments:{operator:"and_",flow_or_deployment_name:{like_:t["deployments.nameLike"]},tags:{operator:"and_",all_:t["deployments.tags"]||[]}}}));Ds(D?.name?`Flow: ${D.name}`:"Flow");const{data:i}=z(Y(ne(t,a),3e4)),v=i?.results??[];o.useEffect(()=>{const N=v.map(F=>F.id);N.length>0&&s.prefetchQuery(Z(N))},[s,v]);const w=o.useCallback(N=>{const F=ne({...t,"runs.page":N},a);(async()=>{const T=(await s.ensureQueryData(Y(F,3e4)))?.results?.map(P=>P.id)??[];T.length>0&&s.prefetchQuery(Z(T))})()},[s,t,a]);return e.jsx(zs,{flow:D,flowRuns:v,flowRunsCount:i?.count??0,flowRunsPages:i?.pages??0,deployments:S?.results??[],deploymentsCount:S?.count??0,deploymentsPages:S?.pages??0,tab:t.tab,pagination:n,onPaginationChange:l,onPrefetchPage:w,sort:r,onSortChange:c,flowRunSearch:d,onFlowRunSearchChange:u,selectedStates:p,onSelectFilter:x,deploymentSearch:h,onDeploymentSearchChange:j,deploymentTags:g,onDeploymentTagsChange:f,deploymentSort:y,onDeploymentSortChange:b,deploymentPagination:R,onDeploymentPaginationChange:C})};export{xa as component};
2
+ //# sourceMappingURL=flow._id-V6-Qhkwk.js.map