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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/cli/__init__.py +1 -0
  3. prefect/cli/cloud/asset.py +135 -0
  4. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js +2 -0
  5. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js.map +1 -0
  6. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js +2 -0
  7. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js.map +1 -0
  8. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js +2 -0
  9. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js.map +1 -0
  10. prefect/server/ui-v2/assets/automation._id-CEHa-X0X.js +2 -0
  11. prefect/server/ui-v2/assets/{automation._id-CMiura1b.js.map → automation._id-CEHa-X0X.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js → automation_._id.edit-BRWAsELa.js} +2 -2
  13. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js.map → automation_._id.edit-BRWAsELa.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js → automations-header-Dr6v5dPp.js} +2 -2
  15. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js.map → automations-header-Dr6v5dPp.js.map} +1 -1
  16. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js +2 -0
  17. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js.map +1 -0
  18. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js +2 -0
  19. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js.map +1 -0
  20. prefect/server/ui-v2/assets/block-type-logo-scnMsyY5.js +2 -0
  21. prefect/server/ui-v2/assets/{block-type-logo-DuvU7goV.js.map → block-type-logo-scnMsyY5.js.map} +1 -1
  22. prefect/server/ui-v2/assets/block._id-BY42cyjR.js +2 -0
  23. prefect/server/ui-v2/assets/block._id-BY42cyjR.js.map +1 -0
  24. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js → block_._id.edit-n2jwU5yr.js} +2 -2
  25. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js.map → block_._id.edit-n2jwU5yr.js.map} +1 -1
  26. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js +2 -0
  27. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js.map +1 -0
  28. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js +2 -0
  29. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js.map +1 -0
  30. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js → catalog_._slug_.create-rboQmoyW.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js.map → catalog_._slug_.create-rboQmoyW.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js → collapsible-Lk7MRvBH.js} +2 -2
  33. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js.map → collapsible-Lk7MRvBH.js.map} +1 -1
  34. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js +2 -0
  35. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js.map +1 -0
  36. prefect/server/ui-v2/assets/create-CtsA2QIl.js +2 -0
  37. prefect/server/ui-v2/assets/{create-BrNwbpVu.js.map → create-CtsA2QIl.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{create-DWgkh2HT.js → create-DJPAEZ93.js} +2 -2
  39. prefect/server/ui-v2/assets/create-DJPAEZ93.js.map +1 -0
  40. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js → data-table-bk-0xKWT.js} +2 -2
  41. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js.map → data-table-bk-0xKWT.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js → delete-confirmation-dialog-BZg9EOfN.js} +2 -2
  43. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js.map → delete-confirmation-dialog-BZg9EOfN.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js → deployment-action-header-DwuMPgVg.js} +2 -2
  45. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js.map → deployment-action-header-DwuMPgVg.js.map} +1 -1
  46. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js +3 -0
  47. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js.map +1 -0
  48. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js → deployment-links-B67P-6Ph.js} +2 -2
  49. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js.map → deployment-links-B67P-6Ph.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment._id-DXrb6frJ.js → deployment._id-BVOBfMVf.js} +2 -2
  51. prefect/server/ui-v2/assets/deployment._id-BVOBfMVf.js.map +1 -0
  52. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js +2 -0
  53. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js.map +1 -0
  54. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js +2 -0
  55. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js.map +1 -0
  56. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js +2 -0
  57. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js.map +1 -0
  58. prefect/server/ui-v2/assets/deployment_._id.run-DFVA4Xhx.js +2 -0
  59. prefect/server/ui-v2/assets/{deployment_._id.run-CnacOmhY.js.map → deployment_._id.run-DFVA4Xhx.js.map} +1 -1
  60. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js → dropdown-menu-fRiq5bS-.js} +2 -2
  61. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js.map → dropdown-menu-fRiq5bS-.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js → event-resource-display-C1ZAey-o.js} +2 -2
  63. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js.map → event-resource-display-C1ZAey-o.js.map} +1 -1
  64. prefect/server/ui-v2/assets/event._eventDate._eventId-CcbtP9Ag.js +2 -0
  65. prefect/server/ui-v2/assets/{event._eventDate._eventId-CKTuT_8S.js.map → event._eventDate._eventId-CcbtP9Ag.js.map} +1 -1
  66. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js +2 -0
  67. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js.map +1 -0
  68. prefect/server/ui-v2/assets/{flow-run._id-BKv9Meqc.js → flow-run._id-Dn9R_Tjy.js} +2 -2
  69. prefect/server/ui-v2/assets/flow-run._id-Dn9R_Tjy.js.map +1 -0
  70. prefect/server/ui-v2/assets/{flow-run._id-ZTkjj6bM.js → flow-run._id-Dwx7ojcj.js} +2 -2
  71. prefect/server/ui-v2/assets/flow-run._id-Dwx7ojcj.js.map +1 -0
  72. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js +4 -0
  73. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js.map +1 -0
  74. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js +2 -0
  75. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js.map +1 -0
  76. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js +2 -0
  77. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js.map +1 -0
  78. prefect/server/ui-v2/assets/{form-DOdmIC3A.js → form-Cl5Hk9bq.js} +2 -2
  79. prefect/server/ui-v2/assets/{form-DOdmIC3A.js.map → form-Cl5Hk9bq.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{header-DcIuN5UN.js → header-BuI436ik.js} +2 -2
  81. prefect/server/ui-v2/assets/{header-DcIuN5UN.js.map → header-BuI436ik.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{header-CnBwASd-.js → header-DcAQCxQl.js} +2 -2
  83. prefect/server/ui-v2/assets/{header-CnBwASd-.js.map → header-DcAQCxQl.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-DxE-NzAK.js → header-qlcK4NLD.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-DxE-NzAK.js.map → header-qlcK4NLD.js.map} +1 -1
  86. prefect/server/ui-v2/assets/index--Z69UYXV.js +2 -0
  87. prefect/server/ui-v2/assets/index--Z69UYXV.js.map +1 -0
  88. prefect/server/ui-v2/assets/{index-D0R9_LIL.js → index-BO4Qqsm8.js} +2 -2
  89. prefect/server/ui-v2/assets/index-BO4Qqsm8.js.map +1 -0
  90. prefect/server/ui-v2/assets/index-Bg45XS_V.js +2 -0
  91. prefect/server/ui-v2/assets/index-Bg45XS_V.js.map +1 -0
  92. prefect/server/ui-v2/assets/{index-BIBIJufF.js → index-BleYpDoN.js} +2 -2
  93. prefect/server/ui-v2/assets/index-BleYpDoN.js.map +1 -0
  94. prefect/server/ui-v2/assets/{index-DyOAqIOp.js → index-C63VUjOh.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-DyOAqIOp.js.map → index-C63VUjOh.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-DfKXdmko.js → index-C6LgWyJb.js} +2 -2
  97. prefect/server/ui-v2/assets/index-C6LgWyJb.js.map +1 -0
  98. prefect/server/ui-v2/assets/index-CE-bVgqj.js +2 -0
  99. prefect/server/ui-v2/assets/{index-DlAHvqFx.js.map → index-CE-bVgqj.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{index-V_xTKaEb.js → index-CPpeVt8m.js} +13 -13
  101. prefect/server/ui-v2/assets/index-CPpeVt8m.js.map +1 -0
  102. prefect/server/ui-v2/assets/index-CYaUe0Ym.js +2 -0
  103. prefect/server/ui-v2/assets/index-CYaUe0Ym.js.map +1 -0
  104. prefect/server/ui-v2/assets/{index-C5RMFRyZ.js → index-Clbms0kg.js} +2 -2
  105. prefect/server/ui-v2/assets/index-Clbms0kg.js.map +1 -0
  106. prefect/server/ui-v2/assets/index-D13YFoYA.js +2 -0
  107. prefect/server/ui-v2/assets/index-D13YFoYA.js.map +1 -0
  108. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js → index-D73a_nGu.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js.map → index-D73a_nGu.js.map} +1 -1
  110. prefect/server/ui-v2/assets/index-DJXBzX1E.css +1 -0
  111. prefect/server/ui-v2/assets/{index-BO60ehN6.js → index-DPPPaOr_.js} +2 -2
  112. prefect/server/ui-v2/assets/index-DPPPaOr_.js.map +1 -0
  113. prefect/server/ui-v2/assets/{index-DP8W-xJo.js → index-DU9ShbqW.js} +2 -2
  114. prefect/server/ui-v2/assets/index-DU9ShbqW.js.map +1 -0
  115. prefect/server/ui-v2/assets/index-DdR1lzZk.js +2 -0
  116. prefect/server/ui-v2/assets/index-DdR1lzZk.js.map +1 -0
  117. prefect/server/ui-v2/assets/{index-B9ttjsyu.js → index-ELo08q04.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-B9ttjsyu.js.map → index-ELo08q04.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{index-BTL1xHS9.js → index-cp6PTdHp.js} +2 -2
  120. prefect/server/ui-v2/assets/{index-BTL1xHS9.js.map → index-cp6PTdHp.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{index-D6G96ToY.js → index-kM_g8J0u.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-D6G96ToY.js.map → index-kM_g8J0u.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-q5Y3hlDT.js → index-mYcm9Rkr.js} +2 -2
  124. prefect/server/ui-v2/assets/index-mYcm9Rkr.js.map +1 -0
  125. prefect/server/ui-v2/assets/{index-D9cOtoSU.js → index-yavn_NBp.js} +2 -2
  126. prefect/server/ui-v2/assets/index-yavn_NBp.js.map +1 -0
  127. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js → json-input-iUzf6BvZ.js} +2 -2
  128. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js.map → json-input-iUzf6BvZ.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js → key-value-DI27Dv4P.js} +2 -2
  130. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js.map → key-value-DI27Dv4P.js.map} +1 -1
  131. prefect/server/ui-v2/assets/key._key-C-nk2nld.js +2 -0
  132. prefect/server/ui-v2/assets/key._key-C-nk2nld.js.map +1 -0
  133. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js → lazy-markdown-D_y73qoD.js} +2 -2
  134. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js.map → lazy-markdown-D_y73qoD.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js → login-DR_xuMmg.js} +2 -2
  136. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js.map → login-DR_xuMmg.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js → markdown-input-hzlzpUdj.js} +2 -2
  138. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js.map → markdown-input-hzlzpUdj.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js → python-example-snippet-d8bTNJ0J.js} +3 -3
  140. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js.map → python-example-snippet-d8bTNJ0J.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{python-input-niCawr8m.js → python-input-Bxdnzvx3.js} +2 -2
  142. prefect/server/ui-v2/assets/{python-input-niCawr8m.js.map → python-input-Bxdnzvx3.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js → radio-group-0oOEMJCS.js} +2 -2
  144. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js.map → radio-group-0oOEMJCS.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js → route-error-state-BqbnZCc-.js} +2 -2
  146. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js.map → route-error-state-BqbnZCc-.js.map} +1 -1
  147. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js → schema-form-BD-WM4S0.js} +2 -2
  148. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js.map → schema-form-BD-WM4S0.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js → schema-form-input-string-format-datetime-Dg3zVAp5.js} +4 -4
  150. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js.map → schema-form-input-string-format-datetime-Dg3zVAp5.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js → settings-Dm6yMLix.js} +2 -2
  152. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js.map → settings-Dm6yMLix.js.map} +1 -1
  153. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js → sort-filter-X6JyRc0-.js} +2 -2
  154. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js.map → sort-filter-X6JyRc0-.js.map} +1 -1
  155. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js → table-Xyel2BEw.js} +2 -2
  156. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js.map → table-Xyel2BEw.js.map} +1 -1
  157. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js → tags-input-DqZ8v99z.js} +2 -2
  158. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js.map → tags-input-DqZ8v99z.js.map} +1 -1
  159. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js} +2 -2
  160. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js.map → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js.map} +1 -1
  161. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js → task-run._id-9DcrUEGz.js} +3 -3
  162. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js.map → task-run._id-9DcrUEGz.js.map} +1 -1
  163. prefect/server/ui-v2/assets/{task-run._id-CQGeAiBh.js → task-run._id-DJkoLl_e.js} +2 -2
  164. prefect/server/ui-v2/assets/task-run._id-DJkoLl_e.js.map +1 -0
  165. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js +2 -0
  166. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js.map +1 -0
  167. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js → textarea-DFEOJJdc.js} +2 -2
  168. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js.map → textarea-DFEOJJdc.js.map} +1 -1
  169. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js → timezone-select-NViFNNLz.js} +2 -2
  170. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js.map → timezone-select-NViFNNLz.js.map} +1 -1
  171. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js → toggle-group-EMgSOoYH.js} +2 -2
  172. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js.map → toggle-group-EMgSOoYH.js.map} +1 -1
  173. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js +2 -0
  174. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js.map +1 -0
  175. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js → use-delete-block-document-confirmation-dialog-CxRkBKPg.js} +2 -2
  176. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js.map → use-delete-block-document-confirmation-dialog-CxRkBKPg.js.map} +1 -1
  177. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js +2 -0
  178. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js.map +1 -0
  179. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js → use-get-artifacts-flow-task-runs-D7Djt53s.js} +2 -2
  180. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js.map → use-get-artifacts-flow-task-runs-D7Djt53s.js.map} +1 -1
  181. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js → use-quick-run-Cpy0t7dX.js} +2 -2
  182. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js.map → use-quick-run-Cpy0t7dX.js.map} +1 -1
  183. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js → use-state-favicon-CMsL9s6j.js} +2 -2
  184. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js.map → use-state-favicon-CMsL9s6j.js.map} +1 -1
  185. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js +2 -0
  186. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js.map +1 -0
  187. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js → utilities-D9BfvLg5.js} +2 -2
  188. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js.map → utilities-D9BfvLg5.js.map} +1 -1
  189. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js +2 -0
  190. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js.map +1 -0
  191. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js → work-pool-queue-toggle-f_-cTWxB.js} +2 -2
  192. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js.map → work-pool-queue-toggle-f_-cTWxB.js.map} +1 -1
  193. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js → work-pool._workPoolName-zBqgkYLT.js} +2 -2
  194. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js.map → work-pool._workPoolName-zBqgkYLT.js.map} +1 -1
  195. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js → work-pool_._workPoolName.edit-B-8_CnfA.js} +2 -2
  196. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js.map → work-pool_._workPoolName.edit-B-8_CnfA.js.map} +1 -1
  197. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js → work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js} +2 -2
  198. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js.map +1 -0
  199. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js → work-queue-icon-text-BqqQ413o.js} +2 -2
  200. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js.map → work-queue-icon-text-BqqQ413o.js.map} +1 -1
  201. prefect/server/ui-v2/index.html +2 -2
  202. prefect/task_engine.py +26 -12
  203. prefect/workers/base.py +18 -1
  204. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/METADATA +1 -1
  205. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/RECORD +208 -207
  206. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js +0 -2
  207. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js.map +0 -1
  208. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js +0 -2
  209. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js.map +0 -1
  210. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js +0 -2
  211. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js.map +0 -1
  212. prefect/server/ui-v2/assets/automation._id-CMiura1b.js +0 -2
  213. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js +0 -2
  214. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js.map +0 -1
  215. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js +0 -2
  216. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js.map +0 -1
  217. prefect/server/ui-v2/assets/block-type-logo-DuvU7goV.js +0 -2
  218. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js +0 -2
  219. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js.map +0 -1
  220. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js +0 -2
  221. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js.map +0 -1
  222. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js +0 -2
  223. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js.map +0 -1
  224. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js +0 -2
  225. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js.map +0 -1
  226. prefect/server/ui-v2/assets/create-BrNwbpVu.js +0 -2
  227. prefect/server/ui-v2/assets/create-DWgkh2HT.js.map +0 -1
  228. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js +0 -3
  229. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js.map +0 -1
  230. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js +0 -2
  231. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js.map +0 -1
  232. prefect/server/ui-v2/assets/deployment._id-DXrb6frJ.js.map +0 -1
  233. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js +0 -2
  234. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js.map +0 -1
  235. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js +0 -2
  236. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js.map +0 -1
  237. prefect/server/ui-v2/assets/deployment_._id.run-CnacOmhY.js +0 -2
  238. prefect/server/ui-v2/assets/event._eventDate._eventId-CKTuT_8S.js +0 -2
  239. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js +0 -2
  240. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js.map +0 -1
  241. prefect/server/ui-v2/assets/flow-run._id-BKv9Meqc.js.map +0 -1
  242. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js +0 -4
  243. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js.map +0 -1
  244. prefect/server/ui-v2/assets/flow-run._id-ZTkjj6bM.js.map +0 -1
  245. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js +0 -2
  246. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js.map +0 -1
  247. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js +0 -2
  248. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js.map +0 -1
  249. prefect/server/ui-v2/assets/index-BIBIJufF.js.map +0 -1
  250. prefect/server/ui-v2/assets/index-BO60ehN6.js.map +0 -1
  251. prefect/server/ui-v2/assets/index-BS7fbJ2s.js +0 -2
  252. prefect/server/ui-v2/assets/index-BS7fbJ2s.js.map +0 -1
  253. prefect/server/ui-v2/assets/index-C5RMFRyZ.js.map +0 -1
  254. prefect/server/ui-v2/assets/index-D0R9_LIL.js.map +0 -1
  255. prefect/server/ui-v2/assets/index-D9cOtoSU.js.map +0 -1
  256. prefect/server/ui-v2/assets/index-DEpWUeaO.js +0 -2
  257. prefect/server/ui-v2/assets/index-DEpWUeaO.js.map +0 -1
  258. prefect/server/ui-v2/assets/index-DP8W-xJo.js.map +0 -1
  259. prefect/server/ui-v2/assets/index-DfKXdmko.js.map +0 -1
  260. prefect/server/ui-v2/assets/index-DiVKp6rW.js +0 -2
  261. prefect/server/ui-v2/assets/index-DiVKp6rW.js.map +0 -1
  262. prefect/server/ui-v2/assets/index-DlAHvqFx.js +0 -2
  263. prefect/server/ui-v2/assets/index-VNFzALsC.js +0 -2
  264. prefect/server/ui-v2/assets/index-VNFzALsC.js.map +0 -1
  265. prefect/server/ui-v2/assets/index-V_xTKaEb.js.map +0 -1
  266. prefect/server/ui-v2/assets/index-WIq8QUNT.js +0 -2
  267. prefect/server/ui-v2/assets/index-WIq8QUNT.js.map +0 -1
  268. prefect/server/ui-v2/assets/index-m9O-nIOl.css +0 -1
  269. prefect/server/ui-v2/assets/index-q5Y3hlDT.js.map +0 -1
  270. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js +0 -2
  271. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js.map +0 -1
  272. prefect/server/ui-v2/assets/task-run._id-CQGeAiBh.js.map +0 -1
  273. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js +0 -2
  274. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js.map +0 -1
  275. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js +0 -2
  276. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js.map +0 -1
  277. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js +0 -2
  278. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js.map +0 -1
  279. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js +0 -2
  280. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js.map +0 -1
  281. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js +0 -2
  282. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js.map +0 -1
  283. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js.map +0 -1
  284. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/WHEEL +0 -0
  285. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/entry_points.txt +0 -0
  286. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["GlobalConcurrencyLimitSelect","presetOptions","selected","onSelect","Suspense","jsx","GlobalConcurrencyLimitSelectImplementation","search","setSearch","useState","data","useSuspenseQuery","buildListGlobalConcurrencyLimitsQuery","deferredSearch","useDeferredValue","filteredData","useMemo","globalConcurrencyLimit","filteredPresetOptions","option","Combobox","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","jsxs","ComboboxCommandGroup","ComboboxCommandItem","value","MarkdownInputLazy","lazy","__vitePreload","mod","LazyMarkdownInput","className","props","Skeleton","WorkPoolSelect","WorkPoolSelectImplementation","buildFilterWorkPoolsQuery","workPool","LIMIT_COLLISSION_STRATEGIES","LimitCollissionStrategySelect","onValueChange","Select","SelectTrigger","SelectValue","SelectContent","SelectGroup","SelectItem","createFormSchema","deployment","mode","z.object","z.string","z.array","z.enum","val","ctx","err","z.NEVER","z.boolean","z.record","z.unknown","DEFAULT_VALUES","useDeploymentForm","navigate","useNavigate","form","useForm","zodResolver","parametersFormValues","setParametersFormValues","parameterFormErrors","validateParametersForm","useSchemaForm","createDeployment","useCreateDeployment","updateDeployment","useUpdateDeployment","useEffect","name","description","work_pool_name","work_queue_name","tags","concurrency_options","parameter_openapi_schema","enforce_parameter_schema","job_variables","global_concurrency_limit","values","global_concurrency_limit_id","jobVariablesPayload","message","toast","concurrencyOptions","id","error","DeploymentForm","onSave","watchPoolName","parametersOpenAPISchema","Form","e","FormMessage","FormField","field","FormItem","FormLabel","FormControl","Input","MarkdownInput","WorkQueueSelect","TagsInput","LazySchemaForm","Switch","JsonInput","Link","Button"],"ignoreList":[],"sources":["../../src/components/global-concurrency-limit/global-concurrency-limit-select/global-concurrency-limit-select.tsx","../../src/components/ui/markdown-input-lazy.tsx","../../src/components/work-pools/work-pool-select/work-pool-select.tsx","../../src/components/deployments/deployment-form/limit-collision-strategy-select.tsx","../../src/components/deployments/deployment-form/use-deployment-form.ts","../../src/components/deployments/deployment-form/deployment-form.tsx"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport { buildListGlobalConcurrencyLimitsQuery } from \"@/api/global-concurrency-limits\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\ntype PresetOption = {\n\tlabel: string;\n\tvalue: string | null | undefined;\n};\n\ntype GlobalConcurrencyLimitSelectProps = {\n\tpresetOptions?: Array<PresetOption>;\n\tselected: string | undefined | null;\n\tonSelect: (name: string | undefined | null) => void;\n};\n\nexport const GlobalConcurrencyLimitSelect = ({\n\tpresetOptions = [],\n\tselected,\n\tonSelect,\n}: GlobalConcurrencyLimitSelectProps) => {\n\treturn (\n\t\t<Suspense>\n\t\t\t<GlobalConcurrencyLimitSelectImplementation\n\t\t\t\tpresetOptions={presetOptions}\n\t\t\t\tselected={selected}\n\t\t\t\tonSelect={onSelect}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n};\n\nconst GlobalConcurrencyLimitSelectImplementation = ({\n\tpresetOptions = [],\n\tselected,\n\tonSelect,\n}: GlobalConcurrencyLimitSelectProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst { data } = useSuspenseQuery(buildListGlobalConcurrencyLimitsQuery());\n\n\tconst deferredSearch = useDeferredValue(search);\n\tconst filteredData = useMemo(() => {\n\t\treturn data.filter((globalConcurrencyLimit) =>\n\t\t\tglobalConcurrencyLimit.name\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\tconst filteredPresetOptions = useMemo(() => {\n\t\treturn presetOptions.filter((option) =>\n\t\t\toption.label.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deferredSearch, presetOptions]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\tselected={Boolean(selected)}\n\t\t\t\taria-label=\"Select a global concurrency limit\"\n\t\t\t>\n\t\t\t\t{\n\t\t\t\t\tdata.find(\n\t\t\t\t\t\t(globalConcurrencyLimit) => globalConcurrencyLimit.id === selected,\n\t\t\t\t\t)?.name\n\t\t\t\t}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search for a global concurrency limit...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\tNo global concurrency limit found\n\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredPresetOptions.map((option) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={option.label}\n\t\t\t\t\t\t\t\tselected={selected === option.value}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonSelect(option.value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t//nb: Stringifies label so that UX has a hoverable state\n\t\t\t\t\t\t\t\tvalue={String(option.label)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{filteredData.map((globalConcurrencyLimit) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={globalConcurrencyLimit.id}\n\t\t\t\t\t\t\t\tselected={selected === globalConcurrencyLimit.name}\n\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\tonSelect(value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={globalConcurrencyLimit.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{globalConcurrencyLimit.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n};\n","import type { ComponentProps } from \"react\";\nimport { lazy, Suspense } from \"react\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\nconst MarkdownInputLazy = lazy(() =>\n\timport(\"./markdown-input\").then((mod) => ({ default: mod.MarkdownInput })),\n);\n\ntype LazyMarkdownInputProps = ComponentProps<typeof MarkdownInputLazy>;\n\nexport function LazyMarkdownInput({\n\tclassName,\n\t...props\n}: LazyMarkdownInputProps) {\n\treturn (\n\t\t<Suspense\n\t\t\tfallback={<Skeleton className={`min-h-[200px] ${className ?? \"\"}`} />}\n\t\t>\n\t\t\t<MarkdownInputLazy className={className} {...props} />\n\t\t</Suspense>\n\t);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkPoolsQuery } from \"@/api/work-pools\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\ntype PresetOption = {\n\tlabel: string;\n\tvalue: string | null | undefined;\n};\n\ntype WorkPoolSelectProps = {\n\tpresetOptions?: Array<PresetOption>;\n\tselected: string | undefined | null;\n\tonSelect: (name: string | undefined | null) => void;\n};\n\nexport const WorkPoolSelect = ({\n\tpresetOptions = [],\n\tselected,\n\tonSelect,\n}: WorkPoolSelectProps) => {\n\treturn (\n\t\t<Suspense>\n\t\t\t<WorkPoolSelectImplementation\n\t\t\t\tpresetOptions={presetOptions}\n\t\t\t\tselected={selected}\n\t\t\t\tonSelect={onSelect}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n};\n\nconst WorkPoolSelectImplementation = ({\n\tpresetOptions = [],\n\tselected,\n\tonSelect,\n}: WorkPoolSelectProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst { data } = useSuspenseQuery(buildFilterWorkPoolsQuery());\n\n\t// nb: because work pools API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\tconst filteredData = useMemo(() => {\n\t\treturn data.filter((workPool) =>\n\t\t\tworkPool.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\tconst filteredPresetOptions = useMemo(() => {\n\t\treturn presetOptions.filter((option) =>\n\t\t\toption.label.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deferredSearch, presetOptions]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\tselected={Boolean(selected)}\n\t\t\t\taria-label=\"Select a work pool\"\n\t\t\t>\n\t\t\t\t{selected}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search for a work pool...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No work pool found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredPresetOptions.map((option) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={option.label}\n\t\t\t\t\t\t\t\tselected={selected === option.value}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonSelect(option.value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t//nb: Stringifies label so that UX has a hoverable state\n\t\t\t\t\t\t\t\tvalue={String(option.label)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{filteredData.map((workPool) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={workPool.id}\n\t\t\t\t\t\t\t\tselected={selected === workPool.name}\n\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\tonSelect(value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={workPool.name}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{workPool.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n};\n","import type { components } from \"@/api/prefect\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\ntype LimitCollissionStrategy =\n\tcomponents[\"schemas\"][\"ConcurrencyLimitStrategy\"];\n\nconst LIMIT_COLLISSION_STRATEGIES = {\n\tENQUEUE: \"ENQUEUE\",\n\tCANCEL_NEW: \"CANCEL_NEW\",\n} satisfies Record<LimitCollissionStrategy, LimitCollissionStrategy>;\n\ntype LimitCollissionStrategySelectProps = {\n\tonValueChange: (value: LimitCollissionStrategy | undefined) => void;\n\tvalue: LimitCollissionStrategy | undefined;\n};\n\nexport const LimitCollissionStrategySelect = ({\n\tonValueChange,\n\tvalue,\n}: LimitCollissionStrategySelectProps) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={value}\n\t\t\tonValueChange={(value) => {\n\t\t\t\tif (value === \"\") {\n\t\t\t\t\tonValueChange(undefined);\n\t\t\t\t} else {\n\t\t\t\t\tonValueChange(value as LimitCollissionStrategy);\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<SelectTrigger>\n\t\t\t\t<SelectValue placeholder={LIMIT_COLLISSION_STRATEGIES.ENQUEUE} />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t<SelectGroup>\n\t\t\t\t\t<SelectItem value={LIMIT_COLLISSION_STRATEGIES.ENQUEUE}>\n\t\t\t\t\t\t{LIMIT_COLLISSION_STRATEGIES.ENQUEUE}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t\t<SelectItem value={LIMIT_COLLISSION_STRATEGIES.CANCEL_NEW}>\n\t\t\t\t\t\t{LIMIT_COLLISSION_STRATEGIES.CANCEL_NEW}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t</SelectGroup>\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { useEffect } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport {\n\ttype Deployment,\n\tuseCreateDeployment,\n\tuseUpdateDeployment,\n} from \"@/api/deployments\";\nimport { useSchemaForm } from \"@/components/schemas\";\n\ntype FormMode = \"edit\" | \"duplicate\";\n\nconst createFormSchema = (\n\tdeployment: Deployment,\n\t{ mode }: { mode: FormMode },\n) =>\n\tz.object({\n\t\tname: z.string().refine(\n\t\t\t(value) => {\n\t\t\t\tif (mode === \"edit\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn value !== deployment.name;\n\t\t\t},\n\t\t\t{ message: \"Name must be different from the original deployment\" },\n\t\t),\n\t\tdescription: z.string().nullable().optional(),\n\t\twork_pool_name: z.string().nullable().optional(),\n\t\twork_queue_name: z.string().nullable().optional(),\n\t\ttags: z.array(z.string()).optional(),\n\t\tconcurrency_options: z\n\t\t\t.object({\n\t\t\t\tcollision_strategy: z.enum([\"ENQUEUE\", \"CANCEL_NEW\"]).optional(),\n\t\t\t})\n\t\t\t.nullable()\n\t\t\t.optional(),\n\t\tjob_variables: z.string().superRefine((val, ctx) => {\n\t\t\ttry {\n\t\t\t\tif (!val) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn JSON.parse(val) as Record<string, unknown>;\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err);\n\t\t\t\tctx.addIssue({ code: \"custom\", message: \"Invalid JSON\" });\n\t\t\t\treturn z.NEVER;\n\t\t\t}\n\t\t}),\n\t\tenforce_parameter_schema: z.boolean(),\n\t\tparameter_openapi_schema: z\n\t\t\t.record(z.unknown())\n\t\t\t.optional()\n\t\t\t.nullable()\n\t\t\t.readonly(),\n\t\tglobal_concurrency_limit_id: z.string().uuid().optional().nullable(),\n\t});\n\nexport type DeploymentFormSchema = z.infer<ReturnType<typeof createFormSchema>>;\n\nconst DEFAULT_VALUES: DeploymentFormSchema = {\n\tname: \"\",\n\tdescription: \"\",\n\ttags: [],\n\tjob_variables: \"\",\n\tenforce_parameter_schema: true,\n\tglobal_concurrency_limit_id: null,\n};\n\nexport const useDeploymentForm = (\n\tdeployment: Deployment,\n\t{ mode }: { mode: FormMode },\n) => {\n\tconst navigate = useNavigate();\n\tconst form = useForm({\n\t\tresolver: zodResolver(createFormSchema(deployment, { mode })),\n\t\tdefaultValues: DEFAULT_VALUES,\n\t});\n\tconst {\n\t\tvalues: parametersFormValues,\n\t\tsetValues: setParametersFormValues,\n\t\terrors: parameterFormErrors,\n\t\tvalidateForm: validateParametersForm,\n\t} = useSchemaForm();\n\n\tconst { createDeployment } = useCreateDeployment();\n\tconst { updateDeployment } = useUpdateDeployment();\n\n\t// syncs form state to deployment to update\n\tuseEffect(() => {\n\t\tconst {\n\t\t\tname,\n\t\t\tdescription,\n\t\t\twork_pool_name,\n\t\t\twork_queue_name,\n\t\t\ttags,\n\t\t\tconcurrency_options,\n\t\t\tparameter_openapi_schema,\n\t\t\tenforce_parameter_schema,\n\t\t\tjob_variables,\n\t\t\tglobal_concurrency_limit,\n\t\t} = deployment;\n\n\t\t// nb: parameter form state and validation is handled separately using SchemaForm\n\t\t// parameters has poor typings from openAPI\n\t\tsetParametersFormValues(deployment.parameters as Record<string, unknown>);\n\n\t\t// nb: Handle remaining form fields using react-hook-form\n\t\tform.reset({\n\t\t\tdescription,\n\t\t\tname,\n\t\t\twork_pool_name,\n\t\t\twork_queue_name,\n\t\t\ttags,\n\t\t\tconcurrency_options,\n\t\t\tparameter_openapi_schema,\n\t\t\tenforce_parameter_schema,\n\t\t\tjob_variables: job_variables ? JSON.stringify(job_variables) : \"\",\n\t\t\tglobal_concurrency_limit_id: global_concurrency_limit?.id,\n\t\t});\n\t}, [form, deployment, setParametersFormValues]);\n\n\tconst onSave = async (values: DeploymentFormSchema) => {\n\t\tconst {\n\t\t\tname,\n\t\t\tjob_variables,\n\t\t\tdescription,\n\t\t\twork_pool_name,\n\t\t\twork_queue_name,\n\t\t\ttags,\n\t\t\tenforce_parameter_schema,\n\t\t\tconcurrency_options,\n\t\t\tparameter_openapi_schema,\n\t\t\tglobal_concurrency_limit_id,\n\t\t} = values;\n\n\t\tconst jobVariablesPayload = job_variables\n\t\t\t? (JSON.parse(job_variables) as Record<string, unknown>)\n\t\t\t: undefined;\n\n\t\tif (parameter_openapi_schema && enforce_parameter_schema) {\n\t\t\ttry {\n\t\t\t\tawait validateParametersForm({ schema: parameter_openapi_schema });\n\t\t\t} catch (err) {\n\t\t\t\tconst message = \"Unknown error while updating validating schema.\";\n\t\t\t\ttoast.error(message);\n\t\t\t\tconsole.error(message, err);\n\t\t\t}\n\t\t}\n\n\t\t// Early exit if there's errors\n\t\tif (parameterFormErrors.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst concurrencyOptions = concurrency_options?.collision_strategy\n\t\t\t? { collision_strategy: concurrency_options.collision_strategy }\n\t\t\t: undefined;\n\n\t\tswitch (mode) {\n\t\t\tcase \"duplicate\":\n\t\t\t\tcreateDeployment(\n\t\t\t\t\t{\n\t\t\t\t\t\tconcurrency_options: concurrencyOptions,\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t\tenforce_parameter_schema,\n\t\t\t\t\t\tflow_id: deployment.flow_id,\n\t\t\t\t\t\tjob_variables: jobVariablesPayload,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tparameters: parametersFormValues,\n\t\t\t\t\t\tparameter_openapi_schema: parameter_openapi_schema || undefined,\n\t\t\t\t\t\tpaused: deployment.paused,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t\t// If value is \"\", set as null\n\t\t\t\t\t\twork_pool_name: work_pool_name || null,\n\t\t\t\t\t\t// If value is \"\", set as null\n\t\t\t\t\t\twork_queue_name: work_queue_name || null,\n\t\t\t\t\t\tglobal_concurrency_limit_id,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: ({ id }) => {\n\t\t\t\t\t\t\ttoast.success(\"Deployment created\");\n\t\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\t\tto: \"/deployments/deployment/$id\",\n\t\t\t\t\t\t\t\tparams: { id },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while creating deployment.\";\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t\ttoast.error(message);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"edit\":\n\t\t\t\tupdateDeployment(\n\t\t\t\t\t{\n\t\t\t\t\t\tconcurrency_options: concurrencyOptions,\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t\tenforce_parameter_schema,\n\t\t\t\t\t\tid: deployment.id,\n\t\t\t\t\t\tjob_variables: jobVariablesPayload,\n\t\t\t\t\t\tparameters: parametersFormValues,\n\t\t\t\t\t\tpaused: deployment.paused,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t\t// If value is \"\", set as null\n\t\t\t\t\t\twork_pool_name: work_pool_name || null,\n\t\t\t\t\t\t// If value is \"\", set as null\n\t\t\t\t\t\twork_queue_name: work_queue_name || null,\n\t\t\t\t\t\tglobal_concurrency_limit_id,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Deployment updated\");\n\t\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\t\tto: \"/deployments/deployment/$id\",\n\t\t\t\t\t\t\t\tparams: { id: deployment.id },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while updating deployment.\";\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t\ttoast.error(message);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\treturn {\n\t\tform,\n\t\tonSave,\n\t\tparametersFormValues,\n\t\tsetParametersFormValues,\n\t\tparameterFormErrors,\n\t};\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { GlobalConcurrencyLimitSelect } from \"@/components/global-concurrency-limit/global-concurrency-limit-select\";\nimport { LazySchemaForm, type PrefectSchemaObject } from \"@/components/schemas\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { LazyMarkdownInput as MarkdownInput } from \"@/components/ui/markdown-input-lazy\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { WorkPoolSelect } from \"@/components/work-pools/work-pool-select\";\nimport { WorkQueueSelect } from \"@/components/work-pools/work-queue-select\";\nimport { LimitCollissionStrategySelect } from \"./limit-collision-strategy-select\";\nimport { useDeploymentForm } from \"./use-deployment-form\";\n\ntype DeploymentFormProps = {\n\tdeployment: Deployment;\n\tmode: \"edit\" | \"duplicate\";\n};\n\nexport const DeploymentForm = ({ deployment, mode }: DeploymentFormProps) => {\n\tconst {\n\t\tform,\n\t\tonSave,\n\t\tparameterFormErrors,\n\t\tsetParametersFormValues,\n\t\tparametersFormValues,\n\t} = useDeploymentForm(deployment, { mode });\n\tconst watchPoolName = form.watch(\"work_pool_name\");\n\tconst parametersOpenAPISchema = form.getValues(\"parameter_openapi_schema\");\n\n\treturn (\n\t\t<Form {...form}>\n\t\t\t<form\n\t\t\t\tonSubmit={(e) => void form.handleSubmit(onSave)(e)}\n\t\t\t\tclassName=\"space-y-4\"\n\t\t\t>\n\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\n\t\t\t\t<h3 className=\"text-2xl font-semibold tracking-tight\">General</h3>\n\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"name\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\t\t\tdisabled={mode === \"edit\"}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"description\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Description (Optional)</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<MarkdownInput\n\t\t\t\t\t\t\t\t\taria-label=\"deployment description input\"\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"work_pool_name\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Work Pool (Optional)</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<WorkPoolSelect\n\t\t\t\t\t\t\t\t\tpresetOptions={[{ label: \"None\", value: \"\" }]}\n\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\tselected={field.value}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t{watchPoolName && (\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"work_queue_name\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel>Work Queue (Optional)</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<WorkQueueSelect\n\t\t\t\t\t\t\t\t\t\tworkPoolName={watchPoolName}\n\t\t\t\t\t\t\t\t\t\tpresetOptions={[{ label: \"None\", value: \"\" }]}\n\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\tselected={field.value}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"tags\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Tags (Optional)</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<TagsInput {...field} />\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"concurrency_options.collision_strategy\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>\n\t\t\t\t\t\t\t\t<div className=\"col gap-1 mb-0.5\">\n\t\t\t\t\t\t\t\t\t<p className=\"text-sm\">\n\t\t\t\t\t\t\t\t\t\tConcurrency Limit Collision Strategy (Optional)\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\tConfigure behavior for runs once the concurrency limit is\n\t\t\t\t\t\t\t\t\t\treached.\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<LimitCollissionStrategySelect\n\t\t\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\t\t\tonValueChange={field.onChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"global_concurrency_limit_id\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Global concurrency limit</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<GlobalConcurrencyLimitSelect\n\t\t\t\t\t\t\t\t\tpresetOptions={[{ label: \"None\", value: null }]}\n\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\tselected={field.value}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"pt-4 border-t\">\n\t\t\t\t\t<h3 className=\"text-2xl font-semibold tracking-tight mb-4\">\n\t\t\t\t\t\tParameters\n\t\t\t\t\t</h3>\n\t\t\t\t\t{parametersOpenAPISchema && (\n\t\t\t\t\t\t<LazySchemaForm\n\t\t\t\t\t\t\tschema={parametersOpenAPISchema as unknown as PrefectSchemaObject}\n\t\t\t\t\t\t\terrors={parameterFormErrors}\n\t\t\t\t\t\t\tvalues={parametersFormValues}\n\t\t\t\t\t\t\tonValuesChange={setParametersFormValues}\n\t\t\t\t\t\t\tkinds={[\"json\"]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"enforce_parameter_schema\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel>Enforce Parameter Schema</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t\t\t\t\tchecked={field.value}\n\t\t\t\t\t\t\t\t\t\tonCheckedChange={field.onChange}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"pt-4 border-t\">\n\t\t\t\t\t<h3 className=\"text-2xl font-semibold tracking-tight mb-4\">\n\t\t\t\t\t\tJob Variables\n\t\t\t\t\t</h3>\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"job_variables\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel>Job Variables (Optional)</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<JsonInput {...field} />\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex gap-3 justify-end\">\n\t\t\t\t\t<Link to=\"/deployments/deployment/$id\" params={{ id: deployment.id }}>\n\t\t\t\t\t\t<Button variant=\"secondary\">Cancel</Button>\n\t\t\t\t\t</Link>\n\t\t\t\t\t<Button type=\"submit\">Save</Button>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</Form>\n\t);\n};\n"],"file":"deployment-form-BpKkzEf2.js"}
@@ -1,2 +1,2 @@
1
- import{j as r}from"./vendor-tanstack-BdLtprmr.js";import{F as a,a as e,W as s}from"./work-queue-icon-text-vWlRNW-b.js";const u=({deployment:o})=>r.jsxs("div",{className:"flex items-center gap-4",children:[r.jsx(a,{flowId:o.flow_id}),o.work_pool_name&&r.jsx(e,{workPoolName:o.work_pool_name}),o.work_pool_name&&o.work_queue_name&&r.jsx(s,{workPoolName:o.work_pool_name,workQueueName:o.work_queue_name,showLabel:!0,showStatus:!0})]});export{u as D};
2
- //# sourceMappingURL=deployment-links-CGjJpxJA.js.map
1
+ import{j as r}from"./vendor-tanstack-BdLtprmr.js";import{F as a,a as e,W as s}from"./work-queue-icon-text-BqqQ413o.js";const u=({deployment:o})=>r.jsxs("div",{className:"flex items-center gap-4",children:[r.jsx(a,{flowId:o.flow_id}),o.work_pool_name&&r.jsx(e,{workPoolName:o.work_pool_name}),o.work_pool_name&&o.work_queue_name&&r.jsx(s,{workPoolName:o.work_pool_name,workQueueName:o.work_queue_name,showLabel:!0,showStatus:!0})]});export{u as D};
2
+ //# sourceMappingURL=deployment-links-B67P-6Ph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deployment-links-CGjJpxJA.js","sources":["../../src/components/deployments/deployment-links.tsx"],"sourcesContent":["import type { Deployment } from \"@/api/deployments\";\nimport { FlowLink } from \"@/components/flows/flow-link\";\nimport { WorkPoolLink } from \"@/components/work-pools/work-pool-link\";\nimport { WorkQueueIconText } from \"@/components/work-pools/work-queue-icon-text\";\n\ntype DeploymentLinksProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentLinks = ({ deployment }: DeploymentLinksProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-4\">\n\t\t\t<FlowLink flowId={deployment.flow_id} />\n\t\t\t{deployment.work_pool_name && (\n\t\t\t\t<WorkPoolLink workPoolName={deployment.work_pool_name} />\n\t\t\t)}\n\t\t\t{deployment.work_pool_name && deployment.work_queue_name && (\n\t\t\t\t<WorkQueueIconText\n\t\t\t\t\tworkPoolName={deployment.work_pool_name}\n\t\t\t\t\tworkQueueName={deployment.work_queue_name}\n\t\t\t\t\tshowLabel\n\t\t\t\t\tshowStatus\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["DeploymentLinks","deployment","jsxs","jsx","FlowLink","WorkPoolLink","WorkQueueIconText"],"mappings":"uHASO,MAAMA,EAAkB,CAAC,CAAE,WAAAC,KAEhCC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAS,OAAQH,EAAW,OAAA,CAAS,EACrCA,EAAW,gBACXE,MAACE,EAAA,CAAa,aAAcJ,EAAW,eAAgB,EAEvDA,EAAW,gBAAkBA,EAAW,iBACxCE,EAAAA,IAACG,EAAA,CACA,aAAcL,EAAW,eACzB,cAAeA,EAAW,gBAC1B,UAAS,GACT,WAAU,EAAA,CAAA,CACX,EAEF"}
1
+ {"version":3,"file":"deployment-links-B67P-6Ph.js","sources":["../../src/components/deployments/deployment-links.tsx"],"sourcesContent":["import type { Deployment } from \"@/api/deployments\";\nimport { FlowLink } from \"@/components/flows/flow-link\";\nimport { WorkPoolLink } from \"@/components/work-pools/work-pool-link\";\nimport { WorkQueueIconText } from \"@/components/work-pools/work-queue-icon-text\";\n\ntype DeploymentLinksProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentLinks = ({ deployment }: DeploymentLinksProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-4\">\n\t\t\t<FlowLink flowId={deployment.flow_id} />\n\t\t\t{deployment.work_pool_name && (\n\t\t\t\t<WorkPoolLink workPoolName={deployment.work_pool_name} />\n\t\t\t)}\n\t\t\t{deployment.work_pool_name && deployment.work_queue_name && (\n\t\t\t\t<WorkQueueIconText\n\t\t\t\t\tworkPoolName={deployment.work_pool_name}\n\t\t\t\t\tworkQueueName={deployment.work_queue_name}\n\t\t\t\t\tshowLabel\n\t\t\t\t\tshowStatus\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["DeploymentLinks","deployment","jsxs","jsx","FlowLink","WorkPoolLink","WorkQueueIconText"],"mappings":"uHASO,MAAMA,EAAkB,CAAC,CAAE,WAAAC,KAEhCC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAS,OAAQH,EAAW,OAAA,CAAS,EACrCA,EAAW,gBACXE,MAACE,EAAA,CAAa,aAAcJ,EAAW,eAAgB,EAEvDA,EAAW,gBAAkBA,EAAW,iBACxCE,EAAAA,IAACG,EAAA,CACA,aAAcL,EAAW,eACzB,cAAeA,EAAW,gBAC1B,UAAS,GACT,WAAU,EAAA,CAAA,CACX,EAEF"}
@@ -1,2 +1,2 @@
1
- import{j as a}from"./vendor-tanstack-BdLtprmr.js";import{s as u,aP as i,aE as r,cw as n}from"./index-V_xTKaEb.js";import{R as T}from"./route-error-state-Cu4m0LTX.js";import{o as t,e as o,n as e,a as l,s as p}from"./vendor-forms-BlFSCfFw.js";import"./vendor-react-HBv6Kpyp.js";import"./vendor-radix-CJc458uP.js";import"./vendor-recharts-CY3PKigC.js";import"./vendor-date-Cl1Jav-N.js";t({tab:o(["Runs","Upcoming","Parameters","Configuration","Description"]).default("Runs"),runs:t({flowRuns:t({name:p().optional(),state:l(o(r)).optional().default(n).catch(n)}).optional(),page:e().int().positive().optional().default(1).catch(1),limit:e().int().positive().optional().default(10).catch(10),sort:o(i).optional().default("START_TIME_DESC").catch("START_TIME_DESC")}).optional(),upcoming:t({flowRuns:t({name:p().optional(),state:l(o(r)).optional().default(["Scheduled"]).catch(["Scheduled"])}).optional(),page:e().int().positive().optional().default(1).catch(1),limit:e().int().positive().optional().default(5).catch(5),sort:o(i).optional().default("START_TIME_ASC").catch("START_TIME_ASC")}).optional()});function y({error:s,reset:c}){const m=u(s,"Failed to load deployment");return a.jsxs("div",{className:"flex flex-col gap-4",children:[a.jsx("div",{children:a.jsx("h1",{className:"text-2xl font-semibold",children:"Deployment"})}),a.jsx(T,{error:m,onRetry:c})]})}export{y as errorComponent};
2
- //# sourceMappingURL=deployment._id-DXrb6frJ.js.map
1
+ import{j as a}from"./vendor-tanstack-BdLtprmr.js";import{s as u,aO as i,aD as r,cv as n}from"./index-CPpeVt8m.js";import{R as T}from"./route-error-state-BqbnZCc-.js";import{o as t,e as o,n as e,a as l,s as p}from"./vendor-forms-BlFSCfFw.js";import"./vendor-react-HBv6Kpyp.js";import"./vendor-radix-CJc458uP.js";import"./vendor-recharts-CY3PKigC.js";import"./vendor-date-Cl1Jav-N.js";t({tab:o(["Runs","Upcoming","Parameters","Configuration","Description"]).default("Runs"),runs:t({flowRuns:t({name:p().optional(),state:l(o(r)).optional().default(n).catch(n)}).optional(),page:e().int().positive().optional().default(1).catch(1),limit:e().int().positive().optional().default(10).catch(10),sort:o(i).optional().default("START_TIME_DESC").catch("START_TIME_DESC")}).optional(),upcoming:t({flowRuns:t({name:p().optional(),state:l(o(r)).optional().default(["Scheduled"]).catch(["Scheduled"])}).optional(),page:e().int().positive().optional().default(1).catch(1),limit:e().int().positive().optional().default(5).catch(5),sort:o(i).optional().default("START_TIME_ASC").catch("START_TIME_ASC")}).optional()});function y({error:s,reset:c}){const m=u(s,"Failed to load deployment");return a.jsxs("div",{className:"flex flex-col gap-4",children:[a.jsx("div",{children:a.jsx("h1",{className:"text-2xl font-semibold",children:"Deployment"})}),a.jsx(T,{error:m,onRetry:c})]})}export{y as errorComponent};
2
+ //# sourceMappingURL=deployment._id-BVOBfMVf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment._id-BVOBfMVf.js","sources":["../../src/routes/deployments/deployment.$id.tsx?tsr-split=errorComponent"],"sourcesContent":["import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListAutomationsRelatedQuery } from \"@/api/automations/automations\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildFLowDetailsQuery } from \"@/api/flows\";\nimport { buildWorkQueueDetailsQuery } from \"@/api/work-queues\";\nimport { DeploymentDetailsPage } from \"@/components/deployments/deployment-details-page\";\nimport {\n\tFLOW_RUN_STATES,\n\tFLOW_RUN_STATES_NO_SCHEDULED,\n\tSORT_FILTERS,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the Deployment Details page\n * @property {\"Runs\" | \"Upcoming\" | \"Parameters\" | \"Configuration\" | \"Description\"} tab used designate which tab view to display\n */\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Runs\", \"Upcoming\", \"Parameters\", \"Configuration\", \"Description\"])\n\t\t.default(\"Runs\"),\n\truns: z\n\t\t.object({\n\t\t\tflowRuns: z\n\t\t\t\t.object({\n\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\tstate: z\n\t\t\t\t\t\t.array(z.enum(FLOW_RUN_STATES))\n\t\t\t\t\t\t.optional()\n\t\t\t\t\t\t.default(FLOW_RUN_STATES_NO_SCHEDULED)\n\t\t\t\t\t\t.catch(FLOW_RUN_STATES_NO_SCHEDULED),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tpage: z.number().int().positive().optional().default(1).catch(1),\n\t\t\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\t\t\tsort: z\n\t\t\t\t.enum(SORT_FILTERS)\n\t\t\t\t.optional()\n\t\t\t\t.default(\"START_TIME_DESC\")\n\t\t\t\t.catch(\"START_TIME_DESC\"),\n\t\t})\n\t\t.optional(),\n\tupcoming: z\n\t\t.object({\n\t\t\tflowRuns: z\n\t\t\t\t.object({\n\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\tstate: z\n\t\t\t\t\t\t.array(z.enum(FLOW_RUN_STATES))\n\t\t\t\t\t\t.optional()\n\t\t\t\t\t\t.default([\"Scheduled\"])\n\t\t\t\t\t\t.catch([\"Scheduled\"]),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tpage: z.number().int().positive().optional().default(1).catch(1),\n\t\t\tlimit: z.number().int().positive().optional().default(5).catch(5),\n\t\t\tsort: z\n\t\t\t\t.enum(SORT_FILTERS)\n\t\t\t\t.optional()\n\t\t\t\t.default(\"START_TIME_ASC\")\n\t\t\t\t.catch(\"START_TIME_ASC\"),\n\t\t})\n\t\t.optional(),\n});\n\nexport type DeploymentDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction DeploymentErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load deployment\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Deployment</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/deployments/deployment/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Critical data\n\t\tconst res = await queryClient.ensureQueryData(\n\t\t\tbuildDeploymentDetailsQuery(params.id),\n\t\t);\n\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListAutomationsRelatedQuery(`prefect.deployment.${params.id}`),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(buildFLowDetailsQuery(res.flow_id));\n\n\t\tif (res.work_pool_name && res.work_queue_name) {\n\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\tbuildWorkQueueDetailsQuery(res.work_pool_name, res.work_queue_name),\n\t\t\t);\n\t\t}\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\n\terrorComponent: DeploymentErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\treturn <DeploymentDetailsPage id={id} />;\n}\n"],"names":["z","tab","default","runs","flowRuns","name","string","optional","state","FLOW_RUN_STATES","FLOW_RUN_STATES_NO_SCHEDULED","catch","page","number","int","positive","limit","sort","SORT_FILTERS","upcoming","DeploymentErrorComponent","error","reset","serverError","categorizeError","jsxs","jsx","RouteErrorState"],"mappings":"+XAsBqBA,EAAS,CAC7BC,IAAKD,EACE,CAAC,OAAQ,WAAY,aAAc,gBAAiB,aAAa,CAAC,EACvEE,QAAQ,MAAM,EAChBC,KAAMH,EACG,CACPI,SAAUJ,EACD,CACPK,KAAML,EAAEM,EAASC,SAAAA,EACjBC,MAAOR,EACCA,EAAOS,CAAe,CAAC,EAC7BF,SAAAA,EACAL,QAAQQ,CAA4B,EACpCC,MAAMD,CAA4B,CAAA,CACpC,EACAH,SAAAA,EACFK,KAAMZ,EAAEa,EAASC,MAAMC,SAAAA,EAAWR,SAAAA,EAAWL,QAAQ,CAAC,EAAES,MAAM,CAAC,EAC/DK,MAAOhB,EAAEa,EAASC,MAAMC,SAAAA,EAAWR,SAAAA,EAAWL,QAAQ,EAAE,EAAES,MAAM,EAAE,EAClEM,KAAMjB,EACCkB,CAAY,EACjBX,SAAAA,EACAL,QAAQ,iBAAiB,EACzBS,MAAM,iBAAiB,CAAA,CACzB,EACAJ,SAAAA,EACFY,SAAUnB,EACD,CACPI,SAAUJ,EACD,CACPK,KAAML,EAAEM,EAASC,SAAAA,EACjBC,MAAOR,EACCA,EAAOS,CAAe,CAAC,EAC7BF,SAAAA,EACAL,QAAQ,CAAC,WAAW,CAAC,EACrBS,MAAM,CAAC,WAAW,CAAC,CAAA,CACrB,EACAJ,SAAAA,EACFK,KAAMZ,EAAEa,EAASC,MAAMC,SAAAA,EAAWR,SAAAA,EAAWL,QAAQ,CAAC,EAAES,MAAM,CAAC,EAC/DK,MAAOhB,EAAEa,EAASC,MAAMC,SAAAA,EAAWR,SAAAA,EAAWL,QAAQ,CAAC,EAAES,MAAM,CAAC,EAChEM,KAAMjB,EACCkB,CAAY,EACjBX,SAAAA,EACAL,QAAQ,gBAAgB,EACxBS,MAAM,gBAAgB,CAAA,CACxB,EACAJ,SAAAA,CACH,CAAC,EAID,SAASa,EAAyB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACxE,MAAMC,EAAcC,EAAgBH,EAAO,2BAA2B,EACtE,OACCI,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,OACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,yBAAyB,sBAAU,CAAA,CAClD,EACAA,EAAAA,IAACC,EAAA,CAAgB,MAAOJ,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
@@ -0,0 +1,2 @@
1
+ import{j as e,L as C,t as $,r as c,F as q,C as Ue,G as Oe,D as $e,B as Be,s as ce}from"./vendor-tanstack-BdLtprmr.js";import{V as de,q as j,I as M,y as F,B as Qe,g as We,h as te,bv as He,bE as Ge,bG as Je,L as ae,aQ as qe,af as ue,aH as Xe,cQ as Ze,cv as G,U as Ke,az as he,aA as me,aC as I,aB as V,$ as Ye,aZ as xe,p as pe,cR as je,cS as X,G as z,a7 as Z,bk as K,a2 as ge,a3 as fe,a4 as ve,a5 as Se,S as es,a as ss,b as ns,c as ts,e as as,cT as rs,cU as os,aP as ls,cV as is,cW as cs,au as ds,cX as us,bW as Ce,bT as De,bU as we,bV as ye,C as hs,cY as ms,cZ as xs,b8 as ps,ct as js,c_ as gs,aO as re,aD as oe}from"./index-CPpeVt8m.js";import{D as be}from"./delete-confirmation-dialog-BZg9EOfN.js";import{D as Y,a as ee,b as se,c as _e,d as E,f as fs}from"./dropdown-menu-fRiq5bS-.js";import{L as vs}from"./lazy-markdown-D_y73qoD.js";import{D as Ss,W as Cs}from"./work-pool-filter-dsJ6xeK6.js";import{S as Ds}from"./sort-filter-X6JyRc0-.js";import{S as ws,a as Ne,F as Te}from"./flow-runs-pagination-DMLZFM1m.js";import{u as Re,F as Ee}from"./use-flow-runs-selected-rows-Ck8nwx2q.js";import{D as ys}from"./data-table-bk-0xKWT.js";import{D as bs}from"./deployment-links-B67P-6Ph.js";import{S as _s}from"./index-ELo08q04.js";import{a as Fe}from"./zod-B1GLD-Zc.js";import{a0 as Ns,$ as Ts}from"./vendor-date-Cl1Jav-N.js";import{c as ke,o as b,b as J,s as A,d as Rs,e as P,n as L,f as Es,a as le}from"./vendor-forms-BlFSCfFw.js";import{c as Fs}from"./vendor-recharts-CY3PKigC.js";import{c as Me}from"./cronstrue-p-STK_QW.js";import{F as Ie,a as f,b as _,c as N,d as T,e as R}from"./form-Cl5Hk9bq.js";import{T as Ve}from"./timezone-select-NViFNNLz.js";import{ao as ks}from"./vendor-radix-CJc458uP.js";import{u as Ms}from"./use-delete-confirmation-dialog-CkL-rSsp.js";import{u as Is,a as Vs}from"./use-quick-run-Cpy0t7dX.js";import"./vendor-react-HBv6Kpyp.js";import"./table-Xyel2BEw.js";import"./work-queue-icon-text-BqqQ413o.js";const Pe=({search:s,sort:n,stateFilter:r,deploymentFilter:a,workPoolFilter:t})=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 pr-2 border-r-2",children:[e.jsx("div",{className:"min-w-56",children:e.jsx(de,{"aria-label":"search by run name",placeholder:"Search by run name",value:s.value,onChange:i=>s.onChange(i.target.value)})}),e.jsx("div",{className:"min-w-56",children:e.jsx(ws,{selectedFilters:r.value,onSelectFilter:r.onSelect})}),a&&e.jsx("div",{className:"min-w-56",children:e.jsx(Ss,{selectedDeployments:a.value,onSelectDeployments:a.onSelect})}),t&&e.jsx("div",{className:"min-w-56",children:e.jsx(Cs,{selectedWorkPools:t.value,onSelectWorkPools:t.onSelect})})]}),e.jsx(Ds,{value:n.value,onSelect:n.onSelect})]}),Ps=({id:s,onDelete:n})=>{const r=a=>{navigator.clipboard.writeText(a),F.success("ID copied")};return e.jsxs(Y,{children:[e.jsx(ee,{asChild:!0,children:e.jsxs(j,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(M,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(se,{align:"end",children:[e.jsx(_e,{children:"Actions"}),e.jsx(E,{onClick:()=>r(s),children:"Copy ID"}),e.jsx(C,{to:"/deployments/deployment/$id/edit",params:{id:s},children:e.jsx(E,{children:"Edit"})}),e.jsx(E,{onClick:n,children:"Delete"}),e.jsx(C,{to:"/deployments/deployment/$id/duplicate",params:{id:s},children:e.jsx(E,{children:"Duplicate"})})]})]})},As=({deployment:s})=>e.jsx(Qe,{children:e.jsxs(We,{children:[e.jsx(te,{children:e.jsx(He,{to:"/deployments",className:"text-xl font-semibold",children:"Deployments"})}),e.jsx(Ge,{}),e.jsx(te,{className:"text-xl font-semibold",children:e.jsx(Je,{children:s.name})})]})}),Ls=({deployment:s})=>{const n=JSON.stringify(s.job_variables??{},null,2),r=JSON.stringify(s.pull_steps??[],null,2);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("h4",{className:"text-xl font-semibold tracking-tight",children:"Job Variables"}),e.jsx(ae,{copy:!0,disabled:!0,hideLineNumbers:!0,value:n}),e.jsx("h4",{className:"text-xl font-semibold tracking-tight",children:"Pull Steps"}),e.jsx(ae,{copy:!0,disabled:!0,hideLineNumbers:!0,value:r})]})},zs=({deployment:s})=>e.jsx("div",{className:"prose max-w-none",children:e.jsx(vs,{children:s.description??""})}),Us=s=>{const{data:n,error:r}=$(qe(s)),a=c.useMemo(()=>n?n.map(o=>o.flow_id):[],[n]),{data:t,error:i}=$(ue({flows:{id:{any_:a},operator:"and_"},offset:0,sort:"CREATED_DESC"},{enabled:a.length>0})),d=c.useMemo(()=>t?new Map(t.map(o=>[o.id,o])):new Map,[t]);return n&&n.length===0?{status:"success",error:null,data:[]}:n&&d.size>0?{status:"success",error:null,data:n.map(o=>{const u=d.get(o.flow_id);return{...o,flow:u}})}:r||i?{status:"error",error:r||i,data:void 0}:{status:"pending",error:null,data:void 0}},Ae=s=>{const{data:n,error:r}=$(Xe(s)),a=c.useMemo(()=>n?n.results.map(o=>o.flow_id):[],[n]),{data:t,error:i}=$(ue({flows:{id:{any_:a},operator:"and_"},offset:0,sort:"CREATED_DESC"},{enabled:a.length>0})),d=c.useMemo(()=>t?new Map(t.map(o=>[o.id,o])):new Map,[t]);return n&&n.results.length===0?{status:"success",error:null,data:{...n,results:[]}}:n&&d.size>0?{status:"success",error:null,data:{...n,results:n.results.map(o=>{const u=d.get(o.flow_id);return{...o,flow:u}})}}:r||i?{status:"error",error:r||i,data:void 0}:{status:"pending",error:null,data:void 0}},D=q("/deployments/deployment/$id"),Os=({deployment:s})=>{const[n,r,{clearSet:a,onSelectRow:t}]=Re(),[i,d]=Qs(),[o,u]=Ws(),[l,m]=Hs(),[h,x]=Gs(),y=Bs(),{data:g}=Ae({deployments:{operator:"and_",id:{any_:[s.id]}},flow_runs:{name:{like_:o||void 0},state:{name:{any_:h.length===0?void 0:h},operator:"or_"},operator:"and_"},limit:i.limit,page:i.page,sort:l}),p=c.useMemo(()=>{if(g)return{...g,results:g.results.map(ze=>({...ze,deployment:s}))}},[g,s]),B=y?()=>{y(),a()}:void 0,U=$s(s);return e.jsxs("div",{className:"flex flex-col gap-2",children:[U&&e.jsxs("div",{className:"flex flex-col gap-2 border-b py-2",children:[e.jsx("p",{className:"text-lg",children:"Next Run"}),e.jsx(Ze,{flowRun:U})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(Ee,{count:p?.count,results:p?.results,selectedRows:n,setSelectedRows:r}),e.jsx(Pe,{search:{value:o,onChange:u},sort:{value:l,onSelect:m},stateFilter:{value:new Set(h),onSelect:x}})]}),e.jsx(Ne,{flowRuns:p?.results,selectedRows:n,onSelect:t,onClearFilters:B}),p&&e.jsx(Te,{count:p.count,pagination:i,onChangePagination:d,pages:p.pages})]})]})};function $s(s){const{data:n}=Us({deployments:{id:{any_:[s.id]},operator:"and_"},flow_runs:{state:{name:{any_:["Scheduled"]},operator:"and_"},operator:"and_"},sort:"EXPECTED_START_TIME_ASC",limit:1,offset:0});return c.useMemo(()=>{if(!(!n||!n[0]))return{...n[0],deployment:s}},[n,s])}function Bs(){const{runs:s}=D.useSearch(),n=D.useNavigate(),r=c.useCallback(()=>{n({to:".",search:t=>({...t,runs:void 0}),replace:!0})},[n]);return c.useMemo(()=>!!s,[s])?r:void 0}function Qs(){const{runs:s}=D.useSearch(),n=D.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,runs:{...s,...t}}),replace:!0})},[n,s]);return[c.useMemo(()=>({page:s?.page??1,limit:s?.limit??10}),[s?.limit,s?.page]),r]}function Ws(){const{runs:s}=D.useSearch(),n=D.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,runs:{...s,flowRuns:{...s?.flowRuns,name:t}}}),replace:!0})},[n,s]);return[c.useMemo(()=>s?.flowRuns?.name??"",[s?.flowRuns?.name]),r]}function Hs(){const{runs:s}=D.useSearch(),n=D.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,runs:{...s,sort:t}}),replace:!0})},[n,s]);return[c.useMemo(()=>s?.sort??"START_TIME_DESC",[s?.sort]),r]}function Gs(){const{runs:s}=D.useSearch(),n=D.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,runs:{...s,flowRuns:{...s?.flowRuns,state:t?Array.from(t):void 0}}}),replace:!0})},[n,s]);return[c.useMemo(()=>s?.flowRuns?.state??G,[s?.flowRuns?.state]),r]}const w=q("/deployments/deployment/$id"),Js=({deployment:s})=>{const[n,r,{clearSet:a,onSelectRow:t}]=Re(),[i,d]=Xs(),[o,u]=Zs(),[l,m]=Ks(),[h,x]=Ys(),y=qs(),{data:g}=Ae({deployments:{operator:"and_",id:{any_:[s.id]}},flow_runs:{name:{like_:o||void 0},state:{name:{any_:h.length===0?void 0:h},operator:"or_"},operator:"and_"},limit:i.limit,page:i.page,sort:l}),p=c.useMemo(()=>{if(g)return{...g,results:g.results.map(U=>({...U,deployment:s}))}},[g,s]),B=y?()=>{y(),a()}:void 0;return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(Ee,{count:p?.count,results:p?.results,selectedRows:n,setSelectedRows:r}),e.jsx(Pe,{search:{value:o,onChange:u},sort:{value:l,onSelect:m},stateFilter:{value:new Set(h),onSelect:x}})]}),e.jsx(Ne,{flowRuns:p?.results,selectedRows:n,onSelect:t,onClearFilters:B}),p&&p.results.length>0&&e.jsx(Te,{count:p.count,pagination:i,onChangePagination:d,pages:p.pages})]})};function qs(){const{upcoming:s}=w.useSearch(),n=w.useNavigate(),r=c.useCallback(()=>{n({to:".",search:t=>({...t,upcoming:void 0}),replace:!0})},[n]);return c.useMemo(()=>!!s,[s])?r:void 0}function Xs(){const{upcoming:s}=w.useSearch(),n=w.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,upcoming:{...s,...t}}),replace:!0})},[n,s]);return[c.useMemo(()=>({page:s?.page??1,limit:s?.limit??5}),[s?.limit,s?.page]),r]}function Zs(){const{upcoming:s}=w.useSearch(),n=w.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,upcoming:{...s,flowRuns:{...s?.flowRuns,name:t}}}),replace:!0})},[n,s]);return[c.useMemo(()=>s?.flowRuns?.name??"",[s?.flowRuns?.name]),r]}function Ks(){const{upcoming:s}=w.useSearch(),n=w.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,upcoming:{...s,sort:t}}),replace:!0})},[n,s]);return[c.useMemo(()=>s?.sort??"START_TIME_ASC",[s?.sort]),r]}function Ys(){const{upcoming:s}=w.useSearch(),n=w.useNavigate(),r=c.useCallback(t=>{n({to:".",search:i=>({...i,upcoming:{...s,flowRuns:{...s?.flowRuns,state:t?Array.from(t):void 0}}}),replace:!0})},[n,s]);return[c.useMemo(()=>s?.flowRuns?.state??["Scheduled"],[s?.flowRuns?.state]),r]}const O=Be(),en=[O.accessor("key",{header:"Key"}),O.accessor("value",{header:"Override"}),O.accessor("defaultValue",{header:"Default"}),O.accessor("type",{header:"Type"})],sn=s=>c.useMemo(()=>{if(!s.parameter_openapi_schema)return[];const n=s.parameter_openapi_schema.properties,r=s.parameters;return Object.keys(n).sort((a,t)=>n[a].position-n[t].position).map(a=>{const t=n[a];return{key:a,value:r[a],defaultValue:t.default,type:t.type}})},[s]),nn=({deployment:s})=>{const[n,r]=c.useState(""),a=sn(s),t=c.useDeferredValue(n),i=c.useMemo(()=>a.filter(o=>o.key.toLowerCase().includes(t.toLowerCase())||o.value?.toString().toLowerCase().includes(t.toLowerCase())||o.defaultValue?.toString().toLowerCase().includes(t.toLowerCase())||o.type?.toString().toLowerCase().includes(t.toLowerCase())),[a,t]),d=Ue({data:i,columns:en,getCoreRowModel:$e(),defaultColumn:{maxSize:300},getPaginationRowModel:Oe()});return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:[i.length," ",Ke(i.length,"parameter")]}),e.jsx("div",{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",children:e.jsx(de,{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",placeholder:"Search parameters",value:n,onChange:o=>r(o.target.value)})})]}),e.jsx(ys,{table:d})]})},tn=q("/deployments/deployment/$id"),an=({deployment:s})=>{const{tab:n}=tn.useSearch(),r=rn(s);return e.jsxs(he,{defaultValue:r[0].value,value:n,children:[e.jsx(me,{children:r.map(({value:a,LinkComponent:t})=>e.jsx(t,{},a))}),r.map(({value:a,ViewComponent:t})=>e.jsx(t,{},a))]})};function rn(s){return c.useMemo(()=>[{value:"Runs",LinkComponent:()=>e.jsx(C,{to:".",search:{tab:"Runs"},children:e.jsx(V,{value:"Runs",children:"Runs"})}),ViewComponent:()=>e.jsx(I,{value:"Runs",children:e.jsx(Os,{deployment:s})})},{value:"Upcoming",LinkComponent:()=>e.jsx(C,{to:".",search:{tab:"Upcoming"},children:e.jsx(V,{value:"Upcoming",children:"Upcoming"})}),ViewComponent:()=>e.jsx(I,{value:"Upcoming",children:e.jsx(Js,{deployment:s})})},{value:"Parameters",LinkComponent:()=>e.jsx(C,{to:".",search:{tab:"Parameters"},children:e.jsx(V,{value:"Parameters",children:"Parameters"})}),ViewComponent:()=>e.jsx(I,{value:"Parameters",children:e.jsx(nn,{deployment:s})})},{value:"Configuration",LinkComponent:()=>e.jsx(C,{to:".",search:{tab:"Configuration"},children:e.jsx(V,{value:"Configuration",children:"Configuration"})}),ViewComponent:()=>e.jsx(I,{value:"Configuration",children:e.jsx(Ls,{deployment:s})})},{value:"Description",LinkComponent:()=>e.jsx(C,{to:".",search:{tab:"Description"},children:e.jsx(V,{value:"Description",children:"Description"})}),ViewComponent:()=>e.jsx(I,{value:"Description",children:e.jsx(zs,{deployment:s})})}],[s])}const v=()=>e.jsx("dd",{className:"text-muted-foreground text-sm",children:"None"}),ie=({children:s})=>e.jsx("dt",{className:"text-sm text-muted-foreground",children:s}),S=({className:s,children:n})=>e.jsx("dd",{className:xe("text-sm",s),children:n}),on=({deployment:s})=>{const n=[{field:"Status",ComponentValue:()=>s.status?e.jsx("dd",{children:e.jsx(_s,{status:s.status})}):e.jsx(v,{})},{field:"Created",ComponentValue:()=>s.created?e.jsx(S,{className:"font-mono",children:s.created}):e.jsx(v,{})},{field:"Updated",ComponentValue:()=>s.updated?e.jsx(S,{className:"font-mono",children:s.updated}):e.jsx(v,{})},{field:"Entrypoint",ComponentValue:()=>s.entrypoint?e.jsx(S,{children:s.entrypoint}):e.jsx(v,{})},{field:"Path",ComponentValue:()=>s.path?e.jsx(S,{children:s.path}):e.jsx(v,{})},{field:"Concurrency Limit",ComponentValue:()=>s.global_concurrency_limit?e.jsx(S,{children:s.global_concurrency_limit.limit}):e.jsx(v,{})}],r=[{field:"Flow ID",ComponentValue:()=>e.jsx(S,{children:s.flow_id})},{field:"Deployment ID",ComponentValue:()=>e.jsx(S,{children:s.id})},{field:"Deployment Version",ComponentValue:()=>s.version?e.jsx(S,{children:s.version}):e.jsx(v,{})},{field:"Storage Document ID",ComponentValue:()=>s.storage_document_id?e.jsx(S,{children:s.storage_document_id}):e.jsx(v,{})},{field:"Infrastructure Document ID",ComponentValue:()=>s.infrastructure_document_id?e.jsx(S,{children:s.infrastructure_document_id}):e.jsx(v,{})},{field:"Tags",ComponentValue:()=>s.tags&&s.tags.length>0?e.jsx("dd",{children:e.jsx(Ye,{tags:s.tags,maxTagsDisplayed:4})}):e.jsx(v,{})}];return e.jsxs("div",{children:[e.jsx("ul",{className:"flex flex-col gap-3",children:n.map(({field:a,ComponentValue:t})=>e.jsx("li",{children:e.jsxs("dl",{children:[e.jsx(ie,{children:a}),e.jsx(t,{})]})},a))}),e.jsx("hr",{className:"my-3"}),e.jsx("ul",{className:"flex flex-col gap-3",children:r.map(({field:a,ComponentValue:t})=>e.jsx("li",{children:e.jsxs("dl",{children:[e.jsx(ie,{children:a}),e.jsx(t,{})]})},a))})]})};var Le=Ns();const Q=s=>{let n="",r=!1;try{Le.CronExpressionParser.parse(s),n=Me.toString(s),r=!0}catch{r=!1,n="Invalid expression"}return{description:n,isCronValid:r}},ln=({onChange:s,...n})=>{const[r,a]=c.useState(Q(String(n.value)).description),[t,i]=c.useState(Q(String(n.value)).isCronValid),d=o=>{if(s){s(o);const{description:u,isCronValid:l}=Q(o.target.value);a(u),i(l)}};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(pe,{...n,onChange:d}),e.jsx("p",{className:Fs("text-sm",t?"text-muted-foreground":"text-red-500"),children:r})]})},cn=s=>{try{return Le.CronExpressionParser.parse(s),!0}catch{return!1}},dn=b({active:J(),schedule:b({cron:A().refine(cn),timezone:A().default("Etc/UTC"),day_or:J().default(!0)})}),W={active:!0,schedule:{cron:"* * * * *",timezone:"Etc/UTC",day_or:!0}},un=({deployment_id:s,scheduleToEdit:n,onSubmit:r})=>{const{createDeploymentSchedule:a,isPending:t}=je(),{updateDeploymentSchedule:i,isPending:d}=X(),o=ke({resolver:Fe(dn),defaultValues:W});c.useEffect(()=>{if(n){const{active:l,schedule:m}=n;if("cron"in m){const{cron:h,day_or:x,timezone:y}=m;o.reset({active:l,schedule:{cron:h,day_or:x,timezone:y??"Etc/UTC"}})}}else o.reset(W)},[o,n]);const u=l=>{const m=()=>{o.reset(W),r()};n?i({deployment_id:s,schedule_id:n.id,...l},{onSuccess:()=>{F.success("Deployment schedule updated")},onError:h=>{const x=h.message||"Unknown error while updating deployment schedule.";o.setError("root",{message:x})},onSettled:m}):a({deployment_id:s,...l},{onSuccess:()=>{F.success("Deployment schedule created")},onError:h=>{const x=h.message||"Unknown error while creating deployment schedule.";o.setError("root",{message:x})},onSettled:m})};return e.jsx(Ie,{...o,children:e.jsxs("form",{onSubmit:l=>{o.handleSubmit(u)(l)},className:"space-y-4",children:[e.jsx(f,{children:o.formState.errors.root?.message}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(_,{control:o.control,name:"active",render:({field:l})=>e.jsxs(N,{children:[e.jsx(T,{children:"Active"}),e.jsx(R,{children:e.jsx(z,{className:"block",checked:l.value,onCheckedChange:l.onChange})}),e.jsx(f,{})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:"w-3/4",children:e.jsx(_,{control:o.control,name:"schedule.cron",render:({field:l})=>e.jsxs(N,{children:[e.jsx(T,{children:"Value"}),e.jsx(R,{children:e.jsx(ln,{...l})}),e.jsx(f,{})]})})}),e.jsx(_,{control:o.control,name:"schedule.day_or",render:({field:l})=>e.jsxs(N,{children:[e.jsxs(T,{"aria-label":"Day Or",children:["Day Or ",e.jsx(hn,{})]}),e.jsx(R,{children:e.jsx(z,{className:"block",checked:l.value,onCheckedChange:l.onChange})}),e.jsx(f,{})]})})]}),e.jsx(_,{control:o.control,name:"schedule.timezone",render:({field:l})=>e.jsxs(N,{children:[e.jsx(T,{children:"Timezone"}),e.jsx(R,{children:e.jsx(Ve,{selectedValue:l.value,onSelect:l.onChange})}),e.jsx(f,{})]})})]}),e.jsxs(Z,{children:[e.jsx(K,{asChild:!0,children:e.jsx(j,{variant:"outline",children:"Close"})}),e.jsx(j,{type:"submit",loading:t||d,children:"Save"})]})]})})},hn=()=>e.jsxs(ge,{children:[e.jsx(K,{asChild:!0,children:e.jsx("button",{type:"button",className:"cursor-help",children:e.jsx(M,{id:"Info",className:"size-4 inline"})})}),e.jsxs(fe,{"aria-describedby":void 0,children:[e.jsx(ve,{children:e.jsx(Se,{children:"Day Or"})}),e.jsx("p",{className:"text-base",children:'When the "Day Or" value is off, this schedule will connect day of the month and day of the week entries using OR logic; when on it will connect them using AND logic.'})]})]}),mn=[{label:"Seconds",value:"seconds"},{label:"Minutes",value:"minutes"},{label:"Hours",value:"hours"},{label:"Days",value:"days"}],k={seconds:1,minutes:60,hours:3600,days:24*3600},xn=s=>{let n=s;const r=Math.floor(s/k.days);if(n%=k.days,n===0)return{interval_value:r,interval_time:"days"};const a=Math.floor(s/k.hours);if(n%=k.hours,n===0)return{interval_value:a,interval_time:"hours"};const t=Math.floor(s/k.minutes);return n%=k.minutes,n===0?{interval_value:t,interval_time:"minutes"}:{interval_value:n,interval_time:"seconds"}},pn=b({active:J(),schedule:b({interval_value:L().or(A()).pipe(Es.number()),interval_time:P(["seconds","minutes","hours","days"]),anchor_date:Rs(),timezone:A().default("Etc/UTC")})}),H={active:!0,schedule:{interval_value:60,interval_time:"minutes",anchor_date:new Date,timezone:"Etc/UTC"}},jn=({deployment_id:s,scheduleToEdit:n,onSubmit:r})=>{const{createDeploymentSchedule:a,isPending:t}=je(),{updateDeploymentSchedule:i,isPending:d}=X(),o=ke({resolver:Fe(pn),defaultValues:H});c.useEffect(()=>{if(n){const{active:l,schedule:m}=n;if("interval"in m){const{interval:h,anchor_date:x,timezone:y}=m,{interval_value:g,interval_time:p}=xn(h);o.reset({active:l,schedule:{interval_value:g,interval_time:p,anchor_date:x?new Date(x):new Date,timezone:y??"Etc/UTC"}})}}else o.reset(H)},[o,n]);const u=l=>{const m=()=>{o.reset(H),r()};n?i({deployment_id:s,schedule_id:n.id,active:l.active,schedule:{interval:l.schedule.interval_value*k[l.schedule.interval_time],anchor_date:l.schedule.anchor_date.toISOString(),timezone:l.schedule.timezone}},{onSuccess:()=>{F.success("Deployment schedule updated")},onError:h=>{const x=h.message||"Unknown error while updating deployment schedule.";o.setError("root",{message:x})},onSettled:m}):a({deployment_id:s,active:l.active,schedule:{interval:l.schedule.interval_value*k[l.schedule.interval_time],anchor_date:l.schedule.anchor_date.toISOString(),timezone:l.schedule.timezone}},{onSuccess:()=>{F.success("Deployment schedule created")},onError:h=>{const x=h.message||"Unknown error while creating deployment schedule.";o.setError("root",{message:x})},onSettled:m})};return e.jsx(Ie,{...o,children:e.jsxs("form",{onSubmit:l=>{o.handleSubmit(u)(l)},className:"space-y-4",children:[e.jsx(f,{children:o.formState.errors.root?.message}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(_,{control:o.control,name:"active",render:({field:l})=>e.jsxs(N,{children:[e.jsx(T,{children:"Active"}),e.jsx(R,{children:e.jsx(z,{className:"block",checked:l.value,onCheckedChange:l.onChange})}),e.jsx(f,{})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:"w-3/4",children:e.jsx(_,{control:o.control,name:"schedule.interval_value",render:({field:l})=>e.jsxs(N,{children:[e.jsx(T,{children:"Value"}),e.jsx(R,{children:e.jsx(pe,{...l})}),e.jsx(f,{})]})})}),e.jsx(_,{control:o.control,name:"schedule.interval_time",render:({field:l})=>e.jsxs(N,{children:[e.jsx(T,{children:"Interval"}),e.jsxs(es,{onValueChange:l.onChange,defaultValue:l.value,value:l.value,children:[e.jsx(R,{children:e.jsx(ss,{children:e.jsx(ns,{placeholder:"Select interval"})})}),e.jsx(ts,{children:mn.map(({label:m,value:h})=>e.jsx(as,{value:h,children:m},h))})]}),e.jsx(f,{})]})})]}),e.jsx(_,{control:o.control,name:"schedule.anchor_date",render:({field:l})=>e.jsxs(N,{className:"flex flex-col",children:[e.jsx(T,{children:"Anchor date"}),e.jsxs(rs,{children:[e.jsx(os,{asChild:!0,children:e.jsx(R,{children:e.jsxs(j,{variant:"outline",className:xe("w-full",!l.value&&"text-muted-foreground"),children:[ls(l.value,"dateTime"),e.jsx(M,{id:"Calendar",className:"ml-auto size-4 opacity-50"})]})})}),e.jsx(is,{className:"w-auto p-0",align:"start",children:e.jsx(cs,{mode:"single",selected:l.value,onSelect:l.onChange})})]}),e.jsx(f,{})]})}),e.jsx(_,{control:o.control,name:"schedule.timezone",render:({field:l})=>e.jsxs(N,{children:[e.jsx(T,{children:"Timezone"}),e.jsx(R,{children:e.jsx(Ve,{selectedValue:l.value,onSelect:l.onChange})}),e.jsx(f,{})]})})]}),e.jsxs(Z,{children:[e.jsx(K,{asChild:!0,children:e.jsx(j,{variant:"outline",children:"Close"})}),e.jsx(j,{type:"submit",loading:t||d,children:"Save"})]})]})})},gn=()=>e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-base",children:"Sorry, modifying RRule schedules via the UI is currently unsupported; select a different schedule type above or modify your schedule in code."}),e.jsxs(Z,{children:[e.jsx(ks,{asChild:!0,children:e.jsx(j,{variant:"outline",children:"Close"})}),e.jsx(j,{disabled:!0,children:"Save"})]})]}),fn=({deploymentId:s,onOpenChange:n,open:r,scheduleToEdit:a,onSubmit:t})=>{const[i,d]=c.useState("interval");c.useEffect(()=>{if(!a)return;const{schedule:u}=a;"interval"in u?d("interval"):"cron"in u?d("cron"):d("rrule")},[a]);const o=[{value:"interval",label:"Interval",Component:()=>e.jsx(jn,{deployment_id:s,onSubmit:t,scheduleToEdit:a})},{value:"cron",label:"Cron",Component:()=>e.jsx(un,{deployment_id:s,onSubmit:t,scheduleToEdit:a})},{value:"rrule",label:"RRule",Component:()=>e.jsx(gn,{})}];return e.jsx(ge,{open:r,onOpenChange:n,children:e.jsxs(fe,{"aria-describedby":void 0,children:[e.jsx(ve,{children:e.jsxs(Se,{children:[a?"Edit":"Add"," Schedule"]})}),e.jsxs(he,{defaultValue:o[0].value,value:i,children:[e.jsx(me,{children:o.map(({value:u,label:l})=>e.jsx(V,{value:u,onClick:()=>d(u),children:l},u))}),o.map(({value:u,Component:l})=>e.jsx(I,{value:u,children:e.jsx(l,{})},u))]})]})})},ne=s=>{const{schedule:n}=s;return"interval"in n?`Every ${ds(n.interval*1e3)}`:"cron"in n?Me.toString(n.cron):Ts(n.rrule).toText()},vn=()=>{const[s,n]=Ms(),{deleteDeploymentSchedule:r}=us();return[s,t=>n({title:"Delete Schedule",description:`Are you sure you want to delete ${ne(t)} schedule?`,onConfirm:()=>{const{id:i,deployment_id:d}=t;if(!d)throw new Error("'deployment_id' expected");r({deployment_id:d,schedule_id:i},{onSuccess:()=>F.success("Schedule deleted"),onError:o=>{const u=o.message||"Unknown error while deleting schedule.";console.error(u)}})}})]},Sn=({deploymentSchedule:s,onEditSchedule:n})=>{const[r,a]=vn(),t=o=>{navigator.clipboard.writeText(o),F.success("ID copied")},i=()=>a(s),d=()=>n(s.id);return e.jsxs(e.Fragment,{children:[e.jsxs(Y,{children:[e.jsx(ee,{asChild:!0,children:e.jsxs(j,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(M,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(se,{align:"end",children:[e.jsx(_e,{children:"Actions"}),e.jsx(E,{onClick:()=>t(s.id),children:"Copy ID"}),e.jsx(E,{onClick:d,children:"Edit"}),e.jsx(E,{onClick:i,children:"Delete"})]})]}),e.jsx(be,{...r})]})},Cn=({deploymentSchedule:s,disabled:n})=>{const{updateDeploymentSchedule:r}=X(),a=t=>{const{id:i,deployment_id:d}=s;if(!d)throw new Error("'deployment_id' expected");r({schedule_id:i,deployment_id:d,active:t},{onSuccess:()=>F.success(`Deployment schedule ${t?"active":"paused"}`),onError:o=>{const u=o.message||"Unknown error while updating deployment schedule.";console.error(u)}})};return e.jsx(Ce,{children:e.jsxs(De,{children:[e.jsx(we,{asChild:!0,children:e.jsx("div",{children:e.jsx(z,{"aria-label":`toggle ${ne(s)}`,checked:s.active,onCheckedChange:a,disabled:n})})}),n&&e.jsx(ye,{children:"Pause or resume this schedule"})]})})},Dn=({deploymentSchedule:s,disabled:n,onEditSchedule:r})=>e.jsx(hs,{className:"p-3",children:e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("p",{className:"text-base",children:ne(s)}),e.jsxs("div",{className:"flex items-baseline gap-2",children:[e.jsx(Cn,{deploymentSchedule:s,disabled:n}),e.jsx(Sn,{deploymentSchedule:s,onEditSchedule:r})]})]})}),wn=({deployment:s})=>{const{updateDeployment:n}=ms(),r=t=>{n({id:s.id,paused:!t},{onSuccess:()=>{F.success(`Deployment ${t?"active":"paused"}`)},onError:i=>{const d=i.message||"Unknown error while updating deployment";console.error(d)}})},a=s.entrypoint===""||s.entrypoint===null;return e.jsx(Ce,{children:e.jsxs(De,{children:[e.jsx(we,{asChild:!0,children:e.jsx("div",{children:e.jsx(z,{"aria-label":"Pause or resume all schedules",disabled:a,onCheckedChange:r,checked:!s.paused})})}),e.jsx(ye,{children:"Pause or resume all schedules"})]})})},yn=3,bn=({deployment:s,onAddSchedule:n,onEditSchedule:r})=>{const a=c.useMemo(()=>s.schedules?s.schedules.sort((t,i)=>t.created?i.created?Date.parse(t.created)-Date.parse(i.created):1:-1):[],[s.schedules]);return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Schedules"}),(a.length>yn||s.paused)&&e.jsx(wn,{deployment:s})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[a.map(t=>e.jsx(Dn,{disabled:s.paused,deploymentSchedule:t,onEditSchedule:r},t.id)),e.jsx("div",{children:e.jsxs(j,{size:"sm",onClick:n,children:[e.jsx(M,{id:"Plus",className:"mr-2 size-4"})," Schedule"]})})]})]})},_n=({deployment:s})=>e.jsx(c.Suspense,{fallback:e.jsx(Rn,{numSkeletons:2}),children:e.jsx(Nn,{deployment:s})}),Nn=({deployment:s})=>{const{data:n}=ce(xs(`prefect.deployment.${s.id}`));return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"Triggers"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(Tn,{automations:n}),e.jsx(C,{to:"/automations/create",search:{actions:{type:"run-deployment",deploymentId:s.id,parameters:s.parameters}},children:e.jsxs(j,{size:"sm",children:[e.jsx(M,{id:"Plus",className:"mr-2 size-4"})," Add"]})})]})]})},Tn=({automations:s})=>e.jsx("ul",{className:"flex flex-col gap-1",children:s.map(n=>e.jsx("li",{children:e.jsxs(C,{to:"/automations/automation/$id",params:{id:n.id},className:"flex items-center text-xs",children:[e.jsx(M,{id:"Bot",className:"mr-1 size-4"}),e.jsx("div",{children:n.name})]})},n.id))}),Rn=({numSkeletons:s=1})=>e.jsx("ul",{className:"flex flex-col gap-1",children:Array.from({length:s}).map((n,r)=>e.jsx("li",{children:e.jsx(ps,{className:"h-4 w-full"})},r))}),En=({deployment:s})=>{const{onQuickRun:n,isPending:r}=Is();return e.jsxs(Y,{children:[e.jsx(ee,{asChild:!0,children:e.jsxs(j,{loading:r,children:["Run ",e.jsx(M,{className:"ml-1 size-4",id:"Play"})]})}),e.jsx(se,{children:e.jsxs(fs,{children:[e.jsx(E,{onClick:()=>n(s.id),children:"Quick run"}),e.jsx(C,{to:"/deployments/deployment/$id/run",params:{id:s.id},search:{parameters:s.parameters},children:e.jsx(E,{children:"Custom run"})})]})})]})},Fn=({id:s})=>{const[n,r]=c.useState({open:!1,scheduleIdToEdit:""}),{data:a}=ce(js(s)),[t,i]=Vs(),d=c.useMemo(()=>{if(!(!a.schedules||!n.scheduleIdToEdit))return a.schedules.find(h=>h.id===n.scheduleIdToEdit)},[a.schedules,n.scheduleIdToEdit]),o=()=>r({open:!0,scheduleIdToEdit:""}),u=h=>r({open:!0,scheduleIdToEdit:h}),l=()=>r({open:!1,scheduleIdToEdit:""}),m=h=>{h||l()};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex align-middle justify-between",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(As,{deployment:a}),e.jsx(bs,{deployment:a})]}),e.jsxs("div",{className:"flex align-middle gap-2",children:[e.jsx(En,{deployment:a}),e.jsx(Ps,{id:s,onDelete:()=>i(a,{shouldNavigate:!0})})]})]}),e.jsxs("div",{className:"grid gap-4",style:{gridTemplateColumns:"5fr 1fr"},children:[e.jsx("div",{className:"flex flex-col gap-5",children:e.jsx(an,{deployment:a})}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(bn,{deployment:a,onAddSchedule:o,onEditSchedule:u}),e.jsx(_n,{deployment:a}),e.jsx("hr",{}),e.jsx(on,{deployment:a})]})]})]}),e.jsx(fn,{deploymentId:s,open:n.open,onOpenChange:m,scheduleToEdit:d,onSubmit:l}),e.jsx(be,{...t})]})};b({tab:P(["Runs","Upcoming","Parameters","Configuration","Description"]).default("Runs"),runs:b({flowRuns:b({name:A().optional(),state:le(P(oe)).optional().default(G).catch(G)}).optional(),page:L().int().positive().optional().default(1).catch(1),limit:L().int().positive().optional().default(10).catch(10),sort:P(re).optional().default("START_TIME_DESC").catch("START_TIME_DESC")}).optional(),upcoming:b({flowRuns:b({name:A().optional(),state:le(P(oe)).optional().default(["Scheduled"]).catch(["Scheduled"])}).optional(),page:L().int().positive().optional().default(1).catch(1),limit:L().int().positive().optional().default(5).catch(5),sort:P(re).optional().default("START_TIME_ASC").catch("START_TIME_ASC")}).optional()});function tt(){const{id:s}=gs.useParams();return e.jsx(Fn,{id:s})}export{tt as component};
2
+ //# sourceMappingURL=deployment._id-KOMC9fpE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment._id-KOMC9fpE.js","sources":["../../src/components/flow-runs/flow-runs-list/flow-runs-filters.tsx","../../src/components/deployments/deployment-action-menu/deployment-action-menu.tsx","../../src/components/deployments/deployment-details-header.tsx","../../src/components/deployments/deployment-configuration.tsx","../../src/components/deployments/deployment-description.tsx","../../src/api/flow-runs/use-filter-flow-runs-with-flows/use-filter-flow-runs-with-flows.ts","../../src/api/flow-runs/use-paginate-flow-runs-with-flows/use-paginate-flow-runs-with-flows.ts","../../src/components/deployments/deployment-details-runs-tab.tsx","../../src/components/deployments/deployment-details-upcoming-tab.tsx","../../src/components/deployments/deployment-parameters-table/deployment-parameters-table.tsx","../../src/components/deployments/deployment-details-tabs.tsx","../../src/components/deployments/deployment-metadata.tsx","../../src/components/ui/cron-input/cron-input.tsx","../../src/components/deployments/deployment-schedules/deployment-schedule-dialog/cron-schedule-form.tsx","../../src/components/deployments/deployment-schedules/deployment-schedule-dialog/interval-schedule-form.tsx","../../src/components/deployments/deployment-schedules/deployment-schedule-dialog/rrule-schedule-form.tsx","../../src/components/deployments/deployment-schedules/deployment-schedule-dialog/deployment-schedule-dialog.tsx","../../src/components/deployments/deployment-schedules/get-schedule-title.ts","../../src/components/deployments/deployment-schedules/use-delete-schedule.ts","../../src/components/deployments/deployment-schedules/schedule-action-menu.tsx","../../src/components/deployments/deployment-schedules/schedule-toggle-switch.tsx","../../src/components/deployments/deployment-schedules/deployment-schedule-item.tsx","../../src/components/deployments/deployment-schedules/deployment-schedule-toggle.tsx","../../src/components/deployments/deployment-schedules/deployment-schedules.tsx","../../src/components/deployments/deployment-triggers.tsx","../../src/components/deployments/run-flow-button/run-flow-button.tsx","../../src/components/deployments/deployment-details-page.tsx","../../src/routes/deployments/deployment.$id.tsx?tsr-split=component"],"sourcesContent":["import { SearchInput } from \"@/components/ui/input\";\nimport { DeploymentFilter } from \"./flow-runs-filters/deployment-filter\";\nimport { SortFilter } from \"./flow-runs-filters/sort-filter\";\nimport type { SortFilters } from \"./flow-runs-filters/sort-filter.constants\";\nimport { StateFilter } from \"./flow-runs-filters/state-filter\";\nimport type { FlowRunState } from \"./flow-runs-filters/state-filters.constants\";\nimport { WorkPoolFilter } from \"./flow-runs-filters/work-pool-filter\";\n\nexport type FlowRunsFiltersProps = {\n\tsearch: {\n\t\tonChange: (value: string) => void;\n\t\tvalue: string;\n\t};\n\tstateFilter: {\n\t\tvalue: Set<FlowRunState>;\n\t\tonSelect: (filters: Set<FlowRunState>) => void;\n\t};\n\tdeploymentFilter?: {\n\t\tvalue: Set<string>;\n\t\tonSelect: (deployments: Set<string>) => void;\n\t};\n\tworkPoolFilter?: {\n\t\tvalue: Set<string>;\n\t\tonSelect: (workPools: Set<string>) => void;\n\t};\n\tsort: {\n\t\tvalue: SortFilters | undefined;\n\t\tonSelect: (sort: SortFilters) => void;\n\t};\n};\n\nexport const FlowRunsFilters = ({\n\tsearch,\n\tsort,\n\tstateFilter,\n\tdeploymentFilter,\n\tworkPoolFilter,\n}: FlowRunsFiltersProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<div className=\"flex items-center gap-2 pr-2 border-r-2\">\n\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\taria-label=\"search by run name\"\n\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\tvalue={search.value}\n\t\t\t\t\t\tonChange={(e) => search.onChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t<StateFilter\n\t\t\t\t\t\tselectedFilters={stateFilter.value}\n\t\t\t\t\t\tonSelectFilter={stateFilter.onSelect}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{deploymentFilter && (\n\t\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t\t<DeploymentFilter\n\t\t\t\t\t\t\tselectedDeployments={deploymentFilter.value}\n\t\t\t\t\t\t\tonSelectDeployments={deploymentFilter.onSelect}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{workPoolFilter && (\n\t\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t\t<WorkPoolFilter\n\t\t\t\t\t\t\tselectedWorkPools={workPoolFilter.value}\n\t\t\t\t\t\t\tonSelectWorkPools={workPoolFilter.onSelect}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<SortFilter value={sort.value} onSelect={sort.onSelect} />\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\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 DeploymentActionMenuProps = {\n\tid: string;\n\tonDelete: () => void;\n};\n\nexport const DeploymentActionMenu = ({\n\tid,\n\tonDelete,\n}: DeploymentActionMenuProps) => {\n\tconst handleCopyId = (_id: string) => {\n\t\tvoid navigator.clipboard.writeText(_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(id)}>\n\t\t\t\t\tCopy ID\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<Link to=\"/deployments/deployment/$id/edit\" params={{ id }}>\n\t\t\t\t\t<DropdownMenuItem>Edit</DropdownMenuItem>\n\t\t\t\t</Link>\n\t\t\t\t<DropdownMenuItem onClick={onDelete}>Delete</DropdownMenuItem>\n\t\t\t\t<Link to=\"/deployments/deployment/$id/duplicate\" params={{ id }}>\n\t\t\t\t\t<DropdownMenuItem>Duplicate</DropdownMenuItem>\n\t\t\t\t</Link>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import type { Deployment } from \"@/api/deployments\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"../ui/breadcrumb\";\n\ntype DeploymentDetailsHeaderProps = {\n\tdeployment: Deployment;\n};\nexport const DeploymentDetailsHeader = ({\n\tdeployment,\n}: DeploymentDetailsHeaderProps) => {\n\treturn (\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbLink to=\"/deployments\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\tDeployments\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t<BreadcrumbPage>{deployment.name}</BreadcrumbPage>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t);\n};\n","import type { Deployment } from \"@/api/deployments\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\n\ntype DeploymentConfigurationProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentConfiguration = ({\n\tdeployment,\n}: DeploymentConfigurationProps) => {\n\tconst jobVariablesDisplay = JSON.stringify(\n\t\tdeployment.job_variables ?? {},\n\t\tnull,\n\t\t2,\n\t);\n\tconst pullStepsDisplay = JSON.stringify(deployment.pull_steps ?? [], null, 2);\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<h4 className=\"text-xl font-semibold tracking-tight\">Job Variables</h4>\n\t\t\t<JsonInput copy disabled hideLineNumbers value={jobVariablesDisplay} />\n\t\t\t<h4 className=\"text-xl font-semibold tracking-tight\">Pull Steps</h4>\n\t\t\t<JsonInput copy disabled hideLineNumbers value={pullStepsDisplay} />\n\t\t</div>\n\t);\n};\n","import type { Deployment } from \"@/api/deployments\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\ntype DeploymentDescriptionProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentDescription = ({\n\tdeployment,\n}: DeploymentDescriptionProps) => (\n\t<div className=\"prose max-w-none\">\n\t\t<LazyMarkdown>{deployment.description ?? \"\"}</LazyMarkdown>\n\t</div>\n);\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { buildFilterFlowRunsQuery, type FlowRunsFilter } from \"@/api/flow-runs\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\n\n/**\n *\n * @param filter\n * @returns a simplified query object that joins a flow run's pagination data with it's parent flow\n */\nexport const useFilterFlowRunswithFlows = (filter: FlowRunsFilter) => {\n\tconst { data: flowRunsData, error: flowRunsError } = useQuery(\n\t\tbuildFilterFlowRunsQuery(filter),\n\t);\n\n\tconst flowIds = useMemo(() => {\n\t\tif (!flowRunsData) {\n\t\t\treturn [];\n\t\t}\n\t\treturn flowRunsData.map((flowRun) => flowRun.flow_id);\n\t}, [flowRunsData]);\n\n\tconst { data: flows, error: flowsError } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: { id: { any_: flowIds }, operator: \"and_\" },\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"CREATED_DESC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst flowMap = useMemo(() => {\n\t\tif (!flows) {\n\t\t\treturn new Map<string, Flow>();\n\t\t}\n\t\treturn new Map(flows.map((flow) => [flow.id, flow]));\n\t}, [flows]);\n\n\t// If there's no results from the query, return empty\n\tif (flowRunsData && flowRunsData.length === 0) {\n\t\treturn {\n\t\t\tstatus: \"success\" as const,\n\t\t\terror: null,\n\t\t\tdata: [],\n\t\t};\n\t}\n\n\tif (flowRunsData && flowMap.size > 0) {\n\t\treturn {\n\t\t\tstatus: \"success\" as const,\n\t\t\terror: null,\n\t\t\tdata: flowRunsData.map((flowRun) => {\n\t\t\t\tconst flow = flowMap.get(flowRun.flow_id);\n\t\t\t\treturn {\n\t\t\t\t\t...flowRun,\n\t\t\t\t\tflow,\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t}\n\n\tif (flowRunsError || flowsError) {\n\t\treturn {\n\t\t\tstatus: \"error\" as const,\n\t\t\terror: flowRunsError || flowsError,\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\treturn {\n\t\tstatus: \"pending\" as const,\n\t\terror: null,\n\t\tdata: undefined,\n\t};\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport {\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsPaginateFilter,\n\ttype FlowRunWithFlow,\n} from \"@/api/flow-runs\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\n\n/**\n *\n * @param filter\n * @returns a simplified query object that joins a flow run's pagination data with it's parent flow\n */\nexport const usePaginateFlowRunswithFlows = (\n\tfilter: FlowRunsPaginateFilter,\n) => {\n\tconst { data: paginateFlowRunsData, error: paginateFlowRunsError } = useQuery(\n\t\tbuildPaginateFlowRunsQuery(filter),\n\t);\n\n\tconst flowIds = useMemo(() => {\n\t\tif (!paginateFlowRunsData) {\n\t\t\treturn [];\n\t\t}\n\t\treturn paginateFlowRunsData.results.map((flowRun) => flowRun.flow_id);\n\t}, [paginateFlowRunsData]);\n\n\tconst { data: flows, error: flowsError } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: { id: { any_: flowIds }, operator: \"and_\" },\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"CREATED_DESC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst flowMap = useMemo(() => {\n\t\tif (!flows) {\n\t\t\treturn new Map<string, Flow>();\n\t\t}\n\t\treturn new Map(flows.map((flow) => [flow.id, flow]));\n\t}, [flows]);\n\n\t// If there's no results from the query, return empty\n\tif (paginateFlowRunsData && paginateFlowRunsData.results.length === 0) {\n\t\treturn {\n\t\t\tstatus: \"success\" as const,\n\t\t\terror: null,\n\t\t\tdata: {\n\t\t\t\t...paginateFlowRunsData,\n\t\t\t\tresults: [] satisfies Array<FlowRunWithFlow>,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (paginateFlowRunsData && flowMap.size > 0) {\n\t\treturn {\n\t\t\tstatus: \"success\" as const,\n\t\t\terror: null,\n\t\t\tdata: {\n\t\t\t\t...paginateFlowRunsData,\n\t\t\t\tresults: paginateFlowRunsData.results.map((flowRun) => {\n\t\t\t\t\tconst flow = flowMap.get(flowRun.flow_id);\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...flowRun,\n\t\t\t\t\t\tflow,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t},\n\t\t};\n\t}\n\n\tif (paginateFlowRunsError || flowsError) {\n\t\treturn {\n\t\t\tstatus: \"error\" as const,\n\t\t\terror: paginateFlowRunsError || flowsError,\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\treturn {\n\t\tstatus: \"pending\" as const,\n\t\terror: null,\n\t\tdata: undefined,\n\t};\n};\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport { useCallback, useMemo } from \"react\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { useFilterFlowRunswithFlows } from \"@/api/flow-runs/use-filter-flow-runs-with-flows\";\nimport { usePaginateFlowRunswithFlows } from \"@/api/flow-runs/use-paginate-flow-runs-with-flows\";\nimport { FlowRunCard } from \"@/components/flow-runs/flow-run-card\";\nimport {\n\tFLOW_RUN_STATES_NO_SCHEDULED,\n\ttype FlowRunState,\n\tFlowRunsFilters,\n\tFlowRunsList,\n\tFlowRunsPagination,\n\tFlowRunsRowCount,\n\ttype PaginationState,\n\ttype SortFilters,\n\tuseFlowRunsSelectedRows,\n} from \"@/components/flow-runs/flow-runs-list\";\n\nconst routeApi = getRouteApi(\"/deployments/deployment/$id\");\n\ntype DeploymentDetailsRunsTabProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentDetailsRunsTab = ({\n\tdeployment,\n}: DeploymentDetailsRunsTabProps) => {\n\tconst [selectedRows, setSelectedRows, { clearSet, onSelectRow }] =\n\t\tuseFlowRunsSelectedRows();\n\tconst [pagination, onChangePagination] = usePagination();\n\tconst [search, setSearch] = useSearch();\n\tconst [sort, setSort] = useSort();\n\tconst [filter, setFilter] = useFilter();\n\tconst resetFilters = useResetFilters();\n\n\tconst { data } = usePaginateFlowRunswithFlows({\n\t\tdeployments: {\n\t\t\toperator: \"and_\",\n\t\t\tid: { any_: [deployment.id] },\n\t\t},\n\t\tflow_runs: {\n\t\t\tname: { like_: search || undefined },\n\t\t\tstate: {\n\t\t\t\tname: { any_: filter.length === 0 ? undefined : filter },\n\t\t\t\toperator: \"or_\",\n\t\t\t},\n\t\t\toperator: \"and_\",\n\t\t},\n\t\tlimit: pagination.limit,\n\t\tpage: pagination.page,\n\t\tsort,\n\t});\n\n\tconst dataWithDeployment = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\t...data,\n\t\t\tresults: data.results.map((flowRun) => ({ ...flowRun, deployment })),\n\t\t};\n\t}, [data, deployment]);\n\n\tconst handleResetFilters = !resetFilters\n\t\t? undefined\n\t\t: () => {\n\t\t\t\tresetFilters();\n\t\t\t\tclearSet();\n\t\t\t};\n\n\tconst nextRun = useGetNextRun(deployment);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t{nextRun && (\n\t\t\t\t<div className=\"flex flex-col gap-2 border-b py-2\">\n\t\t\t\t\t<p className=\"text-lg\">Next Run</p>\n\t\t\t\t\t<FlowRunCard flowRun={nextRun} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<FlowRunsRowCount\n\t\t\t\t\t\tcount={dataWithDeployment?.count}\n\t\t\t\t\t\tresults={dataWithDeployment?.results}\n\t\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\t\tsetSelectedRows={setSelectedRows}\n\t\t\t\t\t/>\n\t\t\t\t\t<FlowRunsFilters\n\t\t\t\t\t\tsearch={{ value: search, onChange: setSearch }}\n\t\t\t\t\t\tsort={{ value: sort, onSelect: setSort }}\n\t\t\t\t\t\tstateFilter={{\n\t\t\t\t\t\t\tvalue: new Set(filter),\n\t\t\t\t\t\t\tonSelect: setFilter,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<FlowRunsList\n\t\t\t\t\tflowRuns={dataWithDeployment?.results}\n\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\tonSelect={onSelectRow}\n\t\t\t\t\tonClearFilters={handleResetFilters}\n\t\t\t\t/>\n\n\t\t\t\t{dataWithDeployment && (\n\t\t\t\t\t<FlowRunsPagination\n\t\t\t\t\t\tcount={dataWithDeployment.count}\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonChangePagination={onChangePagination}\n\t\t\t\t\t\tpages={dataWithDeployment.pages}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nfunction useGetNextRun(deployment: Deployment) {\n\tconst { data } = useFilterFlowRunswithFlows({\n\t\tdeployments: { id: { any_: [deployment.id] }, operator: \"and_\" },\n\t\tflow_runs: {\n\t\t\tstate: { name: { any_: [\"Scheduled\"] }, operator: \"and_\" },\n\t\t\toperator: \"and_\",\n\t\t},\n\t\tsort: \"EXPECTED_START_TIME_ASC\",\n\t\tlimit: 1,\n\t\toffset: 0,\n\t});\n\n\treturn useMemo(() => {\n\t\tif (!data || !data[0]) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\t...data[0],\n\t\t\tdeployment,\n\t\t};\n\t}, [data, deployment]);\n}\n\nfunction useResetFilters() {\n\tconst { runs } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\tconst resetFilters = useCallback(() => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\truns: undefined,\n\t\t\t}),\n\t\t\treplace: true,\n\t\t});\n\t}, [navigate]);\n\tconst hasFiltersApplied = useMemo(() => Boolean(runs), [runs]);\n\n\treturn hasFiltersApplied ? resetFilters : undefined;\n}\n\nfunction usePagination() {\n\tconst { runs } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onChangePagination = useCallback(\n\t\t(pagination?: 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\truns: {\n\t\t\t\t\t\t...runs,\n\t\t\t\t\t\t...pagination,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, runs],\n\t);\n\n\tconst pagination = useMemo(() => {\n\t\treturn {\n\t\t\tpage: runs?.page ?? 1,\n\t\t\tlimit: runs?.limit ?? 10,\n\t\t};\n\t}, [runs?.limit, runs?.page]);\n\n\treturn [pagination, onChangePagination] as const;\n}\n\nfunction useSearch() {\n\tconst { runs } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onSearch = useCallback(\n\t\t(value?: 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\truns: {\n\t\t\t\t\t\t...runs,\n\t\t\t\t\t\tflowRuns: {\n\t\t\t\t\t\t\t...runs?.flowRuns,\n\t\t\t\t\t\t\tname: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, runs],\n\t);\n\tconst search = useMemo(\n\t\t() => runs?.flowRuns?.name ?? \"\",\n\t\t[runs?.flowRuns?.name],\n\t);\n\treturn [search, onSearch] as const;\n}\n\nfunction useSort() {\n\tconst { runs } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onSort = useCallback(\n\t\t(value?: SortFilters) => {\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\truns: {\n\t\t\t\t\t\t...runs,\n\t\t\t\t\t\tsort: value,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, runs],\n\t);\n\tconst sort = useMemo(() => runs?.sort ?? \"START_TIME_DESC\", [runs?.sort]);\n\treturn [sort, onSort] as const;\n}\n\nfunction useFilter() {\n\tconst { runs } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onFilter = useCallback(\n\t\t(value?: 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\truns: {\n\t\t\t\t\t\t...runs,\n\t\t\t\t\t\tflowRuns: {\n\t\t\t\t\t\t\t...runs?.flowRuns,\n\t\t\t\t\t\t\tstate: value ? Array.from(value) : undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, runs],\n\t);\n\n\tconst filter = useMemo(\n\t\t() =>\n\t\t\truns?.flowRuns?.state ??\n\t\t\t(FLOW_RUN_STATES_NO_SCHEDULED satisfies Array<FlowRunState>),\n\t\t[runs?.flowRuns?.state],\n\t);\n\treturn [filter, onFilter] as const;\n}\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport { useCallback, useMemo } from \"react\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { usePaginateFlowRunswithFlows } from \"@/api/flow-runs/use-paginate-flow-runs-with-flows\";\nimport {\n\ttype FlowRunState,\n\tFlowRunsFilters,\n\tFlowRunsList,\n\tFlowRunsPagination,\n\tFlowRunsRowCount,\n\ttype PaginationState,\n\ttype SortFilters,\n\tuseFlowRunsSelectedRows,\n} from \"@/components/flow-runs/flow-runs-list\";\n\nconst routeApi = getRouteApi(\"/deployments/deployment/$id\");\n\ntype DeploymentDetailsUpcomingTabProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentDetailsUpcomingTab = ({\n\tdeployment,\n}: DeploymentDetailsUpcomingTabProps) => {\n\tconst [selectedRows, setSelectedRows, { clearSet, onSelectRow }] =\n\t\tuseFlowRunsSelectedRows();\n\tconst [pagination, onChangePagination] = usePagination();\n\tconst [search, setSearch] = useSearch();\n\tconst [sort, setSort] = useSort();\n\tconst [filter, setFilter] = useFilter();\n\tconst resetFilters = useResetFilters();\n\n\tconst { data } = usePaginateFlowRunswithFlows({\n\t\tdeployments: {\n\t\t\toperator: \"and_\",\n\t\t\tid: { any_: [deployment.id] },\n\t\t},\n\t\tflow_runs: {\n\t\t\tname: { like_: search || undefined },\n\t\t\tstate: {\n\t\t\t\tname: { any_: filter.length === 0 ? undefined : filter },\n\t\t\t\toperator: \"or_\",\n\t\t\t},\n\t\t\toperator: \"and_\",\n\t\t},\n\t\tlimit: pagination.limit,\n\t\tpage: pagination.page,\n\t\tsort,\n\t});\n\n\tconst dataWithDeployment = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\t...data,\n\t\t\tresults: data.results.map((flowRun) => ({ ...flowRun, deployment })),\n\t\t};\n\t}, [data, deployment]);\n\n\tconst handleResetFilters = !resetFilters\n\t\t? undefined\n\t\t: () => {\n\t\t\t\tresetFilters();\n\t\t\t\tclearSet();\n\t\t\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<FlowRunsRowCount\n\t\t\t\t\tcount={dataWithDeployment?.count}\n\t\t\t\t\tresults={dataWithDeployment?.results}\n\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\tsetSelectedRows={setSelectedRows}\n\t\t\t\t/>\n\t\t\t\t<FlowRunsFilters\n\t\t\t\t\tsearch={{ value: search, onChange: setSearch }}\n\t\t\t\t\tsort={{ value: sort, onSelect: setSort }}\n\t\t\t\t\tstateFilter={{\n\t\t\t\t\t\tvalue: new Set(filter),\n\t\t\t\t\t\tonSelect: setFilter,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<FlowRunsList\n\t\t\t\tflowRuns={dataWithDeployment?.results}\n\t\t\t\tselectedRows={selectedRows}\n\t\t\t\tonSelect={onSelectRow}\n\t\t\t\tonClearFilters={handleResetFilters}\n\t\t\t/>\n\n\t\t\t{dataWithDeployment && dataWithDeployment.results.length > 0 && (\n\t\t\t\t<FlowRunsPagination\n\t\t\t\t\tcount={dataWithDeployment.count}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonChangePagination={onChangePagination}\n\t\t\t\t\tpages={dataWithDeployment.pages}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nfunction useResetFilters() {\n\tconst { upcoming } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\tconst resetFilters = useCallback(() => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tupcoming: undefined,\n\t\t\t}),\n\t\t\treplace: true,\n\t\t});\n\t}, [navigate]);\n\tconst hasFiltersApplied = useMemo(() => Boolean(upcoming), [upcoming]);\n\n\treturn hasFiltersApplied ? resetFilters : undefined;\n}\n\nfunction usePagination() {\n\tconst { upcoming } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onChangePagination = useCallback(\n\t\t(pagination?: 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\tupcoming: {\n\t\t\t\t\t\t...upcoming,\n\t\t\t\t\t\t...pagination,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, upcoming],\n\t);\n\n\tconst pagination = useMemo(() => {\n\t\treturn {\n\t\t\tpage: upcoming?.page ?? 1,\n\t\t\tlimit: upcoming?.limit ?? 5,\n\t\t};\n\t}, [upcoming?.limit, upcoming?.page]);\n\n\treturn [pagination, onChangePagination] as const;\n}\n\nfunction useSearch() {\n\tconst { upcoming } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onSearch = useCallback(\n\t\t(value?: 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\tupcoming: {\n\t\t\t\t\t\t...upcoming,\n\t\t\t\t\t\tflowRuns: {\n\t\t\t\t\t\t\t...upcoming?.flowRuns,\n\t\t\t\t\t\t\tname: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, upcoming],\n\t);\n\tconst search = useMemo(\n\t\t() => upcoming?.flowRuns?.name ?? \"\",\n\t\t[upcoming?.flowRuns?.name],\n\t);\n\treturn [search, onSearch] as const;\n}\n\nfunction useSort() {\n\tconst { upcoming } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onSort = useCallback(\n\t\t(value?: SortFilters) => {\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\tupcoming: {\n\t\t\t\t\t\t...upcoming,\n\t\t\t\t\t\tsort: value,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, upcoming],\n\t);\n\tconst sort = useMemo(\n\t\t() => upcoming?.sort ?? \"START_TIME_ASC\",\n\t\t[upcoming?.sort],\n\t);\n\treturn [sort, onSort] as const;\n}\n\nfunction useFilter() {\n\tconst { upcoming } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\tconst onFilter = useCallback(\n\t\t(value?: 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\tupcoming: {\n\t\t\t\t\t\t...upcoming,\n\t\t\t\t\t\tflowRuns: {\n\t\t\t\t\t\t\t...upcoming?.flowRuns,\n\t\t\t\t\t\t\tstate: value ? Array.from(value) : undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate, upcoming],\n\t);\n\n\tconst filter = useMemo(\n\t\t() =>\n\t\t\tupcoming?.flowRuns?.state ??\n\t\t\t([\"Scheduled\"] satisfies Array<FlowRunState>),\n\t\t[upcoming?.flowRuns?.state],\n\t);\n\treturn [filter, onFilter] as const;\n}\n","import {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { pluralize } from \"@/utils\";\n\ntype DeploymentParametersTableProps = {\n\tdeployment: Deployment;\n};\n\ntype ParameterOpenApiSchema = {\n\tdefault: unknown;\n\tposition: number;\n\ttitle: string;\n\ttype: \"boolean\" | \"number\" | \"null\" | \"string\";\n};\n\ntype ParametersTableColumns = {\n\tkey: string;\n\tvalue: unknown;\n\tdefaultValue: unknown;\n\ttype: string | undefined;\n};\n\nconst columnHelper = createColumnHelper<ParametersTableColumns>();\n\nconst columns = [\n\tcolumnHelper.accessor(\"key\", { header: \"Key\" }),\n\tcolumnHelper.accessor(\"value\", { header: \"Override\" }),\n\tcolumnHelper.accessor(\"defaultValue\", { header: \"Default\" }),\n\tcolumnHelper.accessor(\"type\", { header: \"Type\" }),\n];\n\n/**\n *\n * @param deployment\n * @returns converts a deployment schema into a parameters table schema\n */\nconst useDeploymentParametersToTable = (\n\tdeployment: Deployment,\n): Array<ParametersTableColumns> =>\n\tuseMemo(() => {\n\t\tif (!deployment.parameter_openapi_schema) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst parameterOpenApiSchema = deployment.parameter_openapi_schema\n\t\t\t.properties as Record<string, ParameterOpenApiSchema>;\n\t\tconst parameters = deployment.parameters as Record<string, unknown>;\n\t\treturn Object.keys(parameterOpenApiSchema)\n\t\t\t.sort((a, b) => {\n\t\t\t\treturn (\n\t\t\t\t\tparameterOpenApiSchema[a].position -\n\t\t\t\t\tparameterOpenApiSchema[b].position\n\t\t\t\t);\n\t\t\t})\n\t\t\t.map((key) => {\n\t\t\t\tconst parameter = parameterOpenApiSchema[key];\n\t\t\t\treturn {\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: parameters[key],\n\t\t\t\t\tdefaultValue: parameter.default,\n\t\t\t\t\ttype: parameter.type,\n\t\t\t\t};\n\t\t\t});\n\t}, [deployment]);\n\nexport const DeploymentParametersTable = ({\n\tdeployment,\n}: DeploymentParametersTableProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst data = useDeploymentParametersToTable(deployment);\n\n\t// nb: This table does search via client side\n\tconst deferredSearch = useDeferredValue(search);\n\tconst filteredData = useMemo(() => {\n\t\treturn data.filter(\n\t\t\t(parameter) =>\n\t\t\t\tparameter.key.toLowerCase().includes(deferredSearch.toLowerCase()) ||\n\t\t\t\tparameter.value\n\t\t\t\t\t?.toString()\n\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t.includes(deferredSearch.toLowerCase()) ||\n\t\t\t\tparameter.defaultValue\n\t\t\t\t\t?.toString()\n\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t.includes(deferredSearch.toLowerCase()) ||\n\t\t\t\tparameter.type\n\t\t\t\t\t?.toString()\n\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t.includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\tconst table = useReactTable({\n\t\tdata: filteredData,\n\n\t\tcolumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tdefaultColumn: { maxSize: 300 },\n\t\tgetPaginationRowModel: getPaginationRowModel(), //load client-side pagination code\n\t});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{filteredData.length} {pluralize(filteredData.length, \"parameter\")}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tclassName=\"sm:col-span-2 md:col-span-2 lg:col-span-3\"\n\t\t\t\t\t\tplaceholder=\"Search parameters\"\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { getRouteApi, Link } from \"@tanstack/react-router\";\nimport { type JSX, useMemo } from \"react\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { DeploymentDetailsTabOptions } from \"@/routes/deployments/deployment.$id\";\n\nimport { DeploymentConfiguration } from \"./deployment-configuration\";\nimport { DeploymentDescription } from \"./deployment-description\";\nimport { DeploymentDetailsRunsTab } from \"./deployment-details-runs-tab\";\nimport { DeploymentDetailsUpcomingTab } from \"./deployment-details-upcoming-tab\";\nimport { DeploymentParametersTable } from \"./deployment-parameters-table\";\n\nconst routeApi = getRouteApi(\"/deployments/deployment/$id\");\n\ntype TabOption = {\n\tvalue: DeploymentDetailsTabOptions;\n\tLinkComponent: () => JSX.Element;\n\tViewComponent: () => JSX.Element;\n};\n\ntype DeploymentDetailsTabsProps = {\n\tdeployment: Deployment;\n};\nexport const DeploymentDetailsTabs = ({\n\tdeployment,\n}: DeploymentDetailsTabsProps) => {\n\tconst { tab } = routeApi.useSearch();\n\n\tconst tabOptions = useBuildTabOptions(deployment);\n\n\treturn (\n\t\t<Tabs defaultValue={tabOptions[0].value} value={tab}>\n\t\t\t<TabsList>\n\t\t\t\t{tabOptions.map(({ value, LinkComponent }) => (\n\t\t\t\t\t<LinkComponent key={value} />\n\t\t\t\t))}\n\t\t\t</TabsList>\n\t\t\t{tabOptions.map(({ value, ViewComponent }) => (\n\t\t\t\t<ViewComponent key={value} />\n\t\t\t))}\n\t\t</Tabs>\n\t);\n};\n\nfunction useBuildTabOptions(deployment: Deployment) {\n\treturn useMemo(\n\t\t() =>\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tvalue: \"Runs\",\n\t\t\t\t\tLinkComponent: () => (\n\t\t\t\t\t\t<Link to=\".\" search={{ tab: \"Runs\" }}>\n\t\t\t\t\t\t\t<TabsTrigger value=\"Runs\">Runs</TabsTrigger>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t),\n\t\t\t\t\tViewComponent: () => (\n\t\t\t\t\t\t<TabsContent value=\"Runs\">\n\t\t\t\t\t\t\t<DeploymentDetailsRunsTab deployment={deployment} />\n\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvalue: \"Upcoming\",\n\t\t\t\t\tLinkComponent: () => (\n\t\t\t\t\t\t<Link to=\".\" search={{ tab: \"Upcoming\" }}>\n\t\t\t\t\t\t\t<TabsTrigger value=\"Upcoming\">Upcoming</TabsTrigger>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t),\n\t\t\t\t\tViewComponent: () => (\n\t\t\t\t\t\t<TabsContent value=\"Upcoming\">\n\t\t\t\t\t\t\t<DeploymentDetailsUpcomingTab deployment={deployment} />\n\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvalue: \"Parameters\",\n\t\t\t\t\tLinkComponent: () => (\n\t\t\t\t\t\t<Link to=\".\" search={{ tab: \"Parameters\" }}>\n\t\t\t\t\t\t\t<TabsTrigger value=\"Parameters\">Parameters</TabsTrigger>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t),\n\t\t\t\t\tViewComponent: () => (\n\t\t\t\t\t\t<TabsContent value=\"Parameters\">\n\t\t\t\t\t\t\t<DeploymentParametersTable deployment={deployment} />\n\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvalue: \"Configuration\",\n\t\t\t\t\tLinkComponent: () => (\n\t\t\t\t\t\t<Link to=\".\" search={{ tab: \"Configuration\" }}>\n\t\t\t\t\t\t\t<TabsTrigger value=\"Configuration\">Configuration</TabsTrigger>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t),\n\t\t\t\t\tViewComponent: () => (\n\t\t\t\t\t\t<TabsContent value=\"Configuration\">\n\t\t\t\t\t\t\t<DeploymentConfiguration deployment={deployment} />\n\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tvalue: \"Description\",\n\t\t\t\t\tLinkComponent: () => (\n\t\t\t\t\t\t<Link to=\".\" search={{ tab: \"Description\" }}>\n\t\t\t\t\t\t\t<TabsTrigger value=\"Description\">Description</TabsTrigger>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t),\n\t\t\t\t\tViewComponent: () => (\n\t\t\t\t\t\t<TabsContent value=\"Description\">\n\t\t\t\t\t\t\t<DeploymentDescription deployment={deployment} />\n\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t] as const satisfies Array<TabOption>,\n\t\t[deployment],\n\t);\n}\n","import type { Deployment } from \"@/api/deployments\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { cn } from \"@/utils\";\n\ntype DeploymentMetadataProps = {\n\tdeployment: Deployment;\n};\n\nconst None = () => <dd className=\"text-muted-foreground text-sm\">None</dd>;\nconst FieldLabel = ({ children }: { children: React.ReactNode }) => (\n\t<dt className=\"text-sm text-muted-foreground\">{children}</dt>\n);\n\nconst FieldValue = ({\n\tclassName,\n\tchildren,\n}: {\n\tclassName?: string;\n\tchildren: React.ReactNode;\n}) => <dd className={cn(\"text-sm\", className)}>{children}</dd>;\nexport const DeploymentMetadata = ({ deployment }: DeploymentMetadataProps) => {\n\tconst TOP_FIELDS = [\n\t\t{\n\t\t\tfield: \"Status\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.status ? (\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<StatusBadge status={deployment.status} />\n\t\t\t\t\t</dd>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Created\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.created ? (\n\t\t\t\t\t<FieldValue className=\"font-mono\">{deployment.created}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Updated\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.updated ? (\n\t\t\t\t\t<FieldValue className=\"font-mono\">{deployment.updated}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Entrypoint\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.entrypoint ? (\n\t\t\t\t\t<FieldValue>{deployment.entrypoint}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Path\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.path ? <FieldValue>{deployment.path}</FieldValue> : <None />,\n\t\t},\n\t\t{\n\t\t\tfield: \"Concurrency Limit\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.global_concurrency_limit ? (\n\t\t\t\t\t<FieldValue>{deployment.global_concurrency_limit.limit}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t] as const;\n\n\tconst BOTTOM_FIELDS = [\n\t\t{\n\t\t\tfield: \"Flow ID\",\n\t\t\tComponentValue: () => <FieldValue>{deployment.flow_id}</FieldValue>,\n\t\t},\n\t\t{\n\t\t\tfield: \"Deployment ID\",\n\t\t\tComponentValue: () => <FieldValue>{deployment.id}</FieldValue>,\n\t\t},\n\t\t{\n\t\t\tfield: \"Deployment Version\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.version ? (\n\t\t\t\t\t<FieldValue>{deployment.version}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Storage Document ID\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.storage_document_id ? (\n\t\t\t\t\t<FieldValue>{deployment.storage_document_id}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Infrastructure Document ID\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.infrastructure_document_id ? (\n\t\t\t\t\t<FieldValue>{deployment.infrastructure_document_id}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Tags\",\n\t\t\tComponentValue: () =>\n\t\t\t\tdeployment.tags && deployment.tags.length > 0 ? (\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<TagBadgeGroup tags={deployment.tags} maxTagsDisplayed={4} />\n\t\t\t\t\t</dd>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t];\n\n\treturn (\n\t\t<div>\n\t\t\t<ul className=\"flex flex-col gap-3\">\n\t\t\t\t{TOP_FIELDS.map(({ field, ComponentValue }) => (\n\t\t\t\t\t<li key={field}>\n\t\t\t\t\t\t<dl>\n\t\t\t\t\t\t\t<FieldLabel>{field}</FieldLabel>\n\t\t\t\t\t\t\t<ComponentValue />\n\t\t\t\t\t\t</dl>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t\t<hr className=\"my-3\" />\n\t\t\t<ul className=\"flex flex-col gap-3\">\n\t\t\t\t{BOTTOM_FIELDS.map(({ field, ComponentValue }) => (\n\t\t\t\t\t<li key={field}>\n\t\t\t\t\t\t<dl>\n\t\t\t\t\t\t\t<FieldLabel>{field}</FieldLabel>\n\t\t\t\t\t\t\t<ComponentValue />\n\t\t\t\t\t\t</dl>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t);\n};\n","import clsx from \"clsx\";\nimport { CronExpressionParser } from \"cron-parser\";\nimport cronstrue from \"cronstrue\";\nimport { useState } from \"react\";\nimport { Input, type InputProps } from \"@/components/ui/input\";\n\nconst verifyCronValue = (cronValue: string) => {\n\tlet description = \"\";\n\tlet isCronValid = false;\n\ttry {\n\t\tCronExpressionParser.parse(cronValue);\n\t\tdescription = cronstrue.toString(cronValue);\n\t\tisCronValid = true;\n\t} catch {\n\t\tisCronValid = false;\n\t\tdescription = \"Invalid expression\";\n\t}\n\treturn {\n\t\tdescription,\n\t\tisCronValid,\n\t};\n};\n\nexport type CronInputProps = InputProps;\nexport const CronInput = ({ onChange, ...props }: CronInputProps) => {\n\tconst [description, setDescription] = useState(\n\t\tverifyCronValue(String(props.value)).description,\n\t);\n\tconst [isCronValid, setIsCronValid] = useState(\n\t\tverifyCronValue(String(props.value)).isCronValid,\n\t);\n\n\tconst handleChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n\t\tif (onChange) {\n\t\t\tonChange(event);\n\t\t\tconst { description, isCronValid } = verifyCronValue(event.target.value);\n\t\t\tsetDescription(description);\n\t\t\tsetIsCronValid(isCronValid);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t<Input {...props} onChange={handleChange} />\n\t\t\t<p\n\t\t\t\tclassName={clsx(\n\t\t\t\t\t\"text-sm\",\n\t\t\t\t\tisCronValid ? \"text-muted-foreground\" : \"text-red-500\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{description}\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { CronExpressionParser } from \"cron-parser\";\nimport { useEffect } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport type { DeploymentSchedule } from \"@/api/deployments\";\nimport {\n\tuseCreateDeploymentSchedule,\n\tuseUpdateDeploymentSchedule,\n} from \"@/api/deployments\";\nimport { Button } from \"@/components/ui/button\";\nimport { CronInput } from \"@/components/ui/cron-input\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { TimezoneSelect } from \"@/components/ui/timezone-select\";\n\nconst verifyCronValue = (cronValue: string) => {\n\ttry {\n\t\tCronExpressionParser.parse(cronValue);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nconst formSchema = z.object({\n\tactive: z.boolean(),\n\tschedule: z.object({\n\t\tcron: z.string().refine(verifyCronValue),\n\t\ttimezone: z.string().default(\"Etc/UTC\"),\n\t\tday_or: z.boolean().default(true),\n\t}),\n});\ntype FormSchema = z.infer<typeof formSchema>;\n\nconst DEFAULT_VALUES = {\n\tactive: true,\n\tschedule: {\n\t\tcron: \"* * * * *\",\n\t\ttimezone: \"Etc/UTC\",\n\t\tday_or: true,\n\t},\n} satisfies FormSchema;\n\nexport type CronScheduleFormProps = {\n\tdeployment_id: string;\n\t/** Schedule to edit. Pass undefined if creating a new limit */\n\tscheduleToEdit?: DeploymentSchedule;\n\t/** Callback after hitting Save or Update */\n\tonSubmit: () => void;\n};\n\nexport const CronScheduleForm = ({\n\tdeployment_id,\n\tscheduleToEdit,\n\tonSubmit,\n}: CronScheduleFormProps) => {\n\tconst { createDeploymentSchedule, isPending: createPending } =\n\t\tuseCreateDeploymentSchedule();\n\tconst { updateDeploymentSchedule, isPending: updatePending } =\n\t\tuseUpdateDeploymentSchedule();\n\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: DEFAULT_VALUES,\n\t});\n\n\t// Sync form data with scheduleToEdit data\n\tuseEffect(() => {\n\t\tif (scheduleToEdit) {\n\t\t\tconst { active, schedule } = scheduleToEdit;\n\t\t\tif (\"cron\" in schedule) {\n\t\t\t\tconst { cron, day_or, timezone } = schedule;\n\t\t\t\tform.reset({\n\t\t\t\t\tactive,\n\t\t\t\t\tschedule: {\n\t\t\t\t\t\tcron,\n\t\t\t\t\t\tday_or,\n\t\t\t\t\t\ttimezone: timezone ?? \"Etc/UTC\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t}\n\t}, [form, scheduleToEdit]);\n\n\tconst handleSave = (values: FormSchema) => {\n\t\tconst onSettled = () => {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t\tonSubmit();\n\t\t};\n\n\t\tif (scheduleToEdit) {\n\t\t\tupdateDeploymentSchedule(\n\t\t\t\t{\n\t\t\t\t\tdeployment_id,\n\t\t\t\t\tschedule_id: scheduleToEdit.id,\n\t\t\t\t\t...values,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Deployment schedule updated\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror.message ||\n\t\t\t\t\t\t\t\"Unknown error while updating deployment schedule.\";\n\t\t\t\t\t\tform.setError(\"root\", { message });\n\t\t\t\t\t},\n\t\t\t\t\tonSettled,\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\tcreateDeploymentSchedule(\n\t\t\t\t{\n\t\t\t\t\tdeployment_id,\n\t\t\t\t\t...values,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Deployment schedule created\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror.message ||\n\t\t\t\t\t\t\t\"Unknown error while creating deployment schedule.\";\n\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tonSettled,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Form {...form}>\n\t\t\t<form\n\t\t\t\tonSubmit={(e) => void form.handleSubmit(handleSave)(e)}\n\t\t\t\tclassName=\"space-y-4\"\n\t\t\t>\n\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"active\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel>Active</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t\t\t\t\tchecked={field.value}\n\t\t\t\t\t\t\t\t\t\tonCheckedChange={field.onChange}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t<div className=\"w-3/4\">\n\t\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\t\tname=\"schedule.cron\"\n\t\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t\t<FormLabel>Value</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t\t<CronInput {...field} />\n\t\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"schedule.day_or\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel aria-label=\"Day Or\">\n\t\t\t\t\t\t\t\t\t\tDay Or <DayOrDialog />\n\t\t\t\t\t\t\t\t\t</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t\t\t\t\t\tchecked={field.value}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={field.onChange}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"schedule.timezone\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel>Timezone</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<TimezoneSelect\n\t\t\t\t\t\t\t\t\t\tselectedValue={field.value}\n\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button type=\"submit\" loading={createPending || updatePending}>\n\t\t\t\t\t\tSave\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</form>\n\t\t</Form>\n\t);\n};\n\nconst DayOrDialog = () => {\n\treturn (\n\t\t<Dialog>\n\t\t\t<DialogTrigger asChild>\n\t\t\t\t<button type=\"button\" className=\"cursor-help\">\n\t\t\t\t\t<Icon id=\"Info\" className=\"size-4 inline\" />\n\t\t\t\t</button>\n\t\t\t</DialogTrigger>\n\t\t\t<DialogContent aria-describedby={undefined}>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Day Or</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<p className=\"text-base\">\n\t\t\t\t\tWhen the &quot;Day Or&quot; value is off, this schedule will connect\n\t\t\t\t\tday of the month and day of the week entries using OR logic; when on\n\t\t\t\t\tit will connect them using AND logic.\n\t\t\t\t</p>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useEffect } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport type { DeploymentSchedule } from \"@/api/deployments\";\nimport {\n\tuseCreateDeploymentSchedule,\n\tuseUpdateDeploymentSchedule,\n} from \"@/api/deployments\";\nimport { Button } from \"@/components/ui/button\";\nimport { Calendar } from \"@/components/ui/calendar\";\nimport { DialogFooter, DialogTrigger } from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from \"@/components/ui/popover\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { TimezoneSelect } from \"@/components/ui/timezone-select\";\nimport { cn } from \"@/utils\";\nimport { formatDate } from \"@/utils/date\";\n\nconst INTERVALS = [\n\t{ label: \"Seconds\", value: \"seconds\" },\n\t{ label: \"Minutes\", value: \"minutes\" },\n\t{ label: \"Hours\", value: \"hours\" },\n\t{ label: \"Days\", value: \"days\" },\n] as const;\ntype Intervals = (typeof INTERVALS)[number][\"value\"];\n\nconst INTERVAL_SECONDS = {\n\tseconds: 1,\n\tminutes: 60,\n\thours: 3_600,\n\tdays: 24 * 3600,\n} satisfies Record<Intervals, number>;\n\nconst parseIntervalToTime = (\n\tinterval: number,\n): { interval_value: number; interval_time: Intervals } => {\n\tlet remainingSeconds = interval;\n\n\tconst days = Math.floor(interval / INTERVAL_SECONDS.days);\n\tremainingSeconds %= INTERVAL_SECONDS.days;\n\tif (remainingSeconds === 0) {\n\t\treturn { interval_value: days, interval_time: \"days\" } as const;\n\t}\n\n\tconst hours = Math.floor(interval / INTERVAL_SECONDS.hours);\n\tremainingSeconds %= INTERVAL_SECONDS.hours;\n\tif (remainingSeconds === 0) {\n\t\treturn { interval_value: hours, interval_time: \"hours\" } as const;\n\t}\n\n\tconst minutes = Math.floor(interval / INTERVAL_SECONDS.minutes);\n\tremainingSeconds %= INTERVAL_SECONDS.minutes;\n\tif (remainingSeconds === 0) {\n\t\treturn { interval_value: minutes, interval_time: \"minutes\" } as const;\n\t}\n\n\treturn {\n\t\tinterval_value: remainingSeconds,\n\t\tinterval_time: \"seconds\",\n\t} as const;\n};\n\nconst formSchema = z.object({\n\tactive: z.boolean(),\n\tschedule: z.object({\n\t\t/** Coerce to solve common issue of transforming a string number to a number type */\n\t\tinterval_value: z.number().or(z.string()).pipe(z.coerce.number()),\n\t\tinterval_time: z.enum([\"seconds\", \"minutes\", \"hours\", \"days\"]),\n\t\tanchor_date: z.date(),\n\t\ttimezone: z.string().default(\"Etc/UTC\"),\n\t}),\n});\ntype FormSchema = z.infer<typeof formSchema>;\n\nconst DEFAULT_VALUES: FormSchema = {\n\tactive: true,\n\tschedule: {\n\t\tinterval_value: 60,\n\t\tinterval_time: \"minutes\",\n\t\tanchor_date: new Date(),\n\t\ttimezone: \"Etc/UTC\",\n\t},\n};\n\nexport type IntervalScheduleFormProps = {\n\tdeployment_id: string;\n\t/** Schedule to edit. Pass undefined if creating a new limit */\n\tscheduleToEdit?: DeploymentSchedule;\n\t/** Callback after hitting Save or Update */\n\tonSubmit: () => void;\n};\n\nexport const IntervalScheduleForm = ({\n\tdeployment_id,\n\tscheduleToEdit,\n\tonSubmit,\n}: IntervalScheduleFormProps) => {\n\tconst { createDeploymentSchedule, isPending: createPending } =\n\t\tuseCreateDeploymentSchedule();\n\tconst { updateDeploymentSchedule, isPending: updatePending } =\n\t\tuseUpdateDeploymentSchedule();\n\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: DEFAULT_VALUES,\n\t});\n\n\t// Sync form data with scheduleToEdit data\n\tuseEffect(() => {\n\t\tif (scheduleToEdit) {\n\t\t\tconst { active, schedule } = scheduleToEdit;\n\t\t\tif (\"interval\" in schedule) {\n\t\t\t\tconst { interval, anchor_date, timezone } = schedule;\n\t\t\t\tconst { interval_value, interval_time } = parseIntervalToTime(interval);\n\t\t\t\tform.reset({\n\t\t\t\t\tactive,\n\t\t\t\t\tschedule: {\n\t\t\t\t\t\tinterval_value,\n\t\t\t\t\t\tinterval_time,\n\t\t\t\t\t\tanchor_date: anchor_date ? new Date(anchor_date) : new Date(),\n\t\t\t\t\t\ttimezone: timezone ?? \"Etc/UTC\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t}\n\t}, [form, scheduleToEdit]);\n\n\tconst handleSave = (values: FormSchema) => {\n\t\tconst onSettled = () => {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t\tonSubmit();\n\t\t};\n\n\t\tif (scheduleToEdit) {\n\t\t\tupdateDeploymentSchedule(\n\t\t\t\t{\n\t\t\t\t\tdeployment_id,\n\t\t\t\t\tschedule_id: scheduleToEdit.id,\n\t\t\t\t\tactive: values.active,\n\t\t\t\t\tschedule: {\n\t\t\t\t\t\tinterval:\n\t\t\t\t\t\t\tvalues.schedule.interval_value *\n\t\t\t\t\t\t\tINTERVAL_SECONDS[values.schedule.interval_time],\n\t\t\t\t\t\tanchor_date: values.schedule.anchor_date.toISOString(),\n\t\t\t\t\t\ttimezone: values.schedule.timezone,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Deployment schedule updated\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror.message ||\n\t\t\t\t\t\t\t\"Unknown error while updating deployment schedule.\";\n\t\t\t\t\t\tform.setError(\"root\", { message });\n\t\t\t\t\t},\n\t\t\t\t\tonSettled,\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\tcreateDeploymentSchedule(\n\t\t\t\t{\n\t\t\t\t\tdeployment_id,\n\t\t\t\t\tactive: values.active,\n\t\t\t\t\tschedule: {\n\t\t\t\t\t\tinterval:\n\t\t\t\t\t\t\tvalues.schedule.interval_value *\n\t\t\t\t\t\t\tINTERVAL_SECONDS[values.schedule.interval_time],\n\t\t\t\t\t\tanchor_date: values.schedule.anchor_date.toISOString(),\n\t\t\t\t\t\ttimezone: values.schedule.timezone,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Deployment schedule created\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror.message ||\n\t\t\t\t\t\t\t\"Unknown error while creating deployment schedule.\";\n\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tonSettled,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Form {...form}>\n\t\t\t<form\n\t\t\t\tonSubmit={(e) => void form.handleSubmit(handleSave)(e)}\n\t\t\t\tclassName=\"space-y-4\"\n\t\t\t>\n\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"active\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel>Active</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t\t\t\t\tchecked={field.value}\n\t\t\t\t\t\t\t\t\t\tonCheckedChange={field.onChange}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t<div className=\"w-3/4\">\n\t\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\t\tname=\"schedule.interval_value\"\n\t\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t\t<FormLabel>Value</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t\t<Input {...field} />\n\t\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"schedule.interval_time\"\n\t\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\t\t// nb: There's a select bug with shadcn that resets the value to \"\". For now, just have the users re-enter time interval\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t\t<FormLabel>Interval</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\t\t\tonValueChange={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue={field.value}\n\t\t\t\t\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select interval\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t\t\t{INTERVALS.map(({ label, value }) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={value} value={value}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"schedule.anchor_date\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t\t<FormLabel>Anchor date</FormLabel>\n\t\t\t\t\t\t\t\t<Popover>\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-full\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t!field.value && \"text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{formatDate(field.value, \"dateTime\")}\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"Calendar\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-auto size-4 opacity-50\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t\t<PopoverContent className=\"w-auto p-0\" align=\"start\">\n\t\t\t\t\t\t\t\t\t\t<Calendar\n\t\t\t\t\t\t\t\t\t\t\tmode=\"single\"\n\t\t\t\t\t\t\t\t\t\t\tselected={field.value}\n\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t\t\t</Popover>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"schedule.timezone\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel>Timezone</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<TimezoneSelect\n\t\t\t\t\t\t\t\t\t\tselectedValue={field.value}\n\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button type=\"submit\" loading={createPending || updatePending}>\n\t\t\t\t\t\tSave\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</form>\n\t\t</Form>\n\t);\n};\n","import { DialogTrigger } from \"@radix-ui/react-dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { DialogFooter } from \"@/components/ui/dialog\";\n\nexport const RRuleScheduleForm = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<p className=\"text-base\">\n\t\t\t\tSorry, modifying RRule schedules via the UI is currently unsupported;\n\t\t\t\tselect a different schedule type above or modify your schedule in code.\n\t\t\t</p>\n\n\t\t\t<DialogFooter>\n\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t</DialogTrigger>\n\t\t\t\t<Button disabled>Save</Button>\n\t\t\t</DialogFooter>\n\t\t</div>\n\t);\n};\n","import { useEffect, useState } from \"react\";\nimport type { DeploymentSchedule } from \"@/api/deployments\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { CronScheduleForm } from \"./cron-schedule-form\";\nimport { IntervalScheduleForm } from \"./interval-schedule-form\";\nimport { RRuleScheduleForm } from \"./rrule-schedule-form\";\n\ntype ScheduleTypes = \"interval\" | \"cron\" | \"rrule\";\n\ntype DeploymentScheduleDialogProps = {\n\tdeploymentId: string;\n\tonOpenChange: (open: boolean) => void;\n\topen: boolean;\n\tscheduleToEdit?: DeploymentSchedule;\n\tonSubmit: () => void;\n};\n\nexport const DeploymentScheduleDialog = ({\n\tdeploymentId,\n\tonOpenChange,\n\topen,\n\tscheduleToEdit,\n\tonSubmit,\n}: DeploymentScheduleDialogProps) => {\n\tconst [scheduleTab, setScheduleTab] = useState<ScheduleTypes>(\"interval\");\n\n\t// sync tab with scheduleToEdit\n\tuseEffect(() => {\n\t\tif (!scheduleToEdit) {\n\t\t\treturn;\n\t\t}\n\t\tconst { schedule } = scheduleToEdit;\n\t\tif (\"interval\" in schedule) {\n\t\t\tsetScheduleTab(\"interval\");\n\t\t} else if (\"cron\" in schedule) {\n\t\t\tsetScheduleTab(\"cron\");\n\t\t} else {\n\t\t\tsetScheduleTab(\"rrule\");\n\t\t}\n\t}, [scheduleToEdit]);\n\n\tconst SCHEDULE_TAB_OPTIONS = [\n\t\t{\n\t\t\tvalue: \"interval\",\n\t\t\tlabel: \"Interval\",\n\t\t\tComponent: () => (\n\t\t\t\t<IntervalScheduleForm\n\t\t\t\t\tdeployment_id={deploymentId}\n\t\t\t\t\tonSubmit={onSubmit}\n\t\t\t\t\tscheduleToEdit={scheduleToEdit}\n\t\t\t\t/>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tvalue: \"cron\",\n\t\t\tlabel: \"Cron\",\n\t\t\tComponent: () => (\n\t\t\t\t<CronScheduleForm\n\t\t\t\t\tdeployment_id={deploymentId}\n\t\t\t\t\tonSubmit={onSubmit}\n\t\t\t\t\tscheduleToEdit={scheduleToEdit}\n\t\t\t\t/>\n\t\t\t),\n\t\t},\n\t\t{ value: \"rrule\", label: \"RRule\", Component: () => <RRuleScheduleForm /> },\n\t] as const;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent aria-describedby={undefined}>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>{scheduleToEdit ? \"Edit\" : \"Add\"} Schedule</DialogTitle>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<Tabs defaultValue={SCHEDULE_TAB_OPTIONS[0].value} value={scheduleTab}>\n\t\t\t\t\t<TabsList>\n\t\t\t\t\t\t{SCHEDULE_TAB_OPTIONS.map(({ value, label }) => (\n\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\tonClick={() => setScheduleTab(value)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TabsList>\n\t\t\t\t\t{SCHEDULE_TAB_OPTIONS.map(({ value, Component }) => (\n\t\t\t\t\t\t<TabsContent key={value} value={value}>\n\t\t\t\t\t\t\t<Component />\n\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t))}\n\t\t\t\t</Tabs>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import cronstrue from \"cronstrue\";\nimport humanizeDuration from \"humanize-duration\";\nimport { rrulestr } from \"rrule\";\nimport type { DeploymentSchedule } from \"@/api/deployments\";\n\nexport const getScheduleTitle = (deploymentSchedule: DeploymentSchedule) => {\n\tconst { schedule } = deploymentSchedule;\n\tif (\"interval\" in schedule) {\n\t\treturn `Every ${humanizeDuration(schedule.interval * 1_000)}`;\n\t}\n\tif (\"cron\" in schedule) {\n\t\treturn cronstrue.toString(schedule.cron);\n\t}\n\treturn rrulestr(schedule.rrule).toText();\n};\n","import { toast } from \"sonner\";\nimport type { DeploymentSchedule } from \"@/api/deployments\";\nimport { useDeleteDeploymentSchedule } from \"@/api/deployments\";\nimport { useDeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { getScheduleTitle } from \"./get-schedule-title\";\n\nexport const useDeleteSchedule = () => {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\n\tconst { deleteDeploymentSchedule } = useDeleteDeploymentSchedule();\n\n\tconst handleConfirmDelete = (deploymentSchedule: DeploymentSchedule) =>\n\t\tconfirmDelete({\n\t\t\ttitle: \"Delete Schedule\",\n\t\t\tdescription: `Are you sure you want to delete ${getScheduleTitle(deploymentSchedule)} schedule?`,\n\t\t\tonConfirm: () => {\n\t\t\t\tconst { id, deployment_id } = deploymentSchedule;\n\t\t\t\tif (!deployment_id) {\n\t\t\t\t\tthrow new Error(\"'deployment_id' expected\");\n\t\t\t\t}\n\t\t\t\tdeleteDeploymentSchedule(\n\t\t\t\t\t{ deployment_id, schedule_id: id },\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => toast.success(\"Schedule deleted\"),\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while deleting schedule.\";\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\n\treturn [dialogState, handleConfirmDelete] as const;\n};\n","import { toast } from \"sonner\";\nimport type { DeploymentSchedule } from \"@/api/deployments\";\nimport { Button } from \"@/components/ui/button\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { useDeleteSchedule } from \"./use-delete-schedule\";\n\ntype ScheduleActionMenuProps = {\n\tdeploymentSchedule: DeploymentSchedule;\n\tonEditSchedule: (scheduleId: string) => void;\n};\n\nexport const ScheduleActionMenu = ({\n\tdeploymentSchedule,\n\tonEditSchedule,\n}: ScheduleActionMenuProps) => {\n\tconst [dialogState, confirmDelete] = useDeleteSchedule();\n\tconst handleCopyId = (id: string) => {\n\t\tvoid navigator.clipboard.writeText(id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\tconst handleDelete = () => confirmDelete(deploymentSchedule);\n\tconst handleEdit = () => onEditSchedule(deploymentSchedule.id);\n\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem onClick={() => handleCopyId(deploymentSchedule.id)}>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={handleEdit}>Edit</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={handleDelete}>Delete</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n","import { toast } from \"sonner\";\nimport type { DeploymentSchedule } from \"@/api/deployments\";\nimport { useUpdateDeploymentSchedule } from \"@/api/deployments\";\nimport { Switch } from \"@/components/ui/switch\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { getScheduleTitle } from \"./get-schedule-title\";\n\ntype ScheduleToggleSwitchProps = {\n\tdeploymentSchedule: DeploymentSchedule;\n\tdisabled?: boolean;\n};\n\nexport const ScheduleToggleSwitch = ({\n\tdeploymentSchedule,\n\tdisabled,\n}: ScheduleToggleSwitchProps) => {\n\tconst { updateDeploymentSchedule } = useUpdateDeploymentSchedule();\n\n\tconst handleCheckedChanged = (checked: boolean) => {\n\t\tconst { id, deployment_id } = deploymentSchedule;\n\t\tif (!deployment_id) {\n\t\t\tthrow new Error(\"'deployment_id' expected\");\n\t\t}\n\t\tupdateDeploymentSchedule(\n\t\t\t{ schedule_id: id, deployment_id, active: checked },\n\t\t\t{\n\t\t\t\tonSuccess: () =>\n\t\t\t\t\ttoast.success(`Deployment schedule ${checked ? \"active\" : \"paused\"}`),\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message ||\n\t\t\t\t\t\t\"Unknown error while updating deployment schedule.\";\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\taria-label={`toggle ${getScheduleTitle(deploymentSchedule)}`}\n\t\t\t\t\t\t\tchecked={deploymentSchedule.active}\n\t\t\t\t\t\t\tonCheckedChange={handleCheckedChanged}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t{disabled && (\n\t\t\t\t\t<TooltipContent>Pause or resume this schedule</TooltipContent>\n\t\t\t\t)}\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n","import type { DeploymentSchedule } from \"@/api/deployments\";\nimport { Card } from \"@/components/ui/card\";\n\nimport { getScheduleTitle } from \"./get-schedule-title\";\nimport { ScheduleActionMenu } from \"./schedule-action-menu\";\nimport { ScheduleToggleSwitch } from \"./schedule-toggle-switch\";\n\ntype DeploymentScheduleItemProps = {\n\tdeploymentSchedule: DeploymentSchedule;\n\tdisabled: boolean;\n\tonEditSchedule: (scheduleId: string) => void;\n};\n\nexport const DeploymentScheduleItem = ({\n\tdeploymentSchedule,\n\tdisabled,\n\tonEditSchedule,\n}: DeploymentScheduleItemProps) => {\n\treturn (\n\t\t<Card className=\"p-3\">\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<p className=\"text-base\">{getScheduleTitle(deploymentSchedule)}</p>\n\t\t\t\t<div className=\"flex items-baseline gap-2\">\n\t\t\t\t\t<ScheduleToggleSwitch\n\t\t\t\t\t\tdeploymentSchedule={deploymentSchedule}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t/>\n\t\t\t\t\t<ScheduleActionMenu\n\t\t\t\t\t\tdeploymentSchedule={deploymentSchedule}\n\t\t\t\t\t\tonEditSchedule={onEditSchedule}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Card>\n\t);\n};\n","import { toast } from \"sonner\";\nimport { type Deployment, useUpdateDeployment } from \"@/api/deployments\";\nimport { Switch } from \"@/components/ui/switch\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ntype DeploymentScheduleToggleProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentScheduleToggle = ({\n\tdeployment,\n}: DeploymentScheduleToggleProps) => {\n\tconst { updateDeployment } = useUpdateDeployment();\n\n\tconst handleChckedChange = (checked: boolean) => {\n\t\tupdateDeployment(\n\t\t\t{ id: deployment.id, paused: !checked },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(`Deployment ${checked ? \"active\" : \"paused\"}`);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while updating deployment\";\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst isDeploymentDeprecated =\n\t\tdeployment.entrypoint === \"\" || deployment.entrypoint === null;\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\taria-label=\"Pause or resume all schedules\"\n\t\t\t\t\t\t\tdisabled={isDeploymentDeprecated}\n\t\t\t\t\t\t\tonCheckedChange={handleChckedChange}\n\t\t\t\t\t\t\tchecked={!deployment.paused}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>Pause or resume all schedules</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { DeploymentScheduleItem } from \"./deployment-schedule-item\";\nimport { DeploymentScheduleToggle } from \"./deployment-schedule-toggle\";\n\nconst NUM_SCHEDULES_TO_TOGGLE = 3;\n\ntype DeploymentSchedulesProps = {\n\tonAddSchedule: () => void;\n\tonEditSchedule: (scheduleId: string) => void;\n\tdeployment: Deployment;\n};\n\nexport const DeploymentSchedules = ({\n\tdeployment,\n\tonAddSchedule,\n\tonEditSchedule,\n}: DeploymentSchedulesProps) => {\n\t// nb: Need to sort by created, because API re-arranges order per last update\n\tconst deploymentSchedulesSorted = useMemo(() => {\n\t\tif (!deployment.schedules) {\n\t\t\treturn [];\n\t\t}\n\t\treturn deployment.schedules.sort((a, b) => {\n\t\t\tif (!a.created) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (!b.created) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn Date.parse(a.created) - Date.parse(b.created);\n\t\t});\n\t}, [deployment.schedules]);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">Schedules</p>\n\t\t\t\t{(deploymentSchedulesSorted.length > NUM_SCHEDULES_TO_TOGGLE ||\n\t\t\t\t\tdeployment.paused) && (\n\t\t\t\t\t<DeploymentScheduleToggle deployment={deployment} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t{deploymentSchedulesSorted.map((schedule) => (\n\t\t\t\t\t<DeploymentScheduleItem\n\t\t\t\t\t\tkey={schedule.id}\n\t\t\t\t\t\tdisabled={deployment.paused}\n\t\t\t\t\t\tdeploymentSchedule={schedule}\n\t\t\t\t\t\tonEditSchedule={onEditSchedule}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t\t<div>\n\t\t\t\t\t<Button size=\"sm\" onClick={onAddSchedule}>\n\t\t\t\t\t\t<Icon id=\"Plus\" className=\"mr-2 size-4\" /> Schedule\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { Suspense } from \"react\";\nimport type { Automation } from \"@/api/automations\";\nimport { buildListAutomationsRelatedQuery } from \"@/api/automations/automations\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\ntype DeploymentTriggersProps = {\n\tdeployment: Deployment;\n};\n\nexport const DeploymentTriggers = ({ deployment }: DeploymentTriggersProps) => {\n\treturn (\n\t\t<Suspense fallback={<LoadingSkeleton numSkeletons={2} />}>\n\t\t\t<DeploymentTriggersImplementation deployment={deployment} />\n\t\t</Suspense>\n\t);\n};\n\nexport const DeploymentTriggersImplementation = ({\n\tdeployment,\n}: DeploymentTriggersProps) => {\n\tconst { data: automations } = useSuspenseQuery(\n\t\tbuildListAutomationsRelatedQuery(`prefect.deployment.${deployment.id}`),\n\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t<div className=\"text-sm text-muted-foreground\">Triggers</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<RelatedDeployments automations={automations} />\n\t\t\t\t<Link\n\t\t\t\t\tto=\"/automations/create\"\n\t\t\t\t\tsearch={{\n\t\t\t\t\t\tactions: {\n\t\t\t\t\t\t\ttype: \"run-deployment\",\n\t\t\t\t\t\t\tdeploymentId: deployment.id,\n\t\t\t\t\t\t\tparameters: deployment.parameters,\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Button size=\"sm\">\n\t\t\t\t\t\t<Icon id=\"Plus\" className=\"mr-2 size-4\" /> Add\n\t\t\t\t\t</Button>\n\t\t\t\t</Link>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\ntype RelatedDeploymentsProps = {\n\tautomations: Array<Automation>;\n};\nconst RelatedDeployments = ({ automations }: RelatedDeploymentsProps) => {\n\treturn (\n\t\t<ul className=\"flex flex-col gap-1\">\n\t\t\t{automations.map((automation) => (\n\t\t\t\t<li key={automation.id}>\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/automations/automation/$id\"\n\t\t\t\t\t\tparams={{ id: automation.id }}\n\t\t\t\t\t\tclassName=\"flex items-center text-xs\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Bot\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t<div>{automation.name}</div>\n\t\t\t\t\t</Link>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ul>\n\t);\n};\n\ntype LoadingSkeletonProps = {\n\tnumSkeletons?: number;\n};\nconst LoadingSkeleton = ({ numSkeletons = 1 }: LoadingSkeletonProps) => (\n\t<ul className=\"flex flex-col gap-1\">\n\t\t{Array.from({ length: numSkeletons }).map((_, i) => (\n\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: okay for static skeleton list\n\t\t\t<li key={i}>\n\t\t\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t\t</li>\n\t\t))}\n\t</ul>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport type { Deployment } from \"@/api/deployments\";\nimport { useQuickRun } from \"@/components/deployments/use-quick-run\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport type RunFlowButtonProps = {\n\tdeployment: Deployment;\n};\n\nexport const RunFlowButton = ({ deployment }: RunFlowButtonProps) => {\n\tconst { onQuickRun, isPending } = useQuickRun();\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button loading={isPending}>\n\t\t\t\t\tRun <Icon className=\"ml-1 size-4\" id=\"Play\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent>\n\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onQuickRun(deployment.id)}>\n\t\t\t\t\t\tQuick run\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/deployments/deployment/$id/run\"\n\t\t\t\t\t\tparams={{ id: deployment.id }}\n\t\t\t\t\t\tsearch={{ parameters: deployment.parameters }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<DropdownMenuItem>Custom run</DropdownMenuItem>\n\t\t\t\t\t</Link>\n\t\t\t\t</DropdownMenuGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\nimport { DeploymentActionMenu } from \"./deployment-action-menu\";\nimport { DeploymentDetailsHeader } from \"./deployment-details-header\";\nimport { DeploymentDetailsTabs } from \"./deployment-details-tabs\";\nimport { DeploymentLinks } from \"./deployment-links\";\nimport { DeploymentMetadata } from \"./deployment-metadata\";\nimport { DeploymentScheduleDialog } from \"./deployment-schedules/deployment-schedule-dialog\";\nimport { DeploymentSchedules } from \"./deployment-schedules/deployment-schedules\";\nimport { DeploymentTriggers } from \"./deployment-triggers\";\nimport { RunFlowButton } from \"./run-flow-button\";\nimport { useDeleteDeploymentConfirmationDialog } from \"./use-delete-deployment-confirmation-dialog\";\n\ntype DeploymentDetailsPageProps = {\n\tid: string;\n};\n\nexport const DeploymentDetailsPage = ({ id }: DeploymentDetailsPageProps) => {\n\tconst [showScheduleDialog, setShowScheduleDialog] = useState({\n\t\topen: false,\n\t\tscheduleIdToEdit: \"\",\n\t});\n\n\tconst { data: deployment } = useSuspenseQuery(\n\t\tbuildDeploymentDetailsQuery(id),\n\t);\n\n\tconst [deleteConfirmationDialogState, confirmDelete] =\n\t\tuseDeleteDeploymentConfirmationDialog();\n\n\tconst scheduleToEdit = useMemo(() => {\n\t\tif (!deployment.schedules || !showScheduleDialog.scheduleIdToEdit) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn deployment.schedules.find(\n\t\t\t(schedule) => schedule.id === showScheduleDialog.scheduleIdToEdit,\n\t\t);\n\t}, [deployment.schedules, showScheduleDialog.scheduleIdToEdit]);\n\n\tconst handleAddSchedule = () =>\n\t\tsetShowScheduleDialog({ open: true, scheduleIdToEdit: \"\" });\n\tconst handleEditSchedule = (scheduleId: string) =>\n\t\tsetShowScheduleDialog({ open: true, scheduleIdToEdit: scheduleId });\n\tconst closeDialog = () =>\n\t\tsetShowScheduleDialog({ open: false, scheduleIdToEdit: \"\" });\n\tconst handleOpenChange = (open: boolean) => {\n\t\t// nb: Only need to handle when closing the dialog\n\t\tif (!open) {\n\t\t\tcloseDialog();\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div className=\"flex align-middle justify-between\">\n\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t<DeploymentDetailsHeader deployment={deployment} />\n\t\t\t\t\t\t<DeploymentLinks deployment={deployment} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex align-middle gap-2\">\n\t\t\t\t\t\t<RunFlowButton deployment={deployment} />\n\t\t\t\t\t\t<DeploymentActionMenu\n\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\tonDelete={() =>\n\t\t\t\t\t\t\t\tconfirmDelete(deployment, { shouldNavigate: true })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"grid gap-4\" style={{ gridTemplateColumns: \"5fr 1fr\" }}>\n\t\t\t\t\t<div className=\"flex flex-col gap-5\">\n\t\t\t\t\t\t<DeploymentDetailsTabs deployment={deployment} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t<DeploymentSchedules\n\t\t\t\t\t\t\tdeployment={deployment}\n\t\t\t\t\t\t\tonAddSchedule={handleAddSchedule}\n\t\t\t\t\t\t\tonEditSchedule={handleEditSchedule}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DeploymentTriggers deployment={deployment} />\n\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t<DeploymentMetadata deployment={deployment} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DeploymentScheduleDialog\n\t\t\t\tdeploymentId={id}\n\t\t\t\topen={showScheduleDialog.open}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\tscheduleToEdit={scheduleToEdit}\n\t\t\t\tonSubmit={closeDialog}\n\t\t\t/>\n\n\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t</>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListAutomationsRelatedQuery } from \"@/api/automations/automations\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildFLowDetailsQuery } from \"@/api/flows\";\nimport { buildWorkQueueDetailsQuery } from \"@/api/work-queues\";\nimport { DeploymentDetailsPage } from \"@/components/deployments/deployment-details-page\";\nimport {\n\tFLOW_RUN_STATES,\n\tFLOW_RUN_STATES_NO_SCHEDULED,\n\tSORT_FILTERS,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the Deployment Details page\n * @property {\"Runs\" | \"Upcoming\" | \"Parameters\" | \"Configuration\" | \"Description\"} tab used designate which tab view to display\n */\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Runs\", \"Upcoming\", \"Parameters\", \"Configuration\", \"Description\"])\n\t\t.default(\"Runs\"),\n\truns: z\n\t\t.object({\n\t\t\tflowRuns: z\n\t\t\t\t.object({\n\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\tstate: z\n\t\t\t\t\t\t.array(z.enum(FLOW_RUN_STATES))\n\t\t\t\t\t\t.optional()\n\t\t\t\t\t\t.default(FLOW_RUN_STATES_NO_SCHEDULED)\n\t\t\t\t\t\t.catch(FLOW_RUN_STATES_NO_SCHEDULED),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tpage: z.number().int().positive().optional().default(1).catch(1),\n\t\t\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\t\t\tsort: z\n\t\t\t\t.enum(SORT_FILTERS)\n\t\t\t\t.optional()\n\t\t\t\t.default(\"START_TIME_DESC\")\n\t\t\t\t.catch(\"START_TIME_DESC\"),\n\t\t})\n\t\t.optional(),\n\tupcoming: z\n\t\t.object({\n\t\t\tflowRuns: z\n\t\t\t\t.object({\n\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\tstate: z\n\t\t\t\t\t\t.array(z.enum(FLOW_RUN_STATES))\n\t\t\t\t\t\t.optional()\n\t\t\t\t\t\t.default([\"Scheduled\"])\n\t\t\t\t\t\t.catch([\"Scheduled\"]),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tpage: z.number().int().positive().optional().default(1).catch(1),\n\t\t\tlimit: z.number().int().positive().optional().default(5).catch(5),\n\t\t\tsort: z\n\t\t\t\t.enum(SORT_FILTERS)\n\t\t\t\t.optional()\n\t\t\t\t.default(\"START_TIME_ASC\")\n\t\t\t\t.catch(\"START_TIME_ASC\"),\n\t\t})\n\t\t.optional(),\n});\n\nexport type DeploymentDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction DeploymentErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load deployment\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Deployment</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/deployments/deployment/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Critical data\n\t\tconst res = await queryClient.ensureQueryData(\n\t\t\tbuildDeploymentDetailsQuery(params.id),\n\t\t);\n\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListAutomationsRelatedQuery(`prefect.deployment.${params.id}`),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(buildFLowDetailsQuery(res.flow_id));\n\n\t\tif (res.work_pool_name && res.work_queue_name) {\n\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\tbuildWorkQueueDetailsQuery(res.work_pool_name, res.work_queue_name),\n\t\t\t);\n\t\t}\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\n\terrorComponent: DeploymentErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\treturn <DeploymentDetailsPage id={id} />;\n}\n"],"names":["FlowRunsFilters","search","sort","stateFilter","deploymentFilter","workPoolFilter","jsxs","jsx","SearchInput","e","StateFilter","DeploymentFilter","WorkPoolFilter","SortFilter","DeploymentActionMenu","id","onDelete","handleCopyId","_id","toast","DropdownMenu","DropdownMenuTrigger","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","Link","DeploymentDetailsHeader","deployment","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","DeploymentConfiguration","jobVariablesDisplay","pullStepsDisplay","JsonInput","DeploymentDescription","LazyMarkdown","useFilterFlowRunswithFlows","filter","flowRunsData","flowRunsError","useQuery","buildFilterFlowRunsQuery","flowIds","useMemo","flowRun","flows","flowsError","buildListFlowsQuery","flowMap","flow","usePaginateFlowRunswithFlows","paginateFlowRunsData","paginateFlowRunsError","buildPaginateFlowRunsQuery","routeApi","getRouteApi","DeploymentDetailsRunsTab","selectedRows","setSelectedRows","clearSet","onSelectRow","useFlowRunsSelectedRows","pagination","onChangePagination","usePagination","setSearch","useSearch","setSort","useSort","setFilter","useFilter","resetFilters","useResetFilters","data","dataWithDeployment","handleResetFilters","nextRun","useGetNextRun","FlowRunCard","FlowRunsRowCount","FlowRunsList","FlowRunsPagination","runs","navigate","useCallback","prev","onSearch","value","onSort","onFilter","FLOW_RUN_STATES_NO_SCHEDULED","DeploymentDetailsUpcomingTab","upcoming","columnHelper","createColumnHelper","columns","useDeploymentParametersToTable","parameterOpenApiSchema","parameters","b","key","parameter","DeploymentParametersTable","useState","deferredSearch","useDeferredValue","filteredData","table","useReactTable","getCoreRowModel","getPaginationRowModel","pluralize","DataTable","DeploymentDetailsTabs","tab","tabOptions","useBuildTabOptions","Tabs","TabsList","LinkComponent","ViewComponent","TabsTrigger","TabsContent","None","FieldLabel","children","FieldValue","className","cn","DeploymentMetadata","TOP_FIELDS","StatusBadge","BOTTOM_FIELDS","TagBadgeGroup","field","ComponentValue","verifyCronValue","cronValue","description","isCronValid","CronExpressionParser","cronstrue","CronInput","onChange","props","setDescription","setIsCronValid","handleChange","event","Input","clsx","formSchema","z.object","z.boolean","z.string","DEFAULT_VALUES","CronScheduleForm","deployment_id","scheduleToEdit","onSubmit","createDeploymentSchedule","createPending","useCreateDeploymentSchedule","updateDeploymentSchedule","updatePending","useUpdateDeploymentSchedule","form","useForm","zodResolver","useEffect","active","schedule","cron","day_or","timezone","handleSave","values","onSettled","error","message","Form","FormMessage","FormField","FormItem","FormLabel","FormControl","Switch","DayOrDialog","TimezoneSelect","DialogFooter","DialogTrigger","Dialog","DialogContent","DialogHeader","DialogTitle","INTERVALS","INTERVAL_SECONDS","parseIntervalToTime","interval","remainingSeconds","days","hours","minutes","z.number","z.coerce","z.enum","z.date","IntervalScheduleForm","anchor_date","interval_value","interval_time","Select","SelectTrigger","SelectValue","SelectContent","label","SelectItem","Popover","PopoverTrigger","formatDate","PopoverContent","Calendar","RRuleScheduleForm","DeploymentScheduleDialog","deploymentId","onOpenChange","open","scheduleTab","setScheduleTab","SCHEDULE_TAB_OPTIONS","Component","getScheduleTitle","deploymentSchedule","humanizeDuration","rrulestr","useDeleteSchedule","dialogState","confirmDelete","useDeleteConfirmationDialog","deleteDeploymentSchedule","useDeleteDeploymentSchedule","ScheduleActionMenu","onEditSchedule","handleDelete","handleEdit","Fragment","DeleteConfirmationDialog","ScheduleToggleSwitch","disabled","handleCheckedChanged","checked","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","DeploymentScheduleItem","Card","DeploymentScheduleToggle","updateDeployment","useUpdateDeployment","handleChckedChange","isDeploymentDeprecated","NUM_SCHEDULES_TO_TOGGLE","DeploymentSchedules","onAddSchedule","deploymentSchedulesSorted","a","DeploymentTriggers","Suspense","LoadingSkeleton","DeploymentTriggersImplementation","automations","useSuspenseQuery","buildListAutomationsRelatedQuery","RelatedDeployments","automation","numSkeletons","_","i","Skeleton","RunFlowButton","onQuickRun","isPending","useQuickRun","DropdownMenuGroup","DeploymentDetailsPage","showScheduleDialog","setShowScheduleDialog","buildDeploymentDetailsQuery","deleteConfirmationDialogState","useDeleteDeploymentConfirmationDialog","handleAddSchedule","handleEditSchedule","scheduleId","closeDialog","handleOpenChange","DeploymentLinks","z","default","flowRuns","name","string","optional","state","FLOW_RUN_STATES","catch","page","number","int","positive","limit","SORT_FILTERS","RouteComponent","Route","useParams"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{s as m,j as o}from"./vendor-tanstack-BdLtprmr.js";import{ct as r,dO as p}from"./index-CPpeVt8m.js";import{D as i}from"./deployment-action-header-DwuMPgVg.js";import{D as s}from"./deployment-form-BpKkzEf2.js";import"./vendor-react-HBv6Kpyp.js";import"./vendor-radix-CJc458uP.js";import"./vendor-recharts-CY3PKigC.js";import"./vendor-forms-BlFSCfFw.js";import"./vendor-date-Cl1Jav-N.js";import"./schema-form-input-string-format-datetime-Dg3zVAp5.js";import"./zod-B1GLD-Zc.js";import"./use-debounce-callback-Dk7Ebi48.js";import"./toggle-group-EMgSOoYH.js";import"./timezone-select-NViFNNLz.js";import"./dropdown-menu-fRiq5bS-.js";import"./form-Cl5Hk9bq.js";import"./tags-input-DqZ8v99z.js";const n=({id:t})=>{const{data:e}=m(r(t));return o.jsxs("div",{className:"flex flex-col gap-4",children:[o.jsx(i,{deployment:e,action:"Duplicate"}),o.jsx(s,{deployment:e,mode:"duplicate"})]})};function A(){const{id:t}=p.useParams();return o.jsx(n,{id:t})}export{A as component};
2
+ //# sourceMappingURL=deployment_._id.duplicate-BPk2SchT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment_._id.duplicate-BPk2SchT.js","sources":["../../src/components/deployments/deployment-duplicate-page.tsx","../../src/routes/deployments/deployment_.$id.duplicate.tsx?tsr-split=component"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport { DeploymentActionHeader } from \"./deployment-action-header\";\nimport { DeploymentForm } from \"./deployment-form\";\n\ntype DeploymentDuplicatePageProps = {\n\tid: string;\n};\n\nexport const DeploymentDuplicatePage = ({\n\tid,\n}: DeploymentDuplicatePageProps) => {\n\tconst { data } = useSuspenseQuery(buildDeploymentDetailsQuery(id));\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<DeploymentActionHeader deployment={data} action=\"Duplicate\" />\n\t\t\t<DeploymentForm deployment={data} mode=\"duplicate\" />\n\t\t</div>\n\t);\n};\n","import { createFileRoute } from \"@tanstack/react-router\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport { DeploymentDuplicatePage } from \"@/components/deployments/deployment-duplicate-page\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\n\nexport const Route = createFileRoute(\"/deployments/deployment_/$id/duplicate\")({\n\tcomponent: RouteComponent,\n\tloader: ({ params, context: { queryClient } }) =>\n\t\tqueryClient.ensureQueryData(buildDeploymentDetailsQuery(params.id)),\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\treturn <DeploymentDuplicatePage id={id} />;\n}\n"],"names":["DeploymentDuplicatePage","id","data","useSuspenseQuery","buildDeploymentDetailsQuery","jsxs","jsx","DeploymentActionHeader","DeploymentForm","RouteComponent","Route","useParams"],"mappings":"srBASO,MAAMA,EAA0B,CAAC,CACvC,GAAAC,CACD,IAAoC,CACnC,KAAM,CAAE,KAAAC,CAAA,EAASC,EAAiBC,EAA4BH,CAAE,CAAC,EAEjE,OACCI,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAuB,WAAYL,EAAM,OAAO,YAAY,EAC7DI,EAAAA,IAACE,EAAA,CAAe,WAAYN,EAAM,KAAK,WAAA,CAAY,CAAA,EACpD,CAEF,ECPA,SAASO,GAAiB,CACzB,KAAM,CAAER,GAAAA,CAAAA,EAAOS,EAAMC,UAAAA,EACrB,OAAOL,MAACN,GAAwB,GAAAC,EAAO,CACxC"}