prefect 3.6.15__py3-none-any.whl → 3.6.16.dev3__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 (259) hide show
  1. prefect/__init__.py +20 -0
  2. prefect/_build_info.py +3 -3
  3. prefect/_internal/analytics/__init__.py +80 -0
  4. prefect/_internal/analytics/_config.py +2 -0
  5. prefect/_internal/analytics/ci_detection.py +39 -0
  6. prefect/_internal/analytics/client.py +132 -0
  7. prefect/_internal/analytics/device_id.py +55 -0
  8. prefect/_internal/analytics/emit.py +90 -0
  9. prefect/_internal/analytics/enabled.py +33 -0
  10. prefect/_internal/analytics/events.py +14 -0
  11. prefect/_internal/analytics/milestones.py +177 -0
  12. prefect/_internal/analytics/notice.py +60 -0
  13. prefect/_internal/analytics/service.py +238 -0
  14. prefect/analytics/__init__.py +67 -0
  15. prefect/deployments/runner.py +20 -0
  16. prefect/flow_engine.py +16 -0
  17. prefect/flows.py +8 -0
  18. prefect/logging/formatters.py +24 -1
  19. prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js → artifact-card-BclosG8t.js} +2 -2
  20. prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js.map → artifact-card-BclosG8t.js.map} +1 -1
  21. prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js +2 -0
  22. prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js.map +1 -0
  23. prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js → automation-wizard-Bmgt6nn8.js} +2 -2
  24. prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js.map → automation-wizard-Bmgt6nn8.js.map} +1 -1
  25. prefect/server/ui-v2/assets/automation._id-Ccke3KJz.js +2 -0
  26. prefect/server/ui-v2/assets/{automation._id-Dn7jABys.js.map → automation._id-Ccke3KJz.js.map} +1 -1
  27. prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js → automation_._id.edit-BlKPUTVf.js} +2 -2
  28. prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js.map → automation_._id.edit-BlKPUTVf.js.map} +1 -1
  29. prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js → automations-header-Df2zw3SC.js} +2 -2
  30. prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js.map → automations-header-Df2zw3SC.js.map} +1 -1
  31. prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js → base-job-template-form-section-oZD6U-RW.js} +2 -2
  32. prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js.map → base-job-template-form-section-oZD6U-RW.js.map} +1 -1
  33. prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js → block-type-details-CYrdaLot.js} +2 -2
  34. prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js.map → block-type-details-CYrdaLot.js.map} +1 -1
  35. prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js +2 -0
  36. prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js.map +1 -0
  37. prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js → block._id-CBgHrpTP.js} +2 -2
  38. prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js.map → block._id-CBgHrpTP.js.map} +1 -1
  39. prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js → block_._id.edit-CW-kdi4O.js} +2 -2
  40. prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js.map → block_._id.edit-CW-kdi4O.js.map} +1 -1
  41. prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js → catalog-Brh0kn1I.js} +2 -2
  42. prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js.map → catalog-Brh0kn1I.js.map} +1 -1
  43. prefect/server/ui-v2/assets/catalog_._slug-MCgzguIZ.js +2 -0
  44. prefect/server/ui-v2/assets/{catalog_._slug-Bl2J2oI3.js.map → catalog_._slug-MCgzguIZ.js.map} +1 -1
  45. prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js → catalog_._slug_.create-DBaeHi9Q.js} +2 -2
  46. prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js.map → catalog_._slug_.create-DBaeHi9Q.js.map} +1 -1
  47. prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js → collapsible-B_NJS0uJ.js} +2 -2
  48. prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js.map → collapsible-B_NJS0uJ.js.map} +1 -1
  49. prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js → concurrency-limit._id-qzNUQzQa.js} +2 -2
  50. prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js.map → concurrency-limit._id-qzNUQzQa.js.map} +1 -1
  51. prefect/server/ui-v2/assets/create-BwXG6EIb.js +2 -0
  52. prefect/server/ui-v2/assets/{create-D--LHaji.js.map → create-BwXG6EIb.js.map} +1 -1
  53. prefect/server/ui-v2/assets/{create-BycfZHGQ.js → create-MoiIE9Ms.js} +2 -2
  54. prefect/server/ui-v2/assets/{create-BycfZHGQ.js.map → create-MoiIE9Ms.js.map} +1 -1
  55. prefect/server/ui-v2/assets/data-table-CPkppyg6.js +2 -0
  56. prefect/server/ui-v2/assets/data-table-CPkppyg6.js.map +1 -0
  57. prefect/server/ui-v2/assets/delete-confirmation-dialog-CwDK_2QS.js +2 -0
  58. prefect/server/ui-v2/assets/{delete-confirmation-dialog-DHkm2p8m.js.map → delete-confirmation-dialog-CwDK_2QS.js.map} +1 -1
  59. prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js → deployment-action-header-Vp9YsCJO.js} +2 -2
  60. prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js.map → deployment-action-header-Vp9YsCJO.js.map} +1 -1
  61. prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js → deployment-form-CJcg_6DJ.js} +3 -3
  62. prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js.map → deployment-form-CJcg_6DJ.js.map} +1 -1
  63. prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js → deployment-links-CIkJIuHh.js} +2 -2
  64. prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js.map → deployment-links-CIkJIuHh.js.map} +1 -1
  65. prefect/server/ui-v2/assets/deployment._id-C6XrGMp_.js +2 -0
  66. prefect/server/ui-v2/assets/{deployment._id-Ci9zge5n.js.map → deployment._id-C6XrGMp_.js.map} +1 -1
  67. prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js → deployment._id-CWgTYmTG.js} +2 -2
  68. prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js.map → deployment._id-CWgTYmTG.js.map} +1 -1
  69. prefect/server/ui-v2/assets/deployment_._id.duplicate-Bg0s0ZJn.js +2 -0
  70. prefect/server/ui-v2/assets/{deployment_._id.duplicate-D9ZWkh8H.js.map → deployment_._id.duplicate-Bg0s0ZJn.js.map} +1 -1
  71. prefect/server/ui-v2/assets/deployment_._id.edit-CnoB0UeG.js +2 -0
  72. prefect/server/ui-v2/assets/{deployment_._id.edit-CS7sObzC.js.map → deployment_._id.edit-CnoB0UeG.js.map} +1 -1
  73. prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js → deployment_._id.run-BqPK6rTB.js} +2 -2
  74. prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js.map → deployment_._id.run-BqPK6rTB.js.map} +1 -1
  75. prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js → dropdown-menu-D7Gwbd15.js} +2 -2
  76. prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js.map → dropdown-menu-D7Gwbd15.js.map} +1 -1
  77. prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js → event-resource-display-CDRgVKd4.js} +2 -2
  78. prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js.map → event-resource-display-CDRgVKd4.js.map} +1 -1
  79. prefect/server/ui-v2/assets/event._eventDate._eventId-C73GMDkK.js +2 -0
  80. prefect/server/ui-v2/assets/{event._eventDate._eventId-D7Twzb22.js.map → event._eventDate._eventId-C73GMDkK.js.map} +1 -1
  81. prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js → flow-run-graph-ckiE3mA9.js} +2 -2
  82. prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js.map → flow-run-graph-ckiE3mA9.js.map} +1 -1
  83. prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js → flow-run._id-BukrNCAq.js} +2 -2
  84. prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js.map → flow-run._id-BukrNCAq.js.map} +1 -1
  85. prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js → flow-run._id-CtI5VZ2M.js} +2 -2
  86. prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js.map → flow-run._id-CtI5VZ2M.js.map} +1 -1
  87. prefect/server/ui-v2/assets/flow-run._id-s1UJuakA.js +4 -0
  88. prefect/server/ui-v2/assets/{flow-run._id-RLy2kBh0.js.map → flow-run._id-s1UJuakA.js.map} +1 -1
  89. prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js → flow-runs-pagination-SLbYtvaR.js} +2 -2
  90. prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js.map → flow-runs-pagination-SLbYtvaR.js.map} +1 -1
  91. prefect/server/ui-v2/assets/flow._id-CZ5P0v4N.js +2 -0
  92. prefect/server/ui-v2/assets/{flow._id-BdQGWPKP.js.map → flow._id-CZ5P0v4N.js.map} +1 -1
  93. prefect/server/ui-v2/assets/{form-DLrbC7rV.js → form-mws4law8.js} +2 -2
  94. prefect/server/ui-v2/assets/{form-DLrbC7rV.js.map → form-mws4law8.js.map} +1 -1
  95. prefect/server/ui-v2/assets/{header-BTAWyeXv.js → header-Bes1LmY7.js} +2 -2
  96. prefect/server/ui-v2/assets/{header-BTAWyeXv.js.map → header-Bes1LmY7.js.map} +1 -1
  97. prefect/server/ui-v2/assets/{header-ChFAx5uR.js → header-Bj_zBR-a.js} +2 -2
  98. prefect/server/ui-v2/assets/{header-ChFAx5uR.js.map → header-Bj_zBR-a.js.map} +1 -1
  99. prefect/server/ui-v2/assets/{header-CyQqOj1w.js → header-CPxTHSvz.js} +2 -2
  100. prefect/server/ui-v2/assets/{header-CyQqOj1w.js.map → header-CPxTHSvz.js.map} +1 -1
  101. prefect/server/ui-v2/assets/{index-m48E4KcG.js → index-B8vo2Lrg.js} +5 -5
  102. prefect/server/ui-v2/assets/{index-m48E4KcG.js.map → index-B8vo2Lrg.js.map} +1 -1
  103. prefect/server/ui-v2/assets/{index-D5RT-SAp.js → index-BBeh-3Nh.js} +2 -2
  104. prefect/server/ui-v2/assets/{index-D5RT-SAp.js.map → index-BBeh-3Nh.js.map} +1 -1
  105. prefect/server/ui-v2/assets/index-BLnEvHia.js +2 -0
  106. prefect/server/ui-v2/assets/{index-7i4X9TeK.js.map → index-BLnEvHia.js.map} +1 -1
  107. prefect/server/ui-v2/assets/index-BpKoubXu.js +2 -0
  108. prefect/server/ui-v2/assets/index-BpKoubXu.js.map +1 -0
  109. prefect/server/ui-v2/assets/index-By6YGqR3.js +2 -0
  110. prefect/server/ui-v2/assets/index-By6YGqR3.js.map +1 -0
  111. prefect/server/ui-v2/assets/index-CEi3BlKI.js +2 -0
  112. prefect/server/ui-v2/assets/index-CEi3BlKI.js.map +1 -0
  113. prefect/server/ui-v2/assets/{index-BaWDC4da.js → index-CS-zxv7Z.js} +2 -2
  114. prefect/server/ui-v2/assets/{index-BaWDC4da.js.map → index-CS-zxv7Z.js.map} +1 -1
  115. prefect/server/ui-v2/assets/{index-kP_I5Qfd.js → index-CToHKh4q.js} +2 -2
  116. prefect/server/ui-v2/assets/{index-kP_I5Qfd.js.map → index-CToHKh4q.js.map} +1 -1
  117. prefect/server/ui-v2/assets/{index-CKGj5lSu.js → index-CUVvZndW.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-CKGj5lSu.js.map → index-CUVvZndW.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{index-CxUfZRkN.js → index-CYVn-I3i.js} +2 -2
  120. prefect/server/ui-v2/assets/{index-CxUfZRkN.js.map → index-CYVn-I3i.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{index-CnlN-VC_.js → index-Cun0JN4t.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-CnlN-VC_.js.map → index-Cun0JN4t.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-BwCLKpNb.js → index-D6ynV6U7.js} +2 -2
  124. prefect/server/ui-v2/assets/{index-BwCLKpNb.js.map → index-D6ynV6U7.js.map} +1 -1
  125. prefect/server/ui-v2/assets/{index-CHf6xi9j.js → index-DdNUJLRW.js} +2 -2
  126. prefect/server/ui-v2/assets/{index-CHf6xi9j.js.map → index-DdNUJLRW.js.map} +1 -1
  127. prefect/server/ui-v2/assets/{index-CQnWiUE5.js → index-DlHOXQhu.js} +2 -2
  128. prefect/server/ui-v2/assets/{index-CQnWiUE5.js.map → index-DlHOXQhu.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js → index-DyVw8YE8.js} +2 -2
  130. prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js.map → index-DyVw8YE8.js.map} +1 -1
  131. prefect/server/ui-v2/assets/{index-Btb_-PDp.js → index-DzRz7D2P.js} +2 -2
  132. prefect/server/ui-v2/assets/{index-Btb_-PDp.js.map → index-DzRz7D2P.js.map} +1 -1
  133. prefect/server/ui-v2/assets/{index-DQGif3jm.js → index-DzUcVNZg.js} +2 -2
  134. prefect/server/ui-v2/assets/{index-DQGif3jm.js.map → index-DzUcVNZg.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{index-DNh9ZBy4.js → index-IBvMMs6S.js} +2 -2
  136. prefect/server/ui-v2/assets/{index-DNh9ZBy4.js.map → index-IBvMMs6S.js.map} +1 -1
  137. prefect/server/ui-v2/assets/index-_kpA__te.js +2 -0
  138. prefect/server/ui-v2/assets/{index-CiSFHkhI.js.map → index-_kpA__te.js.map} +1 -1
  139. prefect/server/ui-v2/assets/index-m9O-nIOl.css +1 -0
  140. prefect/server/ui-v2/assets/{index-lyQav_XM.js → index-wOvyf10b.js} +2 -2
  141. prefect/server/ui-v2/assets/{index-lyQav_XM.js.map → index-wOvyf10b.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js → json-input-Ce-HlRqa.js} +2 -2
  143. prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js.map → json-input-Ce-HlRqa.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js → key-value-XHEZOtZX.js} +2 -2
  145. prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js.map → key-value-XHEZOtZX.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js → key._key-LpsMf3zD.js} +2 -2
  147. prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js.map → key._key-LpsMf3zD.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js → lazy-markdown-1Hz0xzca.js} +2 -2
  149. prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js.map → lazy-markdown-1Hz0xzca.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{login-DxMF9Jvj.js → login-D5uepl9L.js} +2 -2
  151. prefect/server/ui-v2/assets/{login-DxMF9Jvj.js.map → login-D5uepl9L.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js → markdown-input-CG6M9zD0.js} +2 -2
  153. prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js.map → markdown-input-CG6M9zD0.js.map} +1 -1
  154. prefect/server/ui-v2/assets/python-example-snippet-DRHcUlCX.js +3 -0
  155. prefect/server/ui-v2/assets/{python-example-snippet-DfCFYPN_.js.map → python-example-snippet-DRHcUlCX.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{python-input-mr6GD840.js → python-input-BsUS8fw1.js} +2 -2
  157. prefect/server/ui-v2/assets/{python-input-mr6GD840.js.map → python-input-BsUS8fw1.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js → radio-group-BUsmwdrt.js} +2 -2
  159. prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js.map → radio-group-BUsmwdrt.js.map} +1 -1
  160. prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js → route-error-state-BFBpiIhD.js} +2 -2
  161. prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js.map → route-error-state-BFBpiIhD.js.map} +1 -1
  162. prefect/server/ui-v2/assets/{schema-form-CWDHSME9.js → schema-form-BwTmkvJk.js} +2 -2
  163. prefect/server/ui-v2/assets/schema-form-BwTmkvJk.js.map +1 -0
  164. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js → schema-form-input-string-format-datetime-nrb3g-JJ.js} +4 -4
  165. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js.map → schema-form-input-string-format-datetime-nrb3g-JJ.js.map} +1 -1
  166. prefect/server/ui-v2/assets/{settings-DU5y6tJE.js → settings-CUBtK5aW.js} +2 -2
  167. prefect/server/ui-v2/assets/{settings-DU5y6tJE.js.map → settings-CUBtK5aW.js.map} +1 -1
  168. prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js → sort-filter-Cv8zAXMp.js} +2 -2
  169. prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js.map → sort-filter-Cv8zAXMp.js.map} +1 -1
  170. prefect/server/ui-v2/assets/{table-bBL6C0ZK.js → table-BBNGfPra.js} +2 -2
  171. prefect/server/ui-v2/assets/{table-bBL6C0ZK.js.map → table-BBNGfPra.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js → tags-input-DHrnkwjQ.js} +2 -2
  173. prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js.map → tags-input-DHrnkwjQ.js.map} +1 -1
  174. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js +2 -0
  175. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-S69sih55.js.map → task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js.map} +1 -1
  176. prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js → task-run._id-BY58gqs2.js} +2 -2
  177. prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js.map → task-run._id-BY58gqs2.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js → task-run._id-u73Jxfqw.js} +3 -3
  179. prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js.map → task-run._id-u73Jxfqw.js.map} +1 -1
  180. prefect/server/ui-v2/assets/task-runs-pagination-DUy3147A.js +2 -0
  181. prefect/server/ui-v2/assets/{task-runs-pagination-VdR-LO4r.js.map → task-runs-pagination-DUy3147A.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js → textarea-DUhh6-kq.js} +2 -2
  183. prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js.map → textarea-DUhh6-kq.js.map} +1 -1
  184. prefect/server/ui-v2/assets/timezone-select-D4Q6VBtD.js +2 -0
  185. prefect/server/ui-v2/assets/{timezone-select-BuPYznge.js.map → timezone-select-D4Q6VBtD.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js → toggle-group-7WUJn2Tx.js} +2 -2
  187. prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js.map → toggle-group-7WUJn2Tx.js.map} +1 -1
  188. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-D4AD5Ndf.js +2 -0
  189. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DpdsLH4t.js.map → use-delete-automation-confirmation-dialog-D4AD5Ndf.js.map} +1 -1
  190. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js → use-delete-block-document-confirmation-dialog-DnwWEGUY.js} +2 -2
  191. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js.map → use-delete-block-document-confirmation-dialog-DnwWEGUY.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js → use-flow-runs-selected-rows-C-tehPRB.js} +2 -2
  193. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js.map → use-flow-runs-selected-rows-C-tehPRB.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js → use-get-artifacts-flow-task-runs-DRWRrmrb.js} +2 -2
  195. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js.map → use-get-artifacts-flow-task-runs-DRWRrmrb.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js → use-quick-run-B4Xj-YQQ.js} +2 -2
  197. prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js.map → use-quick-run-B4Xj-YQQ.js.map} +1 -1
  198. prefect/server/ui-v2/assets/use-state-favicon-au2TZdMV.js +2 -0
  199. prefect/server/ui-v2/assets/{use-state-favicon-M09DmrNy.js.map → use-state-favicon-au2TZdMV.js.map} +1 -1
  200. prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js → use-stepper-DyIb3vlq.js} +2 -2
  201. prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js.map → use-stepper-DyIb3vlq.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js → utilities-D9Y2wo66.js} +2 -2
  203. prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js.map → utilities-D9Y2wo66.js.map} +1 -1
  204. prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js +34 -0
  205. prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js.map +1 -0
  206. prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js → work-pool-filter-CSOATj2D.js} +2 -2
  207. prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js.map → work-pool-filter-CSOATj2D.js.map} +1 -1
  208. prefect/server/ui-v2/assets/work-pool-queue-toggle-Dh7B1zMo.js +2 -0
  209. prefect/server/ui-v2/assets/{work-pool-queue-toggle-BQ9b-Wxy.js.map → work-pool-queue-toggle-Dh7B1zMo.js.map} +1 -1
  210. prefect/server/ui-v2/assets/work-pool._workPoolName-B_NFWXKS.js +2 -0
  211. prefect/server/ui-v2/assets/{work-pool._workPoolName-C_LiL3SE.js.map → work-pool._workPoolName-B_NFWXKS.js.map} +1 -1
  212. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js → work-pool_._workPoolName.edit-Cyzn8g-S.js} +2 -2
  213. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js.map → work-pool_._workPoolName.edit-Cyzn8g-S.js.map} +1 -1
  214. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js} +2 -2
  215. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js.map → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js.map} +1 -1
  216. prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js → work-queue-icon-text-BOpcJ8YU.js} +2 -2
  217. prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js.map → work-queue-icon-text-BOpcJ8YU.js.map} +1 -1
  218. prefect/server/ui-v2/index.html +3 -3
  219. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/METADATA +2 -1
  220. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/RECORD +223 -211
  221. prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js +0 -2
  222. prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js.map +0 -1
  223. prefect/server/ui-v2/assets/automation._id-Dn7jABys.js +0 -2
  224. prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js +0 -2
  225. prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js.map +0 -1
  226. prefect/server/ui-v2/assets/catalog_._slug-Bl2J2oI3.js +0 -2
  227. prefect/server/ui-v2/assets/create-D--LHaji.js +0 -2
  228. prefect/server/ui-v2/assets/data-table-rlbkLcrY.js +0 -2
  229. prefect/server/ui-v2/assets/data-table-rlbkLcrY.js.map +0 -1
  230. prefect/server/ui-v2/assets/delete-confirmation-dialog-DHkm2p8m.js +0 -2
  231. prefect/server/ui-v2/assets/deployment._id-Ci9zge5n.js +0 -2
  232. prefect/server/ui-v2/assets/deployment_._id.duplicate-D9ZWkh8H.js +0 -2
  233. prefect/server/ui-v2/assets/deployment_._id.edit-CS7sObzC.js +0 -2
  234. prefect/server/ui-v2/assets/event._eventDate._eventId-D7Twzb22.js +0 -2
  235. prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js +0 -4
  236. prefect/server/ui-v2/assets/flow._id-BdQGWPKP.js +0 -2
  237. prefect/server/ui-v2/assets/index-7i4X9TeK.js +0 -2
  238. prefect/server/ui-v2/assets/index-BkiGTHwU.js +0 -2
  239. prefect/server/ui-v2/assets/index-BkiGTHwU.js.map +0 -1
  240. prefect/server/ui-v2/assets/index-COouj_0-.css +0 -1
  241. prefect/server/ui-v2/assets/index-CiSFHkhI.js +0 -2
  242. prefect/server/ui-v2/assets/index-DATPYZfT.js +0 -2
  243. prefect/server/ui-v2/assets/index-DATPYZfT.js.map +0 -1
  244. prefect/server/ui-v2/assets/index-VH4TnZ4e.js +0 -2
  245. prefect/server/ui-v2/assets/index-VH4TnZ4e.js.map +0 -1
  246. prefect/server/ui-v2/assets/python-example-snippet-DfCFYPN_.js +0 -3
  247. prefect/server/ui-v2/assets/schema-form-CWDHSME9.js.map +0 -1
  248. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-S69sih55.js +0 -2
  249. prefect/server/ui-v2/assets/task-runs-pagination-VdR-LO4r.js +0 -2
  250. prefect/server/ui-v2/assets/timezone-select-BuPYznge.js +0 -2
  251. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DpdsLH4t.js +0 -2
  252. prefect/server/ui-v2/assets/use-state-favicon-M09DmrNy.js +0 -2
  253. prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js +0 -34
  254. prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js.map +0 -1
  255. prefect/server/ui-v2/assets/work-pool-queue-toggle-BQ9b-Wxy.js +0 -2
  256. prefect/server/ui-v2/assets/work-pool._workPoolName-C_LiL3SE.js +0 -2
  257. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/WHEEL +0 -0
  258. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/entry_points.txt +0 -0
  259. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"flow._id-BdQGWPKP.js","sources":["../../src/components/flows/detail/delete-flow-dialog.tsx","../../src/components/flows/detail/mini-deployment-activity.tsx","../../src/components/flows/detail/deployment-columns.tsx","../../src/components/flows/detail/flow-deployments-tab.tsx","../../src/components/flows/detail/flow-details.tsx","../../src/components/flows/detail/flow-menu.tsx","../../src/components/flows/detail/flow-page-header.tsx","../../src/components/flows/detail/flow-stats-summary/cumulative-task-runs-card.tsx","../../src/components/flows/detail/flow-stats-summary/flow-runs-history-card.tsx","../../src/components/flows/detail/flow-stats-summary/index.tsx","../../src/components/flows/detail/index.tsx","../../src/routes/flows/flow.$id.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport type { Flow } from \"@/api/flows\";\nimport { useDeleteFlowById } from \"@/api/flows\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\ntype DeleteFlowDialogProps = {\n\tflow: Flow;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tonDeleted?: () => void;\n};\n\nexport const DeleteFlowDialog = ({\n\tflow,\n\topen,\n\tonOpenChange,\n\tonDeleted,\n}: DeleteFlowDialogProps) => {\n\tconst navigate = useNavigate();\n\tconst { deleteFlow, isPending } = useDeleteFlowById();\n\n\tconst handleDelete = () => {\n\t\tdeleteFlow(flow.id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Flow deleted\");\n\t\t\t\tonDeleted?.();\n\t\t\t\tvoid navigate({ to: \"/flows\" });\n\t\t\t},\n\t\t\tonError: () => {\n\t\t\t\ttoast.error(\"Failed to delete flow\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<DeleteConfirmationDialog\n\t\t\tisOpen={open}\n\t\t\ttitle=\"Delete Flow\"\n\t\t\tdescription={`Are you sure you want to delete ${flow.name}? This action cannot be undone.`}\n\t\t\tisLoading={isPending}\n\t\t\tloadingText=\"Deleting...\"\n\t\t\tonConfirm={handleDelete}\n\t\t\tonClose={() => onOpenChange(false)}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subSeconds } from \"date-fns\";\nimport { secondsInWeek } from \"date-fns/constants\";\nimport { useCallback, useState } from \"react\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\nconst BAR_WIDTH = 4;\nconst BAR_GAP = 2;\n\ninterface MiniDeploymentActivityProps {\n\tdeploymentId: string;\n}\n\nexport const MiniDeploymentActivity = ({\n\tdeploymentId,\n}: MiniDeploymentActivityProps) => {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\tupdateBars();\n\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => {\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tconst effectiveNumberOfBars = debouncedNumberOfBars || numberOfBars;\n\n\tconst { data: flowRuns } = useQuery(\n\t\tbuildFilterFlowRunsQuery({\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: [deploymentId] },\n\t\t\t},\n\t\t\tlimit: Math.min(60, effectiveNumberOfBars || 60),\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst enrichedFlowRuns =\n\t\tflowRuns?.map((flowRun) => ({\n\t\t\t...flowRun,\n\t\t})) ?? [];\n\n\treturn (\n\t\t<div className=\"w-full\" ref={chartRef}>\n\t\t\t<FlowRunActivityBarChart\n\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\tstartDate={subSeconds(new Date(), secondsInWeek)}\n\t\t\t\tendDate={new Date()}\n\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\tnumberOfBars={effectiveNumberOfBars}\n\t\t\t\tclassName=\"h-8 w-full\"\n\t\t\t\tchartId={`deployment-${deploymentId}`}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { components } from \"@/api/prefect\";\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 { ScheduleBadgeGroup } from \"@/components/ui/schedule-badge\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { MiniDeploymentActivity } from \"./mini-deployment-activity\";\n\ntype Deployment = components[\"schemas\"][\"DeploymentResponse\"];\n\nexport const columns: ColumnDef<Deployment>[] = [\n\t{\n\t\tid: \"select\",\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\tonCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(!!value)}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t\tmaxSize: 20,\n\t\tminSize: 20,\n\t},\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: \"Name\",\n\t\tcell: ({ row }) => row.original.name,\n\t},\n\t{\n\t\taccessorKey: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => {\n\t\t\tconst status = row.original.paused\n\t\t\t\t? \"PAUSED\"\n\t\t\t\t: (row.original.status ?? \"NOT_READY\");\n\t\t\treturn <StatusBadge status={status} />;\n\t\t},\n\t},\n\t{\n\t\taccessorKey: \"tags\",\n\t\theader: \"Tags\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{row.original.tags?.map((tag) => (\n\t\t\t\t\t<span\n\t\t\t\t\t\tkey={tag}\n\t\t\t\t\t\tclassName=\"bg-gray-100 text-gray-800 text-xs font-medium px-2 py-0.5 rounded\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{tag}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t),\n\t},\n\t{\n\t\taccessorKey: \"schedules\",\n\t\theader: \"Schedules\",\n\t\tcell: ({ row }) => {\n\t\t\tconst schedules = row.original.schedules;\n\t\t\tif (!schedules || schedules.length === 0) return null;\n\t\t\treturn <ScheduleBadgeGroup schedules={schedules} />;\n\t\t},\n\t\tsize: 150,\n\t},\n\t{\n\t\taccessorKey: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: ({ row }) => {\n\t\t\tif (!row.original.id) return null;\n\t\t\treturn <MiniDeploymentActivity deploymentId={row.original.id} />;\n\t\t},\n\t},\n\t{\n\t\tid: \"actions\",\n\t\tcell: ({ row }) => {\n\t\t\tif (!row.original.id) return null;\n\n\t\t\treturn (\n\t\t\t\t<DropdownMenu>\n\t\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"ghost\" className=\"size-8 p-0\">\n\t\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t\t<Icon id=\"MoreHorizontal\" className=\"size-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(row.original.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCopy ID\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t</DropdownMenu>\n\t\t\t);\n\t\t},\n\t\tminSize: 30,\n\t\tmaxSize: 30,\n\t},\n];\n","import type { OnChangeFn, PaginationState } from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { Trash2 } from \"lucide-react\";\nimport type { ChangeEvent } from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { useDeleteDeployment } from \"@/api/deployments\";\nimport type { components } from \"@/api/prefect\";\nimport { Button } from \"@/components/ui/button\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { FlowRunActivityBarGraphTooltipProvider } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { columns as baseDeploymentColumns } from \"./deployment-columns\";\n\ntype DeploymentSort = components[\"schemas\"][\"DeploymentSort\"];\n\nconst SORT_OPTIONS: { label: string; value: DeploymentSort }[] = [\n\t{ label: \"Created\", value: \"CREATED_DESC\" },\n\t{ label: \"A to Z\", value: \"NAME_ASC\" },\n\t{ label: \"Z to A\", value: \"NAME_DESC\" },\n];\n\ntype FlowDeploymentsTabProps = {\n\tdeployments: components[\"schemas\"][\"DeploymentResponse\"][];\n\tdeploymentsCount: number;\n\tdeploymentsPages: number;\n\tdeploymentSearch: string | undefined;\n\tonDeploymentSearchChange: (search: string) => void;\n\tdeploymentTags: string[];\n\tonDeploymentTagsChange: (tags: string[]) => void;\n\tdeploymentSort: DeploymentSort;\n\tonDeploymentSortChange: (sort: DeploymentSort) => void;\n\tdeploymentPagination: { page: number; limit: number };\n\tonDeploymentPaginationChange: (pagination: {\n\t\tpage: number;\n\t\tlimit: number;\n\t}) => void;\n};\n\nexport const FlowDeploymentsTab = ({\n\tdeployments,\n\tdeploymentsCount,\n\tdeploymentsPages,\n\tdeploymentSearch,\n\tonDeploymentSearchChange,\n\tdeploymentTags,\n\tonDeploymentTagsChange,\n\tdeploymentSort,\n\tonDeploymentSortChange,\n\tdeploymentPagination,\n\tonDeploymentPaginationChange,\n}: FlowDeploymentsTabProps) => {\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\tconst { deleteDeployment } = useDeleteDeployment();\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tconst currentPagination: PaginationState = {\n\t\t\t\tpageIndex: deploymentPagination.page - 1,\n\t\t\t\tpageSize: deploymentPagination.limit,\n\t\t\t};\n\t\t\tconst newPagination =\n\t\t\t\ttypeof updater === \"function\" ? updater(currentPagination) : updater;\n\t\t\tonDeploymentPaginationChange({\n\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t});\n\t\t\tsetRowSelection({});\n\t\t},\n\t\t[deploymentPagination, onDeploymentPaginationChange],\n\t);\n\n\tconst deploymentsTable = useReactTable({\n\t\tdata: deployments,\n\t\tcolumns: baseDeploymentColumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tpageCount: deploymentsPages,\n\t\tstate: {\n\t\t\trowSelection,\n\t\t\tpagination: {\n\t\t\t\tpageIndex: deploymentPagination.page - 1,\n\t\t\t\tpageSize: deploymentPagination.limit,\n\t\t\t},\n\t\t},\n\t\tonRowSelectionChange: setRowSelection,\n\t\tonPaginationChange: handlePaginationChange,\n\t\tgetRowId: (row) => row.id,\n\t});\n\n\tconst selectedCount = Object.keys(rowSelection).length;\n\n\tconst handleDeleteSelected = useCallback(() => {\n\t\tconst selectedIds = Object.keys(rowSelection);\n\t\tfor (const id of selectedIds) {\n\t\t\tdeleteDeployment(id);\n\t\t}\n\t\tsetRowSelection({});\n\t\tsetShowDeleteDialog(false);\n\t}, [rowSelection, deleteDeployment]);\n\n\tconst handleDeploymentTagsChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (Array.isArray(e)) {\n\t\t\t\tonDeploymentTagsChange(e);\n\t\t\t}\n\t\t},\n\t\t[onDeploymentTagsChange],\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{/* Count and selection info - 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{selectedCount > 0 ? (\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t{selectedCount} selected\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 text-destructive hover:text-destructive\"\n\t\t\t\t\t\t\t\tonClick={() => setShowDeleteDialog(true)}\n\t\t\t\t\t\t\t\taria-label=\"Delete selected deployments\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Trash2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{deploymentsCount} Deployment{deploymentsCount !== 1 ? \"s\" : \"\"}\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 columns */}\n\t\t\t\t<div className=\"xl:col-span-4 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\tplaceholder=\"Search deployments...\"\n\t\t\t\t\t\tvalue={deploymentSearch ?? \"\"}\n\t\t\t\t\t\tonChange={(e) => onDeploymentSearchChange(e.target.value)}\n\t\t\t\t\t\taria-label=\"Search deployments\"\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<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tvalue={deploymentTags}\n\t\t\t\t\t\tonChange={handleDeploymentTagsChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\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-3 order-2\">\n\t\t\t\t\t<Select\n\t\t\t\t\t\tvalue={deploymentSort}\n\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\tonDeploymentSortChange(value as DeploymentSort)\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectTrigger className=\"w-full\" aria-label=\"Sort deployments\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{SORT_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t{/* Override table container overflow to allow chart tooltips to escape */}\n\t\t\t\t<div className=\"[&_[data-slot=table-container]]:overflow-visible\">\n\t\t\t\t\t<DataTable table={deploymentsTable} />\n\t\t\t\t</div>\n\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\n\t\t\t<Dialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n\t\t\t\t<DialogContent>\n\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t<DialogTitle>Delete Deployments</DialogTitle>\n\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\tAre you sure you want to delete {selectedCount} deployment\n\t\t\t\t\t\t\t{selectedCount !== 1 ? \"s\" : \"\"}? This action cannot be undone.\n\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tonClick={() => setShowDeleteDialog(false)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button variant=\"destructive\" onClick={handleDeleteSelected}>\n\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DialogFooter>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t</div>\n\t);\n};\n","import type { Flow } from \"@/api/flows\";\nimport { FormattedDate } from \"@/components/ui/formatted-date\";\n\ntype FlowDetailsProps = {\n\tflow: Flow;\n};\n\nexport const FlowDetails = ({ flow }: FlowDetailsProps) => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Flow ID</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.id}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Created</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.created ? (\n\t\t\t\t\t\t<FormattedDate date={flow.created} format=\"absolute\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"N/A\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Updated</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.updated ? (\n\t\t\t\t\t\t<FormattedDate date={flow.updated} format=\"absolute\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"N/A\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</div>\n\t);\n};\n","import { toast } from \"sonner\";\nimport type { Flow } from \"@/api/flows\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport type FlowMenuProps = {\n\tflow: Flow;\n\tonDelete: () => void;\n};\n\nexport const FlowMenu = ({ flow, onDelete }: FlowMenuProps) => {\n\tconst handleCopyId = () => {\n\t\tvoid navigator.clipboard.writeText(flow.id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={handleCopyId}>Copy ID</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem variant=\"destructive\" onClick={onDelete}>\n\t\t\t\t\tDelete\n\t\t\t\t</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import type { Flow } from \"@/api/flows\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { FlowMenu } from \"./flow-menu\";\n\ntype FlowPageHeaderProps = {\n\tflow: Flow;\n\tonDelete: () => void;\n};\n\nexport function FlowPageHeader({ flow, onDelete }: FlowPageHeaderProps) {\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink to=\"/flows\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tFlows\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t<BreadcrumbPage>{flow.name}</BreadcrumbPage>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<FlowMenu flow={flow} onDelete={onDelete} />\n\t\t</div>\n\t);\n}\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { Area, AreaChart } from \"recharts\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildTaskRunsHistoryQuery,\n\ttype HistoryResponse,\n} from \"@/api/task-runs\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { type ChartConfig, ChartContainer } from \"@/components/ui/chart\";\nimport {\n\tbuildCompletedTaskRunsCountFilter,\n\tbuildFailedTaskRunsCountFilter,\n\tbuildRunningTaskRunsCountFilter,\n\tbuildTaskRunsHistoryFilterForFlow,\n\tbuildTotalTaskRunsCountFilter,\n} from \"./query-filters\";\n\nconst REFETCH_INTERVAL = 30_000;\n\ntype CumulativeTaskRunsCardProps = {\n\tflowId: string;\n};\n\ntype ChartDataPoint = {\n\ttimestamp: string;\n\tcompleted: number;\n\tfailed: number;\n};\n\nconst chartConfig = {\n\tcompleted: {\n\t\tlabel: \"Completed\",\n\t\tcolor: \"hsl(142.1 76.2% 36.3%)\",\n\t},\n\tfailed: {\n\t\tlabel: \"Failed\",\n\t\tcolor: \"hsl(0 84.2% 60.2%)\",\n\t},\n} satisfies ChartConfig;\n\nconst transformHistoryToChartData = (\n\thistory: HistoryResponse[],\n): ChartDataPoint[] => {\n\tconst chartData: ChartDataPoint[] = [];\n\tlet cumulativeCompleted = 0;\n\tlet cumulativeFailed = 0;\n\n\tfor (const item of history) {\n\t\tlet completedCount = 0;\n\t\tlet failedCount = 0;\n\n\t\tfor (const state of item.states) {\n\t\t\tif (state.state_type === \"COMPLETED\") {\n\t\t\t\tcompletedCount += state.count_runs;\n\t\t\t} else if (\n\t\t\t\tstate.state_type === \"FAILED\" ||\n\t\t\t\tstate.state_type === \"CRASHED\"\n\t\t\t) {\n\t\t\t\tfailedCount += state.count_runs;\n\t\t\t}\n\t\t}\n\n\t\tcumulativeCompleted += completedCount;\n\t\tcumulativeFailed += failedCount;\n\n\t\tchartData.push({\n\t\t\ttimestamp: item.interval_start,\n\t\t\tcompleted: cumulativeCompleted,\n\t\t\tfailed: cumulativeFailed,\n\t\t});\n\t}\n\n\treturn chartData;\n};\n\nexport function CumulativeTaskRunsCard({\n\tflowId,\n}: CumulativeTaskRunsCardProps) {\n\tconst [\n\t\t{ data: total },\n\t\t{ data: completed },\n\t\t{ data: failed },\n\t\t{ data: running },\n\t\t{ data: history },\n\t] = useSuspenseQueries({\n\t\tqueries: [\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildTotalTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildCompletedTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildFailedTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildRunningTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildTaskRunsHistoryQuery(\n\t\t\t\tbuildTaskRunsHistoryFilterForFlow(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t],\n\t});\n\n\tconst chartData = useMemo(\n\t\t() => transformHistoryToChartData(history),\n\t\t[history],\n\t);\n\n\tconst hasFailedData = chartData.some((point) => point.failed > 0);\n\n\tconst percentComparisonTotal = total - running;\n\tconst completedPercentage =\n\t\tpercentComparisonTotal > 0\n\t\t\t? ((completed / percentComparisonTotal) * 100).toFixed(0)\n\t\t\t: \"0\";\n\tconst failedPercentage =\n\t\tpercentComparisonTotal > 0\n\t\t\t? ((failed / percentComparisonTotal) * 100).toFixed(1)\n\t\t\t: \"0\";\n\n\treturn (\n\t\t<Card className=\"flex-1 relative overflow-hidden pb-20\">\n\t\t\t<CardHeader className=\"pb-2\">\n\t\t\t\t<CardTitle>Task Runs</CardTitle>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t<div className=\"grid gap-1\">\n\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-base\">\n\t\t\t\t\t\t<span className=\"font-semibold\">{total}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{running > 0 && (\n\t\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"font-semibold text-blue-600\">{running}</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Running</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t<span className=\"font-semibold text-green-600\">{completed}</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Completed</span>\n\t\t\t\t\t\t<span className=\"text-green-600\">{completedPercentage}%</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{failed > 0 && (\n\t\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"font-semibold text-red-600\">{failed}</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Failed</span>\n\t\t\t\t\t\t\t<span className=\"text-red-600\">{failedPercentage}%</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\t\t\t<div className=\"absolute bottom-4 left-0 right-0 h-16\">\n\t\t\t\t<ChartContainer config={chartConfig} className=\"h-full w-full\">\n\t\t\t\t\t<AreaChart\n\t\t\t\t\t\tdata={chartData}\n\t\t\t\t\t\tmargin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\tid=\"completedGradientFlow\"\n\t\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\t\ty1=\"1\"\n\t\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\t\ty2=\"0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-completed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-completed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\tid=\"failedGradientFlow\"\n\t\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\t\ty1=\"1\"\n\t\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\t\ty2=\"0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t{hasFailedData && (\n\t\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\t\tdataKey=\"failed\"\n\t\t\t\t\t\t\t\tstroke=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\t\tfill=\"url(#failedGradientFlow)\"\n\t\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey=\"completed\"\n\t\t\t\t\t\t\tstroke=\"var(--color-completed)\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\tfill=\"url(#completedGradientFlow)\"\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</AreaChart>\n\t\t\t\t</ChartContainer>\n\t\t\t</div>\n\t\t</Card>\n\t);\n}\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { subDays } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n} from \"@/api/flow-runs\";\nimport type { Flow } from \"@/api/flows\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport {\n\tFlowRunActivityBarChart,\n\tFlowRunActivityBarGraphTooltipProvider,\n} from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport {\n\tbuildFlowRunsCountFilterForHistory,\n\tbuildFlowRunsHistoryFilter,\n} from \"./query-filters\";\n\nconst BAR_WIDTH = 8;\nconst BAR_GAP = 4;\nconst REFETCH_INTERVAL = 30_000;\n\ntype FlowRunsHistoryCardProps = {\n\tflowId: string;\n\tflow: Flow;\n};\n\nexport function FlowRunsHistoryCard({\n\tflowId,\n\tflow,\n}: FlowRunsHistoryCardProps) {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\tupdateBars();\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => resizeObserver.disconnect();\n\t}, []);\n\n\tconst effectiveNumberOfBars = debouncedNumberOfBars || numberOfBars;\n\t// Use a fixed limit of 60 to ensure query key stability with prefetch\n\tconst QUERY_LIMIT = 60;\n\n\tconst [{ data: flowRuns }, { data: totalCount }] = useSuspenseQueries({\n\t\tqueries: [\n\t\t\tbuildFilterFlowRunsQuery(\n\t\t\t\tbuildFlowRunsHistoryFilter(flowId, QUERY_LIMIT),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\tbuildFlowRunsCountFilterForHistory(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t],\n\t});\n\n\tconst enrichedFlowRuns = useMemo(\n\t\t() =>\n\t\t\tflowRuns.map((flowRun: FlowRun) => ({\n\t\t\t\t...flowRun,\n\t\t\t\tflow,\n\t\t\t})),\n\t\t[flowRuns, flow],\n\t);\n\n\tconst { startDate, endDate } = useMemo((): {\n\t\tstartDate: Date;\n\t\tendDate: Date;\n\t} => {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\tstartDate: subDays(now, 7),\n\t\t\tendDate: now,\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t<Card className=\"flex-1\">\n\t\t\t<CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n\t\t\t\t<CardTitle>Flow Runs</CardTitle>\n\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} total\n\t\t\t\t</span>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t<div className=\"h-24\" ref={chartRef}>\n\t\t\t\t\t{effectiveNumberOfBars === 0 ? (\n\t\t\t\t\t\t<Skeleton className=\"h-full w-full\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t\t\t\t<FlowRunActivityBarChart\n\t\t\t\t\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\t\t\t\t\tstartDate={startDate}\n\t\t\t\t\t\t\t\tendDate={endDate}\n\t\t\t\t\t\t\t\tnumberOfBars={effectiveNumberOfBars}\n\t\t\t\t\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\t\t\t\t\tclassName=\"h-full w-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","import type { Flow } from \"@/api/flows\";\nimport { CumulativeTaskRunsCard } from \"./cumulative-task-runs-card\";\nimport { FlowRunsHistoryCard } from \"./flow-runs-history-card\";\n\ntype FlowStatsSummaryProps = {\n\tflowId: string;\n\tflow: Flow;\n};\n\nexport function FlowStatsSummary({ flowId, flow }: FlowStatsSummaryProps) {\n\treturn (\n\t\t<div className=\"grid gap-5 md:grid-cols-[2fr_1fr]\">\n\t\t\t<FlowRunsHistoryCard flowId={flowId} flow={flow} />\n\t\t\t<CumulativeTaskRunsCard flowId={flowId} />\n\t\t</div>\n\t);\n}\n","import { useNavigate } from \"@tanstack/react-router\";\nimport { type JSX, useCallback, useState } from \"react\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport type { Flow } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport type { FlowRunCardData } from \"@/components/flow-runs/flow-run-card\";\nimport {\n\tFlowRunsList,\n\tFlowRunsPagination,\n\tFlowRunsRowCount,\n\ttype PaginationState,\n\ttype SortFilters,\n\tuseFlowRunsSelectedRows,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport { SortFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter\";\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 { SearchInput } from \"@/components/ui/input\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { DeleteFlowDialog } from \"./delete-flow-dialog\";\nimport { FlowDeploymentsTab } from \"./flow-deployments-tab\";\nimport { FlowDetails } from \"./flow-details\";\nimport { FlowPageHeader } from \"./flow-page-header\";\nimport { FlowStatsSummary } from \"./flow-stats-summary\";\n\nexport default function FlowDetail({\n\tflow,\n\tflowRuns,\n\tflowRunsCount,\n\tflowRunsPages,\n\tdeployments,\n\tdeploymentsCount,\n\tdeploymentsPages,\n\ttab = \"runs\",\n\tpagination,\n\tonPaginationChange,\n\tonPrefetchPage,\n\tsort,\n\tonSortChange,\n\tflowRunSearch,\n\tonFlowRunSearchChange,\n\tselectedStates,\n\tonSelectFilter,\n\tdeploymentSearch,\n\tonDeploymentSearchChange,\n\tdeploymentTags,\n\tonDeploymentTagsChange,\n\tdeploymentSort,\n\tonDeploymentSortChange,\n\tdeploymentPagination,\n\tonDeploymentPaginationChange,\n}: {\n\tflow: Flow;\n\tflowRuns: FlowRun[];\n\tflowRunsCount: number;\n\tflowRunsPages: number;\n\tdeployments: components[\"schemas\"][\"DeploymentResponse\"][];\n\tdeploymentsCount: number;\n\tdeploymentsPages: number;\n\ttab: \"runs\" | \"deployments\" | \"details\";\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonPrefetchPage: (page: number) => void;\n\tsort: SortFilters;\n\tonSortChange: (sort: SortFilters) => void;\n\tflowRunSearch: string | undefined;\n\tonFlowRunSearchChange: (search: string) => void;\n\tselectedStates: Set<FlowRunState>;\n\tonSelectFilter: (states: Set<FlowRunState>) => void;\n\tdeploymentSearch: string | undefined;\n\tonDeploymentSearchChange: (search: string) => void;\n\tdeploymentTags: string[];\n\tonDeploymentTagsChange: (tags: string[]) => void;\n\tdeploymentSort: components[\"schemas\"][\"DeploymentSort\"];\n\tonDeploymentSortChange: (\n\t\tsort: components[\"schemas\"][\"DeploymentSort\"],\n\t) => void;\n\tdeploymentPagination: { page: number; limit: number };\n\tonDeploymentPaginationChange: (pagination: {\n\t\tpage: number;\n\t\tlimit: number;\n\t}) => void;\n}): JSX.Element {\n\tconst navigate = useNavigate();\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\tconst [selectedRows, setSelectedRows, { onSelectRow, clearSet }] =\n\t\tuseFlowRunsSelectedRows();\n\n\t// Enrich paginated flow runs with flow object for the list\n\tconst enrichedFlowRuns: FlowRunCardData[] = flowRuns.map((flowRun) => ({\n\t\t...flowRun,\n\t\tflow: flow,\n\t}));\n\n\t// Handler to clear filters\n\tconst onClearFilters = useCallback(() => {\n\t\tonFlowRunSearchChange(\"\");\n\t\tonSelectFilter(new Set());\n\t\tclearSet();\n\t}, [onFlowRunSearchChange, onSelectFilter, clearSet]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"container mx-auto flex flex-col gap-4\">\n\t\t\t\t<FlowPageHeader\n\t\t\t\t\tflow={flow}\n\t\t\t\t\tonDelete={() => setShowDeleteDialog(true)}\n\t\t\t\t/>\n\t\t\t\t<FlowStatsSummary flowId={flow.id} flow={flow} />\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={tab}\n\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \".\",\n\t\t\t\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\ttab: value as \"runs\" | \"deployments\" | \"details\",\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>\n\t\t\t\t\t<TabsList>\n\t\t\t\t\t\t<TabsTrigger value=\"runs\">Runs</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"deployments\">Deployments</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"details\">Details</TabsTrigger>\n\t\t\t\t\t</TabsList>\n\t\t\t\t\t<TabsContent value=\"runs\" className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t<FlowRunsRowCount\n\t\t\t\t\t\t\t\tcount={flowRunsCount}\n\t\t\t\t\t\t\t\tresults={enrichedFlowRuns}\n\t\t\t\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\t\t\t\tsetSelectedRows={setSelectedRows}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-4\">\n\t\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\t\t\t\tvalue={flowRunSearch ?? \"\"}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onFlowRunSearchChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"w-64\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<StateFilter\n\t\t\t\t\t\t\t\t\tselectedFilters={selectedStates}\n\t\t\t\t\t\t\t\t\tonSelectFilter={onSelectFilter}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<SortFilter value={sort} onSelect={onSortChange} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<FlowRunsList\n\t\t\t\t\t\t\tflowRuns={enrichedFlowRuns}\n\t\t\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\t\t\tonSelect={onSelectRow}\n\t\t\t\t\t\t\tonClearFilters={onClearFilters}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FlowRunsPagination\n\t\t\t\t\t\t\tcount={flowRunsCount}\n\t\t\t\t\t\t\tpages={flowRunsPages}\n\t\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\t\tonChangePagination={onPaginationChange}\n\t\t\t\t\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</TabsContent>\n\t\t\t\t\t<TabsContent value=\"deployments\">\n\t\t\t\t\t\t<FlowDeploymentsTab\n\t\t\t\t\t\t\tdeployments={deployments}\n\t\t\t\t\t\t\tdeploymentsCount={deploymentsCount}\n\t\t\t\t\t\t\tdeploymentsPages={deploymentsPages}\n\t\t\t\t\t\t\tdeploymentSearch={deploymentSearch}\n\t\t\t\t\t\t\tonDeploymentSearchChange={onDeploymentSearchChange}\n\t\t\t\t\t\t\tdeploymentTags={deploymentTags}\n\t\t\t\t\t\t\tonDeploymentTagsChange={onDeploymentTagsChange}\n\t\t\t\t\t\t\tdeploymentSort={deploymentSort}\n\t\t\t\t\t\t\tonDeploymentSortChange={onDeploymentSortChange}\n\t\t\t\t\t\t\tdeploymentPagination={deploymentPagination}\n\t\t\t\t\t\t\tonDeploymentPaginationChange={onDeploymentPaginationChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</TabsContent>\n\t\t\t\t\t<TabsContent value=\"details\">\n\t\t\t\t\t\t<FlowDetails flow={flow} />\n\t\t\t\t\t</TabsContent>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t\t<DeleteFlowDialog\n\t\t\t\tflow={flow}\n\t\t\t\topen={showDeleteDialog}\n\t\t\t\tonOpenChange={setShowDeleteDialog}\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQueries,\n} from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { buildPaginateDeploymentsQuery } from \"@/api/deployments\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildFilterFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsPaginateFilter,\n} from \"@/api/flow-runs\";\nimport {\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildFLowDetailsQuery,\n} from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildGetFlowRunsTaskRunsCountQuery,\n\tbuildTaskRunsHistoryQuery,\n} from \"@/api/task-runs\";\nimport {\n\ttype PaginationState,\n\tSORT_FILTERS,\n\ttype SortFilters,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport FlowDetail from \"@/components/flows/detail\";\nimport {\n\tbuildCompletedTaskRunsCountFilter,\n\tbuildFailedTaskRunsCountFilter,\n\tbuildFlowRunsCountFilterForHistory,\n\tbuildFlowRunsHistoryFilter,\n\tbuildRunningTaskRunsCountFilter,\n\tbuildTaskRunsHistoryFilterForFlow,\n\tbuildTotalTaskRunsCountFilter,\n} from \"@/components/flows/detail/flow-stats-summary/query-filters\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\n\n// Route for /flows/flow/$id\n\n// This file contains the route definition and loader function for the /flows/flow/$id route.\n\n// 1. searchParams defined as a zod schema for validating and typechecking the search query.\n// 2. filterFlowRunsBySearchParams function that takes a search object and returns a filter for flow runs.\n// 3. Route definition using createFileRoute function:\n// - It uses useSuspenseQueries to fetch data for the flow, flow runs, deployments, and related counts.\n// - Passes the fetched data to the FlowDetail component.\n// - Includes a loader function to prefetch data on the server side.\n\nconst searchParams = z\n\t.object({\n\t\ttab: z.enum([\"runs\", \"deployments\", \"details\"]).optional().default(\"runs\"),\n\t\t\"runs.page\": z.number().int().positive().optional().default(1),\n\t\t\"runs.limit\": z.number().int().positive().max(100).optional().default(10),\n\t\t\"runs.sort\": z.enum(SORT_FILTERS).optional().default(\"START_TIME_DESC\"),\n\t\t\"runs.flowRuns.nameLike\": z.string().optional().default(\"\"),\n\t\t\"runs.flowRuns.state.name\": z.array(z.string()).optional(),\n\t\ttype: z.enum([\"span\", \"range\"]).optional(),\n\t\tseconds: z.number().int().positive().optional(),\n\t\tstartDateTime: z.date().optional(),\n\t\tendDateTime: z.date().optional(),\n\t\t\"deployments.page\": z.number().int().positive().optional().default(1),\n\t\t\"deployments.limit\": z.number().int().positive().optional().default(10),\n\t\t\"deployments.nameLike\": z.string().optional(),\n\t\t\"deployments.tags\": z.array(z.string()).optional(),\n\t\t\"deployments.sort\": z\n\t\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t\t.optional()\n\t\t\t.default(\"NAME_ASC\"),\n\t})\n\t.optional()\n\t.default({});\n\ntype SearchParams = z.infer<typeof searchParams>;\n\nconst buildPaginationBody = (\n\tsearch: SearchParams,\n\tflowId: string,\n): FlowRunsPaginateFilter => {\n\tconst flowRunSearch = search[\"runs.flowRuns.nameLike\"];\n\tconst stateFilters = search[\"runs.flowRuns.state.name\"] ?? [];\n\n\tconst hasFilters = flowRunSearch || stateFilters.length > 0;\n\tconst flowRunsFilter = hasFilters\n\t\t? {\n\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t...(flowRunSearch && {\n\t\t\t\t\tname: { like_: flowRunSearch },\n\t\t\t\t}),\n\t\t\t\t...(stateFilters.length > 0 && {\n\t\t\t\t\tstate: {\n\t\t\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t\t\tname: { any_: stateFilters },\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\tpage: search[\"runs.page\"],\n\t\tlimit: search[\"runs.limit\"],\n\t\tsort: search[\"runs.sort\"],\n\t\tflow_runs: flowRunsFilter,\n\t\tflows: { operator: \"and_\" as const, id: { any_: [flowId] } },\n\t};\n};\n\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpage: search[\"runs.page\"],\n\t\t\tlimit: search[\"runs.limit\"],\n\t\t}),\n\t\t[search[\"runs.page\"], search[\"runs.limit\"]],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.page\": newPagination.page,\n\t\t\t\t\t\"runs.limit\": newPagination.limit,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortChange = useCallback(\n\t\t(sort: SortFilters) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, \"runs.sort\": sort, \"runs.page\": 1 }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"runs.sort\"], onSortChange] as const;\n};\n\nconst useFlowRunSearch = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onFlowRunSearchChange = useCallback(\n\t\t(flowRunSearch: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.flowRuns.nameLike\": flowRunSearch,\n\t\t\t\t\t\"runs.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"runs.flowRuns.nameLike\"], onFlowRunSearchChange] as const;\n};\n\nconst useStateFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst selectedStates = useMemo(\n\t\t() => new Set((search[\"runs.flowRuns.state.name\"] || []) as FlowRunState[]),\n\t\t[search[\"runs.flowRuns.state.name\"]],\n\t);\n\n\tconst onSelectFilter = useCallback(\n\t\t(states: Set<FlowRunState>) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.flowRuns.state.name\": Array.from(states),\n\t\t\t\t\t\"runs.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn { selectedStates, onSelectFilter };\n};\n\nconst useDeploymentSearch = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentSearchChange = useCallback(\n\t\t(deploymentSearch: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.nameLike\": deploymentSearch || undefined,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.nameLike\"], onDeploymentSearchChange] as const;\n};\n\nconst useDeploymentTagsFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentTagsChange = useCallback(\n\t\t(tags: string[]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.tags\": tags.length > 0 ? tags : undefined,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.tags\"] ?? [], onDeploymentTagsChange] as const;\n};\n\nconst useDeploymentSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentSortChange = useCallback(\n\t\t(sort: components[\"schemas\"][\"DeploymentSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.sort\": sort,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.sort\"], onDeploymentSortChange] as const;\n};\n\nconst useDeploymentPagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst deploymentPagination = useMemo(\n\t\t() => ({\n\t\t\tpage: search[\"deployments.page\"],\n\t\t\tlimit: search[\"deployments.limit\"],\n\t\t}),\n\t\t[search[\"deployments.page\"], search[\"deployments.limit\"]],\n\t);\n\n\tconst onDeploymentPaginationChange = useCallback(\n\t\t(newPagination: { page: number; limit: number }) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.page\": newPagination.page,\n\t\t\t\t\t\"deployments.limit\": newPagination.limit,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [deploymentPagination, onDeploymentPaginationChange] as const;\n};\n\nconst FlowDetailRoute = () => {\n\tconst queryClient = useQueryClient();\n\tconst { id } = Route.useParams();\n\tconst search = Route.useSearch();\n\n\t// Navigation hooks for flow runs\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [flowRunSearch, onFlowRunSearchChange] = useFlowRunSearch();\n\tconst { selectedStates, onSelectFilter } = useStateFilter();\n\n\t// Navigation hooks for deployments\n\tconst [deploymentSearch, onDeploymentSearchChange] = useDeploymentSearch();\n\tconst [deploymentTags, onDeploymentTagsChange] = useDeploymentTagsFilter();\n\tconst [deploymentSort, onDeploymentSortChange] = useDeploymentSort();\n\tconst [deploymentPagination, onDeploymentPaginationChange] =\n\t\tuseDeploymentPagination();\n\n\t// Suspense queries for stable data (flow)\n\tconst [{ data: flow }] = useSuspenseQueries({\n\t\tqueries: [buildFLowDetailsQuery(id)],\n\t});\n\n\t// Use useQuery for deployments to leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: deploymentsPage } = useQuery(\n\t\tbuildPaginateDeploymentsQuery({\n\t\t\tsort: search[\"deployments.sort\"],\n\t\t\tpage: search[\"deployments.page\"],\n\t\t\tlimit: search[\"deployments.limit\"],\n\t\t\tflows: { operator: \"and_\", id: { any_: [id] } },\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_or_deployment_name: { like_: search[\"deployments.nameLike\"] },\n\t\t\t\ttags: { operator: \"and_\", all_: search[\"deployments.tags\"] || [] },\n\t\t\t},\n\t\t}),\n\t);\n\n\t// Set page title based on flow name\n\tusePageTitle(flow?.name ? `Flow: ${flow.name}` : \"Flow\");\n\n\t// Use useQuery for paginated flow runsto leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: flowRunsPage } = useQuery(\n\t\tbuildPaginateFlowRunsQuery(buildPaginationBody(search, id), 30_000),\n\t);\n\n\tconst flowRuns = flowRunsPage?.results ?? [];\n\n\t// Prefetch task run counts for the current page's flow runs\n\t// This ensures the data is ready when FlowRunCard renders\n\tuseEffect(() => {\n\t\tconst flowRunIds = flowRuns.map((run) => run.id);\n\t\tif (flowRunIds.length > 0) {\n\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t);\n\t\t}\n\t}, [queryClient, flowRuns]);\n\n\t// Prefetch handler for pagination hover\n\tconst onPrefetchPage = useCallback(\n\t\t(page: number) => {\n\t\t\tconst filter = buildPaginationBody(\n\t\t\t\t{\n\t\t\t\t\t...search,\n\t\t\t\t\t\"runs.page\": page,\n\t\t\t\t},\n\t\t\t\tid,\n\t\t\t);\n\t\t\t// Prefetch the page data, then chain prefetch of task run counts\n\t\t\tvoid (async () => {\n\t\t\t\tconst pageData = await queryClient.ensureQueryData(\n\t\t\t\t\tbuildPaginateFlowRunsQuery(filter, 30_000),\n\t\t\t\t);\n\t\t\t\tconst flowRunIds = pageData?.results?.map((run) => run.id) ?? [];\n\t\t\t\tif (flowRunIds.length > 0) {\n\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\t[queryClient, search, id],\n\t);\n\n\treturn (\n\t\t<FlowDetail\n\t\t\tflow={flow}\n\t\t\tflowRuns={flowRuns}\n\t\t\tflowRunsCount={flowRunsPage?.count ?? 0}\n\t\t\tflowRunsPages={flowRunsPage?.pages ?? 0}\n\t\t\tdeployments={deploymentsPage?.results ?? []}\n\t\t\tdeploymentsCount={deploymentsPage?.count ?? 0}\n\t\t\tdeploymentsPages={deploymentsPage?.pages ?? 0}\n\t\t\ttab={search.tab}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\tsort={sort}\n\t\t\tonSortChange={onSortChange}\n\t\t\tflowRunSearch={flowRunSearch}\n\t\t\tonFlowRunSearchChange={onFlowRunSearchChange}\n\t\t\tselectedStates={selectedStates}\n\t\t\tonSelectFilter={onSelectFilter}\n\t\t\tdeploymentSearch={deploymentSearch}\n\t\t\tonDeploymentSearchChange={onDeploymentSearchChange}\n\t\t\tdeploymentTags={deploymentTags}\n\t\t\tonDeploymentTagsChange={onDeploymentTagsChange}\n\t\t\tdeploymentSort={deploymentSort}\n\t\t\tonDeploymentSortChange={onDeploymentSortChange}\n\t\t\tdeploymentPagination={deploymentPagination}\n\t\t\tonDeploymentPaginationChange={onDeploymentPaginationChange}\n\t\t/>\n\t);\n};\n\nexport const Route = createFileRoute(\"/flows/flow/$id\")({\n\tcomponent: FlowDetailRoute,\n\tvalidateSearch: zodValidator(searchParams),\n\tloaderDeps: ({ search }) => ({\n\t\tflowRunsDeps: search,\n\t}),\n\tloader: ({ params: { id }, context, deps }) => {\n\t\tconst REFETCH_INTERVAL = 30_000;\n\n\t\t// Prefetch flow details\n\t\tvoid context.queryClient.prefetchQuery(buildFLowDetailsQuery(id));\n\n\t\t// Prefetch paginated flow runs without blocking (uses keepPreviousData)\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\tbuildPaginationBody(deps.flowRunsDeps, id),\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\n\t\t// Prefetch deployments with filter parameters\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateDeploymentsQuery({\n\t\t\t\tsort: deps.flowRunsDeps[\"deployments.sort\"],\n\t\t\t\tpage: deps.flowRunsDeps[\"deployments.page\"],\n\t\t\t\tlimit: deps.flowRunsDeps[\"deployments.limit\"],\n\t\t\t\tflows: { operator: \"and_\", id: { any_: [id] } },\n\t\t\t\tdeployments: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_or_deployment_name: {\n\t\t\t\t\t\tlike_: deps.flowRunsDeps[\"deployments.nameLike\"],\n\t\t\t\t\t},\n\t\t\t\t\ttags: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tall_: deps.flowRunsDeps[\"deployments.tags\"] || [],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// Prefetch deployments count\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildDeploymentsCountByFlowQuery([id]),\n\t\t);\n\n\t\t// Prefetch FlowStatsSummary queries\n\t\t// FlowRunsHistoryCard queries\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildFilterFlowRunsQuery(\n\t\t\t\tbuildFlowRunsHistoryFilter(id, 60),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\tbuildFlowRunsCountFilterForHistory(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\n\t\t// CumulativeTaskRunsCard queries\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildTotalTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildCompletedTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildFailedTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildRunningTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildTaskRunsHistoryQuery(\n\t\t\t\tbuildTaskRunsHistoryFilterForFlow(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\n\t\t// Background async chain: prefetch task run counts for each flow run\n\t\t// This prevents suspense when FlowRunCard renders\n\t\tvoid (async () => {\n\t\t\tconst pageData = await context.queryClient.ensureQueryData(\n\t\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\t\tbuildPaginationBody(deps.flowRunsDeps, id),\n\t\t\t\t\t30_000,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst flowRunIds = pageData?.results?.map((run) => run.id) ?? [];\n\t\t\tif (flowRunIds.length > 0) {\n\t\t\t\tvoid context.queryClient.prefetchQuery(\n\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t\t);\n\t\t\t}\n\t\t})();\n\n\t\t// Ensure flow details are loaded (critical data)\n\t\treturn context.queryClient.ensureQueryData(buildFLowDetailsQuery(id));\n\t},\n\twrapInSuspense: true,\n});\n"],"names":["DeleteFlowDialog","flow","open","onOpenChange","onDeleted","navigate","useNavigate","deleteFlow","isPending","useDeleteFlowById","handleDelete","toast","jsx","DeleteConfirmationDialog","BAR_WIDTH","BAR_GAP","MiniDeploymentActivity","deploymentId","numberOfBars","setNumberOfBars","useState","debouncedNumberOfBars","useDebounce","chartRef","useCallback","node","updateBars","chartWidth","resizeObserver","effectiveNumberOfBars","flowRuns","useQuery","buildFilterFlowRunsQuery","enrichedFlowRuns","flowRun","FlowRunActivityBarChart","subSeconds","secondsInWeek","columns","table","Checkbox","value","row","status","StatusBadge","tag","schedules","ScheduleBadgeGroup","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuItem","SORT_OPTIONS","FlowDeploymentsTab","deployments","deploymentsCount","deploymentsPages","deploymentSearch","onDeploymentSearchChange","deploymentTags","onDeploymentTagsChange","deploymentSort","onDeploymentSortChange","deploymentPagination","onDeploymentPaginationChange","rowSelection","setRowSelection","showDeleteDialog","setShowDeleteDialog","deleteDeployment","useDeleteDeployment","handlePaginationChange","updater","currentPagination","newPagination","deploymentsTable","useReactTable","baseDeploymentColumns","getCoreRowModel","selectedCount","handleDeleteSelected","selectedIds","id","handleDeploymentTagsChange","e","Typography","Trash2","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","FlowRunActivityBarGraphTooltipProvider","DataTable","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","FlowDetails","FormattedDate","FlowMenu","onDelete","handleCopyId","DropdownMenuLabel","FlowPageHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","REFETCH_INTERVAL","chartConfig","transformHistoryToChartData","history","chartData","cumulativeCompleted","cumulativeFailed","item","completedCount","failedCount","state","CumulativeTaskRunsCard","flowId","total","completed","failed","running","useSuspenseQueries","buildCountTaskRunsQuery","buildTotalTaskRunsCountFilter","buildCompletedTaskRunsCountFilter","buildFailedTaskRunsCountFilter","buildRunningTaskRunsCountFilter","buildTaskRunsHistoryQuery","buildTaskRunsHistoryFilterForFlow","useMemo","hasFailedData","point","percentComparisonTotal","completedPercentage","failedPercentage","Card","CardHeader","CardTitle","CardContent","ChartContainer","AreaChart","Area","FlowRunsHistoryCard","QUERY_LIMIT","totalCount","buildFlowRunsHistoryFilter","buildCountFlowRunsQuery","buildFlowRunsCountFilterForHistory","startDate","endDate","now","subDays","Skeleton","FlowStatsSummary","FlowDetail","flowRunsCount","flowRunsPages","tab","pagination","onPaginationChange","onPrefetchPage","sort","onSortChange","flowRunSearch","onFlowRunSearchChange","selectedStates","onSelectFilter","selectedRows","setSelectedRows","onSelectRow","clearSet","useFlowRunsSelectedRows","onClearFilters","Fragment","Tabs","prev","TabsList","TabsTrigger","TabsContent","FlowRunsRowCount","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","z","optional","default","number","int","positive","max","SORT_FILTERS","string","type","seconds","startDateTime","date","endDateTime","buildPaginationBody","search","stateFilters","flowRunsFilter","length","operator","name","like_","any_","undefined","page","limit","flow_runs","flows","usePagination","Route","useSearch","to","replace","useSort","useFlowRunSearch","useStateFilter","Set","states","Array","from","useDeploymentSearch","useDeploymentTagsFilter","tags","useDeploymentSort","useDeploymentPagination","FlowDetailRoute","queryClient","useQueryClient","useParams","data","queries","buildFLowDetailsQuery","deploymentsPage","buildPaginateDeploymentsQuery","flow_or_deployment_name","all_","usePageTitle","flowRunsPage","buildPaginateFlowRunsQuery","results","useEffect","flowRunIds","map","run","prefetchQuery","buildGetFlowRunsTaskRunsCountQuery","filter","ensureQueryData","count","pages"],"mappings":"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"}
1
+ {"version":3,"file":"flow._id-CZ5P0v4N.js","sources":["../../src/components/flows/detail/delete-flow-dialog.tsx","../../src/components/flows/detail/mini-deployment-activity.tsx","../../src/components/flows/detail/deployment-columns.tsx","../../src/components/flows/detail/flow-deployments-tab.tsx","../../src/components/flows/detail/flow-details.tsx","../../src/components/flows/detail/flow-menu.tsx","../../src/components/flows/detail/flow-page-header.tsx","../../src/components/flows/detail/flow-stats-summary/cumulative-task-runs-card.tsx","../../src/components/flows/detail/flow-stats-summary/flow-runs-history-card.tsx","../../src/components/flows/detail/flow-stats-summary/index.tsx","../../src/components/flows/detail/index.tsx","../../src/routes/flows/flow.$id.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport type { Flow } from \"@/api/flows\";\nimport { useDeleteFlowById } from \"@/api/flows\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\ntype DeleteFlowDialogProps = {\n\tflow: Flow;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tonDeleted?: () => void;\n};\n\nexport const DeleteFlowDialog = ({\n\tflow,\n\topen,\n\tonOpenChange,\n\tonDeleted,\n}: DeleteFlowDialogProps) => {\n\tconst navigate = useNavigate();\n\tconst { deleteFlow, isPending } = useDeleteFlowById();\n\n\tconst handleDelete = () => {\n\t\tdeleteFlow(flow.id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Flow deleted\");\n\t\t\t\tonDeleted?.();\n\t\t\t\tvoid navigate({ to: \"/flows\" });\n\t\t\t},\n\t\t\tonError: () => {\n\t\t\t\ttoast.error(\"Failed to delete flow\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<DeleteConfirmationDialog\n\t\t\tisOpen={open}\n\t\t\ttitle=\"Delete Flow\"\n\t\t\tdescription={`Are you sure you want to delete ${flow.name}? This action cannot be undone.`}\n\t\t\tisLoading={isPending}\n\t\t\tloadingText=\"Deleting...\"\n\t\t\tonConfirm={handleDelete}\n\t\t\tonClose={() => onOpenChange(false)}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subSeconds } from \"date-fns\";\nimport { secondsInWeek } from \"date-fns/constants\";\nimport { useCallback, useState } from \"react\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\nconst BAR_WIDTH = 4;\nconst BAR_GAP = 2;\n\ninterface MiniDeploymentActivityProps {\n\tdeploymentId: string;\n}\n\nexport const MiniDeploymentActivity = ({\n\tdeploymentId,\n}: MiniDeploymentActivityProps) => {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\tupdateBars();\n\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => {\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tconst effectiveNumberOfBars = debouncedNumberOfBars || numberOfBars;\n\n\tconst { data: flowRuns } = useQuery(\n\t\tbuildFilterFlowRunsQuery({\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: [deploymentId] },\n\t\t\t},\n\t\t\tlimit: Math.min(60, effectiveNumberOfBars || 60),\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst enrichedFlowRuns =\n\t\tflowRuns?.map((flowRun) => ({\n\t\t\t...flowRun,\n\t\t})) ?? [];\n\n\treturn (\n\t\t<div className=\"w-full\" ref={chartRef}>\n\t\t\t<FlowRunActivityBarChart\n\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\tstartDate={subSeconds(new Date(), secondsInWeek)}\n\t\t\t\tendDate={new Date()}\n\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\tnumberOfBars={effectiveNumberOfBars}\n\t\t\t\tclassName=\"h-8 w-full\"\n\t\t\t\tchartId={`deployment-${deploymentId}`}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { components } from \"@/api/prefect\";\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 { ScheduleBadgeGroup } from \"@/components/ui/schedule-badge\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { MiniDeploymentActivity } from \"./mini-deployment-activity\";\n\ntype Deployment = components[\"schemas\"][\"DeploymentResponse\"];\n\nexport const columns: ColumnDef<Deployment>[] = [\n\t{\n\t\tid: \"select\",\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\tonCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(!!value)}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t\tmaxSize: 20,\n\t\tminSize: 20,\n\t},\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: \"Name\",\n\t\tcell: ({ row }) => row.original.name,\n\t},\n\t{\n\t\taccessorKey: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => {\n\t\t\tconst status = row.original.paused\n\t\t\t\t? \"PAUSED\"\n\t\t\t\t: (row.original.status ?? \"NOT_READY\");\n\t\t\treturn <StatusBadge status={status} />;\n\t\t},\n\t},\n\t{\n\t\taccessorKey: \"tags\",\n\t\theader: \"Tags\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{row.original.tags?.map((tag) => (\n\t\t\t\t\t<span\n\t\t\t\t\t\tkey={tag}\n\t\t\t\t\t\tclassName=\"bg-gray-100 text-gray-800 text-xs font-medium px-2 py-0.5 rounded\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{tag}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t),\n\t},\n\t{\n\t\taccessorKey: \"schedules\",\n\t\theader: \"Schedules\",\n\t\tcell: ({ row }) => {\n\t\t\tconst schedules = row.original.schedules;\n\t\t\tif (!schedules || schedules.length === 0) return null;\n\t\t\treturn <ScheduleBadgeGroup schedules={schedules} />;\n\t\t},\n\t\tsize: 150,\n\t},\n\t{\n\t\taccessorKey: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: ({ row }) => {\n\t\t\tif (!row.original.id) return null;\n\t\t\treturn <MiniDeploymentActivity deploymentId={row.original.id} />;\n\t\t},\n\t},\n\t{\n\t\tid: \"actions\",\n\t\tcell: ({ row }) => {\n\t\t\tif (!row.original.id) return null;\n\n\t\t\treturn (\n\t\t\t\t<DropdownMenu>\n\t\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"ghost\" className=\"size-8 p-0\">\n\t\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t\t<Icon id=\"MoreHorizontal\" className=\"size-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(row.original.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCopy ID\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t</DropdownMenu>\n\t\t\t);\n\t\t},\n\t\tminSize: 30,\n\t\tmaxSize: 30,\n\t},\n];\n","import type { OnChangeFn, PaginationState } from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { Trash2 } from \"lucide-react\";\nimport type { ChangeEvent } from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { useDeleteDeployment } from \"@/api/deployments\";\nimport type { components } from \"@/api/prefect\";\nimport { Button } from \"@/components/ui/button\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { FlowRunActivityBarGraphTooltipProvider } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { columns as baseDeploymentColumns } from \"./deployment-columns\";\n\ntype DeploymentSort = components[\"schemas\"][\"DeploymentSort\"];\n\nconst SORT_OPTIONS: { label: string; value: DeploymentSort }[] = [\n\t{ label: \"Created\", value: \"CREATED_DESC\" },\n\t{ label: \"A to Z\", value: \"NAME_ASC\" },\n\t{ label: \"Z to A\", value: \"NAME_DESC\" },\n];\n\ntype FlowDeploymentsTabProps = {\n\tdeployments: components[\"schemas\"][\"DeploymentResponse\"][];\n\tdeploymentsCount: number;\n\tdeploymentsPages: number;\n\tdeploymentSearch: string | undefined;\n\tonDeploymentSearchChange: (search: string) => void;\n\tdeploymentTags: string[];\n\tonDeploymentTagsChange: (tags: string[]) => void;\n\tdeploymentSort: DeploymentSort;\n\tonDeploymentSortChange: (sort: DeploymentSort) => void;\n\tdeploymentPagination: { page: number; limit: number };\n\tonDeploymentPaginationChange: (pagination: {\n\t\tpage: number;\n\t\tlimit: number;\n\t}) => void;\n};\n\nexport const FlowDeploymentsTab = ({\n\tdeployments,\n\tdeploymentsCount,\n\tdeploymentsPages,\n\tdeploymentSearch,\n\tonDeploymentSearchChange,\n\tdeploymentTags,\n\tonDeploymentTagsChange,\n\tdeploymentSort,\n\tonDeploymentSortChange,\n\tdeploymentPagination,\n\tonDeploymentPaginationChange,\n}: FlowDeploymentsTabProps) => {\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\tconst { deleteDeployment } = useDeleteDeployment();\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tconst currentPagination: PaginationState = {\n\t\t\t\tpageIndex: deploymentPagination.page - 1,\n\t\t\t\tpageSize: deploymentPagination.limit,\n\t\t\t};\n\t\t\tconst newPagination =\n\t\t\t\ttypeof updater === \"function\" ? updater(currentPagination) : updater;\n\t\t\tonDeploymentPaginationChange({\n\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t});\n\t\t\tsetRowSelection({});\n\t\t},\n\t\t[deploymentPagination, onDeploymentPaginationChange],\n\t);\n\n\tconst deploymentsTable = useReactTable({\n\t\tdata: deployments,\n\t\tcolumns: baseDeploymentColumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tpageCount: deploymentsPages,\n\t\tstate: {\n\t\t\trowSelection,\n\t\t\tpagination: {\n\t\t\t\tpageIndex: deploymentPagination.page - 1,\n\t\t\t\tpageSize: deploymentPagination.limit,\n\t\t\t},\n\t\t},\n\t\tonRowSelectionChange: setRowSelection,\n\t\tonPaginationChange: handlePaginationChange,\n\t\tgetRowId: (row) => row.id,\n\t});\n\n\tconst selectedCount = Object.keys(rowSelection).length;\n\n\tconst handleDeleteSelected = useCallback(() => {\n\t\tconst selectedIds = Object.keys(rowSelection);\n\t\tfor (const id of selectedIds) {\n\t\t\tdeleteDeployment(id);\n\t\t}\n\t\tsetRowSelection({});\n\t\tsetShowDeleteDialog(false);\n\t}, [rowSelection, deleteDeployment]);\n\n\tconst handleDeploymentTagsChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (Array.isArray(e)) {\n\t\t\t\tonDeploymentTagsChange(e);\n\t\t\t}\n\t\t},\n\t\t[onDeploymentTagsChange],\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{/* Count and selection info - 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{selectedCount > 0 ? (\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t{selectedCount} selected\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 text-destructive hover:text-destructive\"\n\t\t\t\t\t\t\t\tonClick={() => setShowDeleteDialog(true)}\n\t\t\t\t\t\t\t\taria-label=\"Delete selected deployments\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Trash2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{deploymentsCount} Deployment{deploymentsCount !== 1 ? \"s\" : \"\"}\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 columns */}\n\t\t\t\t<div className=\"xl:col-span-4 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\tplaceholder=\"Search deployments...\"\n\t\t\t\t\t\tvalue={deploymentSearch ?? \"\"}\n\t\t\t\t\t\tonChange={(e) => onDeploymentSearchChange(e.target.value)}\n\t\t\t\t\t\taria-label=\"Search deployments\"\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<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tvalue={deploymentTags}\n\t\t\t\t\t\tonChange={handleDeploymentTagsChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\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-3 order-2\">\n\t\t\t\t\t<Select\n\t\t\t\t\t\tvalue={deploymentSort}\n\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\tonDeploymentSortChange(value as DeploymentSort)\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectTrigger className=\"w-full\" aria-label=\"Sort deployments\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{SORT_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t{/* Override table container overflow to allow chart tooltips to escape */}\n\t\t\t\t<div className=\"[&_[data-slot=table-container]]:overflow-visible\">\n\t\t\t\t\t<DataTable table={deploymentsTable} />\n\t\t\t\t</div>\n\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\n\t\t\t<Dialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n\t\t\t\t<DialogContent>\n\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t<DialogTitle>Delete Deployments</DialogTitle>\n\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\tAre you sure you want to delete {selectedCount} deployment\n\t\t\t\t\t\t\t{selectedCount !== 1 ? \"s\" : \"\"}? This action cannot be undone.\n\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tonClick={() => setShowDeleteDialog(false)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button variant=\"destructive\" onClick={handleDeleteSelected}>\n\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DialogFooter>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t</div>\n\t);\n};\n","import type { Flow } from \"@/api/flows\";\nimport { FormattedDate } from \"@/components/ui/formatted-date\";\n\ntype FlowDetailsProps = {\n\tflow: Flow;\n};\n\nexport const FlowDetails = ({ flow }: FlowDetailsProps) => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Flow ID</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.id}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Created</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.created ? (\n\t\t\t\t\t\t<FormattedDate date={flow.created} format=\"absolute\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"N/A\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Updated</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.updated ? (\n\t\t\t\t\t\t<FormattedDate date={flow.updated} format=\"absolute\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"N/A\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</div>\n\t);\n};\n","import { toast } from \"sonner\";\nimport type { Flow } from \"@/api/flows\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport type FlowMenuProps = {\n\tflow: Flow;\n\tonDelete: () => void;\n};\n\nexport const FlowMenu = ({ flow, onDelete }: FlowMenuProps) => {\n\tconst handleCopyId = () => {\n\t\tvoid navigator.clipboard.writeText(flow.id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={handleCopyId}>Copy ID</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem variant=\"destructive\" onClick={onDelete}>\n\t\t\t\t\tDelete\n\t\t\t\t</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import type { Flow } from \"@/api/flows\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { FlowMenu } from \"./flow-menu\";\n\ntype FlowPageHeaderProps = {\n\tflow: Flow;\n\tonDelete: () => void;\n};\n\nexport function FlowPageHeader({ flow, onDelete }: FlowPageHeaderProps) {\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink to=\"/flows\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tFlows\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t<BreadcrumbPage>{flow.name}</BreadcrumbPage>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<FlowMenu flow={flow} onDelete={onDelete} />\n\t\t</div>\n\t);\n}\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { Area, AreaChart } from \"recharts\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildTaskRunsHistoryQuery,\n\ttype HistoryResponse,\n} from \"@/api/task-runs\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { type ChartConfig, ChartContainer } from \"@/components/ui/chart\";\nimport {\n\tbuildCompletedTaskRunsCountFilter,\n\tbuildFailedTaskRunsCountFilter,\n\tbuildRunningTaskRunsCountFilter,\n\tbuildTaskRunsHistoryFilterForFlow,\n\tbuildTotalTaskRunsCountFilter,\n} from \"./query-filters\";\n\nconst REFETCH_INTERVAL = 30_000;\n\ntype CumulativeTaskRunsCardProps = {\n\tflowId: string;\n};\n\ntype ChartDataPoint = {\n\ttimestamp: string;\n\tcompleted: number;\n\tfailed: number;\n};\n\nconst chartConfig = {\n\tcompleted: {\n\t\tlabel: \"Completed\",\n\t\tcolor: \"hsl(142.1 76.2% 36.3%)\",\n\t},\n\tfailed: {\n\t\tlabel: \"Failed\",\n\t\tcolor: \"hsl(0 84.2% 60.2%)\",\n\t},\n} satisfies ChartConfig;\n\nconst transformHistoryToChartData = (\n\thistory: HistoryResponse[],\n): ChartDataPoint[] => {\n\tconst chartData: ChartDataPoint[] = [];\n\tlet cumulativeCompleted = 0;\n\tlet cumulativeFailed = 0;\n\n\tfor (const item of history) {\n\t\tlet completedCount = 0;\n\t\tlet failedCount = 0;\n\n\t\tfor (const state of item.states) {\n\t\t\tif (state.state_type === \"COMPLETED\") {\n\t\t\t\tcompletedCount += state.count_runs;\n\t\t\t} else if (\n\t\t\t\tstate.state_type === \"FAILED\" ||\n\t\t\t\tstate.state_type === \"CRASHED\"\n\t\t\t) {\n\t\t\t\tfailedCount += state.count_runs;\n\t\t\t}\n\t\t}\n\n\t\tcumulativeCompleted += completedCount;\n\t\tcumulativeFailed += failedCount;\n\n\t\tchartData.push({\n\t\t\ttimestamp: item.interval_start,\n\t\t\tcompleted: cumulativeCompleted,\n\t\t\tfailed: cumulativeFailed,\n\t\t});\n\t}\n\n\treturn chartData;\n};\n\nexport function CumulativeTaskRunsCard({\n\tflowId,\n}: CumulativeTaskRunsCardProps) {\n\tconst [\n\t\t{ data: total },\n\t\t{ data: completed },\n\t\t{ data: failed },\n\t\t{ data: running },\n\t\t{ data: history },\n\t] = useSuspenseQueries({\n\t\tqueries: [\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildTotalTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildCompletedTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildFailedTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildRunningTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildTaskRunsHistoryQuery(\n\t\t\t\tbuildTaskRunsHistoryFilterForFlow(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t],\n\t});\n\n\tconst chartData = useMemo(\n\t\t() => transformHistoryToChartData(history),\n\t\t[history],\n\t);\n\n\tconst hasFailedData = chartData.some((point) => point.failed > 0);\n\n\tconst percentComparisonTotal = total - running;\n\tconst completedPercentage =\n\t\tpercentComparisonTotal > 0\n\t\t\t? ((completed / percentComparisonTotal) * 100).toFixed(0)\n\t\t\t: \"0\";\n\tconst failedPercentage =\n\t\tpercentComparisonTotal > 0\n\t\t\t? ((failed / percentComparisonTotal) * 100).toFixed(1)\n\t\t\t: \"0\";\n\n\treturn (\n\t\t<Card className=\"flex-1 relative overflow-hidden pb-20\">\n\t\t\t<CardHeader className=\"pb-2\">\n\t\t\t\t<CardTitle>Task Runs</CardTitle>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t<div className=\"grid gap-1\">\n\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-base\">\n\t\t\t\t\t\t<span className=\"font-semibold\">{total}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{running > 0 && (\n\t\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"font-semibold text-blue-600\">{running}</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Running</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t<span className=\"font-semibold text-green-600\">{completed}</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Completed</span>\n\t\t\t\t\t\t<span className=\"text-green-600\">{completedPercentage}%</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{failed > 0 && (\n\t\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"font-semibold text-red-600\">{failed}</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Failed</span>\n\t\t\t\t\t\t\t<span className=\"text-red-600\">{failedPercentage}%</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\t\t\t<div className=\"absolute bottom-4 left-0 right-0 h-16\">\n\t\t\t\t<ChartContainer config={chartConfig} className=\"h-full w-full\">\n\t\t\t\t\t<AreaChart\n\t\t\t\t\t\tdata={chartData}\n\t\t\t\t\t\tmargin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\tid=\"completedGradientFlow\"\n\t\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\t\ty1=\"1\"\n\t\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\t\ty2=\"0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-completed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-completed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\tid=\"failedGradientFlow\"\n\t\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\t\ty1=\"1\"\n\t\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\t\ty2=\"0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t{hasFailedData && (\n\t\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\t\tdataKey=\"failed\"\n\t\t\t\t\t\t\t\tstroke=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\t\tfill=\"url(#failedGradientFlow)\"\n\t\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey=\"completed\"\n\t\t\t\t\t\t\tstroke=\"var(--color-completed)\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\tfill=\"url(#completedGradientFlow)\"\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</AreaChart>\n\t\t\t\t</ChartContainer>\n\t\t\t</div>\n\t\t</Card>\n\t);\n}\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { subDays } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n} from \"@/api/flow-runs\";\nimport type { Flow } from \"@/api/flows\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport {\n\tFlowRunActivityBarChart,\n\tFlowRunActivityBarGraphTooltipProvider,\n} from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport {\n\tbuildFlowRunsCountFilterForHistory,\n\tbuildFlowRunsHistoryFilter,\n} from \"./query-filters\";\n\nconst BAR_WIDTH = 8;\nconst BAR_GAP = 4;\nconst REFETCH_INTERVAL = 30_000;\n\ntype FlowRunsHistoryCardProps = {\n\tflowId: string;\n\tflow: Flow;\n};\n\nexport function FlowRunsHistoryCard({\n\tflowId,\n\tflow,\n}: FlowRunsHistoryCardProps) {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\tupdateBars();\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => resizeObserver.disconnect();\n\t}, []);\n\n\tconst effectiveNumberOfBars = debouncedNumberOfBars || numberOfBars;\n\t// Use a fixed limit of 60 to ensure query key stability with prefetch\n\tconst QUERY_LIMIT = 60;\n\n\tconst [{ data: flowRuns }, { data: totalCount }] = useSuspenseQueries({\n\t\tqueries: [\n\t\t\tbuildFilterFlowRunsQuery(\n\t\t\t\tbuildFlowRunsHistoryFilter(flowId, QUERY_LIMIT),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\tbuildFlowRunsCountFilterForHistory(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t],\n\t});\n\n\tconst enrichedFlowRuns = useMemo(\n\t\t() =>\n\t\t\tflowRuns.map((flowRun: FlowRun) => ({\n\t\t\t\t...flowRun,\n\t\t\t\tflow,\n\t\t\t})),\n\t\t[flowRuns, flow],\n\t);\n\n\tconst { startDate, endDate } = useMemo((): {\n\t\tstartDate: Date;\n\t\tendDate: Date;\n\t} => {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\tstartDate: subDays(now, 7),\n\t\t\tendDate: now,\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t<Card className=\"flex-1\">\n\t\t\t<CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n\t\t\t\t<CardTitle>Flow Runs</CardTitle>\n\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} total\n\t\t\t\t</span>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t<div className=\"h-24\" ref={chartRef}>\n\t\t\t\t\t{effectiveNumberOfBars === 0 ? (\n\t\t\t\t\t\t<Skeleton className=\"h-full w-full\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t\t\t\t<FlowRunActivityBarChart\n\t\t\t\t\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\t\t\t\t\tstartDate={startDate}\n\t\t\t\t\t\t\t\tendDate={endDate}\n\t\t\t\t\t\t\t\tnumberOfBars={effectiveNumberOfBars}\n\t\t\t\t\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\t\t\t\t\tclassName=\"h-full w-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","import type { Flow } from \"@/api/flows\";\nimport { CumulativeTaskRunsCard } from \"./cumulative-task-runs-card\";\nimport { FlowRunsHistoryCard } from \"./flow-runs-history-card\";\n\ntype FlowStatsSummaryProps = {\n\tflowId: string;\n\tflow: Flow;\n};\n\nexport function FlowStatsSummary({ flowId, flow }: FlowStatsSummaryProps) {\n\treturn (\n\t\t<div className=\"grid gap-5 md:grid-cols-[2fr_1fr]\">\n\t\t\t<FlowRunsHistoryCard flowId={flowId} flow={flow} />\n\t\t\t<CumulativeTaskRunsCard flowId={flowId} />\n\t\t</div>\n\t);\n}\n","import { useNavigate } from \"@tanstack/react-router\";\nimport { type JSX, useCallback, useState } from \"react\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport type { Flow } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport type { FlowRunCardData } from \"@/components/flow-runs/flow-run-card\";\nimport {\n\tFlowRunsList,\n\tFlowRunsPagination,\n\tFlowRunsRowCount,\n\ttype PaginationState,\n\ttype SortFilters,\n\tuseFlowRunsSelectedRows,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport { SortFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter\";\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 { SearchInput } from \"@/components/ui/input\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { DeleteFlowDialog } from \"./delete-flow-dialog\";\nimport { FlowDeploymentsTab } from \"./flow-deployments-tab\";\nimport { FlowDetails } from \"./flow-details\";\nimport { FlowPageHeader } from \"./flow-page-header\";\nimport { FlowStatsSummary } from \"./flow-stats-summary\";\n\nexport default function FlowDetail({\n\tflow,\n\tflowRuns,\n\tflowRunsCount,\n\tflowRunsPages,\n\tdeployments,\n\tdeploymentsCount,\n\tdeploymentsPages,\n\ttab = \"runs\",\n\tpagination,\n\tonPaginationChange,\n\tonPrefetchPage,\n\tsort,\n\tonSortChange,\n\tflowRunSearch,\n\tonFlowRunSearchChange,\n\tselectedStates,\n\tonSelectFilter,\n\tdeploymentSearch,\n\tonDeploymentSearchChange,\n\tdeploymentTags,\n\tonDeploymentTagsChange,\n\tdeploymentSort,\n\tonDeploymentSortChange,\n\tdeploymentPagination,\n\tonDeploymentPaginationChange,\n}: {\n\tflow: Flow;\n\tflowRuns: FlowRun[];\n\tflowRunsCount: number;\n\tflowRunsPages: number;\n\tdeployments: components[\"schemas\"][\"DeploymentResponse\"][];\n\tdeploymentsCount: number;\n\tdeploymentsPages: number;\n\ttab: \"runs\" | \"deployments\" | \"details\";\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonPrefetchPage: (page: number) => void;\n\tsort: SortFilters;\n\tonSortChange: (sort: SortFilters) => void;\n\tflowRunSearch: string | undefined;\n\tonFlowRunSearchChange: (search: string) => void;\n\tselectedStates: Set<FlowRunState>;\n\tonSelectFilter: (states: Set<FlowRunState>) => void;\n\tdeploymentSearch: string | undefined;\n\tonDeploymentSearchChange: (search: string) => void;\n\tdeploymentTags: string[];\n\tonDeploymentTagsChange: (tags: string[]) => void;\n\tdeploymentSort: components[\"schemas\"][\"DeploymentSort\"];\n\tonDeploymentSortChange: (\n\t\tsort: components[\"schemas\"][\"DeploymentSort\"],\n\t) => void;\n\tdeploymentPagination: { page: number; limit: number };\n\tonDeploymentPaginationChange: (pagination: {\n\t\tpage: number;\n\t\tlimit: number;\n\t}) => void;\n}): JSX.Element {\n\tconst navigate = useNavigate();\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\tconst [selectedRows, setSelectedRows, { onSelectRow, clearSet }] =\n\t\tuseFlowRunsSelectedRows();\n\n\t// Enrich paginated flow runs with flow object for the list\n\tconst enrichedFlowRuns: FlowRunCardData[] = flowRuns.map((flowRun) => ({\n\t\t...flowRun,\n\t\tflow: flow,\n\t}));\n\n\t// Handler to clear filters\n\tconst onClearFilters = useCallback(() => {\n\t\tonFlowRunSearchChange(\"\");\n\t\tonSelectFilter(new Set());\n\t\tclearSet();\n\t}, [onFlowRunSearchChange, onSelectFilter, clearSet]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"container mx-auto flex flex-col gap-4\">\n\t\t\t\t<FlowPageHeader\n\t\t\t\t\tflow={flow}\n\t\t\t\t\tonDelete={() => setShowDeleteDialog(true)}\n\t\t\t\t/>\n\t\t\t\t<FlowStatsSummary flowId={flow.id} flow={flow} />\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={tab}\n\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \".\",\n\t\t\t\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\ttab: value as \"runs\" | \"deployments\" | \"details\",\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>\n\t\t\t\t\t<TabsList>\n\t\t\t\t\t\t<TabsTrigger value=\"runs\">Runs</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"deployments\">Deployments</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"details\">Details</TabsTrigger>\n\t\t\t\t\t</TabsList>\n\t\t\t\t\t<TabsContent value=\"runs\" className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t<FlowRunsRowCount\n\t\t\t\t\t\t\t\tcount={flowRunsCount}\n\t\t\t\t\t\t\t\tresults={enrichedFlowRuns}\n\t\t\t\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\t\t\t\tsetSelectedRows={setSelectedRows}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-4\">\n\t\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\t\t\t\tvalue={flowRunSearch ?? \"\"}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onFlowRunSearchChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"w-64\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<StateFilter\n\t\t\t\t\t\t\t\t\tselectedFilters={selectedStates}\n\t\t\t\t\t\t\t\t\tonSelectFilter={onSelectFilter}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<SortFilter value={sort} onSelect={onSortChange} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<FlowRunsList\n\t\t\t\t\t\t\tflowRuns={enrichedFlowRuns}\n\t\t\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\t\t\tonSelect={onSelectRow}\n\t\t\t\t\t\t\tonClearFilters={onClearFilters}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FlowRunsPagination\n\t\t\t\t\t\t\tcount={flowRunsCount}\n\t\t\t\t\t\t\tpages={flowRunsPages}\n\t\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\t\tonChangePagination={onPaginationChange}\n\t\t\t\t\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</TabsContent>\n\t\t\t\t\t<TabsContent value=\"deployments\">\n\t\t\t\t\t\t<FlowDeploymentsTab\n\t\t\t\t\t\t\tdeployments={deployments}\n\t\t\t\t\t\t\tdeploymentsCount={deploymentsCount}\n\t\t\t\t\t\t\tdeploymentsPages={deploymentsPages}\n\t\t\t\t\t\t\tdeploymentSearch={deploymentSearch}\n\t\t\t\t\t\t\tonDeploymentSearchChange={onDeploymentSearchChange}\n\t\t\t\t\t\t\tdeploymentTags={deploymentTags}\n\t\t\t\t\t\t\tonDeploymentTagsChange={onDeploymentTagsChange}\n\t\t\t\t\t\t\tdeploymentSort={deploymentSort}\n\t\t\t\t\t\t\tonDeploymentSortChange={onDeploymentSortChange}\n\t\t\t\t\t\t\tdeploymentPagination={deploymentPagination}\n\t\t\t\t\t\t\tonDeploymentPaginationChange={onDeploymentPaginationChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</TabsContent>\n\t\t\t\t\t<TabsContent value=\"details\">\n\t\t\t\t\t\t<FlowDetails flow={flow} />\n\t\t\t\t\t</TabsContent>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t\t<DeleteFlowDialog\n\t\t\t\tflow={flow}\n\t\t\t\topen={showDeleteDialog}\n\t\t\t\tonOpenChange={setShowDeleteDialog}\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQueries,\n} from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { buildPaginateDeploymentsQuery } from \"@/api/deployments\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildFilterFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsPaginateFilter,\n} from \"@/api/flow-runs\";\nimport {\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildFLowDetailsQuery,\n} from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildGetFlowRunsTaskRunsCountQuery,\n\tbuildTaskRunsHistoryQuery,\n} from \"@/api/task-runs\";\nimport {\n\ttype PaginationState,\n\tSORT_FILTERS,\n\ttype SortFilters,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport FlowDetail from \"@/components/flows/detail\";\nimport {\n\tbuildCompletedTaskRunsCountFilter,\n\tbuildFailedTaskRunsCountFilter,\n\tbuildFlowRunsCountFilterForHistory,\n\tbuildFlowRunsHistoryFilter,\n\tbuildRunningTaskRunsCountFilter,\n\tbuildTaskRunsHistoryFilterForFlow,\n\tbuildTotalTaskRunsCountFilter,\n} from \"@/components/flows/detail/flow-stats-summary/query-filters\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\n\n// Route for /flows/flow/$id\n\n// This file contains the route definition and loader function for the /flows/flow/$id route.\n\n// 1. searchParams defined as a zod schema for validating and typechecking the search query.\n// 2. filterFlowRunsBySearchParams function that takes a search object and returns a filter for flow runs.\n// 3. Route definition using createFileRoute function:\n// - It uses useSuspenseQueries to fetch data for the flow, flow runs, deployments, and related counts.\n// - Passes the fetched data to the FlowDetail component.\n// - Includes a loader function to prefetch data on the server side.\n\nconst searchParams = z\n\t.object({\n\t\ttab: z.enum([\"runs\", \"deployments\", \"details\"]).optional().default(\"runs\"),\n\t\t\"runs.page\": z.number().int().positive().optional().default(1),\n\t\t\"runs.limit\": z.number().int().positive().max(100).optional().default(10),\n\t\t\"runs.sort\": z.enum(SORT_FILTERS).optional().default(\"START_TIME_DESC\"),\n\t\t\"runs.flowRuns.nameLike\": z.string().optional().default(\"\"),\n\t\t\"runs.flowRuns.state.name\": z.array(z.string()).optional(),\n\t\ttype: z.enum([\"span\", \"range\"]).optional(),\n\t\tseconds: z.number().int().positive().optional(),\n\t\tstartDateTime: z.date().optional(),\n\t\tendDateTime: z.date().optional(),\n\t\t\"deployments.page\": z.number().int().positive().optional().default(1),\n\t\t\"deployments.limit\": z.number().int().positive().optional().default(10),\n\t\t\"deployments.nameLike\": z.string().optional(),\n\t\t\"deployments.tags\": z.array(z.string()).optional(),\n\t\t\"deployments.sort\": z\n\t\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t\t.optional()\n\t\t\t.default(\"NAME_ASC\"),\n\t})\n\t.optional()\n\t.default({});\n\ntype SearchParams = z.infer<typeof searchParams>;\n\nconst buildPaginationBody = (\n\tsearch: SearchParams,\n\tflowId: string,\n): FlowRunsPaginateFilter => {\n\tconst flowRunSearch = search[\"runs.flowRuns.nameLike\"];\n\tconst stateFilters = search[\"runs.flowRuns.state.name\"] ?? [];\n\n\tconst hasFilters = flowRunSearch || stateFilters.length > 0;\n\tconst flowRunsFilter = hasFilters\n\t\t? {\n\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t...(flowRunSearch && {\n\t\t\t\t\tname: { like_: flowRunSearch },\n\t\t\t\t}),\n\t\t\t\t...(stateFilters.length > 0 && {\n\t\t\t\t\tstate: {\n\t\t\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t\t\tname: { any_: stateFilters },\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\tpage: search[\"runs.page\"],\n\t\tlimit: search[\"runs.limit\"],\n\t\tsort: search[\"runs.sort\"],\n\t\tflow_runs: flowRunsFilter,\n\t\tflows: { operator: \"and_\" as const, id: { any_: [flowId] } },\n\t};\n};\n\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpage: search[\"runs.page\"],\n\t\t\tlimit: search[\"runs.limit\"],\n\t\t}),\n\t\t[search[\"runs.page\"], search[\"runs.limit\"]],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.page\": newPagination.page,\n\t\t\t\t\t\"runs.limit\": newPagination.limit,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortChange = useCallback(\n\t\t(sort: SortFilters) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, \"runs.sort\": sort, \"runs.page\": 1 }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"runs.sort\"], onSortChange] as const;\n};\n\nconst useFlowRunSearch = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onFlowRunSearchChange = useCallback(\n\t\t(flowRunSearch: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.flowRuns.nameLike\": flowRunSearch,\n\t\t\t\t\t\"runs.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"runs.flowRuns.nameLike\"], onFlowRunSearchChange] as const;\n};\n\nconst useStateFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst selectedStates = useMemo(\n\t\t() => new Set((search[\"runs.flowRuns.state.name\"] || []) as FlowRunState[]),\n\t\t[search[\"runs.flowRuns.state.name\"]],\n\t);\n\n\tconst onSelectFilter = useCallback(\n\t\t(states: Set<FlowRunState>) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.flowRuns.state.name\": Array.from(states),\n\t\t\t\t\t\"runs.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn { selectedStates, onSelectFilter };\n};\n\nconst useDeploymentSearch = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentSearchChange = useCallback(\n\t\t(deploymentSearch: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.nameLike\": deploymentSearch || undefined,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.nameLike\"], onDeploymentSearchChange] as const;\n};\n\nconst useDeploymentTagsFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentTagsChange = useCallback(\n\t\t(tags: string[]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.tags\": tags.length > 0 ? tags : undefined,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.tags\"] ?? [], onDeploymentTagsChange] as const;\n};\n\nconst useDeploymentSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentSortChange = useCallback(\n\t\t(sort: components[\"schemas\"][\"DeploymentSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.sort\": sort,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.sort\"], onDeploymentSortChange] as const;\n};\n\nconst useDeploymentPagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst deploymentPagination = useMemo(\n\t\t() => ({\n\t\t\tpage: search[\"deployments.page\"],\n\t\t\tlimit: search[\"deployments.limit\"],\n\t\t}),\n\t\t[search[\"deployments.page\"], search[\"deployments.limit\"]],\n\t);\n\n\tconst onDeploymentPaginationChange = useCallback(\n\t\t(newPagination: { page: number; limit: number }) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.page\": newPagination.page,\n\t\t\t\t\t\"deployments.limit\": newPagination.limit,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [deploymentPagination, onDeploymentPaginationChange] as const;\n};\n\nconst FlowDetailRoute = () => {\n\tconst queryClient = useQueryClient();\n\tconst { id } = Route.useParams();\n\tconst search = Route.useSearch();\n\n\t// Navigation hooks for flow runs\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [flowRunSearch, onFlowRunSearchChange] = useFlowRunSearch();\n\tconst { selectedStates, onSelectFilter } = useStateFilter();\n\n\t// Navigation hooks for deployments\n\tconst [deploymentSearch, onDeploymentSearchChange] = useDeploymentSearch();\n\tconst [deploymentTags, onDeploymentTagsChange] = useDeploymentTagsFilter();\n\tconst [deploymentSort, onDeploymentSortChange] = useDeploymentSort();\n\tconst [deploymentPagination, onDeploymentPaginationChange] =\n\t\tuseDeploymentPagination();\n\n\t// Suspense queries for stable data (flow)\n\tconst [{ data: flow }] = useSuspenseQueries({\n\t\tqueries: [buildFLowDetailsQuery(id)],\n\t});\n\n\t// Use useQuery for deployments to leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: deploymentsPage } = useQuery(\n\t\tbuildPaginateDeploymentsQuery({\n\t\t\tsort: search[\"deployments.sort\"],\n\t\t\tpage: search[\"deployments.page\"],\n\t\t\tlimit: search[\"deployments.limit\"],\n\t\t\tflows: { operator: \"and_\", id: { any_: [id] } },\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_or_deployment_name: { like_: search[\"deployments.nameLike\"] },\n\t\t\t\ttags: { operator: \"and_\", all_: search[\"deployments.tags\"] || [] },\n\t\t\t},\n\t\t}),\n\t);\n\n\t// Set page title based on flow name\n\tusePageTitle(flow?.name ? `Flow: ${flow.name}` : \"Flow\");\n\n\t// Use useQuery for paginated flow runsto leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: flowRunsPage } = useQuery(\n\t\tbuildPaginateFlowRunsQuery(buildPaginationBody(search, id), 30_000),\n\t);\n\n\tconst flowRuns = flowRunsPage?.results ?? [];\n\n\t// Prefetch task run counts for the current page's flow runs\n\t// This ensures the data is ready when FlowRunCard renders\n\tuseEffect(() => {\n\t\tconst flowRunIds = flowRuns.map((run) => run.id);\n\t\tif (flowRunIds.length > 0) {\n\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t);\n\t\t}\n\t}, [queryClient, flowRuns]);\n\n\t// Prefetch handler for pagination hover\n\tconst onPrefetchPage = useCallback(\n\t\t(page: number) => {\n\t\t\tconst filter = buildPaginationBody(\n\t\t\t\t{\n\t\t\t\t\t...search,\n\t\t\t\t\t\"runs.page\": page,\n\t\t\t\t},\n\t\t\t\tid,\n\t\t\t);\n\t\t\t// Prefetch the page data, then chain prefetch of task run counts\n\t\t\tvoid (async () => {\n\t\t\t\tconst pageData = await queryClient.ensureQueryData(\n\t\t\t\t\tbuildPaginateFlowRunsQuery(filter, 30_000),\n\t\t\t\t);\n\t\t\t\tconst flowRunIds = pageData?.results?.map((run) => run.id) ?? [];\n\t\t\t\tif (flowRunIds.length > 0) {\n\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\t[queryClient, search, id],\n\t);\n\n\treturn (\n\t\t<FlowDetail\n\t\t\tflow={flow}\n\t\t\tflowRuns={flowRuns}\n\t\t\tflowRunsCount={flowRunsPage?.count ?? 0}\n\t\t\tflowRunsPages={flowRunsPage?.pages ?? 0}\n\t\t\tdeployments={deploymentsPage?.results ?? []}\n\t\t\tdeploymentsCount={deploymentsPage?.count ?? 0}\n\t\t\tdeploymentsPages={deploymentsPage?.pages ?? 0}\n\t\t\ttab={search.tab}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\tsort={sort}\n\t\t\tonSortChange={onSortChange}\n\t\t\tflowRunSearch={flowRunSearch}\n\t\t\tonFlowRunSearchChange={onFlowRunSearchChange}\n\t\t\tselectedStates={selectedStates}\n\t\t\tonSelectFilter={onSelectFilter}\n\t\t\tdeploymentSearch={deploymentSearch}\n\t\t\tonDeploymentSearchChange={onDeploymentSearchChange}\n\t\t\tdeploymentTags={deploymentTags}\n\t\t\tonDeploymentTagsChange={onDeploymentTagsChange}\n\t\t\tdeploymentSort={deploymentSort}\n\t\t\tonDeploymentSortChange={onDeploymentSortChange}\n\t\t\tdeploymentPagination={deploymentPagination}\n\t\t\tonDeploymentPaginationChange={onDeploymentPaginationChange}\n\t\t/>\n\t);\n};\n\nexport const Route = createFileRoute(\"/flows/flow/$id\")({\n\tcomponent: FlowDetailRoute,\n\tvalidateSearch: zodValidator(searchParams),\n\tloaderDeps: ({ search }) => ({\n\t\tflowRunsDeps: search,\n\t}),\n\tloader: ({ params: { id }, context, deps }) => {\n\t\tconst REFETCH_INTERVAL = 30_000;\n\n\t\t// Prefetch flow details\n\t\tvoid context.queryClient.prefetchQuery(buildFLowDetailsQuery(id));\n\n\t\t// Prefetch paginated flow runs without blocking (uses keepPreviousData)\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\tbuildPaginationBody(deps.flowRunsDeps, id),\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\n\t\t// Prefetch deployments with filter parameters\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateDeploymentsQuery({\n\t\t\t\tsort: deps.flowRunsDeps[\"deployments.sort\"],\n\t\t\t\tpage: deps.flowRunsDeps[\"deployments.page\"],\n\t\t\t\tlimit: deps.flowRunsDeps[\"deployments.limit\"],\n\t\t\t\tflows: { operator: \"and_\", id: { any_: [id] } },\n\t\t\t\tdeployments: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_or_deployment_name: {\n\t\t\t\t\t\tlike_: deps.flowRunsDeps[\"deployments.nameLike\"],\n\t\t\t\t\t},\n\t\t\t\t\ttags: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tall_: deps.flowRunsDeps[\"deployments.tags\"] || [],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// Prefetch deployments count\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildDeploymentsCountByFlowQuery([id]),\n\t\t);\n\n\t\t// Prefetch FlowStatsSummary queries\n\t\t// FlowRunsHistoryCard queries\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildFilterFlowRunsQuery(\n\t\t\t\tbuildFlowRunsHistoryFilter(id, 60),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\tbuildFlowRunsCountFilterForHistory(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\n\t\t// CumulativeTaskRunsCard queries\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildTotalTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildCompletedTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildFailedTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildRunningTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildTaskRunsHistoryQuery(\n\t\t\t\tbuildTaskRunsHistoryFilterForFlow(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\n\t\t// Background async chain: prefetch task run counts for each flow run\n\t\t// This prevents suspense when FlowRunCard renders\n\t\tvoid (async () => {\n\t\t\tconst pageData = await context.queryClient.ensureQueryData(\n\t\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\t\tbuildPaginationBody(deps.flowRunsDeps, id),\n\t\t\t\t\t30_000,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst flowRunIds = pageData?.results?.map((run) => run.id) ?? [];\n\t\t\tif (flowRunIds.length > 0) {\n\t\t\t\tvoid context.queryClient.prefetchQuery(\n\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t\t);\n\t\t\t}\n\t\t})();\n\n\t\t// Ensure flow details are loaded (critical data)\n\t\treturn context.queryClient.ensureQueryData(buildFLowDetailsQuery(id));\n\t},\n\twrapInSuspense: true,\n});\n"],"names":["DeleteFlowDialog","flow","open","onOpenChange","onDeleted","navigate","useNavigate","deleteFlow","isPending","useDeleteFlowById","handleDelete","toast","jsx","DeleteConfirmationDialog","BAR_WIDTH","BAR_GAP","MiniDeploymentActivity","deploymentId","numberOfBars","setNumberOfBars","useState","debouncedNumberOfBars","useDebounce","chartRef","useCallback","node","updateBars","chartWidth","resizeObserver","effectiveNumberOfBars","flowRuns","useQuery","buildFilterFlowRunsQuery","enrichedFlowRuns","flowRun","FlowRunActivityBarChart","subSeconds","secondsInWeek","columns","table","Checkbox","value","row","status","StatusBadge","tag","schedules","ScheduleBadgeGroup","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuItem","SORT_OPTIONS","FlowDeploymentsTab","deployments","deploymentsCount","deploymentsPages","deploymentSearch","onDeploymentSearchChange","deploymentTags","onDeploymentTagsChange","deploymentSort","onDeploymentSortChange","deploymentPagination","onDeploymentPaginationChange","rowSelection","setRowSelection","showDeleteDialog","setShowDeleteDialog","deleteDeployment","useDeleteDeployment","handlePaginationChange","updater","currentPagination","newPagination","deploymentsTable","useReactTable","baseDeploymentColumns","getCoreRowModel","selectedCount","handleDeleteSelected","selectedIds","id","handleDeploymentTagsChange","e","Typography","Trash2","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","FlowRunActivityBarGraphTooltipProvider","DataTable","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","FlowDetails","FormattedDate","FlowMenu","onDelete","handleCopyId","DropdownMenuLabel","FlowPageHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","REFETCH_INTERVAL","chartConfig","transformHistoryToChartData","history","chartData","cumulativeCompleted","cumulativeFailed","item","completedCount","failedCount","state","CumulativeTaskRunsCard","flowId","total","completed","failed","running","useSuspenseQueries","buildCountTaskRunsQuery","buildTotalTaskRunsCountFilter","buildCompletedTaskRunsCountFilter","buildFailedTaskRunsCountFilter","buildRunningTaskRunsCountFilter","buildTaskRunsHistoryQuery","buildTaskRunsHistoryFilterForFlow","useMemo","hasFailedData","point","percentComparisonTotal","completedPercentage","failedPercentage","Card","CardHeader","CardTitle","CardContent","ChartContainer","AreaChart","Area","FlowRunsHistoryCard","QUERY_LIMIT","totalCount","buildFlowRunsHistoryFilter","buildCountFlowRunsQuery","buildFlowRunsCountFilterForHistory","startDate","endDate","now","subDays","Skeleton","FlowStatsSummary","FlowDetail","flowRunsCount","flowRunsPages","tab","pagination","onPaginationChange","onPrefetchPage","sort","onSortChange","flowRunSearch","onFlowRunSearchChange","selectedStates","onSelectFilter","selectedRows","setSelectedRows","onSelectRow","clearSet","useFlowRunsSelectedRows","onClearFilters","Fragment","Tabs","prev","TabsList","TabsTrigger","TabsContent","FlowRunsRowCount","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","z","optional","default","number","int","positive","max","SORT_FILTERS","string","type","seconds","startDateTime","date","endDateTime","buildPaginationBody","search","stateFilters","flowRunsFilter","length","operator","name","like_","any_","undefined","page","limit","flow_runs","flows","usePagination","Route","useSearch","to","replace","useSort","useFlowRunSearch","useStateFilter","Set","states","Array","from","useDeploymentSearch","useDeploymentTagsFilter","tags","useDeploymentSort","useDeploymentPagination","FlowDetailRoute","queryClient","useQueryClient","useParams","data","queries","buildFLowDetailsQuery","deploymentsPage","buildPaginateDeploymentsQuery","flow_or_deployment_name","all_","usePageTitle","flowRunsPage","buildPaginateFlowRunsQuery","results","useEffect","flowRunIds","map","run","prefetchQuery","buildGetFlowRunsTaskRunsCountQuery","filter","ensureQueryData","count","pages"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as s,j as n}from"./vendor-tanstack-BcZfOOfy.js";import{S as F}from"./vendor-radix-BTiKGWfR.js";import{g as x,F as u,C as p}from"./vendor-forms-ClCIacbh.js";import{aW as i,i as I}from"./index-m48E4KcG.js";const l=s.createContext({}),f=s.createContext({}),d=()=>{const e=s.useContext(l),t=s.useContext(f),{getFieldState:r,formState:o}=x(),m=r(e.name,o);if(!e)throw new Error("useFormField should be used within <FormField>");const{id:a}=t;return{id:a,name:e.name,formItemId:`${a}-form-item`,formDescriptionId:`${a}-form-item-description`,formMessageId:`${a}-form-item-message`,...m}},R=u,S=({...e})=>n.jsx(l.Provider,{value:{name:e.name},children:n.jsx(p,{...e})}),C=s.forwardRef(({className:e,...t},r)=>{const o=s.useId();return n.jsx(f.Provider,{value:{id:o},children:n.jsx("div",{ref:r,className:i("space-y-2",e),...t})})});C.displayName="FormItem";const g=s.forwardRef(({className:e,...t},r)=>{const{error:o,formItemId:m}=d();return n.jsx(I,{ref:r,className:i(o&&"text-destructive",e),htmlFor:m,...t})});g.displayName="FormLabel";const j=s.forwardRef(({...e},t)=>{const{error:r,formItemId:o,formDescriptionId:m,formMessageId:a}=d();return n.jsx(F,{ref:t,id:o,"aria-describedby":r?`${m} ${a}`:`${m}`,"aria-invalid":!!r,...e})});j.displayName="FormControl";const v=s.forwardRef(({className:e,...t},r)=>{const{formDescriptionId:o}=d();return n.jsx("p",{ref:r,id:o,className:i("text-[0.8rem] text-muted-foreground",e),...t})});v.displayName="FormDescription";const N=s.forwardRef(({className:e,children:t,...r},o)=>{const{error:m,formMessageId:a}=d(),c=m?String(m?.message):t;return c?n.jsx("p",{ref:o,id:a,className:i("text-[0.8rem] font-medium text-destructive",e),...r,children:c}):null});N.displayName="FormMessage";export{R as F,N as a,S as b,C as c,g as d,j as e};
2
- //# sourceMappingURL=form-DLrbC7rV.js.map
1
+ import{r as s,j as n}from"./vendor-tanstack-BcZfOOfy.js";import{S as F}from"./vendor-radix-BTiKGWfR.js";import{g as x,F as u,C as p}from"./vendor-forms-ClCIacbh.js";import{a_ as i,i as I}from"./index-B8vo2Lrg.js";const l=s.createContext({}),f=s.createContext({}),d=()=>{const e=s.useContext(l),t=s.useContext(f),{getFieldState:r,formState:o}=x(),m=r(e.name,o);if(!e)throw new Error("useFormField should be used within <FormField>");const{id:a}=t;return{id:a,name:e.name,formItemId:`${a}-form-item`,formDescriptionId:`${a}-form-item-description`,formMessageId:`${a}-form-item-message`,...m}},R=u,S=({...e})=>n.jsx(l.Provider,{value:{name:e.name},children:n.jsx(p,{...e})}),C=s.forwardRef(({className:e,...t},r)=>{const o=s.useId();return n.jsx(f.Provider,{value:{id:o},children:n.jsx("div",{ref:r,className:i("space-y-2",e),...t})})});C.displayName="FormItem";const g=s.forwardRef(({className:e,...t},r)=>{const{error:o,formItemId:m}=d();return n.jsx(I,{ref:r,className:i(o&&"text-destructive",e),htmlFor:m,...t})});g.displayName="FormLabel";const j=s.forwardRef(({...e},t)=>{const{error:r,formItemId:o,formDescriptionId:m,formMessageId:a}=d();return n.jsx(F,{ref:t,id:o,"aria-describedby":r?`${m} ${a}`:`${m}`,"aria-invalid":!!r,...e})});j.displayName="FormControl";const v=s.forwardRef(({className:e,...t},r)=>{const{formDescriptionId:o}=d();return n.jsx("p",{ref:r,id:o,className:i("text-[0.8rem] text-muted-foreground",e),...t})});v.displayName="FormDescription";const N=s.forwardRef(({className:e,children:t,...r},o)=>{const{error:m,formMessageId:a}=d(),c=m?String(m?.message):t;return c?n.jsx("p",{ref:o,id:a,className:i("text-[0.8rem] font-medium text-destructive",e),...r,children:c}):null});N.displayName="FormMessage";export{R as F,N as a,S as b,C as c,g as d,j as e};
2
+ //# sourceMappingURL=form-mws4law8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-DLrbC7rV.js","sources":["../../src/components/ui/form/hooks.ts","../../src/components/ui/form/form.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n\ttype FieldPath,\n\ttype FieldValues,\n\tuseFormContext,\n} from \"react-hook-form\";\n\ntype FormFieldContextValue<\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n\tname: TName;\n};\n\nexport const FormFieldContext = React.createContext<FormFieldContextValue>(\n\t{} as FormFieldContextValue,\n);\n\ntype FormItemContextValue = {\n\tid: string;\n};\n\nexport const FormItemContext = React.createContext<FormItemContextValue>(\n\t{} as FormItemContextValue,\n);\n\nexport const useFormField = () => {\n\tconst fieldContext = React.useContext(FormFieldContext);\n\tconst itemContext = React.useContext(FormItemContext);\n\tconst { getFieldState, formState } = useFormContext();\n\n\tconst fieldState = getFieldState(fieldContext.name, formState);\n\n\tif (!fieldContext) {\n\t\tthrow new Error(\"useFormField should be used within <FormField>\");\n\t}\n\n\tconst { id } = itemContext;\n\n\treturn {\n\t\tid,\n\t\tname: fieldContext.name,\n\t\tformItemId: `${id}-form-item`,\n\t\tformDescriptionId: `${id}-form-item-description`,\n\t\tformMessageId: `${id}-form-item-message`,\n\t\t...fieldState,\n\t};\n};\n","import type * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport {\n\tController,\n\ttype ControllerProps,\n\ttype FieldPath,\n\ttype FieldValues,\n\tFormProvider,\n} from \"react-hook-form\";\nimport { Label } from \"@/components/ui/label\";\nimport { cn } from \"@/utils\";\nimport { FormFieldContext, FormItemContext, useFormField } from \"./hooks\";\n\nconst Form = FormProvider;\n\nconst FormField = <\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n\t...props\n}: ControllerProps<TFieldValues, TName>) => {\n\treturn (\n\t\t<FormFieldContext.Provider value={{ name: props.name }}>\n\t\t\t<Controller {...props} />\n\t\t</FormFieldContext.Provider>\n\t);\n};\n\nconst FormItem = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n\tconst id = React.useId();\n\n\treturn (\n\t\t<FormItemContext.Provider value={{ id }}>\n\t\t\t<div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n\t\t</FormItemContext.Provider>\n\t);\n});\nFormItem.displayName = \"FormItem\";\n\ntype FormLabelProps = React.ComponentPropsWithoutRef<\n\ttypeof LabelPrimitive.Root\n> & {\n\tclassName?: string;\n};\n\nconst FormLabel = React.forwardRef<\n\tReact.ElementRef<typeof LabelPrimitive.Root>,\n\tFormLabelProps\n>(({ className, ...props }, ref) => {\n\tconst { error, formItemId } = useFormField();\n\n\treturn (\n\t\t<Label\n\t\t\tref={ref}\n\t\t\tclassName={cn(error && \"text-destructive\", className)}\n\t\t\thtmlFor={formItemId}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<\n\tReact.ElementRef<typeof Slot>,\n\tReact.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n\tconst { error, formItemId, formDescriptionId, formMessageId } =\n\t\tuseFormField();\n\n\treturn (\n\t\t<Slot\n\t\t\tref={ref}\n\t\t\tid={formItemId}\n\t\t\taria-describedby={\n\t\t\t\t!error\n\t\t\t\t\t? `${formDescriptionId}`\n\t\t\t\t\t: `${formDescriptionId} ${formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={!!error}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n\tconst { formDescriptionId } = useFormField();\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formDescriptionId}\n\t\t\tclassName={cn(\"text-[0.8rem] text-muted-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n\tconst { error, formMessageId } = useFormField();\n\tconst body = error ? String(error?.message) : children;\n\n\tif (!body) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formMessageId}\n\t\t\tclassName={cn(\"text-[0.8rem] font-medium text-destructive\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{body}\n\t\t</p>\n\t);\n});\nFormMessage.displayName = \"FormMessage\";\n\nexport {\n\tForm,\n\tFormItem,\n\tFormLabel,\n\tFormControl,\n\tFormDescription,\n\tFormMessage,\n\tFormField,\n};\n"],"names":["FormFieldContext","React.createContext","FormItemContext","useFormField","fieldContext","React.useContext","itemContext","getFieldState","formState","useFormContext","fieldState","id","Form","FormProvider","FormField","props","jsx","Controller","FormItem","React.forwardRef","className","ref","React.useId","cn","FormLabel","error","formItemId","Label","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","children","body"],"mappings":"qNAcO,MAAMA,EAAmBC,EAAAA,cAC/B,CAAA,CACD,EAMaC,EAAkBD,EAAAA,cAC9B,CAAA,CACD,EAEaE,EAAe,IAAM,CACjC,MAAMC,EAAeC,EAAAA,WAAiBL,CAAgB,EAChDM,EAAcD,EAAAA,WAAiBH,CAAe,EAC9C,CAAE,cAAAK,EAAe,UAAAC,CAAA,EAAcC,EAAA,EAE/BC,EAAaH,EAAcH,EAAa,KAAMI,CAAS,EAE7D,GAAI,CAACJ,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGjE,KAAM,CAAE,GAAAO,GAAOL,EAEf,MAAO,CACN,GAAAK,EACA,KAAMP,EAAa,KACnB,WAAY,GAAGO,CAAE,aACjB,kBAAmB,GAAGA,CAAE,yBACxB,cAAe,GAAGA,CAAE,qBACpB,GAAGD,CAAA,CAEL,ECjCME,EAAOC,EAEPC,EAAY,CAGhB,CACD,GAAGC,CACJ,IAEEC,EAAAA,IAAChB,EAAiB,SAAjB,CAA0B,MAAO,CAAE,KAAMe,EAAM,IAAA,EAC/C,SAAAC,EAAAA,IAACC,EAAA,CAAY,GAAGF,EAAO,EACxB,EAIIG,EAAWC,EAAAA,WAGf,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,MAAMV,EAAKW,EAAAA,MAAM,EAEjB,aACEpB,EAAgB,SAAhB,CAAyB,MAAO,CAAE,GAAAS,GAClC,SAAAK,EAAAA,IAAC,MAAA,CAAI,IAAAK,EAAU,UAAWE,EAAG,YAAaH,CAAS,EAAI,GAAGL,EAAO,EAClE,CAEF,CAAC,EACDG,EAAS,YAAc,WAQvB,MAAMM,EAAYL,EAAAA,WAGhB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,MAAAI,EAAO,WAAAC,CAAA,EAAevB,EAAA,EAE9B,OACCa,EAAAA,IAACW,EAAA,CACA,IAAAN,EACA,UAAWE,EAAGE,GAAS,mBAAoBL,CAAS,EACpD,QAASM,EACR,GAAGX,CAAA,CAAA,CAGP,CAAC,EACDS,EAAU,YAAc,YAExB,MAAMI,EAAcT,EAAAA,WAGlB,CAAC,CAAE,GAAGJ,CAAA,EAASM,IAAQ,CACxB,KAAM,CAAE,MAAAI,EAAO,WAAAC,EAAY,kBAAAG,EAAmB,cAAAC,CAAA,EAC7C3B,EAAA,EAED,OACCa,EAAAA,IAACe,EAAA,CACA,IAAAV,EACA,GAAIK,EACJ,mBACED,EAEE,GAAGI,CAAiB,IAAIC,CAAa,GADrC,GAAGD,CAAiB,GAGxB,eAAc,CAAC,CAACJ,EACf,GAAGV,CAAA,CAAA,CAGP,CAAC,EACDa,EAAY,YAAc,cAE1B,MAAMI,EAAkBb,EAAAA,WAGtB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,kBAAAQ,CAAA,EAAsB1B,EAAA,EAE9B,OACCa,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIQ,EACJ,UAAWN,EAAG,sCAAuCH,CAAS,EAC7D,GAAGL,CAAA,CAAA,CAGP,CAAC,EACDiB,EAAgB,YAAc,kBAE9B,MAAMC,EAAcd,EAAAA,WAGlB,CAAC,CAAE,UAAAC,EAAW,SAAAc,EAAU,GAAGnB,CAAA,EAASM,IAAQ,CAC7C,KAAM,CAAE,MAAAI,EAAO,cAAAK,CAAA,EAAkB3B,EAAA,EAC3BgC,EAAOV,EAAQ,OAAOA,GAAO,OAAO,EAAIS,EAE9C,OAAKC,EAKJnB,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIS,EACJ,UAAWP,EAAG,6CAA8CH,CAAS,EACpE,GAAGL,EAEH,SAAAoB,CAAA,CAAA,EAVK,IAaT,CAAC,EACDF,EAAY,YAAc"}
1
+ {"version":3,"file":"form-mws4law8.js","sources":["../../src/components/ui/form/hooks.ts","../../src/components/ui/form/form.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n\ttype FieldPath,\n\ttype FieldValues,\n\tuseFormContext,\n} from \"react-hook-form\";\n\ntype FormFieldContextValue<\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n\tname: TName;\n};\n\nexport const FormFieldContext = React.createContext<FormFieldContextValue>(\n\t{} as FormFieldContextValue,\n);\n\ntype FormItemContextValue = {\n\tid: string;\n};\n\nexport const FormItemContext = React.createContext<FormItemContextValue>(\n\t{} as FormItemContextValue,\n);\n\nexport const useFormField = () => {\n\tconst fieldContext = React.useContext(FormFieldContext);\n\tconst itemContext = React.useContext(FormItemContext);\n\tconst { getFieldState, formState } = useFormContext();\n\n\tconst fieldState = getFieldState(fieldContext.name, formState);\n\n\tif (!fieldContext) {\n\t\tthrow new Error(\"useFormField should be used within <FormField>\");\n\t}\n\n\tconst { id } = itemContext;\n\n\treturn {\n\t\tid,\n\t\tname: fieldContext.name,\n\t\tformItemId: `${id}-form-item`,\n\t\tformDescriptionId: `${id}-form-item-description`,\n\t\tformMessageId: `${id}-form-item-message`,\n\t\t...fieldState,\n\t};\n};\n","import type * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport {\n\tController,\n\ttype ControllerProps,\n\ttype FieldPath,\n\ttype FieldValues,\n\tFormProvider,\n} from \"react-hook-form\";\nimport { Label } from \"@/components/ui/label\";\nimport { cn } from \"@/utils\";\nimport { FormFieldContext, FormItemContext, useFormField } from \"./hooks\";\n\nconst Form = FormProvider;\n\nconst FormField = <\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n\t...props\n}: ControllerProps<TFieldValues, TName>) => {\n\treturn (\n\t\t<FormFieldContext.Provider value={{ name: props.name }}>\n\t\t\t<Controller {...props} />\n\t\t</FormFieldContext.Provider>\n\t);\n};\n\nconst FormItem = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n\tconst id = React.useId();\n\n\treturn (\n\t\t<FormItemContext.Provider value={{ id }}>\n\t\t\t<div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n\t\t</FormItemContext.Provider>\n\t);\n});\nFormItem.displayName = \"FormItem\";\n\ntype FormLabelProps = React.ComponentPropsWithoutRef<\n\ttypeof LabelPrimitive.Root\n> & {\n\tclassName?: string;\n};\n\nconst FormLabel = React.forwardRef<\n\tReact.ElementRef<typeof LabelPrimitive.Root>,\n\tFormLabelProps\n>(({ className, ...props }, ref) => {\n\tconst { error, formItemId } = useFormField();\n\n\treturn (\n\t\t<Label\n\t\t\tref={ref}\n\t\t\tclassName={cn(error && \"text-destructive\", className)}\n\t\t\thtmlFor={formItemId}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<\n\tReact.ElementRef<typeof Slot>,\n\tReact.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n\tconst { error, formItemId, formDescriptionId, formMessageId } =\n\t\tuseFormField();\n\n\treturn (\n\t\t<Slot\n\t\t\tref={ref}\n\t\t\tid={formItemId}\n\t\t\taria-describedby={\n\t\t\t\t!error\n\t\t\t\t\t? `${formDescriptionId}`\n\t\t\t\t\t: `${formDescriptionId} ${formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={!!error}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n\tconst { formDescriptionId } = useFormField();\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formDescriptionId}\n\t\t\tclassName={cn(\"text-[0.8rem] text-muted-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n\tconst { error, formMessageId } = useFormField();\n\tconst body = error ? String(error?.message) : children;\n\n\tif (!body) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formMessageId}\n\t\t\tclassName={cn(\"text-[0.8rem] font-medium text-destructive\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{body}\n\t\t</p>\n\t);\n});\nFormMessage.displayName = \"FormMessage\";\n\nexport {\n\tForm,\n\tFormItem,\n\tFormLabel,\n\tFormControl,\n\tFormDescription,\n\tFormMessage,\n\tFormField,\n};\n"],"names":["FormFieldContext","React.createContext","FormItemContext","useFormField","fieldContext","React.useContext","itemContext","getFieldState","formState","useFormContext","fieldState","id","Form","FormProvider","FormField","props","jsx","Controller","FormItem","React.forwardRef","className","ref","React.useId","cn","FormLabel","error","formItemId","Label","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","children","body"],"mappings":"qNAcO,MAAMA,EAAmBC,EAAAA,cAC/B,CAAA,CACD,EAMaC,EAAkBD,EAAAA,cAC9B,CAAA,CACD,EAEaE,EAAe,IAAM,CACjC,MAAMC,EAAeC,EAAAA,WAAiBL,CAAgB,EAChDM,EAAcD,EAAAA,WAAiBH,CAAe,EAC9C,CAAE,cAAAK,EAAe,UAAAC,CAAA,EAAcC,EAAA,EAE/BC,EAAaH,EAAcH,EAAa,KAAMI,CAAS,EAE7D,GAAI,CAACJ,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGjE,KAAM,CAAE,GAAAO,GAAOL,EAEf,MAAO,CACN,GAAAK,EACA,KAAMP,EAAa,KACnB,WAAY,GAAGO,CAAE,aACjB,kBAAmB,GAAGA,CAAE,yBACxB,cAAe,GAAGA,CAAE,qBACpB,GAAGD,CAAA,CAEL,ECjCME,EAAOC,EAEPC,EAAY,CAGhB,CACD,GAAGC,CACJ,IAEEC,EAAAA,IAAChB,EAAiB,SAAjB,CAA0B,MAAO,CAAE,KAAMe,EAAM,IAAA,EAC/C,SAAAC,EAAAA,IAACC,EAAA,CAAY,GAAGF,EAAO,EACxB,EAIIG,EAAWC,EAAAA,WAGf,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,MAAMV,EAAKW,EAAAA,MAAM,EAEjB,aACEpB,EAAgB,SAAhB,CAAyB,MAAO,CAAE,GAAAS,GAClC,SAAAK,EAAAA,IAAC,MAAA,CAAI,IAAAK,EAAU,UAAWE,EAAG,YAAaH,CAAS,EAAI,GAAGL,EAAO,EAClE,CAEF,CAAC,EACDG,EAAS,YAAc,WAQvB,MAAMM,EAAYL,EAAAA,WAGhB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,MAAAI,EAAO,WAAAC,CAAA,EAAevB,EAAA,EAE9B,OACCa,EAAAA,IAACW,EAAA,CACA,IAAAN,EACA,UAAWE,EAAGE,GAAS,mBAAoBL,CAAS,EACpD,QAASM,EACR,GAAGX,CAAA,CAAA,CAGP,CAAC,EACDS,EAAU,YAAc,YAExB,MAAMI,EAAcT,EAAAA,WAGlB,CAAC,CAAE,GAAGJ,CAAA,EAASM,IAAQ,CACxB,KAAM,CAAE,MAAAI,EAAO,WAAAC,EAAY,kBAAAG,EAAmB,cAAAC,CAAA,EAC7C3B,EAAA,EAED,OACCa,EAAAA,IAACe,EAAA,CACA,IAAAV,EACA,GAAIK,EACJ,mBACED,EAEE,GAAGI,CAAiB,IAAIC,CAAa,GADrC,GAAGD,CAAiB,GAGxB,eAAc,CAAC,CAACJ,EACf,GAAGV,CAAA,CAAA,CAGP,CAAC,EACDa,EAAY,YAAc,cAE1B,MAAMI,EAAkBb,EAAAA,WAGtB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,kBAAAQ,CAAA,EAAsB1B,EAAA,EAE9B,OACCa,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIQ,EACJ,UAAWN,EAAG,sCAAuCH,CAAS,EAC7D,GAAGL,CAAA,CAAA,CAGP,CAAC,EACDiB,EAAgB,YAAc,kBAE9B,MAAMC,EAAcd,EAAAA,WAGlB,CAAC,CAAE,UAAAC,EAAW,SAAAc,EAAU,GAAGnB,CAAA,EAASM,IAAQ,CAC7C,KAAM,CAAE,MAAAI,EAAO,cAAAK,CAAA,EAAkB3B,EAAA,EAC3BgC,EAAOV,EAAQ,OAAOA,GAAO,OAAO,EAAIS,EAE9C,OAAKC,EAKJnB,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIS,EACJ,UAAWP,EAAG,6CAA8CH,CAAS,EACpE,GAAGL,EAEH,SAAAoB,CAAA,CAAA,EAVK,IAaT,CAAC,EACDF,EAAY,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-tanstack-BcZfOOfy.js";import{B as s,g as r,h as t}from"./index-m48E4KcG.js";const c=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(s,{children:e.jsx(r,{children:e.jsx(t,{className:"text-xl font-semibold",children:"Deployments"})})})});export{c as D};
2
- //# sourceMappingURL=header-BTAWyeXv.js.map
1
+ import{j as e}from"./vendor-tanstack-BcZfOOfy.js";import{B as s,g as r,h as t}from"./index-B8vo2Lrg.js";const c=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(s,{children:e.jsx(r,{children:e.jsx(t,{className:"text-xl font-semibold",children:"Deployments"})})})});export{c as D};
2
+ //# sourceMappingURL=header-Bes1LmY7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"header-BTAWyeXv.js","sources":["../../src/components/deployments/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const DeploymentsPageHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tDeployments\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n"],"names":["DeploymentsPageHeader","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem"],"mappings":"wGAMO,MAAMA,EAAwB,IAEnCC,MAAC,MAAA,CAAI,UAAU,0BACd,eAACC,EAAA,CACA,SAAAD,MAACE,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,aAAA,CAElD,EACD,EACD,CAAA,CACD"}
1
+ {"version":3,"file":"header-Bes1LmY7.js","sources":["../../src/components/deployments/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const DeploymentsPageHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tDeployments\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n"],"names":["DeploymentsPageHeader","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem"],"mappings":"wGAMO,MAAMA,EAAwB,IAEnCC,MAAC,MAAA,CAAI,UAAU,0BACd,eAACC,EAAA,CACA,SAAAD,MAACE,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,aAAA,CAElD,EACD,EACD,CAAA,CACD"}
@@ -1,2 +1,2 @@
1
- import{j as s,L as e}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as o,q as i,I as t}from"./index-m48E4KcG.js";const n=()=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(o,{className:"text-xl font-semibold",children:"Work pools"})})}),s.jsx(e,{to:"/work-pools/create",children:s.jsx(i,{size:"icon",className:"size-7",variant:"outline",children:s.jsx(t,{id:"Plus",className:"size-4"})})})]});export{n as W};
2
- //# sourceMappingURL=header-ChFAx5uR.js.map
1
+ import{j as s,L as e}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as o,q as i,I as t}from"./index-B8vo2Lrg.js";const n=()=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(o,{className:"text-xl font-semibold",children:"Work pools"})})}),s.jsx(e,{to:"/work-pools/create",children:s.jsx(i,{size:"icon",className:"size-7",variant:"outline",children:s.jsx(t,{id:"Plus",className:"size-4"})})})]});export{n as W};
2
+ //# sourceMappingURL=header-Bj_zBR-a.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"header-ChFAx5uR.js","sources":["../../src/components/work-pools/header.tsx"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const WorkPoolsPageHeader = () => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\tWork pools\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t\t<Link to=\"/work-pools/create\">\n\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</Link>\n\t</div>\n);\n"],"names":["WorkPoolsPageHeader","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Link","Button","Icon"],"mappings":"6HASO,MAAMA,EAAsB,IAClCC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,YAAA,CAElD,CAAA,CACD,EACD,QACCC,EAAA,CAAK,GAAG,qBACR,SAAAJ,EAAAA,IAACK,EAAA,CAAO,KAAK,OAAO,UAAU,SAAS,QAAQ,UAC9C,eAACC,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,EACpC,CAAA,CACD,CAAA,CAAA,CACD"}
1
+ {"version":3,"file":"header-Bj_zBR-a.js","sources":["../../src/components/work-pools/header.tsx"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const WorkPoolsPageHeader = () => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\tWork pools\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t\t<Link to=\"/work-pools/create\">\n\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</Link>\n\t</div>\n);\n"],"names":["WorkPoolsPageHeader","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Link","Button","Icon"],"mappings":"6HASO,MAAMA,EAAsB,IAClCC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,YAAA,CAElD,CAAA,CACD,EACD,QACCC,EAAA,CAAK,GAAG,qBACR,SAAAJ,EAAAA,IAACK,EAAA,CAAO,KAAK,OAAO,UAAU,SAAS,QAAQ,UAC9C,eAACC,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,EACpC,CAAA,CACD,CAAA,CAAA,CACD"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as i,q as t,I as c}from"./index-m48E4KcG.js";const n=({onAddVariableClick:e})=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(i,{className:"text-xl font-semibold",children:"Variables"})})}),e&&s.jsx(t,{size:"icon",className:"size-7",variant:"outline",onClick:()=>e(),children:s.jsx(c,{id:"Plus",className:"size-4"})})]});export{n as V};
2
- //# sourceMappingURL=header-CyQqOj1w.js.map
1
+ import{j as s}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as i,q as t,I as c}from"./index-B8vo2Lrg.js";const n=({onAddVariableClick:e})=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(i,{className:"text-xl font-semibold",children:"Variables"})})}),e&&s.jsx(t,{size:"icon",className:"size-7",variant:"outline",onClick:()=>e(),children:s.jsx(c,{id:"Plus",className:"size-4"})})]});export{n as V};
2
+ //# sourceMappingURL=header-CPxTHSvz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"header-CyQqOj1w.js","sources":["../../src/components/variables/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype VariablesPageHeaderProps = {\n\tonAddVariableClick?: () => void;\n};\n\nexport const VariablesPageHeader = ({\n\tonAddVariableClick,\n}: VariablesPageHeaderProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tVariables\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t{onAddVariableClick && (\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"size-7\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onAddVariableClick()}\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["VariablesPageHeader","onAddVariableClick","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Button","Icon"],"mappings":"sHAYO,MAAMA,EAAsB,CAAC,CACnC,mBAAAC,CACD,IAEEC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,WAAA,CAElD,CAAA,CACD,EACD,EACCL,GACAE,EAAAA,IAACI,EAAA,CACA,KAAK,OACL,UAAU,SACV,QAAQ,UACR,QAAS,IAAMN,EAAA,EAEf,SAAAE,EAAAA,IAACK,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,EAEF"}
1
+ {"version":3,"file":"header-CPxTHSvz.js","sources":["../../src/components/variables/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype VariablesPageHeaderProps = {\n\tonAddVariableClick?: () => void;\n};\n\nexport const VariablesPageHeader = ({\n\tonAddVariableClick,\n}: VariablesPageHeaderProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tVariables\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t{onAddVariableClick && (\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"size-7\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onAddVariableClick()}\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["VariablesPageHeader","onAddVariableClick","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Button","Icon"],"mappings":"sHAYO,MAAMA,EAAsB,CAAC,CACnC,mBAAAC,CACD,IAEEC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,WAAA,CAElD,CAAA,CACD,EACD,EACCL,GACAE,EAAAA,IAACI,EAAA,CACA,KAAK,OACL,UAAU,SACV,QAAQ,UACR,QAAS,IAAMN,EAAA,EAEf,SAAAE,EAAAA,IAACK,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,EAEF"}