prefect 3.6.14.dev1__py3-none-any.whl → 3.6.14.dev2__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 (228) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/_observers.py +20 -8
  3. prefect/cli/server.py +18 -3
  4. prefect/deployments/runner.py +448 -8
  5. prefect/flows.py +162 -34
  6. prefect/runner/runner.py +48 -0
  7. prefect/server/orchestration/global_policy.py +4 -2
  8. prefect/server/ui-v2/assets/{artifact-card-DkgEVahF.js → artifact-card-D41jcvLX.js} +2 -2
  9. prefect/server/ui-v2/assets/{artifact-card-DkgEVahF.js.map → artifact-card-D41jcvLX.js.map} +1 -1
  10. prefect/server/ui-v2/assets/{artifact._id-C7yJhkKY.js → artifact._id-CYMvBFBb.js} +2 -2
  11. prefect/server/ui-v2/assets/{artifact._id-C7yJhkKY.js.map → artifact._id-CYMvBFBb.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automation-wizard-BLI4sqs9.js → automation-wizard-DHsWJ8JS.js} +2 -2
  13. prefect/server/ui-v2/assets/{automation-wizard-BLI4sqs9.js.map → automation-wizard-DHsWJ8JS.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automation._id-OLes3du9.js → automation._id-CCroE1-1.js} +2 -2
  15. prefect/server/ui-v2/assets/{automation._id-OLes3du9.js.map → automation._id-CCroE1-1.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{automation_._id.edit-QrSzkDDB.js → automation_._id.edit-BgpDmMq7.js} +2 -2
  17. prefect/server/ui-v2/assets/{automation_._id.edit-QrSzkDDB.js.map → automation_._id.edit-BgpDmMq7.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{automations-header-BoJc9HK8.js → automations-header-BEZXZmli.js} +2 -2
  19. prefect/server/ui-v2/assets/{automations-header-BoJc9HK8.js.map → automations-header-BEZXZmli.js.map} +1 -1
  20. prefect/server/ui-v2/assets/{base-job-template-form-section-Br6s0jNS.js → base-job-template-form-section-BubT4OHj.js} +2 -2
  21. prefect/server/ui-v2/assets/{base-job-template-form-section-Br6s0jNS.js.map → base-job-template-form-section-BubT4OHj.js.map} +1 -1
  22. prefect/server/ui-v2/assets/{block-type-details-BSbBP-Nm.js → block-type-details-DCWuBOwb.js} +2 -2
  23. prefect/server/ui-v2/assets/{block-type-details-BSbBP-Nm.js.map → block-type-details-DCWuBOwb.js.map} +1 -1
  24. prefect/server/ui-v2/assets/{block-type-logo-DNFERTyH.js → block-type-logo-SZMe2NdY.js} +2 -2
  25. prefect/server/ui-v2/assets/{block-type-logo-DNFERTyH.js.map → block-type-logo-SZMe2NdY.js.map} +1 -1
  26. prefect/server/ui-v2/assets/{block._id-DO6Hulrv.js → block._id-B6_kwTZ-.js} +2 -2
  27. prefect/server/ui-v2/assets/{block._id-DO6Hulrv.js.map → block._id-B6_kwTZ-.js.map} +1 -1
  28. prefect/server/ui-v2/assets/{block_._id.edit-BWF0TQvv.js → block_._id.edit-Bjg9WgY6.js} +2 -2
  29. prefect/server/ui-v2/assets/{block_._id.edit-BWF0TQvv.js.map → block_._id.edit-Bjg9WgY6.js.map} +1 -1
  30. prefect/server/ui-v2/assets/{catalog-BlaqZP0r.js → catalog-Bv8x-rIx.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog-BlaqZP0r.js.map → catalog-Bv8x-rIx.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{catalog_._slug-BZWiMtjq.js → catalog_._slug-2GldfHc0.js} +2 -2
  33. prefect/server/ui-v2/assets/{catalog_._slug-BZWiMtjq.js.map → catalog_._slug-2GldfHc0.js.map} +1 -1
  34. prefect/server/ui-v2/assets/{catalog_._slug_.create-oHffbeMs.js → catalog_._slug_.create-Bjt7az95.js} +2 -2
  35. prefect/server/ui-v2/assets/{catalog_._slug_.create-oHffbeMs.js.map → catalog_._slug_.create-Bjt7az95.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{collapsible-D45P93xU.js → collapsible-BT0EnMmT.js} +2 -2
  37. prefect/server/ui-v2/assets/{collapsible-D45P93xU.js.map → collapsible-BT0EnMmT.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{concurrency-limit._id-B6oyPVya.js → concurrency-limit._id-Ba5Uof4l.js} +2 -2
  39. prefect/server/ui-v2/assets/{concurrency-limit._id-B6oyPVya.js.map → concurrency-limit._id-Ba5Uof4l.js.map} +1 -1
  40. prefect/server/ui-v2/assets/{create-CcYMd6w6.js → create-DK8Cy1hG.js} +2 -2
  41. prefect/server/ui-v2/assets/{create-CcYMd6w6.js.map → create-DK8Cy1hG.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{create-DK1WvDhf.js → create-Ds8Lheyk.js} +2 -2
  43. prefect/server/ui-v2/assets/{create-DK1WvDhf.js.map → create-Ds8Lheyk.js.map} +1 -1
  44. prefect/server/ui-v2/assets/cronstrue-C72j5NDa.js +2 -0
  45. prefect/server/ui-v2/assets/cronstrue-C72j5NDa.js.map +1 -0
  46. prefect/server/ui-v2/assets/{data-table-B_iyrrTm.js → data-table-B6bdz5Zj.js} +2 -2
  47. prefect/server/ui-v2/assets/{data-table-B_iyrrTm.js.map → data-table-B6bdz5Zj.js.map} +1 -1
  48. prefect/server/ui-v2/assets/{delete-confirmation-dialog-7GKqeKy1.js → delete-confirmation-dialog-CV8ITEEW.js} +2 -2
  49. prefect/server/ui-v2/assets/{delete-confirmation-dialog-7GKqeKy1.js.map → delete-confirmation-dialog-CV8ITEEW.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment-action-header-DrvnfE9Y.js → deployment-action-header-DpjOcab0.js} +2 -2
  51. prefect/server/ui-v2/assets/{deployment-action-header-DrvnfE9Y.js.map → deployment-action-header-DpjOcab0.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment-form-DsAij22s.js → deployment-form-CjIPPnwV.js} +3 -3
  53. prefect/server/ui-v2/assets/{deployment-form-DsAij22s.js.map → deployment-form-CjIPPnwV.js.map} +1 -1
  54. prefect/server/ui-v2/assets/{deployment-links-BwqfKWQX.js → deployment-links--VkBo9wV.js} +2 -2
  55. prefect/server/ui-v2/assets/{deployment-links-BwqfKWQX.js.map → deployment-links--VkBo9wV.js.map} +1 -1
  56. prefect/server/ui-v2/assets/{deployment._id-E5e5s6bO.js → deployment._id-CW00MZGG.js} +2 -2
  57. prefect/server/ui-v2/assets/{deployment._id-E5e5s6bO.js.map → deployment._id-CW00MZGG.js.map} +1 -1
  58. prefect/server/ui-v2/assets/{deployment._id-U6KrtWw0.js → deployment._id-DjYh9IiR.js} +2 -2
  59. prefect/server/ui-v2/assets/{deployment._id-U6KrtWw0.js.map → deployment._id-DjYh9IiR.js.map} +1 -1
  60. prefect/server/ui-v2/assets/deployment_._id.duplicate-18ZQHHgI.js +2 -0
  61. prefect/server/ui-v2/assets/{deployment_._id.duplicate-C_kNyCA9.js.map → deployment_._id.duplicate-18ZQHHgI.js.map} +1 -1
  62. prefect/server/ui-v2/assets/deployment_._id.edit-C9H0Teuv.js +2 -0
  63. prefect/server/ui-v2/assets/{deployment_._id.edit-BP8pfTOR.js.map → deployment_._id.edit-C9H0Teuv.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{deployment_._id.run-Di3-4Mtk.js → deployment_._id.run-CwHYw8j1.js} +2 -2
  65. prefect/server/ui-v2/assets/{deployment_._id.run-Di3-4Mtk.js.map → deployment_._id.run-CwHYw8j1.js.map} +1 -1
  66. prefect/server/ui-v2/assets/{dropdown-menu-iS8iJMpx.js → dropdown-menu-BYgkpoqb.js} +2 -2
  67. prefect/server/ui-v2/assets/{dropdown-menu-iS8iJMpx.js.map → dropdown-menu-BYgkpoqb.js.map} +1 -1
  68. prefect/server/ui-v2/assets/{event._eventDate._eventId-CG15qDSZ.js → event._eventDate._eventId-mPwFHce2.js} +2 -2
  69. prefect/server/ui-v2/assets/{event._eventDate._eventId-CG15qDSZ.js.map → event._eventDate._eventId-mPwFHce2.js.map} +1 -1
  70. prefect/server/ui-v2/assets/flow-run-graph-BMp5vJJa.js +2 -0
  71. prefect/server/ui-v2/assets/flow-run-graph-BMp5vJJa.js.map +1 -0
  72. prefect/server/ui-v2/assets/{flow-run._id-D_eAHZ5z.js → flow-run._id-CafHaMND.js} +2 -2
  73. prefect/server/ui-v2/assets/{flow-run._id-D_eAHZ5z.js.map → flow-run._id-CafHaMND.js.map} +1 -1
  74. prefect/server/ui-v2/assets/flow-run._id-CelqqA9P.js +4 -0
  75. prefect/server/ui-v2/assets/flow-run._id-CelqqA9P.js.map +1 -0
  76. prefect/server/ui-v2/assets/{flow-run._id-wco0Q19f.js → flow-run._id-hVuHWXbi.js} +2 -2
  77. prefect/server/ui-v2/assets/{flow-run._id-wco0Q19f.js.map → flow-run._id-hVuHWXbi.js.map} +1 -1
  78. prefect/server/ui-v2/assets/{flow-runs-pagination-DzGHOht3.js → flow-runs-pagination-CqjL9gOj.js} +2 -2
  79. prefect/server/ui-v2/assets/{flow-runs-pagination-DzGHOht3.js.map → flow-runs-pagination-CqjL9gOj.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{flow._id-Dn2so3rK.js → flow._id-C1Djus0m.js} +2 -2
  81. prefect/server/ui-v2/assets/{flow._id-Dn2so3rK.js.map → flow._id-C1Djus0m.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{form-rC8pxeRl.js → form-z_RaFdEo.js} +2 -2
  83. prefect/server/ui-v2/assets/{form-rC8pxeRl.js.map → form-z_RaFdEo.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-CuAwmJ64.js → header-B-PvVnN7.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-CuAwmJ64.js.map → header-B-PvVnN7.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{header-C0zV3WDn.js → header-BSXYXvPS.js} +2 -2
  87. prefect/server/ui-v2/assets/{header-C0zV3WDn.js.map → header-BSXYXvPS.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{header-C6ko3O7G.js → header-CKVO4oLE.js} +2 -2
  89. prefect/server/ui-v2/assets/{header-C6ko3O7G.js.map → header-CKVO4oLE.js.map} +1 -1
  90. prefect/server/ui-v2/assets/{index-CotXErTe.js → index-B5zctA6A.js} +2 -2
  91. prefect/server/ui-v2/assets/{index-CotXErTe.js.map → index-B5zctA6A.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-k2161reF.js → index-BCzGofA2.js} +2 -2
  93. prefect/server/ui-v2/assets/{index-k2161reF.js.map → index-BCzGofA2.js.map} +1 -1
  94. prefect/server/ui-v2/assets/{index-BdgomKuA.js → index-BOuQzuoR.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-BdgomKuA.js.map → index-BOuQzuoR.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-pE_31vXF.js → index-BQOxk1xu.js} +2 -2
  97. prefect/server/ui-v2/assets/{index-pE_31vXF.js.map → index-BQOxk1xu.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{index-Benf9xn3.js → index-BU1Y-wgo.js} +2 -2
  99. prefect/server/ui-v2/assets/{index-Benf9xn3.js.map → index-BU1Y-wgo.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{index-CYpFLd7y.js → index-BxGluvOD.js} +2 -2
  101. prefect/server/ui-v2/assets/{index-CYpFLd7y.js.map → index-BxGluvOD.js.map} +1 -1
  102. prefect/server/ui-v2/assets/{index-CcVSC2pV.js → index-CAbBPipD.js} +2 -2
  103. prefect/server/ui-v2/assets/{index-CcVSC2pV.js.map → index-CAbBPipD.js.map} +1 -1
  104. prefect/server/ui-v2/assets/index-CHwhYh-B.js +2 -0
  105. prefect/server/ui-v2/assets/{index-BYQ1P2TC.js.map → index-CHwhYh-B.js.map} +1 -1
  106. prefect/server/ui-v2/assets/{index-0g8aAM30.js → index-CIKCrLeZ.js} +2 -2
  107. prefect/server/ui-v2/assets/{index-0g8aAM30.js.map → index-CIKCrLeZ.js.map} +1 -1
  108. prefect/server/ui-v2/assets/{index-fhrsIceD.js → index-CLUjhc4A.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-fhrsIceD.js.map → index-CLUjhc4A.js.map} +1 -1
  110. prefect/server/ui-v2/assets/index-CX5uU1zd.js +2 -0
  111. prefect/server/ui-v2/assets/index-CX5uU1zd.js.map +1 -0
  112. prefect/server/ui-v2/assets/{index-DwkedbVy.js → index-CXVePXfG.js} +2 -2
  113. prefect/server/ui-v2/assets/{index-DwkedbVy.js.map → index-CXVePXfG.js.map} +1 -1
  114. prefect/server/ui-v2/assets/{index-DB2qeheX.js → index-D-ZIgaBw.js} +2 -2
  115. prefect/server/ui-v2/assets/{index-DB2qeheX.js.map → index-D-ZIgaBw.js.map} +1 -1
  116. prefect/server/ui-v2/assets/{index-D8fZaZa7.js → index-D10Svo9k.js} +2 -2
  117. prefect/server/ui-v2/assets/{index-D8fZaZa7.js.map → index-D10Svo9k.js.map} +1 -1
  118. prefect/server/ui-v2/assets/{index-CEStyUb-.js → index-D2EEipYt.js} +2 -2
  119. prefect/server/ui-v2/assets/{index-CEStyUb-.js.map → index-D2EEipYt.js.map} +1 -1
  120. prefect/server/ui-v2/assets/{index-BIqzfifB.js → index-DV5fpxXB.js} +2 -2
  121. prefect/server/ui-v2/assets/{index-BIqzfifB.js.map → index-DV5fpxXB.js.map} +1 -1
  122. prefect/server/ui-v2/assets/{index-C3D0Re7U.js → index-FHRYGk_R.js} +2 -2
  123. prefect/server/ui-v2/assets/{index-C3D0Re7U.js.map → index-FHRYGk_R.js.map} +1 -1
  124. prefect/server/ui-v2/assets/{index-CCs20W5W.js → index-IGxqySze.js} +2 -2
  125. prefect/server/ui-v2/assets/{index-CCs20W5W.js.map → index-IGxqySze.js.map} +1 -1
  126. prefect/server/ui-v2/assets/{index-BKbBu9gL.js → index-P2xc38Yh.js} +2 -2
  127. prefect/server/ui-v2/assets/{index-BKbBu9gL.js.map → index-P2xc38Yh.js.map} +1 -1
  128. prefect/server/ui-v2/assets/index-Yzhlw6-Q.js +17 -0
  129. prefect/server/ui-v2/assets/index-Yzhlw6-Q.js.map +1 -0
  130. prefect/server/ui-v2/assets/{index-BjsWjEUO.js → index-n7YFiQkB.js} +2 -2
  131. prefect/server/ui-v2/assets/{index-BjsWjEUO.js.map → index-n7YFiQkB.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{json-input-C9dkBSdc.js → json-input-Dlzy_XLK.js} +2 -2
  133. prefect/server/ui-v2/assets/{json-input-C9dkBSdc.js.map → json-input-Dlzy_XLK.js.map} +1 -1
  134. prefect/server/ui-v2/assets/{key._key-BBVH44_R.js → key._key-DN_txnIw.js} +2 -2
  135. prefect/server/ui-v2/assets/{key._key-BBVH44_R.js.map → key._key-DN_txnIw.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{lazy-markdown-BoMKGRXo.js → lazy-markdown-CPQjrQrX.js} +2 -2
  137. prefect/server/ui-v2/assets/{lazy-markdown-BoMKGRXo.js.map → lazy-markdown-CPQjrQrX.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{login-BmmIDesJ.js → login-BsnFlv-8.js} +2 -2
  139. prefect/server/ui-v2/assets/{login-BmmIDesJ.js.map → login-BsnFlv-8.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{markdown-input-C6P8cYT1.js → markdown-input-b0zl1NLl.js} +2 -2
  141. prefect/server/ui-v2/assets/{markdown-input-C6P8cYT1.js.map → markdown-input-b0zl1NLl.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{python-example-snippet-DPumgTpL.js → python-example-snippet-W9Z_3hjQ.js} +3 -3
  143. prefect/server/ui-v2/assets/{python-example-snippet-DPumgTpL.js.map → python-example-snippet-W9Z_3hjQ.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{python-input-DX4uV8MF.js → python-input-EKDBgTDE.js} +2 -2
  145. prefect/server/ui-v2/assets/{python-input-DX4uV8MF.js.map → python-input-EKDBgTDE.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{radio-group-DeNK-Ob0.js → radio-group-BMeznoY8.js} +2 -2
  147. prefect/server/ui-v2/assets/{radio-group-DeNK-Ob0.js.map → radio-group-BMeznoY8.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{route-error-state-C9CbByMx.js → route-error-state-BGOi4dn-.js} +2 -2
  149. prefect/server/ui-v2/assets/{route-error-state-C9CbByMx.js.map → route-error-state-BGOi4dn-.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{schema-form-B45xnsnK.js → schema-form-BHWTZ8Sy.js} +2 -2
  151. prefect/server/ui-v2/assets/{schema-form-B45xnsnK.js.map → schema-form-BHWTZ8Sy.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BJj81bu-.js → schema-form-input-string-format-datetime-hWIr4wQr.js} +4 -4
  153. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BJj81bu-.js.map → schema-form-input-string-format-datetime-hWIr4wQr.js.map} +1 -1
  154. prefect/server/ui-v2/assets/{settings-CbkeWqQ9.js → settings-DVSPGBen.js} +2 -2
  155. prefect/server/ui-v2/assets/{settings-CbkeWqQ9.js.map → settings-DVSPGBen.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{sort-filter-DM7SvBB0.js → sort-filter-MiwMjIYc.js} +2 -2
  157. prefect/server/ui-v2/assets/{sort-filter-DM7SvBB0.js.map → sort-filter-MiwMjIYc.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{table-CEPo6xb_.js → table-BJkw82b1.js} +2 -2
  159. prefect/server/ui-v2/assets/{table-CEPo6xb_.js.map → table-BJkw82b1.js.map} +1 -1
  160. prefect/server/ui-v2/assets/{tags-input-DJiZSVHp.js → tags-input-1KkWhGJZ.js} +2 -2
  161. prefect/server/ui-v2/assets/{tags-input-DJiZSVHp.js.map → tags-input-1KkWhGJZ.js.map} +1 -1
  162. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-vJEkvqWp.js → task-run-concurrency-limits-reset-dialog-ClBlDic_.js} +2 -2
  163. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-vJEkvqWp.js.map → task-run-concurrency-limits-reset-dialog-ClBlDic_.js.map} +1 -1
  164. prefect/server/ui-v2/assets/{task-run._id-BCnDnXrL.js → task-run._id-48TwMBP1.js} +2 -2
  165. prefect/server/ui-v2/assets/{task-run._id-BCnDnXrL.js.map → task-run._id-48TwMBP1.js.map} +1 -1
  166. prefect/server/ui-v2/assets/{task-run._id-ByJw1K82.js → task-run._id-BmK7HGNl.js} +2 -2
  167. prefect/server/ui-v2/assets/{task-run._id-ByJw1K82.js.map → task-run._id-BmK7HGNl.js.map} +1 -1
  168. prefect/server/ui-v2/assets/{task-runs-pagination-DbjB6XnY.js → task-runs-pagination-DA4izCRv.js} +2 -2
  169. prefect/server/ui-v2/assets/{task-runs-pagination-DbjB6XnY.js.map → task-runs-pagination-DA4izCRv.js.map} +1 -1
  170. prefect/server/ui-v2/assets/{textarea-BX8KbLGx.js → textarea-BqtBNhJB.js} +2 -2
  171. prefect/server/ui-v2/assets/{textarea-BX8KbLGx.js.map → textarea-BqtBNhJB.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{timezone-select-TBj2n6Ox.js → timezone-select-BgD_PENN.js} +2 -2
  173. prefect/server/ui-v2/assets/{timezone-select-TBj2n6Ox.js.map → timezone-select-BgD_PENN.js.map} +1 -1
  174. prefect/server/ui-v2/assets/{toggle-group-D7mfSUim.js → toggle-group-ChA-JYQB.js} +2 -2
  175. prefect/server/ui-v2/assets/{toggle-group-D7mfSUim.js.map → toggle-group-ChA-JYQB.js.map} +1 -1
  176. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-BpBSjz60.js → use-delete-automation-confirmation-dialog-Da1iWNZ_.js} +2 -2
  177. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-BpBSjz60.js.map → use-delete-automation-confirmation-dialog-Da1iWNZ_.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BjKsNw6b.js → use-delete-block-document-confirmation-dialog-DfrxGSyY.js} +2 -2
  179. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BjKsNw6b.js.map → use-delete-block-document-confirmation-dialog-DfrxGSyY.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-B_BlBMic.js → use-flow-runs-selected-rows-CYOsQ-Df.js} +2 -2
  181. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-B_BlBMic.js.map → use-flow-runs-selected-rows-CYOsQ-Df.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BfE433bC.js → use-get-artifacts-flow-task-runs-C0V3_gYz.js} +2 -2
  183. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BfE433bC.js.map → use-get-artifacts-flow-task-runs-C0V3_gYz.js.map} +1 -1
  184. prefect/server/ui-v2/assets/{use-quick-run-qrtcF-DD.js → use-quick-run-CgM0EheE.js} +2 -2
  185. prefect/server/ui-v2/assets/{use-quick-run-qrtcF-DD.js.map → use-quick-run-CgM0EheE.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{use-stepper-CVy1_GBw.js → use-stepper-CSAs1T4U.js} +2 -2
  187. prefect/server/ui-v2/assets/{use-stepper-CVy1_GBw.js.map → use-stepper-CSAs1T4U.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{utilities-D5-00wjP.js → utilities-DqaYuzh1.js} +2 -2
  189. prefect/server/ui-v2/assets/{utilities-D5-00wjP.js.map → utilities-DqaYuzh1.js.map} +1 -1
  190. prefect/server/ui-v2/assets/{vendor-date-7GxEwcQM.js → vendor-date-JS-ReHrg.js} +2 -2
  191. prefect/server/ui-v2/assets/{vendor-date-7GxEwcQM.js.map → vendor-date-JS-ReHrg.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{vendor-graphs-R8z6S3Jg.js → vendor-graphs-BRVnayIy.js} +2 -2
  193. prefect/server/ui-v2/assets/{vendor-graphs-R8z6S3Jg.js.map → vendor-graphs-BRVnayIy.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{vendor-radix-CznP1SOq.js → vendor-radix-BZJHvSaq.js} +9 -9
  195. prefect/server/ui-v2/assets/{vendor-radix-CznP1SOq.js.map → vendor-radix-BZJHvSaq.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{work-pool-filter-D8MkTbSW.js → work-pool-filter-T6dM4jKE.js} +2 -2
  197. prefect/server/ui-v2/assets/{work-pool-filter-D8MkTbSW.js.map → work-pool-filter-T6dM4jKE.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{work-pool-queue-toggle-CbI7Gfu5.js → work-pool-queue-toggle-CdUw2mAH.js} +2 -2
  199. prefect/server/ui-v2/assets/{work-pool-queue-toggle-CbI7Gfu5.js.map → work-pool-queue-toggle-CdUw2mAH.js.map} +1 -1
  200. prefect/server/ui-v2/assets/{work-pool._workPoolName-CCzzgVV2.js → work-pool._workPoolName-DD8gh9X-.js} +2 -2
  201. prefect/server/ui-v2/assets/{work-pool._workPoolName-CCzzgVV2.js.map → work-pool._workPoolName-DD8gh9X-.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-BAgiuU_j.js → work-pool_._workPoolName.edit-mmnZTSTy.js} +2 -2
  203. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-BAgiuU_j.js.map → work-pool_._workPoolName.edit-mmnZTSTy.js.map} +1 -1
  204. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BUawWJEy.js → work-pool_._workPoolName.queue._workQueueName-fbwQqkVN.js} +2 -2
  205. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BUawWJEy.js.map → work-pool_._workPoolName.queue._workQueueName-fbwQqkVN.js.map} +1 -1
  206. prefect/server/ui-v2/assets/{work-queue-icon-text-D_G_UCJX.js → work-queue-icon-text-YyKOH96e.js} +2 -2
  207. prefect/server/ui-v2/assets/{work-queue-icon-text-D_G_UCJX.js.map → work-queue-icon-text-YyKOH96e.js.map} +1 -1
  208. prefect/server/ui-v2/index.html +3 -3
  209. prefect/settings/models/runner.py +11 -0
  210. prefect/tasks.py +30 -4
  211. {prefect-3.6.14.dev1.dist-info → prefect-3.6.14.dev2.dist-info}/METADATA +1 -1
  212. {prefect-3.6.14.dev1.dist-info → prefect-3.6.14.dev2.dist-info}/RECORD +215 -215
  213. prefect/server/ui-v2/assets/cronstrue-WDy4rv2V.js +0 -2
  214. prefect/server/ui-v2/assets/cronstrue-WDy4rv2V.js.map +0 -1
  215. prefect/server/ui-v2/assets/deployment_._id.duplicate-C_kNyCA9.js +0 -2
  216. prefect/server/ui-v2/assets/deployment_._id.edit-BP8pfTOR.js +0 -2
  217. prefect/server/ui-v2/assets/flow-run-graph-B1vF1w0Z.js +0 -2
  218. prefect/server/ui-v2/assets/flow-run-graph-B1vF1w0Z.js.map +0 -1
  219. prefect/server/ui-v2/assets/flow-run._id-BHY61H6u.js +0 -4
  220. prefect/server/ui-v2/assets/flow-run._id-BHY61H6u.js.map +0 -1
  221. prefect/server/ui-v2/assets/index-BYQ1P2TC.js +0 -2
  222. prefect/server/ui-v2/assets/index-Cd7pM9pk.js +0 -17
  223. prefect/server/ui-v2/assets/index-Cd7pM9pk.js.map +0 -1
  224. prefect/server/ui-v2/assets/index-DvKYj8ko.js +0 -2
  225. prefect/server/ui-v2/assets/index-DvKYj8ko.js.map +0 -1
  226. {prefect-3.6.14.dev1.dist-info → prefect-3.6.14.dev2.dist-info}/WHEEL +0 -0
  227. {prefect-3.6.14.dev1.dist-info → prefect-3.6.14.dev2.dist-info}/entry_points.txt +0 -0
  228. {prefect-3.6.14.dev1.dist-info → prefect-3.6.14.dev2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["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","KeyValue","label","copyable","copyValue","handleCopy","textToCopy","toast","Icon","FlowRunDetails","FormattedDate","TagBadgeGroup","Fragment","FlowRunHeader","onDeleteClick","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","setFlowRunState","isChangingState","useSetFlowRunState","canChangeState","handleChangeState","newState","deployment","useQuery","buildDeploymentDetailsQuery","taskRunCount","buildCountTaskRunsQuery","parentFlowRuns","buildFilterFlowRunsQuery","parentFlowRun","formatTaskRunCount","count","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","Badge","StateBadge","formatDate","secondsToApproximateString","FlowIconText","Link","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","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","e","prev","handleStateFilterChange","newFilters","handleSortChange","newSort","handleClearFilters","handlePrefetchPage","page","hasFilters","Typography","SearchInput","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","MAX_FILTERS_DISPLAYED","TaskRunStateFilter","selectedFilters","onSelectFilter","className","open","setOpen","isAllButScheduled","flowRunStatesNoScheduleSet","FLOW_RUN_STATES_NO_SCHEDULED","filter","handleSelectAllExceptScheduled","handleSelectAllRunState","handleSelectFilter","updatedFilters","renderSelectedTags","selected","visible","extraCount","FLOW_RUN_STATES_MAP","Checkbox","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","isPending","useEffect","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/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/ui/key-value.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-details.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 { 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 { toast } from \"sonner\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype KeyValueProps = {\n\tlabel: string;\n\tvalue: React.ReactNode;\n\tcopyable?: boolean;\n\tcopyValue?: string;\n};\n\nexport function KeyValue({ label, value, copyable, copyValue }: KeyValueProps) {\n\tconst handleCopy = () => {\n\t\tconst textToCopy = copyValue ?? (typeof value === \"string\" ? value : \"\");\n\t\tvoid navigator.clipboard.writeText(textToCopy);\n\t\ttoast.success(`${label} copied`);\n\t};\n\n\treturn (\n\t\t<dl className=\"flex flex-col gap-1\">\n\t\t\t<dt className=\"text-muted-foreground text-sm\">{label}</dt>\n\t\t\t<dd className=\"text-sm flex items-center gap-2\">\n\t\t\t\t{value}\n\t\t\t\t{copyable && (\n\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={handleCopy}>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</dd>\n\t\t</dl>\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 { Link } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\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\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 { 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 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{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<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</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 { Typography } from \"@/components/ui/typography\";\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<Typography className=\"text-muted-foreground\">\n\t\t\t\t\tNo subflow runs found for this flow run.\n\t\t\t\t</Typography>\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<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{countData} Subflow run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</Typography>\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 { Typography } from \"@/components/ui/typography\";\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 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\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 { Typography } from \"@/components/ui/typography\";\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<Typography className=\"text-muted-foreground\">\n\t\t\t\t\tNo task runs found for this flow run.\n\t\t\t\t</Typography>\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<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{countData} Task run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</Typography>\n\t\t\t\t\t{stateSummary && (\n\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\tvariant=\"bodySmall\"\n\t\t\t\t\t\t\tclassName=\"text-muted-foreground text-xs capitalize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t({stateSummary})\n\t\t\t\t\t\t</Typography>\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 { 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\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>\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\tclassName=\"min-h-[200px]\"\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\tclassName=\"min-h-[200px]\"\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 { 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\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-CelqqA9P.js"}
@@ -1,2 +1,2 @@
1
- import{j as t,L as o}from"./vendor-tanstack-BK8oseNA.js";import{E as s,t as e,v as n,w as r,x as a,q as i}from"./index-Cd7pM9pk.js";import{o as m,e as p}from"./vendor-forms-DxqqmhL5.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-date-7GxEwcQM.js";function u(){return t.jsxs(s,{children:[t.jsx(e,{id:"Search"}),t.jsx(n,{children:"Flow Run Not Found"}),t.jsx(r,{children:"The flow run you are looking for does not exist or has been deleted."}),t.jsx(a,{children:t.jsx(i,{asChild:!0,children:t.jsx(o,{to:"/runs",children:"Back to Runs"})})})]})}m({tab:p(["Logs","TaskRuns","SubflowRuns","Artifacts","Details","Parameters","JobVariables"]).default("Logs").catch("Logs")});const y=u;export{y as notFoundComponent};
2
- //# sourceMappingURL=flow-run._id-wco0Q19f.js.map
1
+ import{j as t,L as o}from"./vendor-tanstack-BK8oseNA.js";import{E as s,t as e,v as n,w as r,x as a,q as i}from"./index-Yzhlw6-Q.js";import{o as m,e as p}from"./vendor-forms-DxqqmhL5.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BZJHvSaq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-date-JS-ReHrg.js";function u(){return t.jsxs(s,{children:[t.jsx(e,{id:"Search"}),t.jsx(n,{children:"Flow Run Not Found"}),t.jsx(r,{children:"The flow run you are looking for does not exist or has been deleted."}),t.jsx(a,{children:t.jsx(i,{asChild:!0,children:t.jsx(o,{to:"/runs",children:"Back to Runs"})})})]})}m({tab:p(["Logs","TaskRuns","SubflowRuns","Artifacts","Details","Parameters","JobVariables"]).default("Logs").catch("Logs")});const y=u;export{y as notFoundComponent};
2
+ //# sourceMappingURL=flow-run._id-hVuHWXbi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow-run._id-wco0Q19f.js","sources":["../../src/components/flow-runs/flow-run-not-found.tsx","../../src/routes/runs/flow-run.$id.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport function FlowRunNotFound() {\n\treturn (\n\t\t<EmptyState>\n\t\t\t<EmptyStateIcon id=\"Search\" />\n\t\t\t<EmptyStateTitle>Flow Run Not Found</EmptyStateTitle>\n\t\t\t<EmptyStateDescription>\n\t\t\t\tThe flow run you are looking for does not exist or has been deleted.\n\t\t\t</EmptyStateDescription>\n\t\t\t<EmptyStateActions>\n\t\t\t\t<Button asChild>\n\t\t\t\t\t<Link to=\"/runs\">Back to Runs</Link>\n\t\t\t\t</Button>\n\t\t\t</EmptyStateActions>\n\t\t</EmptyState>\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 { 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\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"],"names":["FlowRunNotFound","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","Button","Link","z","tab","default","catch","SplitNotFoundComponent"],"mappings":"wUAUO,SAASA,GAAkB,CACjC,cACEC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAe,GAAG,QAAA,CAAS,EAC5BD,EAAAA,IAACE,GAAgB,SAAA,oBAAA,CAAkB,EACnCF,EAAAA,IAACG,GAAsB,SAAA,sEAAA,CAEvB,EACAH,EAAAA,IAACI,EAAA,CACA,SAAAJ,EAAAA,IAACK,EAAA,CAAO,QAAO,GACd,SAAAL,EAAAA,IAACM,EAAA,CAAK,GAAG,QAAQ,SAAA,cAAA,CAAY,CAAA,CAC9B,CAAA,CACD,CAAA,EACD,CAEF,CCZqBC,EAAS,CAC7BC,IAAKD,EACE,CACL,OACA,WACA,cACA,YACA,UACA,aACA,cAAc,CACd,EACAE,QAAQ,MAAM,EACdC,MAAM,MAAM,CACf,CAAC,EAE0E,MAAAC,EAlBlEb"}
1
+ {"version":3,"file":"flow-run._id-hVuHWXbi.js","sources":["../../src/components/flow-runs/flow-run-not-found.tsx","../../src/routes/runs/flow-run.$id.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport function FlowRunNotFound() {\n\treturn (\n\t\t<EmptyState>\n\t\t\t<EmptyStateIcon id=\"Search\" />\n\t\t\t<EmptyStateTitle>Flow Run Not Found</EmptyStateTitle>\n\t\t\t<EmptyStateDescription>\n\t\t\t\tThe flow run you are looking for does not exist or has been deleted.\n\t\t\t</EmptyStateDescription>\n\t\t\t<EmptyStateActions>\n\t\t\t\t<Button asChild>\n\t\t\t\t\t<Link to=\"/runs\">Back to Runs</Link>\n\t\t\t\t</Button>\n\t\t\t</EmptyStateActions>\n\t\t</EmptyState>\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 { 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\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"],"names":["FlowRunNotFound","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","Button","Link","z","tab","default","catch","SplitNotFoundComponent"],"mappings":"wUAUO,SAASA,GAAkB,CACjC,cACEC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAe,GAAG,QAAA,CAAS,EAC5BD,EAAAA,IAACE,GAAgB,SAAA,oBAAA,CAAkB,EACnCF,EAAAA,IAACG,GAAsB,SAAA,sEAAA,CAEvB,EACAH,EAAAA,IAACI,EAAA,CACA,SAAAJ,EAAAA,IAACK,EAAA,CAAO,QAAO,GACd,SAAAL,EAAAA,IAACM,EAAA,CAAK,GAAG,QAAQ,SAAA,cAAA,CAAY,CAAA,CAC9B,CAAA,CACD,CAAA,EACD,CAEF,CCZqBC,EAAS,CAC7BC,IAAKD,EACE,CACL,OACA,WACA,cACA,YACA,UACA,aACA,cAAc,CACd,EACAE,QAAQ,MAAM,EACdC,MAAM,MAAM,CACf,CAAC,EAE0E,MAAAC,EAlBlEb"}
@@ -1,2 +1,2 @@
1
- import{r as v,j as e}from"./vendor-tanstack-BK8oseNA.js";import{cj as P,q as E,I as L,ak as N,ck as f,aq as k,al as M,cE as C,C as y,b5 as h,S as _,a as B,b as O,c as z,e as R,b6 as U,b7 as q,b8 as m,cs as V,b9 as W,ba as F,ct as G}from"./index-Cd7pM9pk.js";import{D as H,a as X,b as Y,d as g}from"./dropdown-menu-iS8iJMpx.js";const A=2,ee=({defaultValue:c,selectedFilters:l=c||new Set,onSelectFilter:s})=>{const[n,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(t=>a.has(t))},[l]),u=()=>{s(new Set(P))},j=()=>{s(new Set)},S=a=>{if(d){s(new Set([a]));return}const t=new Set(l);l.has(a)?t.delete(a):t.add(a),s(t)},p=()=>{if(l.size===0)return"All run states";if(d)return"All except scheduled";const a=Array.from(l),t=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:t.map(i=>e.jsx(k,{name:i,type:f[i]},i))}),o>0&&e.jsxs(M,{variant:"bodySmall",className:"shrink-0",children:["+ ",o]})]})};return e.jsxs(H,{open:n,onOpenChange:r,children:[e.jsx(X,{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(Y,{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:t=>{t.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))]})]})},se=({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(M,{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(n=>"onSelect"in s&&"selectedRows"in s?e.jsx("li",{children:e.jsx(C,{flowRun:n,checked:s.selectedRows.has(n.id),onCheckedChange:r=>s.onSelect(n.id,r)})},n.id):e.jsx("li",{children:e.jsx(C,{flowRun:n})},n.id))}):e.jsx(J,{numSkeletons:5}),J=({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(y,{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))}),Q=[5,10,25,50,100],ae=({count:c,pages:l,pagination:s,onChangePagination:n,onPrefetchPage:r})=>{const d=()=>n({limit:s.limit,page:1}),u=()=>n({limit:s.limit,page:s.page-1}),j=()=>n({limit:s.limit,page:s.page+1}),S=()=>n({limit:s.limit,page:l}),p=()=>{s.page>1&&r?.(1)},a=()=>{s.page>1&&r?.(s.page-1)},t=()=>{s.page<l&&r?.(s.page+1)},o=()=>{s.page<l&&r?.(l)},i=s.page<=1,w=s.page>=l,D=x=>{const b=Number(x),T=Math.ceil(c/b),I=Math.min(s.page,T);n({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:D,children:[e.jsx(B,{"aria-label":"Items per page",children:e.jsx(O,{placeholder:"Theme"})}),e.jsx(z,{children:Q.map(x=>e.jsx(R,{value:String(x),children:x},x))})]})]}),e.jsx(U,{className:"justify-end",children:e.jsxs(q,{children:[e.jsxs(m,{children:[e.jsx(V,{onClick:d,onMouseEnter:p,disabled:i}),e.jsx(W,{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(F,{onClick:j,onMouseEnter:t,disabled:w})}),e.jsx(m,{children:e.jsx(G,{onClick:S,onMouseEnter:o,disabled:w})})]})})]})};export{ae as F,ee as S,se as a};
2
- //# sourceMappingURL=flow-runs-pagination-DzGHOht3.js.map
1
+ import{r as v,j as e}from"./vendor-tanstack-BK8oseNA.js";import{cj as P,q as E,I as L,ak as N,ck as f,aq as k,al as M,cE as C,C as y,b5 as h,S as _,a as B,b as O,c as z,e as R,b6 as U,b7 as q,b8 as m,cs as V,b9 as W,ba as F,ct as G}from"./index-Yzhlw6-Q.js";import{D as H,a as X,b as Y,d as g}from"./dropdown-menu-BYgkpoqb.js";const A=2,ee=({defaultValue:c,selectedFilters:l=c||new Set,onSelectFilter:s})=>{const[n,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(t=>a.has(t))},[l]),u=()=>{s(new Set(P))},j=()=>{s(new Set)},S=a=>{if(d){s(new Set([a]));return}const t=new Set(l);l.has(a)?t.delete(a):t.add(a),s(t)},p=()=>{if(l.size===0)return"All run states";if(d)return"All except scheduled";const a=Array.from(l),t=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:t.map(i=>e.jsx(k,{name:i,type:f[i]},i))}),o>0&&e.jsxs(M,{variant:"bodySmall",className:"shrink-0",children:["+ ",o]})]})};return e.jsxs(H,{open:n,onOpenChange:r,children:[e.jsx(X,{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(Y,{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:t=>{t.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))]})]})},se=({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(M,{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(n=>"onSelect"in s&&"selectedRows"in s?e.jsx("li",{children:e.jsx(C,{flowRun:n,checked:s.selectedRows.has(n.id),onCheckedChange:r=>s.onSelect(n.id,r)})},n.id):e.jsx("li",{children:e.jsx(C,{flowRun:n})},n.id))}):e.jsx(J,{numSkeletons:5}),J=({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(y,{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))}),Q=[5,10,25,50,100],ae=({count:c,pages:l,pagination:s,onChangePagination:n,onPrefetchPage:r})=>{const d=()=>n({limit:s.limit,page:1}),u=()=>n({limit:s.limit,page:s.page-1}),j=()=>n({limit:s.limit,page:s.page+1}),S=()=>n({limit:s.limit,page:l}),p=()=>{s.page>1&&r?.(1)},a=()=>{s.page>1&&r?.(s.page-1)},t=()=>{s.page<l&&r?.(s.page+1)},o=()=>{s.page<l&&r?.(l)},i=s.page<=1,w=s.page>=l,D=x=>{const b=Number(x),T=Math.ceil(c/b),I=Math.min(s.page,T);n({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:D,children:[e.jsx(B,{"aria-label":"Items per page",children:e.jsx(O,{placeholder:"Theme"})}),e.jsx(z,{children:Q.map(x=>e.jsx(R,{value:String(x),children:x},x))})]})]}),e.jsx(U,{className:"justify-end",children:e.jsxs(q,{children:[e.jsxs(m,{children:[e.jsx(V,{onClick:d,onMouseEnter:p,disabled:i}),e.jsx(W,{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(F,{onClick:j,onMouseEnter:t,disabled:w})}),e.jsx(m,{children:e.jsx(G,{onClick:S,onMouseEnter:o,disabled:w})})]})})]})};export{ae as F,ee as S,se as a};
2
+ //# sourceMappingURL=flow-runs-pagination-CqjL9gOj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow-runs-pagination-DzGHOht3.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 { Typography } from \"@/components/ui/typography\";\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 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\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\";\nimport { Typography } from \"@/components/ui/typography\";\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<Typography>No runs found</Typography>\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","Typography","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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"}
1
+ {"version":3,"file":"flow-runs-pagination-CqjL9gOj.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 { Typography } from \"@/components/ui/typography\";\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 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\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\";\nimport { Typography } from \"@/components/ui/typography\";\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<Typography>No runs found</Typography>\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","Typography","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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"}
@@ -1,2 +1,2 @@
1
- import{u as oe,j as e,r as o,s as z,C as Se,D as we,E as G,m as Ne}from"./vendor-tanstack-BK8oseNA.js";import{aS as Re,y as H,bN as re,aN as ie,aR as ce,ak as V,q as E,I as de,cu as Fe,al as q,bO as Te,O as ue,S as ke,a as _e,b as Ae,c as Ee,e as Be,c4 as me,_ as Oe,$ as Pe,a0 as Me,a1 as Ie,a2 as Le,a3 as ze,bM as U,B as He,g as Qe,h as Y,bs as Ge,bB as We,bD as Ke,aD as O,cv as $e,cw as Ve,cx as qe,cy as Ue,cz as Ye,cA as Ze,C as pe,m as he,n as ge,o as xe,aX as Xe,aC as Je,cB as es,cC as ss,b5 as as,aw as ts,ax as ns,ay as I,az as L,cD as m,ao as ls,be as os,aE as Z,aH as X,aL as rs}from"./index-Cd7pM9pk.js";import{S as is}from"./sort-filter-DM7SvBB0.js";import{S as cs,a as ds,F as us}from"./flow-runs-pagination-DzGHOht3.js";import{u as ms,F as ps}from"./use-flow-runs-selected-rows-B_BlBMic.js";import{D as hs}from"./delete-confirmation-dialog-7GKqeKy1.js";import{D as gs}from"./data-table-B_iyrrTm.js";import{T as xs}from"./tags-input-DJiZSVHp.js";import{D as fe,a as ye,b as je,d as Q,c as fs}from"./dropdown-menu-iS8iJMpx.js";import{S as ys}from"./index-CYpFLd7y.js";import{S as js}from"./index-BKbBu9gL.js";import{s as bs,U as vs,_ as Cs}from"./vendor-date-7GxEwcQM.js";import{A as Ds,b as J}from"./vendor-recharts-D4imLXNl.js";import{u as Ss}from"./use-page-title-CGAfTz8r.js";import{o as ws,e as P,a as ee,s as M,n as _,d as se}from"./vendor-forms-DxqqmhL5.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./use-delete-confirmation-dialog-CvQEyyhU.js";import"./table-CEPo6xb_.js";import"./cronstrue-WDy4rv2V.js";import"./use-is-overflowing-Bv_2pq2B.js";const Ns=({flow:s,open:a,onOpenChange:t,onDeleted:n})=>{const l=oe(),{deleteFlow:r,isPending:c}=Re(),d=()=>{r(s.id,{onSuccess:()=>{H.success("Flow deleted"),n?.(),l({to:"/flows"})},onError:()=>{H.error("Failed to delete flow")}})};return e.jsx(hs,{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)})},ae=4,Rs=2,Fs=({deploymentId:s})=>{const[a,t]=o.useState(0),n=re(a,150),l=o.useCallback(u=>{if(!u)return;const p=()=>{const h=u.getBoundingClientRect().width;t(Math.floor(h/(ae+Rs)))};p();const x=new ResizeObserver(p);return x.observe(u),()=>{x.disconnect()}},[]),r=n||a,{data:c}=z(ie({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(ce,{enrichedFlowRuns:d,startDate:bs(new Date,vs),endDate:new Date,barWidth:ae,numberOfBars:r,className:"h-8 w-full",chartId:`deployment-${s}`})})},Ts=[{id:"select",header:({table:s})=>e.jsx(V,{checked:s.getIsAllPageRowsSelected(),onCheckedChange:a=>s.toggleAllPageRowsSelected(!!a),"aria-label":"Select all"}),cell:({row:s})=>e.jsx(V,{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(ys,{schedules:a})},size:150},{accessorKey:"activity",header:"Activity",cell:({row:s})=>s.original.id?e.jsx(Fs,{deploymentId:s.original.id}):null},{id:"actions",cell:({row:s})=>s.original.id?e.jsxs(fe,{children:[e.jsx(ye,{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(de,{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}],ks=[{label:"Created",value:"CREATED_DESC"},{label:"A to Z",value:"NAME_ASC"},{label:"Z to A",value:"NAME_DESC"}],_s=({deployments:s,deploymentsCount:a,deploymentsPages:t,deploymentSearch:n,onDeploymentSearchChange:l,deploymentTags:r,onDeploymentTagsChange:c,deploymentSort:d,onDeploymentSortChange:u,deploymentPagination:p,onDeploymentPaginationChange:x})=>{const[h,y]=o.useState({}),[g,f]=o.useState(!1),{deleteDeployment:j}=Fe(),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}),y({})},[p,x]),R=Se({data:s,columns:Ts,getCoreRowModel:we(),manualPagination:!0,pageCount:t,state:{rowSelection:h,pagination:{pageIndex:p.page-1,pageSize:p.limit}},onRowSelectionChange:y,onPaginationChange:b,getRowId:i=>i.id}),C=Object.keys(h).length,D=o.useCallback(()=>{const i=Object.keys(h);for(const v of i)j(v);y({}),f(!1)},[h,j]),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(q,{variant:"bodySmall",className:"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(Te,{className:"h-4 w-4"})})]}):e.jsxs(q,{variant:"bodySmall",className:"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(ue,{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(xs,{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(ke,{value:d,onValueChange:i=>u(i),children:[e.jsx(_e,{className:"w-full","aria-label":"Sort deployments",children:e.jsx(Ae,{placeholder:"Sort by"})}),e.jsx(Ee,{children:ks.map(i=>e.jsx(Be,{value:i.value,children:i.label},i.value))})]})})]}),e.jsx(me,{children:e.jsx("div",{className:"[&_[data-slot=table-container]]:overflow-visible",children:e.jsx(gs,{table:R})})}),e.jsx(Oe,{open:g,onOpenChange:f,children:e.jsxs(Pe,{children:[e.jsxs(Me,{children:[e.jsx(Ie,{children:"Delete Deployments"}),e.jsxs(Le,{children:["Are you sure you want to delete ",C," deployment",C!==1?"s":"","? This action cannot be undone."]})]}),e.jsxs(ze,{children:[e.jsx(E,{variant:"outline",onClick:()=>f(!1),children:"Cancel"}),e.jsx(E,{variant:"destructive",onClick:D,children:"Delete"})]})]})})]})},As=({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(U,{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(U,{date:s.updated,format:"absolute"}):"N/A"})]})]}),Es=({flow:s,onDelete:a})=>{const t=()=>{navigator.clipboard.writeText(s.id),H.success("ID copied")};return e.jsxs(fe,{children:[e.jsx(ye,{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(de,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(je,{align:"end",children:[e.jsx(fs,{children:"Actions"}),e.jsx(Q,{onClick:t,children:"Copy ID"}),e.jsx(Q,{variant:"destructive",onClick:a,children:"Delete"})]})]})};function Bs({flow:s,onDelete:a}){return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(He,{children:e.jsxs(Qe,{children:[e.jsx(Y,{children:e.jsx(Ge,{to:"/flows",className:"text-xl font-semibold",children:"Flows"})}),e.jsx(We,{}),e.jsx(Y,{className:"text-xl font-semibold",children:e.jsx(Ke,{children:s.name})})]})}),e.jsx(Es,{flow:s,onDelete:a})]})}const A=3e4,Os={completed:{label:"Completed",color:"hsl(142.1 76.2% 36.3%)"},failed:{label:"Failed",color:"hsl(0 84.2% 60.2%)"}},Ps=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 Ms({flowId:s}){const[{data:a},{data:t},{data:n},{data:l},{data:r}]=G({queries:[O(Ve(s),A),O(qe(s),A),O(Ue(s),A),O(Ye(s),A),$e(Ze(s),A)]}),c=o.useMemo(()=>Ps(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(pe,{className:"flex-1 relative overflow-hidden pb-20",children:[e.jsx(he,{className:"pb-2",children:e.jsx(ge,{children:"Task Runs"})}),e.jsx(xe,{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(Xe,{config:Os,className:"h-full w-full",children:e.jsxs(Ds,{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 te=8,Is=4,ne=3e4;function Ls({flowId:s,flow:a}){const[t,n]=o.useState(0),l=re(t,150),r=o.useCallback(g=>{if(!g)return;const f=()=>{const b=g.getBoundingClientRect().width;n(Math.floor(b/(te+Is)))};f();const j=new ResizeObserver(f);return j.observe(g),()=>j.disconnect()},[]),c=l||t,d=60,[{data:u},{data:p}]=G({queries:[ie(es(s,d),ne),Je(ss(s),ne)]}),x=o.useMemo(()=>u.map(g=>({...g,flow:a})),[u,a]),{startDate:h,endDate:y}=o.useMemo(()=>{const g=new Date;return{startDate:Cs(g),endDate:g}},[]);return e.jsxs(pe,{className:"flex-1",children:[e.jsxs(he,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(ge,{children:"Flow Runs"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[p," total"]})]}),e.jsx(xe,{children:e.jsx("div",{className:"h-24",ref:r,children:c===0?e.jsx(as,{className:"h-full w-full"}):e.jsx(me,{children:e.jsx(ce,{enrichedFlowRuns:x,startDate:h,endDate:y,numberOfBars:c,barWidth:te,className:"h-full w-full"})})})})]})}function zs({flowId:s,flow:a}){return e.jsxs("div",{className:"grid gap-5 md:grid-cols-[2fr_1fr]",children:[e.jsx(Ls,{flowId:s,flow:a}),e.jsx(Ms,{flowId:s})]})}function Hs({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:y,flowRunSearch:g,onFlowRunSearchChange:f,selectedStates:j,onSelectFilter:b,deploymentSearch:R,onDeploymentSearchChange:C,deploymentTags:D,onDeploymentTagsChange:S,deploymentSort:i,onDeploymentSortChange:v,deploymentPagination:w,onDeploymentPaginationChange:N}){const F=oe(),[W,T]=o.useState(!1),[B,be,{onSelectRow:ve,clearSet:K}]=ms(),$=a.map(k=>({...k,flow:s})),Ce=o.useCallback(()=>{f(""),b(new Set),K()},[f,b,K]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"container mx-auto flex flex-col gap-4",children:[e.jsx(Bs,{flow:s,onDelete:()=>T(!0)}),e.jsx(zs,{flowId:s.id,flow:s}),e.jsxs(ts,{value:d,onValueChange:k=>{F({to:".",search:De=>({...De,tab:k})})},children:[e.jsxs(ns,{children:[e.jsx(I,{value:"runs",children:"Runs"}),e.jsx(I,{value:"deployments",children:"Deployments"}),e.jsx(I,{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(ps,{count:t,results:$,selectedRows:B,setSelectedRows:be}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(ue,{placeholder:"Search by run name",value:g??"",onChange:k=>f(k.target.value),className:"w-64"}),e.jsx(cs,{selectedFilters:j,onSelectFilter:b}),e.jsx(is,{value:h,onSelect:y})]})]}),e.jsx(ds,{flowRuns:$,selectedRows:B,onSelect:ve,onClearFilters:Ce}),e.jsx(us,{count:t,pages:n,pagination:u,onChangePagination:p,onPrefetchPage:x})]}),e.jsx(L,{value:"deployments",children:e.jsx(_s,{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(As,{flow:s})})]})]}),e.jsx(Ns,{flow:s,open:W,onOpenChange:T})]})}ws({tab:P(["runs","deployments","details"]).optional().default("runs"),"runs.page":_().int().positive().optional().default(1),"runs.limit":_().int().positive().max(100).optional().default(10),"runs.sort":P(rs).optional().default("START_TIME_DESC"),"runs.flowRuns.nameLike":M().optional().default(""),"runs.flowRuns.state.name":ee(M()).optional(),type:P(["span","range"]).optional(),seconds:_().int().positive().optional(),startDateTime:se().optional(),endDateTime:se().optional(),"deployments.page":_().int().positive().optional().default(1),"deployments.limit":_().int().positive().optional().default(10),"deployments.nameLike":M().optional(),"deployments.tags":ee(M()).optional(),"deployments.sort":P(["CREATED_DESC","UPDATED_DESC","NAME_ASC","NAME_DESC"]).optional().default("NAME_ASC")}).optional().default({});const le=(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]}}}},Qs=()=>{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]},Gs=()=>{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]},Ws=()=>{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}},$s=()=>{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]},qs=()=>{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]},Us=()=>{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]},fa=()=>{const s=Ne(),{id:a}=m.useParams(),t=m.useSearch(),[n,l]=Qs(),[r,c]=Gs(),[d,u]=Ws(),{selectedStates:p,onSelectFilter:x}=Ks(),[h,y]=$s(),[g,f]=Vs(),[j,b]=qs(),[R,C]=Us(),[{data:D}]=G({queries:[ls(a)]}),{data:S}=z(os({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"]||[]}}}));Ss(D?.name?`Flow: ${D.name}`:"Flow");const{data:i}=z(Z(le(t,a),3e4)),v=i?.results??[];o.useEffect(()=>{const N=v.map(F=>F.id);N.length>0&&s.prefetchQuery(X(N))},[s,v]);const w=o.useCallback(N=>{const F=le({...t,"runs.page":N},a);(async()=>{const T=(await s.ensureQueryData(Z(F,3e4)))?.results?.map(B=>B.id)??[];T.length>0&&s.prefetchQuery(X(T))})()},[s,t,a]);return e.jsx(Hs,{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:y,deploymentTags:g,onDeploymentTagsChange:f,deploymentSort:j,onDeploymentSortChange:b,deploymentPagination:R,onDeploymentPaginationChange:C})};export{fa as component};
2
- //# sourceMappingURL=flow._id-Dn2so3rK.js.map
1
+ import{u as oe,j as e,r as o,s as z,C as Se,D as we,E as G,m as Ne}from"./vendor-tanstack-BK8oseNA.js";import{aS as Re,y as H,bN as re,aN as ie,aR as ce,ak as V,q as E,I as de,cu as Fe,al as q,bO as Te,O as ue,S as ke,a as _e,b as Ae,c as Ee,e as Be,c4 as me,_ as Oe,$ as Pe,a0 as Me,a1 as Ie,a2 as Le,a3 as ze,bM as U,B as He,g as Qe,h as Y,bs as Ge,bB as We,bD as Ke,aD as O,cv as $e,cw as Ve,cx as qe,cy as Ue,cz as Ye,cA as Ze,C as pe,m as he,n as ge,o as xe,aX as Xe,aC as Je,cB as es,cC as ss,b5 as as,aw as ts,ax as ns,ay as I,az as L,cD as m,ao as ls,be as os,aE as Z,aH as X,aL as rs}from"./index-Yzhlw6-Q.js";import{S as is}from"./sort-filter-MiwMjIYc.js";import{S as cs,a as ds,F as us}from"./flow-runs-pagination-CqjL9gOj.js";import{u as ms,F as ps}from"./use-flow-runs-selected-rows-CYOsQ-Df.js";import{D as hs}from"./delete-confirmation-dialog-CV8ITEEW.js";import{D as gs}from"./data-table-B6bdz5Zj.js";import{T as xs}from"./tags-input-1KkWhGJZ.js";import{D as fe,a as ye,b as je,d as Q,c as fs}from"./dropdown-menu-BYgkpoqb.js";import{S as ys}from"./index-BxGluvOD.js";import{S as js}from"./index-P2xc38Yh.js";import{s as bs,U as vs,_ as Cs}from"./vendor-date-JS-ReHrg.js";import{A as Ds,b as J}from"./vendor-recharts-D4imLXNl.js";import{u as Ss}from"./use-page-title-CGAfTz8r.js";import{o as ws,e as P,a as ee,s as M,n as _,d as se}from"./vendor-forms-DxqqmhL5.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BZJHvSaq.js";import"./use-delete-confirmation-dialog-CvQEyyhU.js";import"./table-BJkw82b1.js";import"./cronstrue-C72j5NDa.js";import"./use-is-overflowing-Bv_2pq2B.js";const Ns=({flow:s,open:a,onOpenChange:t,onDeleted:n})=>{const l=oe(),{deleteFlow:r,isPending:c}=Re(),d=()=>{r(s.id,{onSuccess:()=>{H.success("Flow deleted"),n?.(),l({to:"/flows"})},onError:()=>{H.error("Failed to delete flow")}})};return e.jsx(hs,{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)})},ae=4,Rs=2,Fs=({deploymentId:s})=>{const[a,t]=o.useState(0),n=re(a,150),l=o.useCallback(u=>{if(!u)return;const p=()=>{const h=u.getBoundingClientRect().width;t(Math.floor(h/(ae+Rs)))};p();const x=new ResizeObserver(p);return x.observe(u),()=>{x.disconnect()}},[]),r=n||a,{data:c}=z(ie({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(ce,{enrichedFlowRuns:d,startDate:bs(new Date,vs),endDate:new Date,barWidth:ae,numberOfBars:r,className:"h-8 w-full",chartId:`deployment-${s}`})})},Ts=[{id:"select",header:({table:s})=>e.jsx(V,{checked:s.getIsAllPageRowsSelected(),onCheckedChange:a=>s.toggleAllPageRowsSelected(!!a),"aria-label":"Select all"}),cell:({row:s})=>e.jsx(V,{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(ys,{schedules:a})},size:150},{accessorKey:"activity",header:"Activity",cell:({row:s})=>s.original.id?e.jsx(Fs,{deploymentId:s.original.id}):null},{id:"actions",cell:({row:s})=>s.original.id?e.jsxs(fe,{children:[e.jsx(ye,{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(de,{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}],ks=[{label:"Created",value:"CREATED_DESC"},{label:"A to Z",value:"NAME_ASC"},{label:"Z to A",value:"NAME_DESC"}],_s=({deployments:s,deploymentsCount:a,deploymentsPages:t,deploymentSearch:n,onDeploymentSearchChange:l,deploymentTags:r,onDeploymentTagsChange:c,deploymentSort:d,onDeploymentSortChange:u,deploymentPagination:p,onDeploymentPaginationChange:x})=>{const[h,y]=o.useState({}),[g,f]=o.useState(!1),{deleteDeployment:j}=Fe(),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}),y({})},[p,x]),R=Se({data:s,columns:Ts,getCoreRowModel:we(),manualPagination:!0,pageCount:t,state:{rowSelection:h,pagination:{pageIndex:p.page-1,pageSize:p.limit}},onRowSelectionChange:y,onPaginationChange:b,getRowId:i=>i.id}),C=Object.keys(h).length,D=o.useCallback(()=>{const i=Object.keys(h);for(const v of i)j(v);y({}),f(!1)},[h,j]),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(q,{variant:"bodySmall",className:"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(Te,{className:"h-4 w-4"})})]}):e.jsxs(q,{variant:"bodySmall",className:"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(ue,{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(xs,{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(ke,{value:d,onValueChange:i=>u(i),children:[e.jsx(_e,{className:"w-full","aria-label":"Sort deployments",children:e.jsx(Ae,{placeholder:"Sort by"})}),e.jsx(Ee,{children:ks.map(i=>e.jsx(Be,{value:i.value,children:i.label},i.value))})]})})]}),e.jsx(me,{children:e.jsx("div",{className:"[&_[data-slot=table-container]]:overflow-visible",children:e.jsx(gs,{table:R})})}),e.jsx(Oe,{open:g,onOpenChange:f,children:e.jsxs(Pe,{children:[e.jsxs(Me,{children:[e.jsx(Ie,{children:"Delete Deployments"}),e.jsxs(Le,{children:["Are you sure you want to delete ",C," deployment",C!==1?"s":"","? This action cannot be undone."]})]}),e.jsxs(ze,{children:[e.jsx(E,{variant:"outline",onClick:()=>f(!1),children:"Cancel"}),e.jsx(E,{variant:"destructive",onClick:D,children:"Delete"})]})]})})]})},As=({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(U,{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(U,{date:s.updated,format:"absolute"}):"N/A"})]})]}),Es=({flow:s,onDelete:a})=>{const t=()=>{navigator.clipboard.writeText(s.id),H.success("ID copied")};return e.jsxs(fe,{children:[e.jsx(ye,{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(de,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(je,{align:"end",children:[e.jsx(fs,{children:"Actions"}),e.jsx(Q,{onClick:t,children:"Copy ID"}),e.jsx(Q,{variant:"destructive",onClick:a,children:"Delete"})]})]})};function Bs({flow:s,onDelete:a}){return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(He,{children:e.jsxs(Qe,{children:[e.jsx(Y,{children:e.jsx(Ge,{to:"/flows",className:"text-xl font-semibold",children:"Flows"})}),e.jsx(We,{}),e.jsx(Y,{className:"text-xl font-semibold",children:e.jsx(Ke,{children:s.name})})]})}),e.jsx(Es,{flow:s,onDelete:a})]})}const A=3e4,Os={completed:{label:"Completed",color:"hsl(142.1 76.2% 36.3%)"},failed:{label:"Failed",color:"hsl(0 84.2% 60.2%)"}},Ps=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 Ms({flowId:s}){const[{data:a},{data:t},{data:n},{data:l},{data:r}]=G({queries:[O(Ve(s),A),O(qe(s),A),O(Ue(s),A),O(Ye(s),A),$e(Ze(s),A)]}),c=o.useMemo(()=>Ps(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(pe,{className:"flex-1 relative overflow-hidden pb-20",children:[e.jsx(he,{className:"pb-2",children:e.jsx(ge,{children:"Task Runs"})}),e.jsx(xe,{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(Xe,{config:Os,className:"h-full w-full",children:e.jsxs(Ds,{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 te=8,Is=4,ne=3e4;function Ls({flowId:s,flow:a}){const[t,n]=o.useState(0),l=re(t,150),r=o.useCallback(g=>{if(!g)return;const f=()=>{const b=g.getBoundingClientRect().width;n(Math.floor(b/(te+Is)))};f();const j=new ResizeObserver(f);return j.observe(g),()=>j.disconnect()},[]),c=l||t,d=60,[{data:u},{data:p}]=G({queries:[ie(es(s,d),ne),Je(ss(s),ne)]}),x=o.useMemo(()=>u.map(g=>({...g,flow:a})),[u,a]),{startDate:h,endDate:y}=o.useMemo(()=>{const g=new Date;return{startDate:Cs(g),endDate:g}},[]);return e.jsxs(pe,{className:"flex-1",children:[e.jsxs(he,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(ge,{children:"Flow Runs"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[p," total"]})]}),e.jsx(xe,{children:e.jsx("div",{className:"h-24",ref:r,children:c===0?e.jsx(as,{className:"h-full w-full"}):e.jsx(me,{children:e.jsx(ce,{enrichedFlowRuns:x,startDate:h,endDate:y,numberOfBars:c,barWidth:te,className:"h-full w-full"})})})})]})}function zs({flowId:s,flow:a}){return e.jsxs("div",{className:"grid gap-5 md:grid-cols-[2fr_1fr]",children:[e.jsx(Ls,{flowId:s,flow:a}),e.jsx(Ms,{flowId:s})]})}function Hs({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:y,flowRunSearch:g,onFlowRunSearchChange:f,selectedStates:j,onSelectFilter:b,deploymentSearch:R,onDeploymentSearchChange:C,deploymentTags:D,onDeploymentTagsChange:S,deploymentSort:i,onDeploymentSortChange:v,deploymentPagination:w,onDeploymentPaginationChange:N}){const F=oe(),[W,T]=o.useState(!1),[B,be,{onSelectRow:ve,clearSet:K}]=ms(),$=a.map(k=>({...k,flow:s})),Ce=o.useCallback(()=>{f(""),b(new Set),K()},[f,b,K]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"container mx-auto flex flex-col gap-4",children:[e.jsx(Bs,{flow:s,onDelete:()=>T(!0)}),e.jsx(zs,{flowId:s.id,flow:s}),e.jsxs(ts,{value:d,onValueChange:k=>{F({to:".",search:De=>({...De,tab:k})})},children:[e.jsxs(ns,{children:[e.jsx(I,{value:"runs",children:"Runs"}),e.jsx(I,{value:"deployments",children:"Deployments"}),e.jsx(I,{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(ps,{count:t,results:$,selectedRows:B,setSelectedRows:be}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(ue,{placeholder:"Search by run name",value:g??"",onChange:k=>f(k.target.value),className:"w-64"}),e.jsx(cs,{selectedFilters:j,onSelectFilter:b}),e.jsx(is,{value:h,onSelect:y})]})]}),e.jsx(ds,{flowRuns:$,selectedRows:B,onSelect:ve,onClearFilters:Ce}),e.jsx(us,{count:t,pages:n,pagination:u,onChangePagination:p,onPrefetchPage:x})]}),e.jsx(L,{value:"deployments",children:e.jsx(_s,{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(As,{flow:s})})]})]}),e.jsx(Ns,{flow:s,open:W,onOpenChange:T})]})}ws({tab:P(["runs","deployments","details"]).optional().default("runs"),"runs.page":_().int().positive().optional().default(1),"runs.limit":_().int().positive().max(100).optional().default(10),"runs.sort":P(rs).optional().default("START_TIME_DESC"),"runs.flowRuns.nameLike":M().optional().default(""),"runs.flowRuns.state.name":ee(M()).optional(),type:P(["span","range"]).optional(),seconds:_().int().positive().optional(),startDateTime:se().optional(),endDateTime:se().optional(),"deployments.page":_().int().positive().optional().default(1),"deployments.limit":_().int().positive().optional().default(10),"deployments.nameLike":M().optional(),"deployments.tags":ee(M()).optional(),"deployments.sort":P(["CREATED_DESC","UPDATED_DESC","NAME_ASC","NAME_DESC"]).optional().default("NAME_ASC")}).optional().default({});const le=(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]}}}},Qs=()=>{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]},Gs=()=>{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]},Ws=()=>{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}},$s=()=>{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]},qs=()=>{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]},Us=()=>{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]},fa=()=>{const s=Ne(),{id:a}=m.useParams(),t=m.useSearch(),[n,l]=Qs(),[r,c]=Gs(),[d,u]=Ws(),{selectedStates:p,onSelectFilter:x}=Ks(),[h,y]=$s(),[g,f]=Vs(),[j,b]=qs(),[R,C]=Us(),[{data:D}]=G({queries:[ls(a)]}),{data:S}=z(os({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"]||[]}}}));Ss(D?.name?`Flow: ${D.name}`:"Flow");const{data:i}=z(Z(le(t,a),3e4)),v=i?.results??[];o.useEffect(()=>{const N=v.map(F=>F.id);N.length>0&&s.prefetchQuery(X(N))},[s,v]);const w=o.useCallback(N=>{const F=le({...t,"runs.page":N},a);(async()=>{const T=(await s.ensureQueryData(Z(F,3e4)))?.results?.map(B=>B.id)??[];T.length>0&&s.prefetchQuery(X(T))})()},[s,t,a]);return e.jsx(Hs,{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:y,deploymentTags:g,onDeploymentTagsChange:f,deploymentSort:j,onDeploymentSortChange:b,deploymentPagination:R,onDeploymentPaginationChange:C})};export{fa as component};
2
+ //# sourceMappingURL=flow._id-C1Djus0m.js.map