prefect 3.6.13__py3-none-any.whl → 3.6.13.dev2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/_internal/compatibility/blocks.py +0 -18
  3. prefect/client/schemas/filters.py +0 -24
  4. prefect/flow_engine.py +10 -192
  5. prefect/flows.py +2 -61
  6. prefect/results.py +21 -262
  7. prefect/runner/runner.py +82 -29
  8. prefect/runner/storage.py +2 -3
  9. prefect/server/schemas/filters.py +0 -45
  10. prefect/server/ui-v2/assets/{artifact-card-CUEaRDGw.js → artifact-card-C8JEQRHl.js} +2 -2
  11. prefect/server/ui-v2/assets/{artifact-card-CUEaRDGw.js.map → artifact-card-C8JEQRHl.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{artifact._id-Ca6VCUS0.js → artifact._id-67V8kTg9.js} +2 -2
  13. prefect/server/ui-v2/assets/{artifact._id-Ca6VCUS0.js.map → artifact._id-67V8kTg9.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automation-wizard-z26pICBl.js → automation-wizard-DuxZ47Nn.js} +2 -2
  15. prefect/server/ui-v2/assets/{automation-wizard-z26pICBl.js.map → automation-wizard-DuxZ47Nn.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{automation._id-DuodjY5t.js → automation._id-D8S8r4Ji.js} +2 -2
  17. prefect/server/ui-v2/assets/{automation._id-DuodjY5t.js.map → automation._id-D8S8r4Ji.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{automation_._id.edit-CcuJhc-y.js → automation_._id.edit-C1fOM0Hx.js} +2 -2
  19. prefect/server/ui-v2/assets/{automation_._id.edit-CcuJhc-y.js.map → automation_._id.edit-C1fOM0Hx.js.map} +1 -1
  20. prefect/server/ui-v2/assets/{automations-header-CgOWwuc6.js → automations-header-DrijTNGi.js} +2 -2
  21. prefect/server/ui-v2/assets/{automations-header-CgOWwuc6.js.map → automations-header-DrijTNGi.js.map} +1 -1
  22. prefect/server/ui-v2/assets/{base-job-template-form-section-DN9HyjM5.js → base-job-template-form-section-BDkqOkpe.js} +2 -2
  23. prefect/server/ui-v2/assets/{base-job-template-form-section-DN9HyjM5.js.map → base-job-template-form-section-BDkqOkpe.js.map} +1 -1
  24. prefect/server/ui-v2/assets/{block-type-details-rrToxL5r.js → block-type-details-CrFHWH5D.js} +2 -2
  25. prefect/server/ui-v2/assets/{block-type-details-rrToxL5r.js.map → block-type-details-CrFHWH5D.js.map} +1 -1
  26. prefect/server/ui-v2/assets/block-type-logo-WQNm0PzP.js +2 -0
  27. prefect/server/ui-v2/assets/{block-type-logo-DURScH8H.js.map → block-type-logo-WQNm0PzP.js.map} +1 -1
  28. prefect/server/ui-v2/assets/{block._id-Bue6lnrN.js → block._id-C3gN1Ae8.js} +2 -2
  29. prefect/server/ui-v2/assets/{block._id-Bue6lnrN.js.map → block._id-C3gN1Ae8.js.map} +1 -1
  30. prefect/server/ui-v2/assets/{block_._id.edit-QY0OzN_b.js → block_._id.edit-DzPuSvat.js} +2 -2
  31. prefect/server/ui-v2/assets/{block_._id.edit-QY0OzN_b.js.map → block_._id.edit-DzPuSvat.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{catalog-CGjRGWv6.js → catalog-T-7MqsyE.js} +2 -2
  33. prefect/server/ui-v2/assets/{catalog-CGjRGWv6.js.map → catalog-T-7MqsyE.js.map} +1 -1
  34. prefect/server/ui-v2/assets/{catalog_._slug-BMFNZhEb.js → catalog_._slug-DMOI61fc.js} +2 -2
  35. prefect/server/ui-v2/assets/{catalog_._slug-BMFNZhEb.js.map → catalog_._slug-DMOI61fc.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{catalog_._slug_.create-CuFA3kUC.js → catalog_._slug_.create-l9bGUPi-.js} +2 -2
  37. prefect/server/ui-v2/assets/{catalog_._slug_.create-CuFA3kUC.js.map → catalog_._slug_.create-l9bGUPi-.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{collapsible-Ell2FjrX.js → collapsible-DM-Ze5-Y.js} +2 -2
  39. prefect/server/ui-v2/assets/{collapsible-Ell2FjrX.js.map → collapsible-DM-Ze5-Y.js.map} +1 -1
  40. prefect/server/ui-v2/assets/{concurrency-limit._id-Rr1ysUct.js → concurrency-limit._id-BHEt9viF.js} +2 -2
  41. prefect/server/ui-v2/assets/{concurrency-limit._id-Rr1ysUct.js.map → concurrency-limit._id-BHEt9viF.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{create-ewA3uq_h.js → create-BMxUOyN5.js} +2 -2
  43. prefect/server/ui-v2/assets/{create-ewA3uq_h.js.map → create-BMxUOyN5.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{create-CQK8-uO1.js → create-Cq-EAHVk.js} +2 -2
  45. prefect/server/ui-v2/assets/{create-CQK8-uO1.js.map → create-Cq-EAHVk.js.map} +1 -1
  46. prefect/server/ui-v2/assets/{data-table-Bx1uYX_M.js → data-table-Bw8TZx9D.js} +2 -2
  47. prefect/server/ui-v2/assets/{data-table-Bx1uYX_M.js.map → data-table-Bw8TZx9D.js.map} +1 -1
  48. prefect/server/ui-v2/assets/{delete-confirmation-dialog-CqKsUEj_.js → delete-confirmation-dialog-CTdWZlGM.js} +2 -2
  49. prefect/server/ui-v2/assets/{delete-confirmation-dialog-CqKsUEj_.js.map → delete-confirmation-dialog-CTdWZlGM.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment-action-header-Bz5COdER.js → deployment-action-header-BObYqmI_.js} +2 -2
  51. prefect/server/ui-v2/assets/{deployment-action-header-Bz5COdER.js.map → deployment-action-header-BObYqmI_.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment-form-CrlZlNoj.js → deployment-form-CntyhRrK.js} +3 -3
  53. prefect/server/ui-v2/assets/{deployment-form-CrlZlNoj.js.map → deployment-form-CntyhRrK.js.map} +1 -1
  54. prefect/server/ui-v2/assets/{deployment-links-D9ZR_vmp.js → deployment-links-DBUSCaxB.js} +2 -2
  55. prefect/server/ui-v2/assets/{deployment-links-D9ZR_vmp.js.map → deployment-links-DBUSCaxB.js.map} +1 -1
  56. prefect/server/ui-v2/assets/{deployment._id-DvHhx-qN.js → deployment._id-BXanVFA8.js} +2 -2
  57. prefect/server/ui-v2/assets/{deployment._id-DvHhx-qN.js.map → deployment._id-BXanVFA8.js.map} +1 -1
  58. prefect/server/ui-v2/assets/{deployment._id-BV0rSqba.js → deployment._id-Q5cvHMX9.js} +2 -2
  59. prefect/server/ui-v2/assets/{deployment._id-BV0rSqba.js.map → deployment._id-Q5cvHMX9.js.map} +1 -1
  60. prefect/server/ui-v2/assets/deployment_._id.duplicate-DB-4hHHc.js +2 -0
  61. prefect/server/ui-v2/assets/{deployment_._id.duplicate-BrEOenqP.js.map → deployment_._id.duplicate-DB-4hHHc.js.map} +1 -1
  62. prefect/server/ui-v2/assets/deployment_._id.edit-CWf1RIGy.js +2 -0
  63. prefect/server/ui-v2/assets/{deployment_._id.edit-BbYKPK42.js.map → deployment_._id.edit-CWf1RIGy.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{deployment_._id.run-Dv7S_MJR.js → deployment_._id.run-CoHGXFoM.js} +2 -2
  65. prefect/server/ui-v2/assets/{deployment_._id.run-Dv7S_MJR.js.map → deployment_._id.run-CoHGXFoM.js.map} +1 -1
  66. prefect/server/ui-v2/assets/{dropdown-menu-e0Fqb6aw.js → dropdown-menu-CT-s-V7d.js} +2 -2
  67. prefect/server/ui-v2/assets/{dropdown-menu-e0Fqb6aw.js.map → dropdown-menu-CT-s-V7d.js.map} +1 -1
  68. prefect/server/ui-v2/assets/{event._eventDate._eventId-Cp4UmGqq.js → event._eventDate._eventId-BITo_GYL.js} +2 -2
  69. prefect/server/ui-v2/assets/{event._eventDate._eventId-Cp4UmGqq.js.map → event._eventDate._eventId-BITo_GYL.js.map} +1 -1
  70. prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js +2 -0
  71. prefect/server/ui-v2/assets/{flow-run-graph-BrqoR3E2.js.map → flow-run-graph-DxIl6fzW.js.map} +1 -1
  72. prefect/server/ui-v2/assets/{flow-run._id-BOp38Pbq.js → flow-run._id-Bbm9OpDi.js} +2 -2
  73. prefect/server/ui-v2/assets/{flow-run._id-BOp38Pbq.js.map → flow-run._id-Bbm9OpDi.js.map} +1 -1
  74. prefect/server/ui-v2/assets/{flow-run._id-DJnTDEN_.js → flow-run._id-BtSgRDtA.js} +2 -2
  75. prefect/server/ui-v2/assets/{flow-run._id-DJnTDEN_.js.map → flow-run._id-BtSgRDtA.js.map} +1 -1
  76. prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js +4 -0
  77. prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js.map +1 -0
  78. prefect/server/ui-v2/assets/{flow-runs-pagination-Bq2ZUzM6.js → flow-runs-pagination-LrU9Aio8.js} +2 -2
  79. prefect/server/ui-v2/assets/{flow-runs-pagination-Bq2ZUzM6.js.map → flow-runs-pagination-LrU9Aio8.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{flow._id-eCBL95rg.js → flow._id-BJBRokk4.js} +2 -2
  81. prefect/server/ui-v2/assets/{flow._id-eCBL95rg.js.map → flow._id-BJBRokk4.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{form-DNerk3LS.js → form-CVSlEnl8.js} +2 -2
  83. prefect/server/ui-v2/assets/{form-DNerk3LS.js.map → form-CVSlEnl8.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-DwagHBlF.js → header-4plZZheZ.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-DwagHBlF.js.map → header-4plZZheZ.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{header-huSvwxKI.js → header-9rXZ4r39.js} +2 -2
  87. prefect/server/ui-v2/assets/{header-huSvwxKI.js.map → header-9rXZ4r39.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{header-B0ejRncu.js → header-D3uM8_xM.js} +2 -2
  89. prefect/server/ui-v2/assets/{header-B0ejRncu.js.map → header-D3uM8_xM.js.map} +1 -1
  90. prefect/server/ui-v2/assets/{index-DI2DC5gd.js → index-6OsEYhIi.js} +2 -2
  91. prefect/server/ui-v2/assets/{index-DI2DC5gd.js.map → index-6OsEYhIi.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-BzN9bQeM.js → index-B7xsJ-QH.js} +2 -2
  93. prefect/server/ui-v2/assets/{index-BzN9bQeM.js.map → index-B7xsJ-QH.js.map} +1 -1
  94. prefect/server/ui-v2/assets/{index-CnIJUujl.js → index-BeoNC2tJ.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-CnIJUujl.js.map → index-BeoNC2tJ.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-CTnoa3Ho.js → index-BfJLUM7N.js} +2 -2
  97. prefect/server/ui-v2/assets/{index-CTnoa3Ho.js.map → index-BfJLUM7N.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{index-CWkbSdxY.js → index-Bj0OOguP.js} +2 -2
  99. prefect/server/ui-v2/assets/{index-CWkbSdxY.js.map → index-Bj0OOguP.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{index-CBhi1P9g.js → index-BlpD74iH.js} +2 -2
  101. prefect/server/ui-v2/assets/{index-CBhi1P9g.js.map → index-BlpD74iH.js.map} +1 -1
  102. prefect/server/ui-v2/assets/{index-D5RdrxkU.js → index-BvSl3DKP.js} +8 -8
  103. prefect/server/ui-v2/assets/index-BvSl3DKP.js.map +1 -0
  104. prefect/server/ui-v2/assets/{index-BU4yZRd3.js → index-CDwJvjUM.js} +2 -2
  105. prefect/server/ui-v2/assets/{index-BU4yZRd3.js.map → index-CDwJvjUM.js.map} +1 -1
  106. prefect/server/ui-v2/assets/{index-CRDz4nhM.js → index-CDyLkbVG.js} +2 -2
  107. prefect/server/ui-v2/assets/{index-CRDz4nhM.js.map → index-CDyLkbVG.js.map} +1 -1
  108. prefect/server/ui-v2/assets/{index-Cutg_A1j.js → index-ChIrfjIW.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-Cutg_A1j.js.map → index-ChIrfjIW.js.map} +1 -1
  110. prefect/server/ui-v2/assets/{index-BhALpenO.js → index-CzCSgCK-.js} +2 -2
  111. prefect/server/ui-v2/assets/{index-BhALpenO.js.map → index-CzCSgCK-.js.map} +1 -1
  112. prefect/server/ui-v2/assets/{index-Dg_duvDx.js → index-D5v9S-lB.js} +2 -2
  113. prefect/server/ui-v2/assets/{index-Dg_duvDx.js.map → index-D5v9S-lB.js.map} +1 -1
  114. prefect/server/ui-v2/assets/{index-DDiyFpIV.js → index-D6GJ4go1.js} +2 -2
  115. prefect/server/ui-v2/assets/{index-DDiyFpIV.js.map → index-D6GJ4go1.js.map} +1 -1
  116. prefect/server/ui-v2/assets/{index-dSUEBAqg.js → index-DJyKqsFO.js} +2 -2
  117. prefect/server/ui-v2/assets/{index-dSUEBAqg.js.map → index-DJyKqsFO.js.map} +1 -1
  118. prefect/server/ui-v2/assets/{index-BO3SOwdV.js → index-DODEq1Pi.js} +2 -2
  119. prefect/server/ui-v2/assets/{index-BO3SOwdV.js.map → index-DODEq1Pi.js.map} +1 -1
  120. prefect/server/ui-v2/assets/{index-Dspw5HFj.js → index-DicK6p3K.js} +2 -2
  121. prefect/server/ui-v2/assets/{index-Dspw5HFj.js.map → index-DicK6p3K.js.map} +1 -1
  122. prefect/server/ui-v2/assets/{index-VOOLxiSE.js → index-DqCPbST9.js} +2 -2
  123. prefect/server/ui-v2/assets/{index-VOOLxiSE.js.map → index-DqCPbST9.js.map} +1 -1
  124. prefect/server/ui-v2/assets/{index-BTPE3vs7.js → index-DxPoKag8.js} +2 -2
  125. prefect/server/ui-v2/assets/{index-BTPE3vs7.js.map → index-DxPoKag8.js.map} +1 -1
  126. prefect/server/ui-v2/assets/{index-Wfs7Cjew.js → index-h9-QgNjZ.js} +2 -2
  127. prefect/server/ui-v2/assets/{index-Wfs7Cjew.js.map → index-h9-QgNjZ.js.map} +1 -1
  128. prefect/server/ui-v2/assets/{index-uvH5a3zO.js → index-tBdv6kBF.js} +2 -2
  129. prefect/server/ui-v2/assets/{index-uvH5a3zO.js.map → index-tBdv6kBF.js.map} +1 -1
  130. prefect/server/ui-v2/assets/{index-CgOsOj5t.js → index-udb79rgq.js} +2 -2
  131. prefect/server/ui-v2/assets/{index-CgOsOj5t.js.map → index-udb79rgq.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{json-input-gXz7BuJj.js → json-input-Dt1icmrn.js} +2 -2
  133. prefect/server/ui-v2/assets/{json-input-gXz7BuJj.js.map → json-input-Dt1icmrn.js.map} +1 -1
  134. prefect/server/ui-v2/assets/{key._key-CJPbLXwU.js → key._key-Cyh5MBX_.js} +2 -2
  135. prefect/server/ui-v2/assets/{key._key-CJPbLXwU.js.map → key._key-Cyh5MBX_.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{lazy-markdown-wPid80zf.js → lazy-markdown-BwIwKFRF.js} +2 -2
  137. prefect/server/ui-v2/assets/{lazy-markdown-wPid80zf.js.map → lazy-markdown-BwIwKFRF.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{login-DC63bGXK.js → login-DKXFVSwk.js} +2 -2
  139. prefect/server/ui-v2/assets/{login-DC63bGXK.js.map → login-DKXFVSwk.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{markdown-input-BhqrU6Eo.js → markdown-input-Dp0mBlkV.js} +2 -2
  141. prefect/server/ui-v2/assets/{markdown-input-BhqrU6Eo.js.map → markdown-input-Dp0mBlkV.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{python-example-snippet-3jtXWQZN.js → python-example-snippet-BYwPjHI5.js} +3 -3
  143. prefect/server/ui-v2/assets/{python-example-snippet-3jtXWQZN.js.map → python-example-snippet-BYwPjHI5.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{python-input-ZVi-v324.js → python-input-y26XMqXw.js} +2 -2
  145. prefect/server/ui-v2/assets/{python-input-ZVi-v324.js.map → python-input-y26XMqXw.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{radio-group-BBMLpHGc.js → radio-group-D0van45v.js} +2 -2
  147. prefect/server/ui-v2/assets/{radio-group-BBMLpHGc.js.map → radio-group-D0van45v.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{route-error-state-BJXl8qkX.js → route-error-state-CGGpuCGN.js} +2 -2
  149. prefect/server/ui-v2/assets/{route-error-state-BJXl8qkX.js.map → route-error-state-CGGpuCGN.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{schema-form-BEqYjsM-.js → schema-form-2tg5SXM4.js} +2 -2
  151. prefect/server/ui-v2/assets/{schema-form-BEqYjsM-.js.map → schema-form-2tg5SXM4.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-l3xt3PWf.js → schema-form-input-string-format-datetime-CZt6AJ4z.js} +4 -4
  153. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-l3xt3PWf.js.map → schema-form-input-string-format-datetime-CZt6AJ4z.js.map} +1 -1
  154. prefect/server/ui-v2/assets/{settings-txD0dR5Q.js → settings-DDUadk_N.js} +2 -2
  155. prefect/server/ui-v2/assets/{settings-txD0dR5Q.js.map → settings-DDUadk_N.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{sort-filter-DHPFdKZ2.js → sort-filter-D9p3cPx9.js} +2 -2
  157. prefect/server/ui-v2/assets/{sort-filter-DHPFdKZ2.js.map → sort-filter-D9p3cPx9.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{table-ULfpXJXB.js → table-vo9Do8sA.js} +2 -2
  159. prefect/server/ui-v2/assets/{table-ULfpXJXB.js.map → table-vo9Do8sA.js.map} +1 -1
  160. prefect/server/ui-v2/assets/{tags-input-BLzMOTDb.js → tags-input-Ci2JQ-k3.js} +2 -2
  161. prefect/server/ui-v2/assets/{tags-input-BLzMOTDb.js.map → tags-input-Ci2JQ-k3.js.map} +1 -1
  162. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-BpeKHk7g.js → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js} +2 -2
  163. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-BpeKHk7g.js.map → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js.map} +1 -1
  164. prefect/server/ui-v2/assets/{task-run._id-CkOl9MJs.js → task-run._id-CjevSs79.js} +2 -2
  165. prefect/server/ui-v2/assets/{task-run._id-CkOl9MJs.js.map → task-run._id-CjevSs79.js.map} +1 -1
  166. prefect/server/ui-v2/assets/{task-run._id-udkz1lhh.js → task-run._id-D8QKG5UZ.js} +2 -2
  167. prefect/server/ui-v2/assets/{task-run._id-udkz1lhh.js.map → task-run._id-D8QKG5UZ.js.map} +1 -1
  168. prefect/server/ui-v2/assets/{task-runs-pagination-B7D5K_FM.js → task-runs-pagination-CifoSGct.js} +2 -2
  169. prefect/server/ui-v2/assets/{task-runs-pagination-B7D5K_FM.js.map → task-runs-pagination-CifoSGct.js.map} +1 -1
  170. prefect/server/ui-v2/assets/{textarea-C4bdj7Jk.js → textarea-BAtfAxtV.js} +2 -2
  171. prefect/server/ui-v2/assets/{textarea-C4bdj7Jk.js.map → textarea-BAtfAxtV.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{timezone-select-AdlSRQxZ.js → timezone-select-QlQTZSsF.js} +2 -2
  173. prefect/server/ui-v2/assets/{timezone-select-AdlSRQxZ.js.map → timezone-select-QlQTZSsF.js.map} +1 -1
  174. prefect/server/ui-v2/assets/{toggle-group-C-vxYz4l.js → toggle-group-BJN1vjEh.js} +2 -2
  175. prefect/server/ui-v2/assets/{toggle-group-C-vxYz4l.js.map → toggle-group-BJN1vjEh.js.map} +1 -1
  176. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Cqhaqtqe.js → use-delete-automation-confirmation-dialog-eOWJYPkD.js} +2 -2
  177. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Cqhaqtqe.js.map → use-delete-automation-confirmation-dialog-eOWJYPkD.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-GjNhFxZe.js → use-delete-block-document-confirmation-dialog-BTwSeHRM.js} +2 -2
  179. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-GjNhFxZe.js.map → use-delete-block-document-confirmation-dialog-BTwSeHRM.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DfwmswyR.js → use-flow-runs-selected-rows-BL_Gv9CC.js} +2 -2
  181. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DfwmswyR.js.map → use-flow-runs-selected-rows-BL_Gv9CC.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BEBpG_5J.js → use-get-artifacts-flow-task-runs-TSCoomjQ.js} +2 -2
  183. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BEBpG_5J.js.map → use-get-artifacts-flow-task-runs-TSCoomjQ.js.map} +1 -1
  184. prefect/server/ui-v2/assets/{use-quick-run-BYBRcDwC.js → use-quick-run-BMnCkwSv.js} +2 -2
  185. prefect/server/ui-v2/assets/{use-quick-run-BYBRcDwC.js.map → use-quick-run-BMnCkwSv.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{use-stepper-Bk97vOTm.js → use-stepper-C1wm66U2.js} +2 -2
  187. prefect/server/ui-v2/assets/{use-stepper-Bk97vOTm.js.map → use-stepper-C1wm66U2.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{utilities-BQwGFLk5.js → utilities-DxRXxFOF.js} +2 -2
  189. prefect/server/ui-v2/assets/{utilities-BQwGFLk5.js.map → utilities-DxRXxFOF.js.map} +1 -1
  190. prefect/server/ui-v2/assets/{work-pool-filter-Ddhp_M-L.js → work-pool-filter-PudrkZYj.js} +2 -2
  191. prefect/server/ui-v2/assets/{work-pool-filter-Ddhp_M-L.js.map → work-pool-filter-PudrkZYj.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{work-pool-queue-toggle-DX3eV3R_.js → work-pool-queue-toggle-BAOrV_0R.js} +2 -2
  193. prefect/server/ui-v2/assets/{work-pool-queue-toggle-DX3eV3R_.js.map → work-pool-queue-toggle-BAOrV_0R.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{work-pool._workPoolName-BaRIsXBX.js → work-pool._workPoolName-BOM3849e.js} +2 -2
  195. prefect/server/ui-v2/assets/{work-pool._workPoolName-BaRIsXBX.js.map → work-pool._workPoolName-BOM3849e.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-dhS_Xz32.js → work-pool_._workPoolName.edit-CIhcG6yr.js} +2 -2
  197. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-dhS_Xz32.js.map → work-pool_._workPoolName.edit-CIhcG6yr.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js} +2 -2
  199. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js.map → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js.map} +1 -1
  200. prefect/server/ui-v2/assets/{work-queue-icon-text-_Ez8e2dw.js → work-queue-icon-text-CP4yX3uM.js} +2 -2
  201. prefect/server/ui-v2/assets/{work-queue-icon-text-_Ez8e2dw.js.map → work-queue-icon-text-CP4yX3uM.js.map} +1 -1
  202. prefect/server/ui-v2/index.html +1 -1
  203. prefect/settings/models/flows.py +1 -14
  204. prefect/settings/models/runner.py +6 -16
  205. prefect/task_engine.py +3 -1
  206. prefect/task_worker.py +1 -1
  207. prefect/tasks.py +2 -2
  208. prefect/testing/fixtures.py +5 -23
  209. {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/METADATA +1 -1
  210. {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/RECORD +213 -213
  211. prefect/server/ui-v2/assets/block-type-logo-DURScH8H.js +0 -2
  212. prefect/server/ui-v2/assets/deployment_._id.duplicate-BrEOenqP.js +0 -2
  213. prefect/server/ui-v2/assets/deployment_._id.edit-BbYKPK42.js +0 -2
  214. prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js +0 -2
  215. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js +0 -4
  216. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js.map +0 -1
  217. prefect/server/ui-v2/assets/index-D5RdrxkU.js.map +0 -1
  218. {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/WHEEL +0 -0
  219. {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/entry_points.txt +0 -0
  220. {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"automation-wizard-z26pICBl.js","sources":["../../src/components/automations/automations-wizard/actions-step/action-type-select.tsx","../../src/components/automations/automations-wizard/actions-step/change-flow-run-fields.tsx","../../src/components/automations/automations-wizard/actions-step/flow-run-action-description.tsx","../../src/components/automations/automations-wizard/actions-step/loading-select-state.tsx","../../src/components/automations/automations-wizard/actions-step/select-automations-fields.tsx","../../src/api/deployments/use-list-deployments-with-flows/use-list-deployments-with-flows.ts","../../src/components/automations/automations-wizard/actions-step/select-deployments-fields.tsx","../../src/components/automations/automations-wizard/actions-step/select-work-pools-fields.tsx","../../src/components/automations/automations-wizard/actions-step/select-work-queues-fields.tsx","../../src/components/automations/automations-wizard/actions-step/send-notification-fields.tsx","../../src/components/automations/automations-wizard/actions-step/action-step.tsx","../../src/components/automations/automations-wizard/actions-step/actions-step.tsx","../../src/components/automations/automations-wizard/details-step/details-step.tsx","../../src/components/automations/automations-wizard/trigger-step/custom-posture-select/index.tsx","../../src/components/ui/duration-input/index.tsx","../../src/components/automations/automations-wizard/trigger-step/event-resource-combobox/event-resource-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/events-combobox/events-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/custom-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/automation-deployment-combobox/index.tsx","../../src/components/automations/automations-wizard/trigger-step/posture-select.tsx","../../src/components/automations/automations-wizard/trigger-step/deployment-status-trigger-fields.tsx","../../src/components/flows/flow-multi-select/flow-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/state-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/flow-run-state-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/form-mode-toggle.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-json-input.tsx","../../src/components/automations/automations-wizard/automations-trigger-template-select/automations-trigger-template-select.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-step-utils.ts","../../src/components/work-pools/work-pool-multi-select/work-pool-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/work-pool-status-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/work-pools-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/work-queues-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/work-queue-status-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-step.tsx","../../src/components/automations/automations-wizard/automation-wizard.tsx"],"sourcesContent":["import { useFormContext } from \"react-hook-form\";\n\nimport {\n\ttype ActionType,\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectLabel,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst AUTOMATION_ACTION_TYPES: Partial<Record<ActionType, string>> = {\n\t\"cancel-flow-run\": \"Cancel a flow run\",\n\t\"suspend-flow-run\": \"Suspend a flow run\",\n\t\"resume-flow-run\": \"Resume a flow run\",\n\t\"change-flow-run-state\": \"Change flow run's state\",\n\t\"run-deployment\": \"Run a deployment\",\n\t\"pause-deployment\": \"Pause a deployment\",\n\t\"resume-deployment\": \"Resume a deployment\",\n\t\"pause-work-queue\": \"Pause a work queue\",\n\t\"resume-work-queue\": \"Resume a work queue\",\n\t\"pause-work-pool\": \"Pause a work pool\",\n\t\"resume-work-pool\": \"Resume a work pool\",\n\t\"pause-automation\": \"Pause an automation\",\n\t\"resume-automation\": \"Resume an automation\",\n\t\"send-notification\": \"Send a notification\",\n};\n\nexport const ActionTypeSelect = ({ index }: { index: number }) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.type`}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>Action Type</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\tonValueChange={(type: ActionType) => {\n\t\t\t\t\t\t\t\tfield.onChange(type);\n\t\t\t\t\t\t\t\tconst defaultActionField = getDefaultActionField({\n\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (defaultActionField) {\n\t\t\t\t\t\t\t\t\tform.setValue(defaultActionField, UNASSIGNED);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger aria-label=\"select action\" className=\"w-full\">\n\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select action\" />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t<SelectLabel>Actions</SelectLabel>\n\t\t\t\t\t\t\t\t\t{Object.keys(AUTOMATION_ACTION_TYPES).map((key) => (\n\t\t\t\t\t\t\t\t\t\t<SelectItem key={key} value={key}>\n\t\t\t\t\t\t\t\t\t\t\t{AUTOMATION_ACTION_TYPES[key as ActionType]}\n\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n\n/**\n * @returns form field name to be set that is associated with the passed `type` arg\n */\nfunction getDefaultActionField({\n\tindex,\n\ttype,\n}: {\n\tindex: number;\n\ttype: ActionType;\n}) {\n\tswitch (type) {\n\t\tcase \"run-deployment\":\n\t\tcase \"pause-deployment\":\n\t\tcase \"resume-deployment\":\n\t\t\treturn `actions.${index}.deployment_id` as const;\n\t\tcase \"pause-work-queue\":\n\t\tcase \"resume-work-queue\":\n\t\t\treturn `actions.${index}.work_queue_id` as const;\n\t\tcase \"pause-work-pool\":\n\t\tcase \"resume-work-pool\":\n\t\t\treturn `actions.${index}.work_pool_id` as const;\n\t\tcase \"pause-automation\":\n\t\tcase \"resume-automation\":\n\t\t\treturn `actions.${index}.automation_id` as const;\n\t\t// TODO: add these back in once we have field names for them\n\t\t// case \"send-notification\":\n\t\t// case \"cancel-flow-run\":\n\t\t// case \"suspend-flow-run\":\n\t\t// case \"resume-flow-run\":\n\t\t// case \"change-flow-run-state\":\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n","import { useFormContext } from \"react-hook-form\";\nimport { RUN_STATES } from \"@/api/flow-runs/constants\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { StateSelect } from \"@/components/ui/state-select\";\nimport { Textarea } from \"@/components/ui/textarea\";\n\ntype ChangeFlowRunStateFieldsProps = {\n\tindex: number;\n};\n\nexport const ChangeFlowRunStateFields = ({\n\tindex,\n}: ChangeFlowRunStateFieldsProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst stateField = form.watch(`actions.${index}.state`);\n\n\treturn (\n\t\t<>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.state`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>State</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<StateSelect value={field.value} onValueChange={field.onChange} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.name`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\t\tplaceholder={stateField ? RUN_STATES[stateField] : undefined}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.message`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Message</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\tplaceholder=\"State changed by Automation <id>\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","import { Typography } from \"@/components/ui/typography\";\n\ntype FlowRunActionDescriptionProps = {\n\taction: \"Suspend\" | \"Cancel\" | \"Resume\";\n};\n\nexport const FlowRunActionDescription = ({\n\taction,\n}: FlowRunActionDescriptionProps) => {\n\t// Vue uses different text for resume vs cancel/suspend:\n\t// - Cancel/Suspend: \"{Action} flow run inferred from the triggering event\"\n\t// - Resume: \"Resume a flow run inferred from the triggering event\"\n\tconst text =\n\t\taction === \"Resume\"\n\t\t\t? \"Resume a flow run inferred from the triggering event\"\n\t\t\t: `${action} flow run inferred from the triggering event`;\n\n\treturn (\n\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t{text}\n\t\t</Typography>\n\t);\n};\n","import { Skeleton } from \"@/components/ui/skeleton\";\n\nconst DEFAULT_NUM_SKELETONS = 4;\n\ntype LoadingSelectStateProps = {\n\tlength?: number;\n};\n\nexport const LoadingSelectState = ({\n\tlength = DEFAULT_NUM_SKELETONS,\n}: LoadingSelectStateProps) =>\n\tArray.from({ length }, (_, index) => (\n\t\t// biome-ignore lint/suspicious/noArrayIndexKey: ok for loading skeletons\n\t\t<Skeleton key={index} className=\"mt-2 p-4 h-2 w-full\" />\n\t));\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { type Automation, buildListAutomationsQuery } from \"@/api/automations\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Automation\",\n} as const;\n\ntype SelectAutomationsFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<Automation> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst automation = data?.find((automation) => automation.id === fieldValue);\n\tif (automation) {\n\t\treturn automation.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectAutomationsFields = ({\n\taction,\n\tindex,\n}: SelectAutomationsFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data, isSuccess } = useQuery(buildListAutomationsQuery());\n\n\t// nb: because automations API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\tconst filteredData = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn [];\n\t\t}\n\t\treturn data.filter((automation) =>\n\t\t\tautomation.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.automation_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Automation To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Automation to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select automation\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for an automation...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No automation found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\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\tvalue={INFER_OPTION.value}\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{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isSuccess ? (\n\t\t\t\t\t\t\t\t\t\t\tfilteredData.map((automation) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={automation.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === automation.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={automation.id}\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\t\t{automation.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport {\n\tbuildPaginateDeploymentsQuery,\n\ttype Deployment,\n\ttype DeploymentsPaginationFilter,\n} from \"@/api/deployments\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\n\nexport type DeploymentWithFlow = Deployment & {\n\tflow: Flow | undefined;\n};\n\n/**\n * A hook that is used to get a pagination list of Deployments, with flow data joined\n *\n * @returns a pagination list of deployments, joined with flow data\n *\n * @example\n * ```tsx\nfunction DeploymentListWithFlows() {\n\tconst { data, status } = useListDeploymentsWithFlows();\n \n\tif (data) {\n\t\treturn (\n\t\t\t<ul>\n\t\t\t\t{data.results.map((deployment) => {\n\t\t\t\t\tconst label = deployment.flow\n\t\t\t\t\t\t? `${deployment.flow.name} > ${deployment.name}`\n\t\t\t\t\t\t: deployment.name;\n\t\t\t\t\treturn <li key={deployment.id}>{label}</li>;\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t);\n\t}\n\n\tif (status === \"error\") {\n\t\treturn <p>Error has occurred</p>;\n\t}\n\n\treturn <div>Loading...</div>;\n}\n * ```\n */\nexport const useListDeploymentsWithFlows = (\n\tfilter: DeploymentsPaginationFilter = {\n\t\tpage: 1,\n\t\tlimit: 100,\n\t\tsort: \"NAME_ASC\",\n\t},\n) => {\n\tconst { data: deploymentsData, status: deploymentsStatus } = useQuery(\n\t\tbuildPaginateDeploymentsQuery(filter),\n\t);\n\n\t// Creates a set of unique flow ids\n\tconst deploymentsFlowIds = new Set(\n\t\tdeploymentsData?.results.map((deployment) => deployment.flow_id),\n\t);\n\n\tconst { data: flowsData, status: flowsStatus } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"or_\",\n\t\t\t\t\tid: { any_: Array.from(deploymentsFlowIds) },\n\t\t\t\t},\n\t\t\t\tsort: \"NAME_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t},\n\t\t\t{ enabled: deploymentsFlowIds.size > 0 },\n\t\t),\n\t);\n\n\treturn useMemo(() => {\n\t\tif (flowsData && deploymentsData) {\n\t\t\tconst flowMap = new Map<string, Flow>(\n\t\t\t\tflowsData.map((flow) => [flow.id, flow]),\n\t\t\t);\n\t\t\t// Normalize data per deployment with deployment & flow\n\t\t\tconst deploymentsWithFlows = deploymentsData.results.map(\n\t\t\t\t(deployment) => ({\n\t\t\t\t\t...deployment,\n\t\t\t\t\tflow: flowMap.get(deployment.flow_id),\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst { count, limit, pages, page } = deploymentsData;\n\t\t\tconst retData = {\n\t\t\t\tcount,\n\t\t\t\tlimit,\n\t\t\t\tpages,\n\t\t\t\tpage,\n\t\t\t\tresults: deploymentsWithFlows,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tdata: retData,\n\t\t\t\tstatus: \"success\",\n\t\t\t};\n\t\t}\n\n\t\tif (flowsStatus === \"error\" || deploymentsStatus === \"error\") {\n\t\t\treturn {\n\t\t\t\tdata: undefined,\n\t\t\t\tstatus: \"error\",\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tdata: undefined,\n\t\t\tstatus: \"pending\",\n\t\t};\n\t}, [deploymentsData, deploymentsStatus, flowsData, flowsStatus]);\n};\n","import { useState } from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport { useListDeploymentsWithFlows } from \"@/api/deployments/use-list-deployments-with-flows\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Icon } from \"@/components/ui/icons\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Deployment\",\n} as const;\n\nconst getButtonLabel = (\n\tdata: Array<DeploymentWithFlow> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst deployment = data?.find((d) => d.id === fieldValue);\n\tif (!deployment) {\n\t\treturn undefined;\n\t}\n\treturn <DeploymentLabel deploymentWithFlow={deployment} />;\n};\n\ntype SelectDeploymentsFieldsProps = {\n\taction: \"Run\" | \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nexport const SelectDeploymentsFields = ({\n\taction,\n\tindex,\n}: SelectDeploymentsFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst actionType = form.watch(`actions.${index}.type`);\n\tconst deploymentId = useWatch<AutomationWizardSchema>({\n\t\tname: `actions.${index}.deployment_id`,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 500);\n\tconst { data } = useListDeploymentsWithFlows({\n\t\tpage: 1,\n\t\tsort: \"NAME_ASC\",\n\t\tdeployments: {\n\t\t\toperator: \"or_\",\n\t\t\tflow_or_deployment_name: {\n\t\t\t\tlike_: debouncedSearch,\n\t\t\t},\n\t\t},\n\t});\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(search.toLowerCase());\n\n\tconst deploymentsWithFlows = data?.results;\n\n\treturn (\n\t\t<>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.deployment_id`}\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst buttonLabel = getButtonLabel(deploymentsWithFlows, field.value);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t<FormLabel>Deployment To {action}</FormLabel>\n\t\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\t\taria-label={`Select Deployment to ${action}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select deployment\"}\n\t\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search for an deployment...\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t\tNo deployment found\n\t\t\t\t\t\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={INFER_OPTION.value}\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\t\t{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{deploymentsWithFlows ? (\n\t\t\t\t\t\t\t\t\t\t\t\tdeploymentsWithFlows.map((deployment) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={deployment.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DeploymentLabel deploymentWithFlow={deployment} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\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<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t\t</Combobox>\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\t\t\t/>\n\t\t\t{deploymentId !== INFER_OPTION.value &&\n\t\t\t\tactionType === \"run-deployment\" && <div>TODO: Additional fields</div>}\n\t\t</>\n\t);\n};\n\ntype DeploymentLabelProps = {\n\tdeploymentWithFlow: DeploymentWithFlow;\n};\nconst DeploymentLabel = ({ deploymentWithFlow }: DeploymentLabelProps) => {\n\tif (deploymentWithFlow.flow) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-0.5\">\n\t\t\t\t<div>{deploymentWithFlow.flow.name}</div>\n\t\t\t\t<Icon className=\"size-4\" id=\"ChevronRight\" />\n\t\t\t\t<div>{deploymentWithFlow.name}</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn deploymentWithFlow.name;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } from \"@/api/work-pools\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Work Pool\" as const,\n} as const;\n\ntype SelectWorkPoolFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<WorkPool> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst workPool = data?.find((wp) => wp.id === fieldValue);\n\tif (workPool) {\n\t\treturn workPool.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectWorkPoolsFields = ({\n\taction,\n\tindex,\n}: SelectWorkPoolFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data, isSuccess } = useQuery(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\tif (!data) {\n\t\t\treturn [];\n\t\t}\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 isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.work_pool_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Work Pool To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Work Pool to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select Work Pool\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a work pool...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No work pool found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\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\tvalue={INFER_OPTION.value}\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{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isSuccess ? (\n\t\t\t\t\t\t\t\t\t\t\tfilteredData.map((workPool) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={workPool.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === workPool.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={workPool.id}\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\t\t{workPool.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { buildFilterWorkQueuesQuery, type WorkQueue } from \"@/api/work-queues\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Work Queue\" as const,\n} as const;\n\ntype SelectWorkQueuesFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<WorkQueue> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst workQueue = data?.find((wq) => wq.id === fieldValue);\n\tif (workQueue) {\n\t\treturn workQueue.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectWorkQueuesFields = ({\n\taction,\n\tindex,\n}: SelectWorkQueuesFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data } = useQuery(buildFilterWorkQueuesQuery());\n\n\t// nb: because work queues API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\n\t// Filters data, but returns as a map of work_pool_name vs work queues\n\tconst filteredMap = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst filteredMap = new Map<string, Array<WorkQueue>>();\n\t\tconst filteredWorkQueues = data.filter((workQueue) =>\n\t\t\tworkQueue.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t\tfor (const wq of filteredWorkQueues) {\n\t\t\tconst { work_pool_name } = wq;\n\t\t\tif (!work_pool_name) {\n\t\t\t\tthrow new Error(\"'work_pool_name expected\");\n\t\t\t}\n\t\t\tfilteredMap.set(work_pool_name, [\n\t\t\t\t...(filteredMap.get(work_pool_name) ?? []),\n\t\t\t\twq,\n\t\t\t]);\n\t\t}\n\n\t\treturn filteredMap;\n\t}, [data, deferredSearch]);\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.work_queue_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Work Queue To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Work Queue to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select Work Queue\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a work queue...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No work queue found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\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\tvalue={INFER_OPTION.value}\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{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{filteredMap ? (\n\t\t\t\t\t\t\t\t\t\t\tArray.from(filteredMap).map(\n\t\t\t\t\t\t\t\t\t\t\t\t([workPoolName, workQueues]) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div key={workPoolName} className=\"border-b\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem disabled>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workPoolName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workQueues.map((workQueue) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workQueue.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\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) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { useValidateTemplate } from \"@/api/automations\";\nimport {\n\ttype BlockDocument,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\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 { Textarea } from \"@/components/ui/textarea\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\ntype SendNotificationFieldsProps = {\n\tindex: number;\n};\n\nexport const SendNotificationFields = ({\n\tindex,\n}: SendNotificationFieldsProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst { data: blockTypes, isLoading: isLoadingBlockTypes } = useQuery(\n\t\tbuildListFilterBlockTypesQuery({\n\t\t\toffset: 0,\n\t\t\tblock_schemas: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tblock_capabilities: { all_: [\"notify\"] },\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst blockTypeSlugs = useMemo(\n\t\t() => blockTypes?.map((bt) => bt.slug) ?? [],\n\t\t[blockTypes],\n\t);\n\n\tconst { data: blockDocuments, isLoading: isLoadingBlockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery(\n\t\t\t{\n\t\t\t\tblock_types:\n\t\t\t\t\tblockTypeSlugs.length > 0\n\t\t\t\t\t\t? { slug: { any_: blockTypeSlugs } }\n\t\t\t\t\t\t: undefined,\n\t\t\t\tinclude_secrets: false,\n\t\t\t\tsort: \"BLOCK_TYPE_AND_NAME_ASC\",\n\t\t\t\toffset: 0,\n\t\t\t},\n\t\t\t{ enabled: blockTypeSlugs.length > 0 },\n\t\t),\n\t);\n\n\tconst isLoading = isLoadingBlockTypes || isLoadingBlockDocuments;\n\n\tconst groupedBlockDocuments = useMemo(() => {\n\t\tif (!blockTypes || !blockDocuments) return [];\n\n\t\treturn blockTypes\n\t\t\t.map((blockType) => ({\n\t\t\t\tblockType,\n\t\t\t\tdocuments: blockDocuments.filter(\n\t\t\t\t\t(doc) => doc.block_type_id === blockType.id,\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [blockTypes, blockDocuments]);\n\n\tconst filteredGroups = useMemo(() => {\n\t\tif (!search) return groupedBlockDocuments;\n\n\t\tconst lowerSearch = search.toLowerCase();\n\t\treturn groupedBlockDocuments\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\tdocuments: group.documents.filter((doc) =>\n\t\t\t\t\tdoc.name?.toLowerCase().includes(lowerSearch),\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [groupedBlockDocuments, search]);\n\n\tconst getSelectedBlockDocument = useCallback(\n\t\t(blockDocumentId: string | undefined): BlockDocument | undefined => {\n\t\t\tif (!blockDocumentId || !blockDocuments) return undefined;\n\t\t\treturn blockDocuments.find((doc) => doc.id === blockDocumentId);\n\t\t},\n\t\t[blockDocuments],\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.block_document_id`}\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst selectedDoc = getSelectedBlockDocument(field.value);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t<FormLabel>Block</FormLabel>\n\t\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\t\tselected={Boolean(selectedDoc)}\n\t\t\t\t\t\t\t\t\taria-label=\"Select notification block\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{selectedDoc\n\t\t\t\t\t\t\t\t\t\t? selectedDoc.name\n\t\t\t\t\t\t\t\t\t\t: \"Select a notification block\"}\n\t\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a block...\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t\tNo notification blocks found\n\t\t\t\t\t\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\tfilteredGroups.map((group) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={group.blockType.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\theading={group.blockType.name}\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\t\t{group.documents.map((doc) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{doc.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t\t</Combobox>\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\t\t\t/>\n\n\t\t\t<TemplateField\n\t\t\t\tindex={index}\n\t\t\t\tname=\"subject\"\n\t\t\t\tlabel=\"Subject\"\n\t\t\t\tplaceholder=\"Enter notification subject...\"\n\t\t\t/>\n\n\t\t\t<TemplateField\n\t\t\t\tindex={index}\n\t\t\t\tname=\"body\"\n\t\t\t\tlabel=\"Body\"\n\t\t\t\tplaceholder=\"Enter notification body...\"\n\t\t\t\tmultiline\n\t\t\t/>\n\n\t\t\t<div className=\"flex items-start gap-2 rounded-md border border-blue-200 bg-blue-50 p-3 text-sm text-blue-800 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-200\">\n\t\t\t\t<Icon id=\"Info\" className=\"mt-0.5 size-4 shrink-0\" />\n\t\t\t\t<p>\n\t\t\t\t\tIn addition to any fields present on the triggering event, the\n\t\t\t\t\tfollowing objects can be used in notification templates:{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tdeployment\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow_run\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_pool\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_queue\n\t\t\t\t\t</code>\n\t\t\t\t\t, and{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tmetric\n\t\t\t\t\t</code>\n\t\t\t\t\t.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\ntype TemplateFieldProps = {\n\tindex: number;\n\tname: \"subject\" | \"body\";\n\tlabel: string;\n\tplaceholder?: string;\n\tmultiline?: boolean;\n};\n\nconst TemplateField = ({\n\tindex,\n\tname,\n\tlabel,\n\tplaceholder,\n\tmultiline = false,\n}: TemplateFieldProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { validateTemplate } = useValidateTemplate();\n\tconst [validationError, setValidationError] = useState<string | null>(null);\n\tconst [isValidating, setIsValidating] = useState(false);\n\n\tconst fieldValue = form.watch(`actions.${index}.${name}`);\n\tconst debouncedValue = useDebounce(fieldValue, 1000);\n\n\tuseEffect(() => {\n\t\tconst validate = async () => {\n\t\t\tif (!debouncedValue || debouncedValue.trim() === \"\") {\n\t\t\t\tsetValidationError(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsValidating(true);\n\t\t\ttry {\n\t\t\t\tconst result = await validateTemplate(debouncedValue);\n\t\t\t\tif (result.valid) {\n\t\t\t\t\tsetValidationError(null);\n\t\t\t\t} else {\n\t\t\t\t\tsetValidationError(result.error);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetValidationError(null);\n\t\t\t} finally {\n\t\t\t\tsetIsValidating(false);\n\t\t\t}\n\t\t};\n\n\t\tvoid validate();\n\t}, [debouncedValue, validateTemplate]);\n\n\tconst InputComponent = multiline ? Textarea : Input;\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.${name}`}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel className=\"flex items-center gap-2\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\t{isValidating && (\n\t\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-3 animate-spin\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<InputComponent\n\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\tclassName={validationError ? \"border-destructive\" : \"\"}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t\t{validationError && (\n\t\t\t\t\t\t<p className=\"text-sm text-destructive\">{validationError}</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<FormMessage />\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { ActionTypeSelect } from \"./action-type-select\";\nimport { ChangeFlowRunStateFields } from \"./change-flow-run-fields\";\nimport { FlowRunActionDescription } from \"./flow-run-action-description\";\nimport { SelectAutomationsFields } from \"./select-automations-fields\";\nimport { SelectDeploymentsFields } from \"./select-deployments-fields\";\nimport { SelectWorkPoolsFields } from \"./select-work-pools-fields\";\nimport { SelectWorkQueuesFields } from \"./select-work-queues-fields\";\nimport { SendNotificationFields } from \"./send-notification-fields\";\n\ntype ActionStepProps = {\n\tindex: number;\n\tonRemove: () => void;\n};\n\nexport const ActionStep = ({ index, onRemove }: ActionStepProps) => {\n\treturn (\n\t\t<div key={index} className=\"space-y-2\">\n\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t<Typography variant=\"body\" className=\"font-semibold\">\n\t\t\t\t\tAction {index + 1}\n\t\t\t\t</Typography>\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\taria-label={`remove action ${index + 1}`}\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Trash2\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<ActionTypeSelect index={index} />\n\t\t\t<ActionTypeAdditionalFields index={index} />\n\t\t\t<hr className=\"my-8\" />\n\t\t</div>\n\t);\n};\n\ntype ActionTypeAdditionalFieldsProps = {\n\tindex: number;\n};\n\nconst ActionTypeAdditionalFields = ({\n\tindex,\n}: ActionTypeAdditionalFieldsProps) => {\n\tconst actionType = useWatch<AutomationWizardSchema>({\n\t\tname: `actions.${index}.type`,\n\t});\n\tswitch (actionType) {\n\t\tcase \"change-flow-run-state\":\n\t\t\treturn <ChangeFlowRunStateFields index={index} />;\n\t\tcase \"run-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Run\" index={index} />;\n\t\tcase \"pause-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-work-queue\":\n\t\t\treturn <SelectWorkQueuesFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-work-queue\":\n\t\t\treturn <SelectWorkQueuesFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-work-pool\":\n\t\t\treturn <SelectWorkPoolsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-work-pool\":\n\t\t\treturn <SelectWorkPoolsFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-automation\":\n\t\t\treturn <SelectAutomationsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-automation\":\n\t\t\treturn <SelectAutomationsFields action=\"Resume\" index={index} />;\n\t\tcase \"send-notification\":\n\t\t\treturn <SendNotificationFields index={index} />;\n\t\tcase \"cancel-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Cancel\" />;\n\t\tcase \"suspend-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Suspend\" />;\n\t\tcase \"resume-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Resume\" />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { useFieldArray, useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { ActionStep } from \"./action-step\";\n\nexport const ActionsStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { fields, append, remove } = useFieldArray({\n\t\tcontrol: form.control,\n\t\tname: \"actions\",\n\t\tshouldUnregister: false,\n\t\trules: { minLength: 1 },\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t{fields.map(({ id }, index) => (\n\t\t\t\t<ActionStep key={id} index={index} onRemove={() => remove(index)} />\n\t\t\t))}\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tonClick={() => append({ type: \"cancel-flow-run\" })}\n\t\t\t>\n\t\t\t\t<Icon id=\"Plus\" className=\"mr-2 size-4\" /> Add Action\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\n\nexport const DetailsStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"name\"\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Automation Name</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input type=\"text\" {...field} value={field.value ?? \"\"} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"description\"\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Description (Optional)</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input type=\"text\" {...field} value={field.value ?? \"\"} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n} from \"@/components/ui/form\";\nimport { Label } from \"@/components/ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\n\nconst POSTURE_OPTIONS = [\n\t{ value: \"Reactive\", label: \"Observe\" },\n\t{ value: \"Proactive\", label: \"Don't observe\" },\n] as const;\n\nconst DEFAULT_PROACTIVE_WITHIN = 30;\n\nexport const CustomPostureSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\tconst handlePostureChange = (value: \"Reactive\" | \"Proactive\") => {\n\t\tconst previousPosture = form.getValues(\"trigger.posture\");\n\t\tform.setValue(\"trigger.posture\", value);\n\n\t\t// Move state values between expect and after when posture changes\n\t\t// Reactive uses \"expect\", Proactive uses \"after\"\n\t\tif (previousPosture === \"Reactive\" && value === \"Proactive\") {\n\t\t\tconst expectValues = form.getValues(\"trigger.expect\") ?? [];\n\t\t\tform.setValue(\"trigger.after\", expectValues);\n\t\t\tform.setValue(\"trigger.expect\", []);\n\t\t\tconst currentWithin = form.getValues(\"trigger.within\");\n\t\t\tif (currentWithin === 0) {\n\t\t\t\tform.setValue(\"trigger.within\", DEFAULT_PROACTIVE_WITHIN);\n\t\t\t}\n\t\t} else if (previousPosture === \"Proactive\" && value === \"Reactive\") {\n\t\t\tconst afterValues = form.getValues(\"trigger.after\") ?? [];\n\t\t\tform.setValue(\"trigger.expect\", afterValues);\n\t\t\tform.setValue(\"trigger.after\", []);\n\t\t}\n\t};\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"trigger.posture\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>When I</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<RadioGroup\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={handlePostureChange}\n\t\t\t\t\t\t\tclassName=\"flex gap-4\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{POSTURE_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<div key={option.value} className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<RadioGroupItem\n\t\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t\t\tid={`custom-${option.value}`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Label htmlFor={`custom-${option.value}`}>\n\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</RadioGroup>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { cn } from \"@/utils\";\n\nconst SECONDS_IN_MINUTE = 60;\nconst SECONDS_IN_HOUR = 3600;\nconst SECONDS_IN_DAY = 86400;\n\ntype DurationUnit = {\n\tlabel: string;\n\tvalue: number;\n};\n\nconst DURATION_UNITS: DurationUnit[] = [\n\t{ label: \"Seconds\", value: 1 },\n\t{ label: \"Minutes\", value: SECONDS_IN_MINUTE },\n\t{ label: \"Hours\", value: SECONDS_IN_HOUR },\n\t{ label: \"Days\", value: SECONDS_IN_DAY },\n];\n\nfunction getDefaultUnitForValue(value: number): number {\n\tif (value > 0 && value % SECONDS_IN_DAY === 0) {\n\t\treturn SECONDS_IN_DAY;\n\t}\n\tif (value > 0 && value % SECONDS_IN_HOUR === 0) {\n\t\treturn SECONDS_IN_HOUR;\n\t}\n\tif (value > 0 && value % SECONDS_IN_MINUTE === 0) {\n\t\treturn SECONDS_IN_MINUTE;\n\t}\n\treturn 1;\n}\n\nexport type DurationInputProps = {\n\tvalue: number;\n\tonChange: (seconds: number) => void;\n\tmin?: number;\n\tmax?: number;\n\tclassName?: string;\n\tdisabled?: boolean;\n};\n\nexport function DurationInput({\n\tvalue,\n\tonChange,\n\tmin = 0,\n\tmax,\n\tclassName,\n\tdisabled = false,\n}: DurationInputProps) {\n\tconst [unit, setUnit] = useState<number>(() => getDefaultUnitForValue(value));\n\n\tconst availableUnits = useMemo(() => {\n\t\treturn DURATION_UNITS.filter((u) => u.value >= min);\n\t}, [min]);\n\n\tconst quantity = useMemo(() => {\n\t\treturn value / unit;\n\t}, [value, unit]);\n\n\tconst handleQuantityChange = useCallback(\n\t\t(newQuantity: number) => {\n\t\t\tlet newValue = newQuantity * unit;\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\t\t\tonChange(newValue);\n\t\t},\n\t\t[onChange, unit, max],\n\t);\n\n\tconst handleUnitChange = useCallback(\n\t\t(newUnitValue: string) => {\n\t\t\tconst newUnit = Number(newUnitValue);\n\t\t\tconst oldUnit = unit;\n\t\t\tsetUnit(newUnit);\n\t\t\tlet newValue = (value / oldUnit) * newUnit;\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\t\t\tonChange(newValue);\n\t\t},\n\t\t[onChange, unit, value, max],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!availableUnits.some((u) => u.value === unit)) {\n\t\t\tconst firstAvailable = availableUnits[0];\n\t\t\tif (firstAvailable) {\n\t\t\t\tsetUnit(firstAvailable.value);\n\t\t\t}\n\t\t}\n\t}, [availableUnits, unit]);\n\n\treturn (\n\t\t<div className={cn(\"grid grid-cols-[1fr_7rem] gap-2 w-full\", className)}>\n\t\t\t<Input\n\t\t\t\ttype=\"number\"\n\t\t\t\tmin={0}\n\t\t\t\tvalue={quantity}\n\t\t\t\tonChange={(e) => handleQuantityChange(Number(e.target.value))}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Duration quantity\"\n\t\t\t/>\n\t\t\t<Select\n\t\t\t\tvalue={String(unit)}\n\t\t\t\tonValueChange={handleUnitChange}\n\t\t\t\tdisabled={disabled}\n\t\t\t>\n\t\t\t\t<SelectTrigger aria-label=\"Duration unit\">\n\t\t\t\t\t<SelectValue />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t{availableUnits.map((u) => (\n\t\t\t\t\t\t<SelectItem key={u.value} value={String(u.value)}>\n\t\t\t\t\t\t\t{u.label}\n\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t))}\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n}\n","import {\n\tuseCallback,\n\tuseDeferredValue,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { useResourceOptions } from \"@/components/events/events-resource-filter/use-resource-options\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { Typography } from \"@/components/ui/typography\";\n\nconst FALLBACK_MAX_DISPLAYED = 2;\nconst PLUS_N_WIDTH = 40;\n\nexport type EventResourceComboboxProps = {\n\tselectedResourceIds: string[];\n\tonToggleResource: (resourceId: string) => void;\n\temptyMessage?: string;\n};\n\ntype ResourceGroup = {\n\tlabel: string;\n\toptions: Array<{ label: string; value: string }>;\n};\n\nexport function EventResourceCombobox({\n\tselectedResourceIds,\n\tonToggleResource,\n\temptyMessage = \"All resources\",\n}: EventResourceComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst measureRef = useRef<HTMLDivElement>(null);\n\n\t// Measure container width using ResizeObserver\n\tuseEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tsetContainerWidth(entry.contentRect.width);\n\t\t\t}\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\t// Use existing hook that fetches all resource types\n\tconst { resourceOptions } = useResourceOptions();\n\n\t// Group resources by type\n\tconst groupedResources = useMemo(() => {\n\t\tconst groups: ResourceGroup[] = [\n\t\t\t{ label: \"Automations\", options: [] },\n\t\t\t{ label: \"Blocks\", options: [] },\n\t\t\t{ label: \"Deployments\", options: [] },\n\t\t\t{ label: \"Flows\", options: [] },\n\t\t\t{ label: \"Work Pools\", options: [] },\n\t\t\t{ label: \"Work Queues\", options: [] },\n\t\t];\n\n\t\tfor (const resource of resourceOptions) {\n\t\t\tconst option = {\n\t\t\t\tlabel: resource.name,\n\t\t\t\tvalue: resource.resourceId,\n\t\t\t};\n\n\t\t\tswitch (resource.type) {\n\t\t\t\tcase \"automation\":\n\t\t\t\t\tgroups[0].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"block\":\n\t\t\t\t\tgroups[1].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"deployment\":\n\t\t\t\t\tgroups[2].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"flow\":\n\t\t\t\t\tgroups[3].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"work-pool\":\n\t\t\t\t\tgroups[4].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"work-queue\":\n\t\t\t\t\tgroups[5].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn groups\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\toptions: group.options.sort((a, b) => a.label.localeCompare(b.label)),\n\t\t\t}))\n\t\t\t.filter((group) => group.options.length > 0);\n\t}, [resourceOptions]);\n\n\t// Filter based on search\n\tconst filteredGroups = useMemo(() => {\n\t\tif (!deferredSearch) return groupedResources;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn groupedResources\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\toptions: group.options.filter(\n\t\t\t\t\t(opt) =>\n\t\t\t\t\t\topt.label.toLowerCase().includes(lower) ||\n\t\t\t\t\t\topt.value.toLowerCase().includes(lower),\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.options.length > 0);\n\t}, [groupedResources, deferredSearch]);\n\n\t// Check if search term could be a custom resource ID (must contain \".\")\n\tconst showCustomOption = useMemo(() => {\n\t\tif (!deferredSearch.trim()) return false;\n\t\tif (!deferredSearch.includes(\".\")) return false;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn !resourceOptions.some(\n\t\t\t(opt) => opt.resourceId.toLowerCase() === lower,\n\t\t);\n\t}, [deferredSearch, resourceOptions]);\n\n\t// Calculate how many names fit in the available width\n\tconst calculateVisibleCount = useCallback(\n\t\t(names: string[]): number => {\n\t\t\tconst measureEl = measureRef.current;\n\t\t\tif (!measureEl || containerWidth === 0 || names.length === 0) {\n\t\t\t\treturn Math.min(names.length, FALLBACK_MAX_DISPLAYED);\n\t\t\t}\n\n\t\t\t// Available width for names (reserve space for \"+N\" if needed)\n\t\t\tconst availableWidth =\n\t\t\t\tnames.length > 1 ? containerWidth - PLUS_N_WIDTH : containerWidth;\n\n\t\t\tlet visibleCount = 0;\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\t\t\t\t// Measure each name by temporarily setting content\n\t\t\t\tmeasureEl.textContent = names.slice(0, i + 1).join(\", \");\n\t\t\t\tconst nameWidth = measureEl.offsetWidth;\n\n\t\t\t\tif (nameWidth <= availableWidth) {\n\t\t\t\t\tvisibleCount = i + 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If all names fit, return all\n\t\t\tif (visibleCount === names.length) {\n\t\t\t\treturn names.length;\n\t\t\t}\n\n\t\t\t// Return at least 1 name\n\t\t\treturn Math.max(1, visibleCount);\n\t\t},\n\t\t[containerWidth],\n\t);\n\n\tconst renderSelectedResources = () => {\n\t\tif (selectedResourceIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tconst selectedNames = selectedResourceIds.map((id) => {\n\t\t\tconst resource = resourceOptions.find((r) => r.resourceId === id);\n\t\t\treturn resource?.name ?? id;\n\t\t});\n\n\t\tconst visibleCount = calculateVisibleCount(selectedNames);\n\t\tconst visible = selectedNames.slice(0, visibleCount);\n\t\tconst extraCount = selectedNames.length - visibleCount;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"flex flex-1 min-w-0 items-center gap-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t\t{/* Hidden element for measuring text width */}\n\t\t\t\t<div\n\t\t\t\t\tref={measureRef}\n\t\t\t\t\tclassName=\"absolute invisible whitespace-nowrap\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleSelect = (value: string) => {\n\t\tonToggleResource(value);\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedResourceIds.length > 0}>\n\t\t\t\t{renderSelectedResources()}\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 resources...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No resources found</ComboboxCommandEmtpy>\n\t\t\t\t\t{showCustomOption && (\n\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey=\"__custom__\"\n\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(deferredSearch)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(deferredSearch)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deferredSearch}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAdd &quot;{deferredSearch}&quot;\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t)}\n\t\t\t\t\t{filteredGroups.map((group) => (\n\t\t\t\t\t\t<ComboboxCommandGroup key={group.label} heading={group.label}>\n\t\t\t\t\t\t\t{group.options.map((option) => (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(option.value)}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleSelect(option.value)}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t))}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildEventsCountQuery } from \"@/api/events\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nexport type EventsComboboxProps = {\n\tselectedEvents: string[];\n\tonToggleEvent: (event: string) => void;\n\temptyMessage?: string;\n};\n\n/**\n * Generate wildcard prefix options from event names.\n * E.g., [\"prefect.flow-run.Completed\", \"prefect.flow-run.Failed\"]\n * generates [\"prefect.*\", \"prefect.flow-run.*\"]\n *\n * Only includes prefixes that match more than one event but not all events.\n */\nfunction getEventPrefixValues(events: string[]): string[] {\n\tconst prefixCounts = new Map<string, number>();\n\n\tfor (const event of events) {\n\t\tconst parts = event.split(\".\");\n\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\tconst prefix = parts.slice(0, i).join(\".\");\n\t\t\tprefixCounts.set(prefix, (prefixCounts.get(prefix) ?? 0) + 1);\n\t\t}\n\t}\n\n\treturn Array.from(prefixCounts.entries())\n\t\t.filter(([, count]) => count > 1 && count < events.length)\n\t\t.map(([prefix]) => `${prefix}.*`);\n}\n\nexport function EventsCombobox({\n\tselectedEvents,\n\tonToggleEvent,\n\temptyMessage = \"All events\",\n}: EventsComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\t// Create a stable filter for the past week (computed once on mount)\n\tconst [occurredFilter] = useState(() => ({\n\t\tsince: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tuntil: new Date().toISOString(),\n\t}));\n\n\t// Fetch event counts for the past week\n\tconst { data: eventCounts = [] } = useQuery(\n\t\tbuildEventsCountQuery(\"event\", {\n\t\t\tfilter: {\n\t\t\t\toccurred: occurredFilter,\n\t\t\t\torder: \"DESC\",\n\t\t\t},\n\t\t\ttime_unit: \"day\",\n\t\t\ttime_interval: 1,\n\t\t}),\n\t);\n\n\t// Extract event labels and generate prefix options\n\tconst options = useMemo(() => {\n\t\tconst eventLabels = eventCounts.map((e) => e.label);\n\t\tconst prefixes = getEventPrefixValues(eventLabels);\n\t\treturn [...eventLabels, ...prefixes].sort((a, b) => a.localeCompare(b));\n\t}, [eventCounts]);\n\n\t// Filter options based on search\n\tconst filteredOptions = useMemo(() => {\n\t\tif (!deferredSearch) return options;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn options.filter((opt) => opt.toLowerCase().includes(lower));\n\t}, [options, deferredSearch]);\n\n\t// Check if search term is a valid custom value\n\tconst showCustomOption = useMemo(() => {\n\t\tif (!deferredSearch.trim()) return false;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn !options.some((opt) => opt.toLowerCase() === lower);\n\t}, [deferredSearch, options]);\n\n\tconst renderSelectedEvents = () => {\n\t\tif (selectedEvents.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tconst visibleNames = selectedEvents.slice(0, 2);\n\t\tconst overflow = selectedEvents.length - visibleNames.length;\n\t\treturn (\n\t\t\t<div className=\"flex min-w-0 items-center justify-start gap-1\">\n\t\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t\t{visibleNames.join(\", \")}\n\t\t\t\t</span>\n\t\t\t\t{overflow > 0 && (\n\t\t\t\t\t<span className=\"shrink-0 text-muted-foreground\">+{overflow}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleSelect = (value: string) => {\n\t\tonToggleEvent(value);\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedEvents.length > 0}>\n\t\t\t\t{renderSelectedEvents()}\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 events...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No events found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{showCustomOption && (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey=\"__custom__\"\n\t\t\t\t\t\t\t\tselected={selectedEvents.includes(deferredSearch)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(deferredSearch)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deferredSearch}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAdd &quot;{deferredSearch}&quot;\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredOptions.map((event) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={event}\n\t\t\t\t\t\t\t\tselected={selectedEvents.includes(event)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(event)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={event}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{event}\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 { ChevronRight } from \"lucide-react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCollapsible,\n\tCollapsibleContent,\n\tCollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { CustomPostureSelect } from \"./custom-posture-select\";\nimport { EventResourceCombobox } from \"./event-resource-combobox\";\nimport { EventsCombobox } from \"./events-combobox\";\n\nexport const CustomTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"flex items-end gap-4\">\n\t\t\t\t<CustomPostureSelect />\n\t\t\t</div>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"trigger.expect\"\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst events = field.value ?? [];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Any event matching</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<EventsCombobox\n\t\t\t\t\t\t\t\t\tselectedEvents={events}\n\t\t\t\t\t\t\t\t\tonToggleEvent={(event) => {\n\t\t\t\t\t\t\t\t\t\tconst newEvents = events.includes(event)\n\t\t\t\t\t\t\t\t\t\t\t? events.filter((e) => e !== event)\n\t\t\t\t\t\t\t\t\t\t\t: [...events, event];\n\t\t\t\t\t\t\t\t\t\tfield.onChange(newEvents);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</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\t\t\t/>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"trigger.match\"\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst resourceIds =\n\t\t\t\t\t\t(field.value?.[\"prefect.resource.id\"] as string[] | undefined) ??\n\t\t\t\t\t\t[];\n\t\t\t\t\tconst resourceIdsArray = Array.isArray(resourceIds)\n\t\t\t\t\t\t? resourceIds\n\t\t\t\t\t\t: [resourceIds];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>From the following resources</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<EventResourceCombobox\n\t\t\t\t\t\t\t\t\tselectedResourceIds={resourceIdsArray}\n\t\t\t\t\t\t\t\t\tonToggleResource={(resourceId) => {\n\t\t\t\t\t\t\t\t\t\tconst newIds = resourceIdsArray.includes(resourceId)\n\t\t\t\t\t\t\t\t\t\t\t? resourceIdsArray.filter((id) => id !== resourceId)\n\t\t\t\t\t\t\t\t\t\t\t: [...resourceIdsArray, resourceId];\n\t\t\t\t\t\t\t\t\t\tif (newIds.length > 0) {\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange({ \"prefect.resource.id\": newIds });\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange({});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</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\t\t\t/>\n\n\t\t\t<div className=\"flex items-end gap-2\">\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.threshold\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem className=\"w-20\">\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\ttype=\"number\"\n\t\t\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.onChange(Number(e.target.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\t\t\t\t<span className=\"pb-2 text-sm text-muted-foreground\">times within</span>\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={posture === \"Proactive\" ? 10 : 0}\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\t\t\t</div>\n\n\t\t\t<Collapsible>\n\t\t\t\t<CollapsibleTrigger className=\"flex items-center gap-2 text-sm font-medium\">\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4 transition-transform data-[state=open]:rotate-90\" />\n\t\t\t\t\tEvaluation Options\n\t\t\t\t</CollapsibleTrigger>\n\t\t\t\t<CollapsibleContent className=\"mt-4 space-y-4 pl-6\">\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.after\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst events = field.value ?? [];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>\n\t\t\t\t\t\t\t\t\t\tEvaluate trigger only after observing an event matching\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<EventsCombobox\n\t\t\t\t\t\t\t\t\t\t\tselectedEvents={events}\n\t\t\t\t\t\t\t\t\t\t\tonToggleEvent={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newEvents = events.includes(event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? events.filter((e) => e !== event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: [...events, event];\n\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(newEvents);\n\t\t\t\t\t\t\t\t\t\t\t}}\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/>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.match_related\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst resourceIds =\n\t\t\t\t\t\t\t\t(field.value?.[\"prefect.resource.id\"] as\n\t\t\t\t\t\t\t\t\t| string[]\n\t\t\t\t\t\t\t\t\t| undefined) ?? [];\n\t\t\t\t\t\t\tconst resourceIdsArray = Array.isArray(resourceIds)\n\t\t\t\t\t\t\t\t? resourceIds\n\t\t\t\t\t\t\t\t: [resourceIds];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Filter for events related to</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<EventResourceCombobox\n\t\t\t\t\t\t\t\t\t\t\tselectedResourceIds={resourceIdsArray}\n\t\t\t\t\t\t\t\t\t\t\tonToggleResource={(resourceId) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newIds = resourceIdsArray.includes(resourceId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? resourceIdsArray.filter((id) => id !== resourceId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: [...resourceIdsArray, resourceId];\n\t\t\t\t\t\t\t\t\t\t\t\tif (newIds.length > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange({ \"prefect.resource.id\": newIds });\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange({});\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/>\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/>\n\t\t\t\t</CollapsibleContent>\n\t\t\t</Collapsible>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport {\n\tuseCallback,\n\tuseDeferredValue,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport {\n\tbuildFilterDeploymentsQuery,\n\ttype Deployment,\n} from \"@/api/deployments\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { Typography } from \"@/components/ui/typography\";\n\nconst FALLBACK_MAX_DISPLAYED = 2;\nconst PLUS_N_WIDTH = 40;\n\ntype AutomationDeploymentComboboxProps = {\n\tselectedDeploymentIds: string[];\n\tonSelectDeploymentIds: (deploymentIds: string[]) => void;\n};\n\nexport const AutomationDeploymentCombobox = ({\n\tselectedDeploymentIds,\n\tonSelectDeploymentIds,\n}: AutomationDeploymentComboboxProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst measureRef = useRef<HTMLDivElement>(null);\n\n\tconst selectedDeploymentsSet = useMemo(\n\t\t() => new Set(selectedDeploymentIds),\n\t\t[selectedDeploymentIds],\n\t);\n\n\t// Measure container width using ResizeObserver\n\tuseEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tsetContainerWidth(entry.contentRect.width);\n\t\t\t}\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tconst { data: deployments = [] } = useQuery(\n\t\tbuildFilterDeploymentsQuery({\n\t\t\tdeployments: deferredSearch\n\t\t\t\t? {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { like_: deferredSearch },\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst { data: selectedDeploymentsData = [] } = useQuery(\n\t\tbuildFilterDeploymentsQuery(\n\t\t\t{\n\t\t\t\tdeployments:\n\t\t\t\t\tselectedDeploymentsSet.size > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tid: { any_: selectedDeploymentIds },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\tlimit: selectedDeploymentsSet.size || 1,\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: selectedDeploymentsSet.size > 0 },\n\t\t),\n\t);\n\n\tconst handleSelectDeployment = (deploymentId: string) => {\n\t\tconst updatedDeployments = new Set(selectedDeploymentsSet);\n\t\tif (selectedDeploymentsSet.has(deploymentId)) {\n\t\t\tupdatedDeployments.delete(deploymentId);\n\t\t} else {\n\t\t\tupdatedDeployments.add(deploymentId);\n\t\t}\n\t\tonSelectDeploymentIds(Array.from(updatedDeployments));\n\t};\n\n\tconst handleClearAll = () => {\n\t\tonSelectDeploymentIds([]);\n\t};\n\n\t// Calculate how many names fit in the available width\n\tconst calculateVisibleCount = useCallback(\n\t\t(names: string[]): number => {\n\t\t\tconst measureEl = measureRef.current;\n\t\t\tif (!measureEl || containerWidth === 0 || names.length === 0) {\n\t\t\t\treturn Math.min(names.length, FALLBACK_MAX_DISPLAYED);\n\t\t\t}\n\n\t\t\t// Available width for names (reserve space for \"+N\" if needed)\n\t\t\tconst availableWidth =\n\t\t\t\tnames.length > 1 ? containerWidth - PLUS_N_WIDTH : containerWidth;\n\n\t\t\tlet visibleCount = 0;\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\t\t\t\t// Measure each name by temporarily setting content\n\t\t\t\tmeasureEl.textContent = names.slice(0, i + 1).join(\", \");\n\t\t\t\tconst nameWidth = measureEl.offsetWidth;\n\n\t\t\t\tif (nameWidth <= availableWidth) {\n\t\t\t\t\tvisibleCount = i + 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If all names fit, return all\n\t\t\tif (visibleCount === names.length) {\n\t\t\t\treturn names.length;\n\t\t\t}\n\n\t\t\t// Return at least 1 name\n\t\t\treturn Math.max(1, visibleCount);\n\t\t},\n\t\t[containerWidth],\n\t);\n\n\tconst renderSelectedDeployments = () => {\n\t\tif (selectedDeploymentsSet.size === 0) {\n\t\t\treturn \"All deployments\";\n\t\t}\n\n\t\tconst selectedDeploymentNames = selectedDeploymentsData\n\t\t\t.filter((deployment) => selectedDeploymentsSet.has(deployment.id))\n\t\t\t.map((deployment) => deployment.name);\n\n\t\tconst visibleCount = calculateVisibleCount(selectedDeploymentNames);\n\t\tconst visible = selectedDeploymentNames.slice(0, visibleCount);\n\t\tconst extraCount = selectedDeploymentNames.length - visibleCount;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"flex flex-1 min-w-0 items-center gap-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t\t{/* Hidden element for measuring text width */}\n\t\t\t\t<div\n\t\t\t\t\tref={measureRef}\n\t\t\t\t\tclassName=\"absolute invisible whitespace-nowrap\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst filteredDeployments = useMemo(() => {\n\t\treturn deployments.filter(\n\t\t\t(deployment: Deployment) =>\n\t\t\t\t!deferredSearch ||\n\t\t\t\tdeployment.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deployments, deferredSearch]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\taria-label=\"Select deployments\"\n\t\t\t\tselected={selectedDeploymentsSet.size === 0}\n\t\t\t>\n\t\t\t\t{renderSelectedDeployments()}\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 deployments...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No deployments found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\taria-label=\"All deployments\"\n\t\t\t\t\t\t\tonSelect={handleClearAll}\n\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\tvalue=\"__all__\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Checkbox checked={selectedDeploymentsSet.size === 0} />\n\t\t\t\t\t\t\tAll deployments\n\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t{filteredDeployments.map((deployment: Deployment) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={deployment.id}\n\t\t\t\t\t\t\t\taria-label={deployment.name}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelectDeployment(deployment.id)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deployment.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Checkbox checked={selectedDeploymentsSet.has(deployment.id)} />\n\t\t\t\t\t\t\t\t{deployment.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 { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FormControl, FormField, FormItem } from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst POSTURE_OPTIONS = [\n\t{ value: \"Reactive\", label: \"Enters\" },\n\t{ value: \"Proactive\", label: \"Stays in\" },\n] as const;\n\nconst DEFAULT_PROACTIVE_WITHIN = 30;\n\nexport const PostureSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"trigger.posture\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={(value: \"Reactive\" | \"Proactive\") => {\n\t\t\t\t\t\t\t\tconst previousPosture = field.value;\n\t\t\t\t\t\t\t\tfield.onChange(value);\n\n\t\t\t\t\t\t\t\t// Move state values between expect and after when posture changes\n\t\t\t\t\t\t\t\t// Reactive uses \"expect\", Proactive uses \"after\"\n\t\t\t\t\t\t\t\tif (previousPosture === \"Reactive\" && value === \"Proactive\") {\n\t\t\t\t\t\t\t\t\t// Moving from Reactive to Proactive: move expect to after\n\t\t\t\t\t\t\t\t\tconst expectValues = form.getValues(\"trigger.expect\") ?? [];\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.after\", expectValues);\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.expect\", []);\n\t\t\t\t\t\t\t\t\t// Set a default within value if it's 0\n\t\t\t\t\t\t\t\t\tconst currentWithin = form.getValues(\"trigger.within\");\n\t\t\t\t\t\t\t\t\tif (currentWithin === 0) {\n\t\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.within\", DEFAULT_PROACTIVE_WITHIN);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tpreviousPosture === \"Proactive\" &&\n\t\t\t\t\t\t\t\t\tvalue === \"Reactive\"\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// Moving from Proactive to Reactive: move after to expect\n\t\t\t\t\t\t\t\t\tconst afterValues = form.getValues(\"trigger.after\") ?? [];\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.expect\", afterValues);\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.after\", []);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger aria-label=\"select posture\" className=\"w-[160px]\">\n\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select posture\" />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t{POSTURE_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { AutomationDeploymentCombobox } from \"./automation-deployment-combobox\";\nimport { PostureSelect } from \"./posture-select\";\n\nconst SECONDS_IN_DAY = 86400;\nconst MAX_WITHIN_SECONDS = 30 * SECONDS_IN_DAY;\n\nconst DEPLOYMENT_STATUSES = [\n\t{ value: \"prefect.deployment.ready\", label: \"Ready\" },\n\t{ value: \"prefect.deployment.not-ready\", label: \"Not Ready\" },\n\t{ value: \"prefect.deployment.disabled\", label: \"Disabled\" },\n];\n\nconst DEPLOYMENT_RESOURCE_PREFIX = \"prefect.deployment.\";\nconst ALL_DEPLOYMENTS_PATTERN = \"prefect.deployment.*\";\n\nconst extractDeploymentIds = (\n\tmatchValue: string | string[] | undefined,\n): string[] => {\n\tif (!matchValue) return [];\n\tconst values = Array.isArray(matchValue) ? matchValue : [matchValue];\n\treturn values\n\t\t.filter((v) => v !== ALL_DEPLOYMENTS_PATTERN)\n\t\t.map((v) => v.replace(DEPLOYMENT_RESOURCE_PREFIX, \"\"));\n};\n\nconst buildMatchPattern = (deploymentIds: string[]): string | string[] => {\n\tif (deploymentIds.length === 0) {\n\t\treturn ALL_DEPLOYMENTS_PATTERN;\n\t}\n\treturn deploymentIds.map((id) => `${DEPLOYMENT_RESOURCE_PREFIX}${id}`);\n};\n\nexport const DeploymentStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\tconst matchValue = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t});\n\n\tconst selectedDeploymentIds = useMemo(() => {\n\t\tconst match = matchValue as Record<string, string | string[]> | undefined;\n\t\tconst resourceId = match?.[\"prefect.resource.id\"];\n\t\treturn extractDeploymentIds(resourceId);\n\t}, [matchValue]);\n\n\tconst handleDeploymentIdsChange = useCallback(\n\t\t(deploymentIds: string[]) => {\n\t\t\tconst currentMatch = form.getValues(\"trigger.match\") ?? {};\n\t\t\tform.setValue(\"trigger.match\", {\n\t\t\t\t...currentMatch,\n\t\t\t\t\"prefect.resource.id\": buildMatchPattern(deploymentIds),\n\t\t\t});\n\t\t},\n\t\t[form],\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Deployments</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<AutomationDeploymentCombobox\n\t\t\t\t\t\tselectedDeploymentIds={selectedDeploymentIds}\n\t\t\t\t\t\tonSelectDeploymentIds={handleDeploymentIdsChange}\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Deployment</FormLabel>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"grid gap-2\"\n\t\t\t\t\tstyle={{ gridTemplateColumns: \"10rem 1fr\" }}\n\t\t\t\t>\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.expect\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst selectedStatus = field.value?.[0];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\tvalue={selectedStatus ?? \"\"}\n\t\t\t\t\t\t\t\t\tonValueChange={(value) => field.onChange([value])}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<SelectTrigger className=\"w-full\">\n\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t{DEPLOYMENT_STATUSES.map((status) => (\n\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t\t\t\t\t\t\t{status.label}\n\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Within</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={10}\n\t\t\t\t\t\t\t\t\tmax={MAX_WITHIN_SECONDS}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nconst MAX_VISIBLE_FLOWS = 2;\n\ntype FlowMultiSelectProps = {\n\tselectedFlowIds: string[];\n\tonToggleFlow: (flowId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function FlowMultiSelect({\n\tselectedFlowIds,\n\tonToggleFlow,\n\temptyMessage = \"Any flow\",\n}: FlowMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: flows = [] } = useQuery(\n\t\tbuildListFlowsQuery({\n\t\t\tflows: deferredSearch\n\t\t\t\t? {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { like_: deferredSearch },\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst { data: selectedFlowsData = [] } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows:\n\t\t\t\t\tselectedFlowIds.length > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tid: { any_: selectedFlowIds },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\tlimit: selectedFlowIds.length || 1,\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: selectedFlowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst filteredFlows = useMemo(() => {\n\t\treturn flows.filter(\n\t\t\t(flow: Flow) =>\n\t\t\t\t!deferredSearch ||\n\t\t\t\tflow.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [flows, deferredSearch]);\n\n\tconst renderSelectedFlows = () => {\n\t\tif (selectedFlowIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedFlowNames = selectedFlowsData\n\t\t\t.filter((flow) => selectedFlowIds.includes(flow.id))\n\t\t\t.map((flow) => flow.name);\n\n\t\tconst visibleNames = selectedFlowNames.slice(0, MAX_VISIBLE_FLOWS);\n\t\tconst overflow = selectedFlowIds.length - visibleNames.length;\n\n\t\treturn (\n\t\t\t<div className=\"flex min-w-0 items-center justify-start gap-1\">\n\t\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t\t{visibleNames.join(\", \")}\n\t\t\t\t</span>\n\t\t\t\t{overflow > 0 && (\n\t\t\t\t\t<span className=\"shrink-0 text-muted-foreground\">+{overflow}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedFlowIds.length > 0}>\n\t\t\t\t{renderSelectedFlows()}\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 flows...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No flows found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredFlows.map((flow: Flow) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={flow.id}\n\t\t\t\t\t\t\t\tselected={selectedFlowIds.includes(flow.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleFlow(flow.id);\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\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={flow.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{flow.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 { useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\tSTATE_NAME_TO_TYPE,\n\tSTATE_NAMES,\n\tSTATE_NAMES_WITHOUT_SCHEDULED,\n\ttype StateName,\n} from \"@/api/flow-runs/constants\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\nconst ALL_RUN_STATES = \"All run states\";\nconst ALL_EXCEPT_SCHEDULED = \"All except scheduled\";\n\ntype StateMultiSelectProps = {\n\tselectedStates: StateName[];\n\tonStateChange: (states: StateName[]) => void;\n\temptyMessage?: string;\n};\n\nfunction isAllExceptScheduled(states: StateName[]): boolean {\n\tif (states.length !== STATE_NAMES.length - 1) return false;\n\treturn !states.includes(\"Scheduled\");\n}\n\nexport function StateMultiSelect({\n\tselectedStates,\n\tonStateChange,\n\temptyMessage = \"Any state\",\n}: StateMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst displayValue = useMemo(() => {\n\t\tif (selectedStates.length === 0) {\n\t\t\treturn ALL_RUN_STATES;\n\t\t}\n\t\tif (isAllExceptScheduled(selectedStates)) {\n\t\t\treturn ALL_EXCEPT_SCHEDULED;\n\t\t}\n\t\treturn selectedStates;\n\t}, [selectedStates]);\n\n\tconst filteredStates = useMemo(() => {\n\t\tconst lowerSearch = deferredSearch.toLowerCase();\n\t\treturn STATE_NAMES.filter((name) =>\n\t\t\tname.toLowerCase().includes(lowerSearch),\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst showConvenienceOptions = useMemo(() => {\n\t\tconst lowerSearch = deferredSearch.toLowerCase();\n\t\treturn (\n\t\t\tALL_RUN_STATES.toLowerCase().includes(lowerSearch) ||\n\t\t\tALL_EXCEPT_SCHEDULED.toLowerCase().includes(lowerSearch)\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst handleConvenienceSelect = (option: string) => {\n\t\tif (option === ALL_RUN_STATES) {\n\t\t\tonStateChange([]);\n\t\t} else if (option === ALL_EXCEPT_SCHEDULED) {\n\t\t\tonStateChange([...STATE_NAMES_WITHOUT_SCHEDULED]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\tconst handleStateToggle = (stateName: StateName) => {\n\t\tif (selectedStates.includes(stateName)) {\n\t\t\tonStateChange(selectedStates.filter((s) => s !== stateName));\n\t\t} else {\n\t\t\tonStateChange([...selectedStates, stateName]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\tconst renderSelectedStates = () => {\n\t\tif (displayValue === ALL_RUN_STATES) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tif (displayValue === ALL_EXCEPT_SCHEDULED) {\n\t\t\treturn <span>All except scheduled</span>;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{selectedStates.map((stateName) => (\n\t\t\t\t\t<StateBadge\n\t\t\t\t\t\tkey={stateName}\n\t\t\t\t\t\ttype={STATE_NAME_TO_TYPE[stateName]}\n\t\t\t\t\t\tname={stateName}\n\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedStates.length > 0}>\n\t\t\t\t{renderSelectedStates()}\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 states...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No state found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{showConvenienceOptions && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tselected={displayValue === ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleConvenienceSelect(ALL_RUN_STATES)}\n\t\t\t\t\t\t\t\t\tvalue={ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tAll run states\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tselected={displayValue === ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleConvenienceSelect(ALL_EXCEPT_SCHEDULED)}\n\t\t\t\t\t\t\t\t\tvalue={ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tAll except scheduled\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredStates.map((stateName) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={stateName}\n\t\t\t\t\t\t\t\tselected={selectedStates.includes(stateName)}\n\t\t\t\t\t\t\t\tonSelect={() => handleStateToggle(stateName)}\n\t\t\t\t\t\t\t\tvalue={stateName}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\ttype={STATE_NAME_TO_TYPE[stateName]}\n\t\t\t\t\t\t\t\t\tname={stateName}\n\t\t\t\t\t\t\t\t/>\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 { useFormContext, useWatch } from \"react-hook-form\";\nimport type { StateName } from \"@/api/flow-runs/constants\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FlowMultiSelect } from \"@/components/flows/flow-multi-select\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { PostureSelect } from \"./posture-select\";\nimport { StateMultiSelect } from \"./state-multi-select\";\n\ntype MatchRelated = Record<string, string | string[]> | undefined;\n\n// Convert state names to event strings (e.g., \"Completed\" -> \"prefect.flow-run.Completed\")\n// When no states selected, returns wildcard [\"prefect.flow-run.*\"] (Vue behavior)\nfunction toStateNameEvents(stateNames: StateName[]): string[] {\n\tif (stateNames.length === 0) {\n\t\treturn [\"prefect.flow-run.*\"];\n\t}\n\treturn stateNames.map((name) => `prefect.flow-run.${name}`);\n}\n\n// Convert event strings back to state names (e.g., \"prefect.flow-run.Completed\" -> \"Completed\")\n// Wildcard \"prefect.flow-run.*\" returns empty array (means \"any state\")\nfunction fromStateNameEvents(events: string[] | undefined): StateName[] {\n\tif (!events || events.length === 0) {\n\t\treturn [];\n\t}\n\tif (events.includes(\"prefect.flow-run.*\")) {\n\t\treturn [];\n\t}\n\treturn events\n\t\t.filter((event) => event.startsWith(\"prefect.flow-run.\"))\n\t\t.map((event) => event.replace(\"prefect.flow-run.\", \"\") as StateName);\n}\n\nfunction extractFlowIdsFromMatchRelated(matchRelated: MatchRelated): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.flow.\"))\n\t\t.map((id) => id.replace(\"prefect.flow.\", \"\"));\n}\n\nfunction extractTagsFromMatchRelated(matchRelated: MatchRelated): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.tag.\"))\n\t\t.map((id) => id.replace(\"prefect.tag.\", \"\"));\n}\n\nfunction buildMatchRelated(flowIds: string[], tags: string[]): MatchRelated {\n\tconst flowResourceIds = flowIds.map((id) => `prefect.flow.${id}`);\n\tconst tagResourceIds = tags.map((tag) => `prefect.tag.${tag}`);\n\n\t// Return empty object when no flows/tags selected (matches Vue behavior)\n\tif (flowResourceIds.length === 0 && tagResourceIds.length === 0) {\n\t\treturn {};\n\t}\n\n\t// Set role based on which type is selected (Vue behavior)\n\t// Since tags are hidden when flows are selected, only one type will be present\n\tconst role = flowResourceIds.length > 0 ? \"flow\" : \"tag\";\n\tconst resourceIds = [...flowResourceIds, ...tagResourceIds];\n\n\treturn {\n\t\t\"prefect.resource.role\": role,\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nexport const FlowRunStateTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\t// Determine which field to use based on posture\n\t// Reactive: use \"expect\" (states to enter)\n\t// Proactive: use \"after\" (states to stay in)\n\tconst stateFieldName =\n\t\tposture === \"Proactive\" ? \"trigger.after\" : \"trigger.expect\";\n\n\tconst matchRelated = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match_related\",\n\t}) as MatchRelated;\n\n\tconst selectedFlowIds = extractFlowIdsFromMatchRelated(matchRelated);\n\tconst selectedTags = extractTagsFromMatchRelated(matchRelated);\n\n\tconst handleFlowToggle = (flowId: string) => {\n\t\tconst currentFlowIds = selectedFlowIds;\n\t\tconst newFlowIds = currentFlowIds.includes(flowId)\n\t\t\t? currentFlowIds.filter((id) => id !== flowId)\n\t\t\t: [...currentFlowIds, flowId];\n\n\t\t// Clear tags when flows are selected (Vue behavior)\n\t\tconst newTags = newFlowIds.length > 0 ? [] : selectedTags;\n\t\tform.setValue(\n\t\t\t\"trigger.match_related\",\n\t\t\tbuildMatchRelated(newFlowIds, newTags),\n\t\t);\n\t};\n\n\tconst handleTagsChange = (tags: string[]) => {\n\t\tform.setValue(\n\t\t\t\"trigger.match_related\",\n\t\t\tbuildMatchRelated(selectedFlowIds, tags),\n\t\t);\n\t};\n\n\t// Hide tags input when flows are selected (Vue behavior)\n\tconst showTagsInput = selectedFlowIds.length === 0;\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Flows</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<FlowMultiSelect\n\t\t\t\t\t\tselectedFlowIds={selectedFlowIds}\n\t\t\t\t\t\tonToggleFlow={handleFlowToggle}\n\t\t\t\t\t\temptyMessage=\"All flows\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t{showTagsInput && (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>Flow Run Tags</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<TagsInput\n\t\t\t\t\t\t\tvalue={selectedTags}\n\t\t\t\t\t\t\tonChange={handleTagsChange}\n\t\t\t\t\t\t\tplaceholder=\"All tags\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Flow Run</FormLabel>\n\t\t\t\t<div className=\"grid grid-cols-[10rem_1fr] gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname={stateFieldName}\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\t// Convert event strings to state names for UI display\n\t\t\t\t\t\t\tconst eventStrings = field.value ?? [];\n\t\t\t\t\t\t\tconst selectedStates = fromStateNameEvents(eventStrings);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<StateMultiSelect\n\t\t\t\t\t\t\t\t\t\tselectedStates={selectedStates}\n\t\t\t\t\t\t\t\t\t\tonStateChange={(states) => {\n\t\t\t\t\t\t\t\t\t\t\t// Convert state names to event strings for storage\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange(toStateNameEvents(states));\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\temptyMessage=\"Any state\"\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);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import type { ReactNode } from \"react\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\nexport type FormMode = \"Form\" | \"JSON\";\n\ntype FormModeToggleProps = {\n\tdefaultValue?: FormMode;\n\t/** Controlled value - when provided, the component becomes controlled */\n\tvalue?: FormMode;\n\t/** Callback when the mode changes - required for controlled mode */\n\tonValueChange?: (value: FormMode) => void;\n\tformContent: ReactNode;\n\tjsonContent: ReactNode;\n};\n\nexport const FormModeToggle = ({\n\tdefaultValue = \"Form\",\n\tvalue,\n\tonValueChange,\n\tformContent,\n\tjsonContent,\n}: FormModeToggleProps) => {\n\t// When value is provided, use controlled mode; otherwise use uncontrolled mode\n\tconst tabsProps =\n\t\tvalue !== undefined\n\t\t\t? { value, onValueChange: onValueChange as (value: string) => void }\n\t\t\t: { defaultValue };\n\n\treturn (\n\t\t<Tabs {...tabsProps}>\n\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t<TabsList>\n\t\t\t\t\t<TabsTrigger value=\"Form\">Form</TabsTrigger>\n\t\t\t\t\t<TabsTrigger value=\"JSON\">JSON</TabsTrigger>\n\t\t\t\t</TabsList>\n\t\t\t</div>\n\t\t\t<TabsContent value=\"Form\">{formContent}</TabsContent>\n\t\t\t<TabsContent value=\"JSON\">{jsonContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n","import { useState } from \"react\";\nimport { z } from \"zod\";\nimport { TriggerSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport type { JsonInputOnChange } from \"@/components/ui/json-input\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Label } from \"@/components/ui/label\";\n\ntype TriggerJsonInputProps = {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\terror?: string;\n};\n\nexport const TriggerJsonInput = ({\n\tvalue,\n\tonChange,\n\terror,\n}: TriggerJsonInputProps) => {\n\tconst [localError, setLocalError] = useState<string | null>(null);\n\n\tconst formatJson = () => {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(value);\n\t\t\tonChange(JSON.stringify(parsed, null, 2));\n\t\t} catch {\n\t\t\t// Invalid JSON, do nothing\n\t\t}\n\t};\n\n\tconst validate = (json: string): boolean => {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(json);\n\t\t\tTriggerSchema.parse(parsed);\n\t\t\tsetLocalError(null);\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\tif (e instanceof SyntaxError) {\n\t\t\t\tsetLocalError(\"Invalid JSON syntax\");\n\t\t\t} else if (e instanceof z.ZodError) {\n\t\t\t\tsetLocalError(e.errors[0]?.message ?? \"Invalid trigger configuration\");\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Label>Trigger Configuration</Label>\n\t\t\t\t<Button variant=\"ghost\" size=\"sm\" onClick={formatJson}>\n\t\t\t\t\tFormat\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\tEdit the trigger configuration as JSON.{\" \"}\n\t\t\t\t<a\n\t\t\t\t\thref=\"https://docs.prefect.io/v3/automate/events/automations-triggers\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclassName=\"underline hover:text-foreground\"\n\t\t\t\t>\n\t\t\t\t\tView documentation\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t\t<JsonInput\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={onChange as JsonInputOnChange}\n\t\t\t\tonBlur={() => validate(value)}\n\t\t\t/>\n\t\t\t{(localError || error) && (\n\t\t\t\t<p className=\"text-sm text-destructive\">{localError || error}</p>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FormControl, FormField, FormItem } from \"@/components/ui/form\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst TEMPLATE_TRIGGERS = {\n\t\"deployment-status\": \"Deployment status\",\n\t\"flow-run-state\": \"Flow run state\",\n\t\"work-pool-status\": \"Work pool status\",\n\t\"work-queue-status\": \"Work queue status\",\n\tcustom: \"Custom\",\n} as const;\n\nexport type TemplateTriggers = keyof typeof TEMPLATE_TRIGGERS;\n\n// Type alias for consistency with ticket specification\nexport type TriggerTemplate = TemplateTriggers;\n\ntype AutomationsTriggerTemplateSelectProps = {\n\tonValueChange: (value: TemplateTriggers) => void;\n\tvalue?: TemplateTriggers;\n};\n\nexport const AutomationsTriggerTemplateSelect = ({\n\tonValueChange,\n\tvalue,\n}: AutomationsTriggerTemplateSelectProps) => {\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t<Label htmlFor=\"automations-trigger-template-select\">\n\t\t\t\tTrigger Template\n\t\t\t</Label>\n\t\t\t<Select value={value} onValueChange={onValueChange}>\n\t\t\t\t<SelectTrigger\n\t\t\t\t\tid=\"automations-trigger-template-select\"\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t>\n\t\t\t\t\t<SelectValue placeholder=\"Select template\" />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t{Object.keys(TEMPLATE_TRIGGERS).map((key) => (\n\t\t\t\t\t\t\t<SelectItem key={key} value={key}>\n\t\t\t\t\t\t\t\t{TEMPLATE_TRIGGERS[key as TemplateTriggers]}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectGroup>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n};\n\ntype TriggerTemplateSelectFieldProps = {\n\tonTemplateChange?: (template: TriggerTemplate) => void;\n};\n\nexport const TriggerTemplateSelectField = ({\n\tonTemplateChange,\n}: TriggerTemplateSelectFieldProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"triggerTemplate\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<AutomationsTriggerTemplateSelect\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\tonTemplateChange?.(value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import type { EventTrigger } from \"@/components/automations/automations-wizard/automation-schema\";\nimport type { TriggerTemplate } from \"@/components/automations/automations-wizard/automations-trigger-template-select\";\n\nconst BASE_TRIGGER: EventTrigger = {\n\ttype: \"event\",\n\tposture: \"Reactive\",\n\tthreshold: 1,\n\twithin: 0,\n};\n\nexport const getDefaultTriggerForTemplate = (\n\ttemplate: TriggerTemplate,\n): EventTrigger => {\n\tswitch (template) {\n\t\tcase \"flow-run-state\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.flow-run.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.flow-run.*\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"deployment-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.deployment.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.deployment.not-ready\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"work-pool-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.work-pool.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\n\t\t\t\t\t\"prefect.work-pool.not-ready\",\n\t\t\t\t\t// compatibility with old event name\n\t\t\t\t\t\"prefect.work-pool.not_ready\",\n\t\t\t\t],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"work-queue-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.work-queue.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.work-queue.not-ready\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"custom\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\t// Include sensible defaults so users see a working example\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": [\"prefect.flow-run.*\"] },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.flow-run.Failed\"],\n\t\t\t\tfor_each: [],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 5,\n\t\t\t\twithin: 60,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn BASE_TRIGGER;\n\t}\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } 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\n// Show all selected work pool names and let CSS truncation handle overflow\n\ntype WorkPoolMultiSelectProps = {\n\tselectedWorkPoolIds: string[];\n\tonToggleWorkPool: (workPoolId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function WorkPoolMultiSelect({\n\tselectedWorkPoolIds,\n\tonToggleWorkPool,\n\temptyMessage = \"All work pools\",\n}: WorkPoolMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workPools = [] } = useQuery(buildFilterWorkPoolsQuery());\n\n\t// Filter to only show work pools with a status (excluding push/agent pools)\n\t// and apply search filter\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools\n\t\t\t.filter((workPool: WorkPool) => workPool.status !== null)\n\t\t\t.filter(\n\t\t\t\t(workPool: WorkPool) =>\n\t\t\t\t\t!deferredSearch ||\n\t\t\t\t\tworkPool.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t\t);\n\t}, [workPools, deferredSearch]);\n\n\t// Get selected work pools data for display\n\tconst selectedWorkPoolsData = useMemo(() => {\n\t\treturn workPools.filter((workPool: WorkPool) =>\n\t\t\tselectedWorkPoolIds.includes(workPool.id),\n\t\t);\n\t}, [workPools, selectedWorkPoolIds]);\n\n\tconst renderSelectedWorkPools = () => {\n\t\tif (selectedWorkPoolIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkPoolNames = selectedWorkPoolsData.map(\n\t\t\t(workPool) => workPool.name,\n\t\t);\n\n\t\t// Show all names and let CSS truncation handle overflow\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkPoolNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkPoolIds.length > 0}>\n\t\t\t\t{renderSelectedWorkPools()}\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 work pools...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work pools found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredWorkPools.map((workPool: 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={selectedWorkPoolIds.includes(workPool.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleWorkPool(workPool.id);\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\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={workPool.id}\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 { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { WorkPoolMultiSelect } from \"@/components/work-pools/work-pool-multi-select\";\nimport { PostureSelect } from \"./posture-select\";\n\n// Status options with their corresponding event arrays (matching Vue implementation)\n// \"not_ready\" maps to two events for backwards compatibility\nconst WORK_POOL_STATUSES = [\n\t{ value: \"ready\", label: \"Ready\", events: [\"prefect.work-pool.ready\"] },\n\t{\n\t\tvalue: \"not_ready\",\n\t\tlabel: \"Not Ready\",\n\t\tevents: [\"prefect.work-pool.not-ready\", \"prefect.work-pool.not_ready\"],\n\t},\n\t{ value: \"paused\", label: \"Paused\", events: [\"prefect.work-pool.paused\"] },\n] as const;\n\n// Get status value from events array (for reading from form state)\nfunction getStatusFromEvents(events: string[] | undefined): string {\n\tif (!events || events.length === 0) return \"not_ready\";\n\n\tfor (const status of WORK_POOL_STATUSES) {\n\t\tif (status.events.some((e) => events.includes(e))) {\n\t\t\treturn status.value;\n\t\t}\n\t}\n\treturn \"not_ready\";\n}\n\n// Get events for a status value\nfunction getEventsForStatus(statusValue: string): string[] {\n\tconst status = WORK_POOL_STATUSES.find((s) => s.value === statusValue);\n\treturn status ? [...status.events] : [];\n}\n\n// Get events for all statuses EXCEPT the given one (for Proactive expect)\nfunction getEventsExceptStatus(statusValue: string): string[] {\n\treturn WORK_POOL_STATUSES.filter((s) => s.value !== statusValue).flatMap(\n\t\t(s) => [...s.events],\n\t);\n}\n\ntype Match = Record<string, string | string[]> | undefined;\n\n// Extract work pool IDs from match['prefect.resource.id']\n// Returns empty array for wildcard \"prefect.work-pool.*\" (meaning \"all work pools\")\nfunction extractWorkPoolIdsFromMatch(match: Match): string[] {\n\tif (!match) return [];\n\n\tconst resourceIds = match[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\t// Handle wildcard case - \"all work pools\" means no specific pools selected\n\tif (resourceIds === \"prefect.work-pool.*\") return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter(\n\t\t\t(id) =>\n\t\t\t\tid.startsWith(\"prefect.work-pool.\") && id !== \"prefect.work-pool.*\",\n\t\t)\n\t\t.map((id) => id.replace(\"prefect.work-pool.\", \"\"));\n}\n\n// Build match object with work pool IDs\nfunction buildMatch(workPoolIds: string[]): Match {\n\tif (workPoolIds.length === 0) {\n\t\treturn {\n\t\t\t\"prefect.resource.id\": \"prefect.work-pool.*\",\n\t\t};\n\t}\n\n\treturn {\n\t\t\"prefect.resource.id\": workPoolIds.map((id) => `prefect.work-pool.${id}`),\n\t};\n}\n\n// Status select component that handles posture-dependent behavior\nconst StatusSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\tconst expect = useWatch<AutomationWizardSchema>({ name: \"trigger.expect\" }) as\n\t\t| string[]\n\t\t| undefined;\n\tconst after = useWatch<AutomationWizardSchema>({ name: \"trigger.after\" }) as\n\t\t| string[]\n\t\t| undefined;\n\n\t// Get current status based on posture\n\t// Reactive: status is in expect, Proactive: status is in after\n\tconst currentStatus =\n\t\tposture === \"Proactive\"\n\t\t\t? getStatusFromEvents(after)\n\t\t\t: getStatusFromEvents(expect);\n\n\tconst handleStatusChange = (statusValue: string) => {\n\t\tconst statusEvents = getEventsForStatus(statusValue);\n\t\tconst otherStatusEvents = getEventsExceptStatus(statusValue);\n\n\t\tif (posture === \"Proactive\") {\n\t\t\t// Proactive: selected status goes to \"after\", other statuses go to \"expect\"\n\t\t\tform.setValue(\"trigger.after\", statusEvents);\n\t\t\tform.setValue(\"trigger.expect\", otherStatusEvents);\n\t\t} else {\n\t\t\t// Reactive: selected status goes to \"expect\", \"after\" is empty\n\t\t\tform.setValue(\"trigger.expect\", statusEvents);\n\t\t\tform.setValue(\"trigger.after\", []);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Select value={currentStatus} onValueChange={handleStatusChange}>\n\t\t\t<SelectTrigger aria-label=\"select status\" className=\"min-w-0 flex-1\">\n\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{WORK_POOL_STATUSES.map((status) => (\n\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t{status.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nexport const WorkPoolStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\tconst match = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t}) as Match;\n\n\tconst selectedWorkPoolIds = extractWorkPoolIdsFromMatch(match);\n\n\tconst handleWorkPoolToggle = (workPoolId: string) => {\n\t\tconst currentWorkPoolIds = selectedWorkPoolIds;\n\t\tconst newWorkPoolIds = currentWorkPoolIds.includes(workPoolId)\n\t\t\t? currentWorkPoolIds.filter((id) => id !== workPoolId)\n\t\t\t: [...currentWorkPoolIds, workPoolId];\n\n\t\tform.setValue(\"trigger.match\", buildMatch(newWorkPoolIds));\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pools</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkPoolMultiSelect\n\t\t\t\t\t\tselectedWorkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\tonToggleWorkPool={handleWorkPoolToggle}\n\t\t\t\t\t\temptyMessage=\"All work pools\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pool</FormLabel>\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<StatusSelect />\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 30}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } 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 WorkPoolsComboboxProps = {\n\tselectedWorkPoolIds: string[];\n\tonToggleWorkPool: (workPoolId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function WorkPoolsCombobox({\n\tselectedWorkPoolIds,\n\tonToggleWorkPool,\n\temptyMessage = \"All work pools\",\n}: WorkPoolsComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workPools = [] } = useQuery(\n\t\tbuildFilterWorkPoolsQuery({\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools.filter((workPool: WorkPool) => {\n\t\t\tif (!workPool.status) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!deferredSearch) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn workPool.name.toLowerCase().includes(deferredSearch.toLowerCase());\n\t\t});\n\t}, [workPools, deferredSearch]);\n\n\tconst renderSelectedWorkPools = () => {\n\t\tif (selectedWorkPoolIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkPoolNames = workPools\n\t\t\t.filter((workPool) => selectedWorkPoolIds.includes(workPool.id))\n\t\t\t.map((workPool) => workPool.name);\n\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkPoolNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkPoolIds.length > 0}>\n\t\t\t\t{renderSelectedWorkPools()}\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 work pools...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work pools found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredWorkPools.map((workPool: 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={selectedWorkPoolIds.includes(workPool.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleWorkPool(workPool.id);\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\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={workPool.id}\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 { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkQueuesQuery, type WorkQueue } from \"@/api/work-queues\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\ntype WorkQueuesComboboxProps = {\n\tselectedWorkQueueIds: string[];\n\tonToggleWorkQueue: (workQueueId: string) => void;\n\tworkPoolIds?: string[];\n\temptyMessage?: string;\n};\n\nexport function WorkQueuesCombobox({\n\tselectedWorkQueueIds,\n\tonToggleWorkQueue,\n\tworkPoolIds = [],\n\temptyMessage = \"All work queues\",\n}: WorkQueuesComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workQueues = [] } = useQuery(\n\t\tbuildFilterWorkQueuesQuery({\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkQueues = useMemo(() => {\n\t\treturn workQueues.filter((workQueue: WorkQueue) => {\n\t\t\t// Filter by work pool IDs if specified\n\t\t\tif (\n\t\t\t\tworkPoolIds.length > 0 &&\n\t\t\t\t(!workQueue.work_pool_id ||\n\t\t\t\t\t!workPoolIds.includes(workQueue.work_pool_id))\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!deferredSearch) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn workQueue.name\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(deferredSearch.toLowerCase());\n\t\t});\n\t}, [workQueues, workPoolIds, deferredSearch]);\n\n\t// Group work queues by work pool name\n\tconst groupedWorkQueues = useMemo(() => {\n\t\tconst groups: Record<string, WorkQueue[]> = {};\n\n\t\tfor (const workQueue of filteredWorkQueues) {\n\t\t\tconst poolName = workQueue.work_pool_name ?? \"Unknown\";\n\t\t\tif (!groups[poolName]) {\n\t\t\t\tgroups[poolName] = [];\n\t\t\t}\n\t\t\tgroups[poolName].push(workQueue);\n\t\t}\n\n\t\t// Sort groups by pool name and sort queues within each group by name\n\t\tconst sortedGroupNames = Object.keys(groups).sort((a, b) =>\n\t\t\ta.localeCompare(b),\n\t\t);\n\n\t\treturn sortedGroupNames.map((poolName) => ({\n\t\t\tpoolName,\n\t\t\tqueues: groups[poolName].sort((a, b) => a.name.localeCompare(b.name)),\n\t\t}));\n\t}, [filteredWorkQueues]);\n\n\tconst renderSelectedWorkQueues = () => {\n\t\tif (selectedWorkQueueIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkQueueNames = workQueues\n\t\t\t.filter((workQueue) => selectedWorkQueueIds.includes(workQueue.id))\n\t\t\t.map((workQueue) => workQueue.name);\n\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkQueueNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkQueueIds.length > 0}>\n\t\t\t\t{renderSelectedWorkQueues()}\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 work queues...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work queues found</ComboboxCommandEmtpy>\n\t\t\t\t\t{groupedWorkQueues.map((group) => (\n\t\t\t\t\t\t<ComboboxCommandGroup key={group.poolName} heading={group.poolName}>\n\t\t\t\t\t\t\t{group.queues.map((workQueue: WorkQueue) => (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={workQueue.id}\n\t\t\t\t\t\t\t\t\tselected={selectedWorkQueueIds.includes(workQueue.id)}\n\t\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\t\tonToggleWorkQueue(workQueue.id);\n\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\tvalue={workQueue.id}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{workQueue.name}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t))}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { PostureSelect } from \"./posture-select\";\nimport { WorkPoolsCombobox } from \"./work-pools-combobox\";\nimport { WorkQueuesCombobox } from \"./work-queues-combobox\";\n\nconst WORK_QUEUE_STATUSES = [\n\t{ value: \"prefect.work-queue.ready\", label: \"Ready\" },\n\t{ value: \"prefect.work-queue.not-ready\", label: \"Not Ready\" },\n\t{ value: \"prefect.work-queue.paused\", label: \"Paused\" },\n];\n\ntype MatchRelated = Record<string, string | string[]> | undefined;\ntype Match = Record<string, string | string[]> | undefined;\n\nfunction extractWorkPoolIdsFromMatchRelated(\n\tmatchRelated: MatchRelated,\n): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.work-pool.\"))\n\t\t.map((id) => id.replace(\"prefect.work-pool.\", \"\"));\n}\n\nfunction extractWorkQueueIdsFromMatch(match: Match): string[] {\n\tif (!match) return [];\n\n\tconst resourceIds = match[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\n\tif (ids.includes(\"prefect.work-queue.*\")) {\n\t\treturn [];\n\t}\n\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.work-queue.\"))\n\t\t.map((id) => id.replace(\"prefect.work-queue.\", \"\"));\n}\n\nfunction buildMatchRelated(workPoolIds: string[]): MatchRelated {\n\tif (workPoolIds.length === 0) {\n\t\treturn {};\n\t}\n\n\tconst resourceIds = workPoolIds.map((id) => `prefect.work-pool.${id}`);\n\n\treturn {\n\t\t\"prefect.resource.role\": \"work-pool\",\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nfunction buildMatch(workQueueIds: string[]): Match {\n\tif (workQueueIds.length === 0) {\n\t\treturn { \"prefect.resource.id\": \"prefect.work-queue.*\" };\n\t}\n\n\tconst resourceIds = workQueueIds.map((id) => `prefect.work-queue.${id}`);\n\n\treturn {\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nexport const WorkQueueStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\tconst matchRelated = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match_related\",\n\t}) as MatchRelated;\n\n\tconst match = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t}) as Match;\n\n\tconst selectedWorkPoolIds = extractWorkPoolIdsFromMatchRelated(matchRelated);\n\tconst selectedWorkQueueIds = extractWorkQueueIdsFromMatch(match);\n\n\tconst handleWorkPoolToggle = (workPoolId: string) => {\n\t\tconst currentWorkPoolIds = selectedWorkPoolIds;\n\t\tconst newWorkPoolIds = currentWorkPoolIds.includes(workPoolId)\n\t\t\t? currentWorkPoolIds.filter((id) => id !== workPoolId)\n\t\t\t: [...currentWorkPoolIds, workPoolId];\n\n\t\tform.setValue(\"trigger.match_related\", buildMatchRelated(newWorkPoolIds));\n\t};\n\n\tconst handleWorkQueueToggle = (workQueueId: string) => {\n\t\tconst currentWorkQueueIds = selectedWorkQueueIds;\n\t\tconst newWorkQueueIds = currentWorkQueueIds.includes(workQueueId)\n\t\t\t? currentWorkQueueIds.filter((id) => id !== workQueueId)\n\t\t\t: [...currentWorkQueueIds, workQueueId];\n\n\t\tform.setValue(\"trigger.match\", buildMatch(newWorkQueueIds));\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pools</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkPoolsCombobox\n\t\t\t\t\t\tselectedWorkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\tonToggleWorkPool={handleWorkPoolToggle}\n\t\t\t\t\t\temptyMessage=\"All work pools\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Queues</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkQueuesCombobox\n\t\t\t\t\t\tselectedWorkQueueIds={selectedWorkQueueIds}\n\t\t\t\t\t\tonToggleWorkQueue={handleWorkQueueToggle}\n\t\t\t\t\t\tworkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\temptyMessage=\"All work queues\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Queue</FormLabel>\n\t\t\t\t<div className=\"grid grid-cols-[10rem_1fr] gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.expect\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst selectedStatus = field.value?.[0];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\t\tvalue={selectedStatus ?? \"\"}\n\t\t\t\t\t\t\t\t\t\tonValueChange={(value) => field.onChange([value])}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SelectTrigger className=\"w-full\">\n\t\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t\t{WORK_QUEUE_STATUSES.map((status) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{status.label}\n\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))}\n\t\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n\ttype AutomationWizardSchema,\n\ttype Trigger,\n\tTriggerSchema,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\ttype TriggerTemplate,\n\tTriggerTemplateSelectField,\n} from \"@/components/automations/automations-wizard/automations-trigger-template-select\";\nimport { CustomTriggerFields } from \"./custom-trigger-fields\";\nimport { DeploymentStatusTriggerFields } from \"./deployment-status-trigger-fields\";\nimport { FlowRunStateTriggerFields } from \"./flow-run-state-trigger-fields\";\nimport { type FormMode, FormModeToggle } from \"./form-mode-toggle\";\nimport { TriggerJsonInput } from \"./trigger-json-input\";\nimport { getDefaultTriggerForTemplate } from \"./trigger-step-utils\";\nimport { WorkPoolStatusTriggerFields } from \"./work-pool-status-trigger-fields\";\nimport { WorkQueueStatusTriggerFields } from \"./work-queue-status-trigger-fields\";\n\nexport const TriggerStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst triggerTemplate = form.watch(\"triggerTemplate\");\n\tconst trigger = form.watch(\"trigger\");\n\n\tconst [mode, setMode] = useState<FormMode>(\"Form\");\n\tconst [jsonString, setJsonString] = useState<string>(\"\");\n\tconst [jsonError, setJsonError] = useState<string | undefined>(undefined);\n\n\t// Serialize trigger to JSON string\n\tconst serializeTrigger = useCallback(() => {\n\t\treturn JSON.stringify(trigger, null, 2);\n\t}, [trigger]);\n\n\t// Update jsonString when trigger changes (while in Form mode)\n\tuseEffect(() => {\n\t\tif (mode === \"Form\") {\n\t\t\tsetJsonString(serializeTrigger());\n\t\t}\n\t}, [mode, serializeTrigger]);\n\n\t// Validate and parse JSON string\n\tconst validateAndParseJson = useCallback(\n\t\t(json: string): { valid: boolean; trigger?: Trigger; error?: string } => {\n\t\t\ttry {\n\t\t\t\tconst parsed: unknown = JSON.parse(json);\n\t\t\t\tconst validatedTrigger = TriggerSchema.parse(parsed);\n\t\t\t\treturn { valid: true, trigger: validatedTrigger };\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof SyntaxError) {\n\t\t\t\t\treturn { valid: false, error: \"Invalid JSON syntax\" };\n\t\t\t\t}\n\t\t\t\tif (e instanceof z.ZodError) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terror: e.errors[0]?.message ?? \"Invalid trigger configuration\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn { valid: false, error: \"Unknown error\" };\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\t// Handle mode change with validation\n\tconst handleModeChange = useCallback(\n\t\t(newMode: FormMode) => {\n\t\t\tif (mode === newMode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (newMode === \"Form\") {\n\t\t\t\t// Switching from JSON to Form - validate and sync JSON to form\n\t\t\t\tconst result = validateAndParseJson(jsonString);\n\t\t\t\tif (!result.valid) {\n\t\t\t\t\tsetJsonError(result.error);\n\t\t\t\t\treturn; // Block switch if JSON is invalid\n\t\t\t\t}\n\t\t\t\t// Update form with parsed trigger\n\t\t\t\tif (result.trigger) {\n\t\t\t\t\tform.setValue(\"trigger\", result.trigger);\n\t\t\t\t}\n\t\t\t\tsetJsonError(undefined);\n\t\t\t} else {\n\t\t\t\t// Switching from Form to JSON - serialize current trigger\n\t\t\t\tsetJsonString(serializeTrigger());\n\t\t\t\tsetJsonError(undefined);\n\t\t\t}\n\n\t\t\tsetMode(newMode);\n\t\t},\n\t\t[mode, jsonString, validateAndParseJson, form, serializeTrigger],\n\t);\n\n\t// Handle JSON input changes - immediately sync valid JSON to form\n\tconst handleJsonChange = useCallback(\n\t\t(value: string) => {\n\t\t\tsetJsonString(value);\n\n\t\t\t// Try to parse and validate the JSON\n\t\t\tconst result = validateAndParseJson(value);\n\t\t\tif (result.valid && result.trigger) {\n\t\t\t\t// Valid JSON - sync to form immediately\n\t\t\t\tform.setValue(\"trigger\", result.trigger);\n\t\t\t\tsetJsonError(undefined);\n\t\t\t}\n\t\t\t// Don't set error on every keystroke - only on blur or mode switch\n\t\t},\n\t\t[validateAndParseJson, form],\n\t);\n\n\tconst handleTemplateChange = (value: TriggerTemplate) => {\n\t\tconst newTrigger = getDefaultTriggerForTemplate(value);\n\t\tform.setValue(\"trigger\", newTrigger);\n\t\t// Reset JSON string when template changes\n\t\tsetJsonString(JSON.stringify(newTrigger, null, 2));\n\t\tsetJsonError(undefined);\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-6\">\n\t\t\t<TriggerTemplateSelectField onTemplateChange={handleTemplateChange} />\n\t\t\t{triggerTemplate && (\n\t\t\t\t<FormModeToggle\n\t\t\t\t\tvalue={mode}\n\t\t\t\t\tonValueChange={handleModeChange}\n\t\t\t\t\tformContent={<TriggerTemplateFields template={triggerTemplate} />}\n\t\t\t\t\tjsonContent={\n\t\t\t\t\t\t<TriggerJsonInput\n\t\t\t\t\t\t\tvalue={jsonString}\n\t\t\t\t\t\t\tonChange={handleJsonChange}\n\t\t\t\t\t\t\terror={jsonError}\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</div>\n\t);\n};\n\ntype TriggerTemplateFieldsProps = {\n\ttemplate: TriggerTemplate;\n};\n\nconst TriggerTemplateFields = ({ template }: TriggerTemplateFieldsProps) => {\n\tswitch (template) {\n\t\tcase \"flow-run-state\":\n\t\t\treturn <FlowRunStateTriggerFields />;\n\t\tcase \"deployment-status\":\n\t\t\treturn <DeploymentStatusTriggerFields />;\n\t\tcase \"work-pool-status\":\n\t\t\treturn <WorkPoolStatusTriggerFields />;\n\t\tcase \"work-queue-status\":\n\t\t\treturn <WorkQueueStatusTriggerFields />;\n\t\tcase \"custom\":\n\t\t\treturn <CustomTriggerFields />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Link } from \"@tanstack/react-router\";\nimport { useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardFooter } from \"@/components/ui/card\";\nimport { Form, FormMessage } from \"@/components/ui/form\";\nimport { Stepper } from \"@/components/ui/stepper\";\nimport { useStepper } from \"@/hooks/use-stepper\";\nimport { ActionsStep } from \"./actions-step\";\nimport { AutomationWizardSchema } from \"./automation-schema\";\nimport { DetailsStep } from \"./details-step\";\nimport { TriggerStep } from \"./trigger-step\";\n\ntype AutomationWizardFormInput = z.input<typeof AutomationWizardSchema>;\ntype AutomationWizardFormOutput = z.output<typeof AutomationWizardSchema>;\n\nconst WIZARD_STEPS = [\"Trigger\", \"Actions\", \"Details\"] as const;\ntype WizardStep = (typeof WIZARD_STEPS)[number];\n\nconst DEFAULT_FORM_VALUES = {\n\tactions: [{ type: undefined }],\n\ttrigger: {\n\t\ttype: \"event\" as const,\n\t\tposture: \"Reactive\" as const,\n\t\tthreshold: 1,\n\t\twithin: 0,\n\t},\n};\n\nexport type AutomationWizardProps = {\n\tdefaultValues?: Partial<AutomationWizardFormInput>;\n\tonSubmit: (values: AutomationWizardFormOutput) => void;\n\tsubmitLabel?: string;\n\tisSubmitting?: boolean;\n};\n\nexport const AutomationWizard = ({\n\tdefaultValues = {},\n\tonSubmit,\n\tsubmitLabel = \"Save\",\n\tisSubmitting = false,\n}: AutomationWizardProps) => {\n\tconst isEditMode = Boolean(\n\t\tdefaultValues && Object.keys(defaultValues).length > 0,\n\t);\n\tconst initialVisitedSteps = isEditMode\n\t\t? new Set([0, 1, 2])\n\t\t: new Set<number>([0]);\n\tconst stepper = useStepper(WIZARD_STEPS.length, 0, initialVisitedSteps);\n\tconst form = useForm<\n\t\tAutomationWizardFormInput,\n\t\tunknown,\n\t\tAutomationWizardFormOutput\n\t>({\n\t\tresolver: zodResolver(AutomationWizardSchema),\n\t\tdefaultValues: {\n\t\t\t...DEFAULT_FORM_VALUES,\n\t\t\t...defaultValues,\n\t\t} as AutomationWizardFormInput,\n\t});\n\n\tconst currentStep = WIZARD_STEPS[stepper.currentStep];\n\tconst WIZARD_STEPS_MAP = {\n\t\tTrigger: {\n\t\t\trender: () => <TriggerStep />,\n\t\t\ttrigger: () => form.trigger(\"trigger\"),\n\t\t},\n\t\tActions: {\n\t\t\trender: () => <ActionsStep />,\n\t\t\ttrigger: () => form.trigger(\"actions\"),\n\t\t},\n\t\tDetails: {\n\t\t\trender: () => <DetailsStep />,\n\t\t\ttrigger: () => form.trigger([\"description\", \"name\"]),\n\t\t},\n\t} as const;\n\n\tconst handleIncrementStep = async (step: WizardStep) => {\n\t\tconst isValid = await WIZARD_STEPS_MAP[step].trigger();\n\t\tif (isValid) {\n\t\t\tstepper.incrementStep();\n\t\t}\n\t};\n\n\treturn (\n\t\t<Form {...form}>\n\t\t\t<form onSubmit={(e) => void form.handleSubmit(onSubmit)(e)}>\n\t\t\t\t<div className=\"flex flex-col gap-8\">\n\t\t\t\t\t<Stepper\n\t\t\t\t\t\tsteps={WIZARD_STEPS}\n\t\t\t\t\t\tcurrentStepNum={stepper.currentStep}\n\t\t\t\t\t\tonClick={(step) => stepper.changeStep(step.stepNum)}\n\t\t\t\t\t\tcompletedSteps={stepper.completedStepsSet}\n\t\t\t\t\t\tvisitedSteps={stepper.visitedStepsSet}\n\t\t\t\t\t/>\n\t\t\t\t\t<Card className=\"p-4 pt-8\">\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t{WIZARD_STEPS_MAP[currentStep].render()}\n\t\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t\t<CardFooter className=\"mt-6 flex gap-2 justify-end\">\n\t\t\t\t\t\t\t<Button type=\"button\" variant=\"outline\">\n\t\t\t\t\t\t\t\t<Link to=\"/automations\">Cancel</Link>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tdisabled={stepper.isStartingStep}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tonClick={stepper.decrementStep}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tPrevious\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t{stepper.isFinalStep ? (\n\t\t\t\t\t\t\t\t<Button key=\"save\" type=\"submit\" loading={isSubmitting}>\n\t\t\t\t\t\t\t\t\t{submitLabel}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tkey=\"next\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => void handleIncrementStep(currentStep)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNext\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</CardFooter>\n\t\t\t\t\t</Card>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</Form>\n\t);\n};\n"],"names":["AUTOMATION_ACTION_TYPES","ActionTypeSelect","index","form","useFormContext","jsx","FormField","field","FormItem","FormLabel","FormControl","jsxs","Select","type","defaultActionField","getDefaultActionField","UNASSIGNED","SelectTrigger","SelectValue","SelectContent","SelectGroup","SelectLabel","key","SelectItem","ChangeFlowRunStateFields","stateField","Fragment","StateSelect","FormMessage","Input","RUN_STATES","Textarea","FlowRunActionDescription","action","text","Typography","DEFAULT_NUM_SKELETONS","LoadingSelectState","length","_","Skeleton","INFER_OPTION","getButtonLabel","data","fieldValue","automation","SelectAutomationsFields","search","setSearch","useState","isSuccess","useQuery","buildListAutomationsQuery","deferredSearch","useDeferredValue","filteredData","useMemo","isInferredOptionFiltered","buttonLabel","Combobox","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","ComboboxCommandGroup","ComboboxCommandItem","value","useListDeploymentsWithFlows","filter","deploymentsData","deploymentsStatus","buildPaginateDeploymentsQuery","deploymentsFlowIds","deployment","flowsData","flowsStatus","buildListFlowsQuery","flowMap","flow","deploymentsWithFlows","count","limit","pages","page","d","DeploymentLabel","SelectDeploymentsFields","actionType","deploymentId","useWatch","debouncedSearch","useDebounce","deploymentWithFlow","Icon","workPool","wp","SelectWorkPoolsFields","buildFilterWorkPoolsQuery","workQueue","wq","SelectWorkQueuesFields","buildFilterWorkQueuesQuery","filteredMap","filteredWorkQueues","work_pool_name","workPoolName","workQueues","SendNotificationFields","blockTypes","isLoadingBlockTypes","buildListFilterBlockTypesQuery","blockTypeSlugs","bt","blockDocuments","isLoadingBlockDocuments","buildListFilterBlockDocumentsQuery","isLoading","groupedBlockDocuments","blockType","doc","group","filteredGroups","lowerSearch","getSelectedBlockDocument","useCallback","blockDocumentId","selectedDoc","TemplateField","name","label","placeholder","multiline","validateTemplate","useValidateTemplate","validationError","setValidationError","isValidating","setIsValidating","debouncedValue","useEffect","result","InputComponent","ActionStep","onRemove","Button","ActionTypeAdditionalFields","ActionsStep","fields","append","remove","useFieldArray","id","DetailsStep","POSTURE_OPTIONS","DEFAULT_PROACTIVE_WITHIN","CustomPostureSelect","handlePostureChange","previousPosture","expectValues","afterValues","RadioGroup","option","RadioGroupItem","Label","SECONDS_IN_MINUTE","SECONDS_IN_HOUR","SECONDS_IN_DAY","DURATION_UNITS","getDefaultUnitForValue","DurationInput","onChange","min","max","className","disabled","unit","setUnit","availableUnits","u","quantity","handleQuantityChange","newQuantity","newValue","handleUnitChange","newUnitValue","newUnit","oldUnit","firstAvailable","cn","e","FALLBACK_MAX_DISPLAYED","PLUS_N_WIDTH","EventResourceCombobox","selectedResourceIds","onToggleResource","emptyMessage","containerWidth","setContainerWidth","containerRef","useRef","measureRef","container","observer","entries","entry","resourceOptions","useResourceOptions","groupedResources","groups","resource","a","b","lower","opt","showCustomOption","calculateVisibleCount","names","measureEl","availableWidth","visibleCount","i","renderSelectedResources","selectedNames","r","visible","extraCount","handleSelect","getEventPrefixValues","events","prefixCounts","event","parts","prefix","EventsCombobox","selectedEvents","onToggleEvent","occurredFilter","eventCounts","buildEventsCountQuery","options","eventLabels","prefixes","filteredOptions","renderSelectedEvents","visibleNames","overflow","CustomTriggerFields","posture","newEvents","resourceIds","resourceIdsArray","resourceId","newIds","Collapsible","CollapsibleTrigger","ChevronRight","CollapsibleContent","AutomationDeploymentCombobox","selectedDeploymentIds","onSelectDeploymentIds","selectedDeploymentsSet","deployments","buildFilterDeploymentsQuery","selectedDeploymentsData","handleSelectDeployment","updatedDeployments","handleClearAll","renderSelectedDeployments","selectedDeploymentNames","filteredDeployments","Checkbox","PostureSelect","MAX_WITHIN_SECONDS","DEPLOYMENT_STATUSES","DEPLOYMENT_RESOURCE_PREFIX","ALL_DEPLOYMENTS_PATTERN","extractDeploymentIds","matchValue","v","buildMatchPattern","deploymentIds","DeploymentStatusTriggerFields","handleDeploymentIdsChange","currentMatch","selectedStatus","status","MAX_VISIBLE_FLOWS","FlowMultiSelect","selectedFlowIds","onToggleFlow","flows","selectedFlowsData","filteredFlows","renderSelectedFlows","ALL_RUN_STATES","ALL_EXCEPT_SCHEDULED","isAllExceptScheduled","states","STATE_NAMES","StateMultiSelect","selectedStates","onStateChange","displayValue","filteredStates","showConvenienceOptions","handleConvenienceSelect","STATE_NAMES_WITHOUT_SCHEDULED","handleStateToggle","stateName","s","renderSelectedStates","StateBadge","STATE_NAME_TO_TYPE","toStateNameEvents","stateNames","fromStateNameEvents","extractFlowIdsFromMatchRelated","matchRelated","extractTagsFromMatchRelated","buildMatchRelated","flowIds","tags","flowResourceIds","tagResourceIds","tag","role","FlowRunStateTriggerFields","stateFieldName","selectedTags","handleFlowToggle","flowId","currentFlowIds","newFlowIds","newTags","handleTagsChange","showTagsInput","TagsInput","eventStrings","FormModeToggle","defaultValue","onValueChange","formContent","jsonContent","tabsProps","Tabs","TabsList","TabsTrigger","TabsContent","TriggerJsonInput","error","localError","setLocalError","formatJson","parsed","validate","json","TriggerSchema","z.ZodError","JsonInput","TEMPLATE_TRIGGERS","AutomationsTriggerTemplateSelect","TriggerTemplateSelectField","onTemplateChange","BASE_TRIGGER","getDefaultTriggerForTemplate","template","WorkPoolMultiSelect","selectedWorkPoolIds","onToggleWorkPool","workPools","filteredWorkPools","selectedWorkPoolsData","renderSelectedWorkPools","selectedWorkPoolNames","WORK_POOL_STATUSES","getStatusFromEvents","getEventsForStatus","statusValue","getEventsExceptStatus","extractWorkPoolIdsFromMatch","match","buildMatch","workPoolIds","StatusSelect","expect","after","currentStatus","handleStatusChange","statusEvents","otherStatusEvents","WorkPoolStatusTriggerFields","handleWorkPoolToggle","workPoolId","currentWorkPoolIds","newWorkPoolIds","WorkPoolsCombobox","WorkQueuesCombobox","selectedWorkQueueIds","onToggleWorkQueue","groupedWorkQueues","poolName","renderSelectedWorkQueues","selectedWorkQueueNames","WORK_QUEUE_STATUSES","extractWorkPoolIdsFromMatchRelated","extractWorkQueueIdsFromMatch","ids","workQueueIds","WorkQueueStatusTriggerFields","handleWorkQueueToggle","workQueueId","currentWorkQueueIds","newWorkQueueIds","TriggerStep","triggerTemplate","trigger","mode","setMode","jsonString","setJsonString","jsonError","setJsonError","serializeTrigger","validateAndParseJson","handleModeChange","newMode","handleJsonChange","handleTemplateChange","newTrigger","TriggerTemplateFields","WIZARD_STEPS","DEFAULT_FORM_VALUES","AutomationWizard","defaultValues","onSubmit","submitLabel","isSubmitting","initialVisitedSteps","stepper","useStepper","useForm","zodResolver","AutomationWizardSchema","currentStep","WIZARD_STEPS_MAP","handleIncrementStep","step","Form","Stepper","Card","CardContent","CardFooter","Link"],"mappings":"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"}
1
+ {"version":3,"file":"automation-wizard-DuxZ47Nn.js","sources":["../../src/components/automations/automations-wizard/actions-step/action-type-select.tsx","../../src/components/automations/automations-wizard/actions-step/change-flow-run-fields.tsx","../../src/components/automations/automations-wizard/actions-step/flow-run-action-description.tsx","../../src/components/automations/automations-wizard/actions-step/loading-select-state.tsx","../../src/components/automations/automations-wizard/actions-step/select-automations-fields.tsx","../../src/api/deployments/use-list-deployments-with-flows/use-list-deployments-with-flows.ts","../../src/components/automations/automations-wizard/actions-step/select-deployments-fields.tsx","../../src/components/automations/automations-wizard/actions-step/select-work-pools-fields.tsx","../../src/components/automations/automations-wizard/actions-step/select-work-queues-fields.tsx","../../src/components/automations/automations-wizard/actions-step/send-notification-fields.tsx","../../src/components/automations/automations-wizard/actions-step/action-step.tsx","../../src/components/automations/automations-wizard/actions-step/actions-step.tsx","../../src/components/automations/automations-wizard/details-step/details-step.tsx","../../src/components/automations/automations-wizard/trigger-step/custom-posture-select/index.tsx","../../src/components/ui/duration-input/index.tsx","../../src/components/automations/automations-wizard/trigger-step/event-resource-combobox/event-resource-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/events-combobox/events-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/custom-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/automation-deployment-combobox/index.tsx","../../src/components/automations/automations-wizard/trigger-step/posture-select.tsx","../../src/components/automations/automations-wizard/trigger-step/deployment-status-trigger-fields.tsx","../../src/components/flows/flow-multi-select/flow-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/state-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/flow-run-state-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/form-mode-toggle.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-json-input.tsx","../../src/components/automations/automations-wizard/automations-trigger-template-select/automations-trigger-template-select.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-step-utils.ts","../../src/components/work-pools/work-pool-multi-select/work-pool-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/work-pool-status-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/work-pools-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/work-queues-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/work-queue-status-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-step.tsx","../../src/components/automations/automations-wizard/automation-wizard.tsx"],"sourcesContent":["import { useFormContext } from \"react-hook-form\";\n\nimport {\n\ttype ActionType,\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectLabel,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst AUTOMATION_ACTION_TYPES: Partial<Record<ActionType, string>> = {\n\t\"cancel-flow-run\": \"Cancel a flow run\",\n\t\"suspend-flow-run\": \"Suspend a flow run\",\n\t\"resume-flow-run\": \"Resume a flow run\",\n\t\"change-flow-run-state\": \"Change flow run's state\",\n\t\"run-deployment\": \"Run a deployment\",\n\t\"pause-deployment\": \"Pause a deployment\",\n\t\"resume-deployment\": \"Resume a deployment\",\n\t\"pause-work-queue\": \"Pause a work queue\",\n\t\"resume-work-queue\": \"Resume a work queue\",\n\t\"pause-work-pool\": \"Pause a work pool\",\n\t\"resume-work-pool\": \"Resume a work pool\",\n\t\"pause-automation\": \"Pause an automation\",\n\t\"resume-automation\": \"Resume an automation\",\n\t\"send-notification\": \"Send a notification\",\n};\n\nexport const ActionTypeSelect = ({ index }: { index: number }) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.type`}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>Action Type</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\tonValueChange={(type: ActionType) => {\n\t\t\t\t\t\t\t\tfield.onChange(type);\n\t\t\t\t\t\t\t\tconst defaultActionField = getDefaultActionField({\n\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (defaultActionField) {\n\t\t\t\t\t\t\t\t\tform.setValue(defaultActionField, UNASSIGNED);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger aria-label=\"select action\" className=\"w-full\">\n\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select action\" />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t<SelectLabel>Actions</SelectLabel>\n\t\t\t\t\t\t\t\t\t{Object.keys(AUTOMATION_ACTION_TYPES).map((key) => (\n\t\t\t\t\t\t\t\t\t\t<SelectItem key={key} value={key}>\n\t\t\t\t\t\t\t\t\t\t\t{AUTOMATION_ACTION_TYPES[key as ActionType]}\n\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n\n/**\n * @returns form field name to be set that is associated with the passed `type` arg\n */\nfunction getDefaultActionField({\n\tindex,\n\ttype,\n}: {\n\tindex: number;\n\ttype: ActionType;\n}) {\n\tswitch (type) {\n\t\tcase \"run-deployment\":\n\t\tcase \"pause-deployment\":\n\t\tcase \"resume-deployment\":\n\t\t\treturn `actions.${index}.deployment_id` as const;\n\t\tcase \"pause-work-queue\":\n\t\tcase \"resume-work-queue\":\n\t\t\treturn `actions.${index}.work_queue_id` as const;\n\t\tcase \"pause-work-pool\":\n\t\tcase \"resume-work-pool\":\n\t\t\treturn `actions.${index}.work_pool_id` as const;\n\t\tcase \"pause-automation\":\n\t\tcase \"resume-automation\":\n\t\t\treturn `actions.${index}.automation_id` as const;\n\t\t// TODO: add these back in once we have field names for them\n\t\t// case \"send-notification\":\n\t\t// case \"cancel-flow-run\":\n\t\t// case \"suspend-flow-run\":\n\t\t// case \"resume-flow-run\":\n\t\t// case \"change-flow-run-state\":\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n","import { useFormContext } from \"react-hook-form\";\nimport { RUN_STATES } from \"@/api/flow-runs/constants\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { StateSelect } from \"@/components/ui/state-select\";\nimport { Textarea } from \"@/components/ui/textarea\";\n\ntype ChangeFlowRunStateFieldsProps = {\n\tindex: number;\n};\n\nexport const ChangeFlowRunStateFields = ({\n\tindex,\n}: ChangeFlowRunStateFieldsProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst stateField = form.watch(`actions.${index}.state`);\n\n\treturn (\n\t\t<>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.state`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>State</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<StateSelect value={field.value} onValueChange={field.onChange} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.name`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\t\tplaceholder={stateField ? RUN_STATES[stateField] : undefined}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.message`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Message</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\tplaceholder=\"State changed by Automation <id>\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","import { Typography } from \"@/components/ui/typography\";\n\ntype FlowRunActionDescriptionProps = {\n\taction: \"Suspend\" | \"Cancel\" | \"Resume\";\n};\n\nexport const FlowRunActionDescription = ({\n\taction,\n}: FlowRunActionDescriptionProps) => {\n\t// Vue uses different text for resume vs cancel/suspend:\n\t// - Cancel/Suspend: \"{Action} flow run inferred from the triggering event\"\n\t// - Resume: \"Resume a flow run inferred from the triggering event\"\n\tconst text =\n\t\taction === \"Resume\"\n\t\t\t? \"Resume a flow run inferred from the triggering event\"\n\t\t\t: `${action} flow run inferred from the triggering event`;\n\n\treturn (\n\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t{text}\n\t\t</Typography>\n\t);\n};\n","import { Skeleton } from \"@/components/ui/skeleton\";\n\nconst DEFAULT_NUM_SKELETONS = 4;\n\ntype LoadingSelectStateProps = {\n\tlength?: number;\n};\n\nexport const LoadingSelectState = ({\n\tlength = DEFAULT_NUM_SKELETONS,\n}: LoadingSelectStateProps) =>\n\tArray.from({ length }, (_, index) => (\n\t\t// biome-ignore lint/suspicious/noArrayIndexKey: ok for loading skeletons\n\t\t<Skeleton key={index} className=\"mt-2 p-4 h-2 w-full\" />\n\t));\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { type Automation, buildListAutomationsQuery } from \"@/api/automations\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Automation\",\n} as const;\n\ntype SelectAutomationsFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<Automation> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst automation = data?.find((automation) => automation.id === fieldValue);\n\tif (automation) {\n\t\treturn automation.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectAutomationsFields = ({\n\taction,\n\tindex,\n}: SelectAutomationsFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data, isSuccess } = useQuery(buildListAutomationsQuery());\n\n\t// nb: because automations API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\tconst filteredData = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn [];\n\t\t}\n\t\treturn data.filter((automation) =>\n\t\t\tautomation.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.automation_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Automation To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Automation to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select automation\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for an automation...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No automation found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\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\tvalue={INFER_OPTION.value}\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{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isSuccess ? (\n\t\t\t\t\t\t\t\t\t\t\tfilteredData.map((automation) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={automation.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === automation.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={automation.id}\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\t\t{automation.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport {\n\tbuildPaginateDeploymentsQuery,\n\ttype Deployment,\n\ttype DeploymentsPaginationFilter,\n} from \"@/api/deployments\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\n\nexport type DeploymentWithFlow = Deployment & {\n\tflow: Flow | undefined;\n};\n\n/**\n * A hook that is used to get a pagination list of Deployments, with flow data joined\n *\n * @returns a pagination list of deployments, joined with flow data\n *\n * @example\n * ```tsx\nfunction DeploymentListWithFlows() {\n\tconst { data, status } = useListDeploymentsWithFlows();\n \n\tif (data) {\n\t\treturn (\n\t\t\t<ul>\n\t\t\t\t{data.results.map((deployment) => {\n\t\t\t\t\tconst label = deployment.flow\n\t\t\t\t\t\t? `${deployment.flow.name} > ${deployment.name}`\n\t\t\t\t\t\t: deployment.name;\n\t\t\t\t\treturn <li key={deployment.id}>{label}</li>;\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t);\n\t}\n\n\tif (status === \"error\") {\n\t\treturn <p>Error has occurred</p>;\n\t}\n\n\treturn <div>Loading...</div>;\n}\n * ```\n */\nexport const useListDeploymentsWithFlows = (\n\tfilter: DeploymentsPaginationFilter = {\n\t\tpage: 1,\n\t\tlimit: 100,\n\t\tsort: \"NAME_ASC\",\n\t},\n) => {\n\tconst { data: deploymentsData, status: deploymentsStatus } = useQuery(\n\t\tbuildPaginateDeploymentsQuery(filter),\n\t);\n\n\t// Creates a set of unique flow ids\n\tconst deploymentsFlowIds = new Set(\n\t\tdeploymentsData?.results.map((deployment) => deployment.flow_id),\n\t);\n\n\tconst { data: flowsData, status: flowsStatus } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"or_\",\n\t\t\t\t\tid: { any_: Array.from(deploymentsFlowIds) },\n\t\t\t\t},\n\t\t\t\tsort: \"NAME_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t},\n\t\t\t{ enabled: deploymentsFlowIds.size > 0 },\n\t\t),\n\t);\n\n\treturn useMemo(() => {\n\t\tif (flowsData && deploymentsData) {\n\t\t\tconst flowMap = new Map<string, Flow>(\n\t\t\t\tflowsData.map((flow) => [flow.id, flow]),\n\t\t\t);\n\t\t\t// Normalize data per deployment with deployment & flow\n\t\t\tconst deploymentsWithFlows = deploymentsData.results.map(\n\t\t\t\t(deployment) => ({\n\t\t\t\t\t...deployment,\n\t\t\t\t\tflow: flowMap.get(deployment.flow_id),\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst { count, limit, pages, page } = deploymentsData;\n\t\t\tconst retData = {\n\t\t\t\tcount,\n\t\t\t\tlimit,\n\t\t\t\tpages,\n\t\t\t\tpage,\n\t\t\t\tresults: deploymentsWithFlows,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tdata: retData,\n\t\t\t\tstatus: \"success\",\n\t\t\t};\n\t\t}\n\n\t\tif (flowsStatus === \"error\" || deploymentsStatus === \"error\") {\n\t\t\treturn {\n\t\t\t\tdata: undefined,\n\t\t\t\tstatus: \"error\",\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tdata: undefined,\n\t\t\tstatus: \"pending\",\n\t\t};\n\t}, [deploymentsData, deploymentsStatus, flowsData, flowsStatus]);\n};\n","import { useState } from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport { useListDeploymentsWithFlows } from \"@/api/deployments/use-list-deployments-with-flows\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Icon } from \"@/components/ui/icons\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Deployment\",\n} as const;\n\nconst getButtonLabel = (\n\tdata: Array<DeploymentWithFlow> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst deployment = data?.find((d) => d.id === fieldValue);\n\tif (!deployment) {\n\t\treturn undefined;\n\t}\n\treturn <DeploymentLabel deploymentWithFlow={deployment} />;\n};\n\ntype SelectDeploymentsFieldsProps = {\n\taction: \"Run\" | \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nexport const SelectDeploymentsFields = ({\n\taction,\n\tindex,\n}: SelectDeploymentsFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst actionType = form.watch(`actions.${index}.type`);\n\tconst deploymentId = useWatch<AutomationWizardSchema>({\n\t\tname: `actions.${index}.deployment_id`,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 500);\n\tconst { data } = useListDeploymentsWithFlows({\n\t\tpage: 1,\n\t\tsort: \"NAME_ASC\",\n\t\tdeployments: {\n\t\t\toperator: \"or_\",\n\t\t\tflow_or_deployment_name: {\n\t\t\t\tlike_: debouncedSearch,\n\t\t\t},\n\t\t},\n\t});\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(search.toLowerCase());\n\n\tconst deploymentsWithFlows = data?.results;\n\n\treturn (\n\t\t<>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.deployment_id`}\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst buttonLabel = getButtonLabel(deploymentsWithFlows, field.value);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t<FormLabel>Deployment To {action}</FormLabel>\n\t\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\t\taria-label={`Select Deployment to ${action}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select deployment\"}\n\t\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search for an deployment...\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t\tNo deployment found\n\t\t\t\t\t\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={INFER_OPTION.value}\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\t\t{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{deploymentsWithFlows ? (\n\t\t\t\t\t\t\t\t\t\t\t\tdeploymentsWithFlows.map((deployment) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={deployment.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DeploymentLabel deploymentWithFlow={deployment} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\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<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t\t</Combobox>\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\t\t\t/>\n\t\t\t{deploymentId !== INFER_OPTION.value &&\n\t\t\t\tactionType === \"run-deployment\" && <div>TODO: Additional fields</div>}\n\t\t</>\n\t);\n};\n\ntype DeploymentLabelProps = {\n\tdeploymentWithFlow: DeploymentWithFlow;\n};\nconst DeploymentLabel = ({ deploymentWithFlow }: DeploymentLabelProps) => {\n\tif (deploymentWithFlow.flow) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-0.5\">\n\t\t\t\t<div>{deploymentWithFlow.flow.name}</div>\n\t\t\t\t<Icon className=\"size-4\" id=\"ChevronRight\" />\n\t\t\t\t<div>{deploymentWithFlow.name}</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn deploymentWithFlow.name;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } from \"@/api/work-pools\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Work Pool\" as const,\n} as const;\n\ntype SelectWorkPoolFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<WorkPool> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst workPool = data?.find((wp) => wp.id === fieldValue);\n\tif (workPool) {\n\t\treturn workPool.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectWorkPoolsFields = ({\n\taction,\n\tindex,\n}: SelectWorkPoolFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data, isSuccess } = useQuery(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\tif (!data) {\n\t\t\treturn [];\n\t\t}\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 isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.work_pool_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Work Pool To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Work Pool to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select Work Pool\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a work pool...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No work pool found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\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\tvalue={INFER_OPTION.value}\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{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isSuccess ? (\n\t\t\t\t\t\t\t\t\t\t\tfilteredData.map((workPool) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={workPool.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === workPool.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={workPool.id}\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\t\t{workPool.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { buildFilterWorkQueuesQuery, type WorkQueue } from \"@/api/work-queues\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Work Queue\" as const,\n} as const;\n\ntype SelectWorkQueuesFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<WorkQueue> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst workQueue = data?.find((wq) => wq.id === fieldValue);\n\tif (workQueue) {\n\t\treturn workQueue.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectWorkQueuesFields = ({\n\taction,\n\tindex,\n}: SelectWorkQueuesFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data } = useQuery(buildFilterWorkQueuesQuery());\n\n\t// nb: because work queues API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\n\t// Filters data, but returns as a map of work_pool_name vs work queues\n\tconst filteredMap = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst filteredMap = new Map<string, Array<WorkQueue>>();\n\t\tconst filteredWorkQueues = data.filter((workQueue) =>\n\t\t\tworkQueue.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t\tfor (const wq of filteredWorkQueues) {\n\t\t\tconst { work_pool_name } = wq;\n\t\t\tif (!work_pool_name) {\n\t\t\t\tthrow new Error(\"'work_pool_name expected\");\n\t\t\t}\n\t\t\tfilteredMap.set(work_pool_name, [\n\t\t\t\t...(filteredMap.get(work_pool_name) ?? []),\n\t\t\t\twq,\n\t\t\t]);\n\t\t}\n\n\t\treturn filteredMap;\n\t}, [data, deferredSearch]);\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.work_queue_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Work Queue To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Work Queue to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select Work Queue\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a work queue...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No work queue found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\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\tvalue={INFER_OPTION.value}\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{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{filteredMap ? (\n\t\t\t\t\t\t\t\t\t\t\tArray.from(filteredMap).map(\n\t\t\t\t\t\t\t\t\t\t\t\t([workPoolName, workQueues]) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div key={workPoolName} className=\"border-b\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem disabled>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workPoolName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workQueues.map((workQueue) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workQueue.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\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) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { useValidateTemplate } from \"@/api/automations\";\nimport {\n\ttype BlockDocument,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\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 { Textarea } from \"@/components/ui/textarea\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\ntype SendNotificationFieldsProps = {\n\tindex: number;\n};\n\nexport const SendNotificationFields = ({\n\tindex,\n}: SendNotificationFieldsProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst { data: blockTypes, isLoading: isLoadingBlockTypes } = useQuery(\n\t\tbuildListFilterBlockTypesQuery({\n\t\t\toffset: 0,\n\t\t\tblock_schemas: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tblock_capabilities: { all_: [\"notify\"] },\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst blockTypeSlugs = useMemo(\n\t\t() => blockTypes?.map((bt) => bt.slug) ?? [],\n\t\t[blockTypes],\n\t);\n\n\tconst { data: blockDocuments, isLoading: isLoadingBlockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery(\n\t\t\t{\n\t\t\t\tblock_types:\n\t\t\t\t\tblockTypeSlugs.length > 0\n\t\t\t\t\t\t? { slug: { any_: blockTypeSlugs } }\n\t\t\t\t\t\t: undefined,\n\t\t\t\tinclude_secrets: false,\n\t\t\t\tsort: \"BLOCK_TYPE_AND_NAME_ASC\",\n\t\t\t\toffset: 0,\n\t\t\t},\n\t\t\t{ enabled: blockTypeSlugs.length > 0 },\n\t\t),\n\t);\n\n\tconst isLoading = isLoadingBlockTypes || isLoadingBlockDocuments;\n\n\tconst groupedBlockDocuments = useMemo(() => {\n\t\tif (!blockTypes || !blockDocuments) return [];\n\n\t\treturn blockTypes\n\t\t\t.map((blockType) => ({\n\t\t\t\tblockType,\n\t\t\t\tdocuments: blockDocuments.filter(\n\t\t\t\t\t(doc) => doc.block_type_id === blockType.id,\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [blockTypes, blockDocuments]);\n\n\tconst filteredGroups = useMemo(() => {\n\t\tif (!search) return groupedBlockDocuments;\n\n\t\tconst lowerSearch = search.toLowerCase();\n\t\treturn groupedBlockDocuments\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\tdocuments: group.documents.filter((doc) =>\n\t\t\t\t\tdoc.name?.toLowerCase().includes(lowerSearch),\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [groupedBlockDocuments, search]);\n\n\tconst getSelectedBlockDocument = useCallback(\n\t\t(blockDocumentId: string | undefined): BlockDocument | undefined => {\n\t\t\tif (!blockDocumentId || !blockDocuments) return undefined;\n\t\t\treturn blockDocuments.find((doc) => doc.id === blockDocumentId);\n\t\t},\n\t\t[blockDocuments],\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.block_document_id`}\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst selectedDoc = getSelectedBlockDocument(field.value);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t<FormLabel>Block</FormLabel>\n\t\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\t\tselected={Boolean(selectedDoc)}\n\t\t\t\t\t\t\t\t\taria-label=\"Select notification block\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{selectedDoc\n\t\t\t\t\t\t\t\t\t\t? selectedDoc.name\n\t\t\t\t\t\t\t\t\t\t: \"Select a notification block\"}\n\t\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a block...\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t\tNo notification blocks found\n\t\t\t\t\t\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\tfilteredGroups.map((group) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={group.blockType.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\theading={group.blockType.name}\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\t\t{group.documents.map((doc) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{doc.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t\t</Combobox>\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\t\t\t/>\n\n\t\t\t<TemplateField\n\t\t\t\tindex={index}\n\t\t\t\tname=\"subject\"\n\t\t\t\tlabel=\"Subject\"\n\t\t\t\tplaceholder=\"Enter notification subject...\"\n\t\t\t/>\n\n\t\t\t<TemplateField\n\t\t\t\tindex={index}\n\t\t\t\tname=\"body\"\n\t\t\t\tlabel=\"Body\"\n\t\t\t\tplaceholder=\"Enter notification body...\"\n\t\t\t\tmultiline\n\t\t\t/>\n\n\t\t\t<div className=\"flex items-start gap-2 rounded-md border border-blue-200 bg-blue-50 p-3 text-sm text-blue-800 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-200\">\n\t\t\t\t<Icon id=\"Info\" className=\"mt-0.5 size-4 shrink-0\" />\n\t\t\t\t<p>\n\t\t\t\t\tIn addition to any fields present on the triggering event, the\n\t\t\t\t\tfollowing objects can be used in notification templates:{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tdeployment\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow_run\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_pool\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_queue\n\t\t\t\t\t</code>\n\t\t\t\t\t, and{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tmetric\n\t\t\t\t\t</code>\n\t\t\t\t\t.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\ntype TemplateFieldProps = {\n\tindex: number;\n\tname: \"subject\" | \"body\";\n\tlabel: string;\n\tplaceholder?: string;\n\tmultiline?: boolean;\n};\n\nconst TemplateField = ({\n\tindex,\n\tname,\n\tlabel,\n\tplaceholder,\n\tmultiline = false,\n}: TemplateFieldProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { validateTemplate } = useValidateTemplate();\n\tconst [validationError, setValidationError] = useState<string | null>(null);\n\tconst [isValidating, setIsValidating] = useState(false);\n\n\tconst fieldValue = form.watch(`actions.${index}.${name}`);\n\tconst debouncedValue = useDebounce(fieldValue, 1000);\n\n\tuseEffect(() => {\n\t\tconst validate = async () => {\n\t\t\tif (!debouncedValue || debouncedValue.trim() === \"\") {\n\t\t\t\tsetValidationError(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsValidating(true);\n\t\t\ttry {\n\t\t\t\tconst result = await validateTemplate(debouncedValue);\n\t\t\t\tif (result.valid) {\n\t\t\t\t\tsetValidationError(null);\n\t\t\t\t} else {\n\t\t\t\t\tsetValidationError(result.error);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetValidationError(null);\n\t\t\t} finally {\n\t\t\t\tsetIsValidating(false);\n\t\t\t}\n\t\t};\n\n\t\tvoid validate();\n\t}, [debouncedValue, validateTemplate]);\n\n\tconst InputComponent = multiline ? Textarea : Input;\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.${name}`}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel className=\"flex items-center gap-2\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\t{isValidating && (\n\t\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-3 animate-spin\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<InputComponent\n\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\tclassName={validationError ? \"border-destructive\" : \"\"}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t\t{validationError && (\n\t\t\t\t\t\t<p className=\"text-sm text-destructive\">{validationError}</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<FormMessage />\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { ActionTypeSelect } from \"./action-type-select\";\nimport { ChangeFlowRunStateFields } from \"./change-flow-run-fields\";\nimport { FlowRunActionDescription } from \"./flow-run-action-description\";\nimport { SelectAutomationsFields } from \"./select-automations-fields\";\nimport { SelectDeploymentsFields } from \"./select-deployments-fields\";\nimport { SelectWorkPoolsFields } from \"./select-work-pools-fields\";\nimport { SelectWorkQueuesFields } from \"./select-work-queues-fields\";\nimport { SendNotificationFields } from \"./send-notification-fields\";\n\ntype ActionStepProps = {\n\tindex: number;\n\tonRemove: () => void;\n};\n\nexport const ActionStep = ({ index, onRemove }: ActionStepProps) => {\n\treturn (\n\t\t<div key={index} className=\"space-y-2\">\n\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t<Typography variant=\"body\" className=\"font-semibold\">\n\t\t\t\t\tAction {index + 1}\n\t\t\t\t</Typography>\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\taria-label={`remove action ${index + 1}`}\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Trash2\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<ActionTypeSelect index={index} />\n\t\t\t<ActionTypeAdditionalFields index={index} />\n\t\t\t<hr className=\"my-8\" />\n\t\t</div>\n\t);\n};\n\ntype ActionTypeAdditionalFieldsProps = {\n\tindex: number;\n};\n\nconst ActionTypeAdditionalFields = ({\n\tindex,\n}: ActionTypeAdditionalFieldsProps) => {\n\tconst actionType = useWatch<AutomationWizardSchema>({\n\t\tname: `actions.${index}.type`,\n\t});\n\tswitch (actionType) {\n\t\tcase \"change-flow-run-state\":\n\t\t\treturn <ChangeFlowRunStateFields index={index} />;\n\t\tcase \"run-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Run\" index={index} />;\n\t\tcase \"pause-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-work-queue\":\n\t\t\treturn <SelectWorkQueuesFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-work-queue\":\n\t\t\treturn <SelectWorkQueuesFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-work-pool\":\n\t\t\treturn <SelectWorkPoolsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-work-pool\":\n\t\t\treturn <SelectWorkPoolsFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-automation\":\n\t\t\treturn <SelectAutomationsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-automation\":\n\t\t\treturn <SelectAutomationsFields action=\"Resume\" index={index} />;\n\t\tcase \"send-notification\":\n\t\t\treturn <SendNotificationFields index={index} />;\n\t\tcase \"cancel-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Cancel\" />;\n\t\tcase \"suspend-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Suspend\" />;\n\t\tcase \"resume-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Resume\" />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { useFieldArray, useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { ActionStep } from \"./action-step\";\n\nexport const ActionsStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { fields, append, remove } = useFieldArray({\n\t\tcontrol: form.control,\n\t\tname: \"actions\",\n\t\tshouldUnregister: false,\n\t\trules: { minLength: 1 },\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t{fields.map(({ id }, index) => (\n\t\t\t\t<ActionStep key={id} index={index} onRemove={() => remove(index)} />\n\t\t\t))}\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tonClick={() => append({ type: \"cancel-flow-run\" })}\n\t\t\t>\n\t\t\t\t<Icon id=\"Plus\" className=\"mr-2 size-4\" /> Add Action\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\n\nexport const DetailsStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"name\"\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Automation Name</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input type=\"text\" {...field} value={field.value ?? \"\"} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"description\"\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Description (Optional)</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input type=\"text\" {...field} value={field.value ?? \"\"} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n} from \"@/components/ui/form\";\nimport { Label } from \"@/components/ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\n\nconst POSTURE_OPTIONS = [\n\t{ value: \"Reactive\", label: \"Observe\" },\n\t{ value: \"Proactive\", label: \"Don't observe\" },\n] as const;\n\nconst DEFAULT_PROACTIVE_WITHIN = 30;\n\nexport const CustomPostureSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\tconst handlePostureChange = (value: \"Reactive\" | \"Proactive\") => {\n\t\tconst previousPosture = form.getValues(\"trigger.posture\");\n\t\tform.setValue(\"trigger.posture\", value);\n\n\t\t// Move state values between expect and after when posture changes\n\t\t// Reactive uses \"expect\", Proactive uses \"after\"\n\t\tif (previousPosture === \"Reactive\" && value === \"Proactive\") {\n\t\t\tconst expectValues = form.getValues(\"trigger.expect\") ?? [];\n\t\t\tform.setValue(\"trigger.after\", expectValues);\n\t\t\tform.setValue(\"trigger.expect\", []);\n\t\t\tconst currentWithin = form.getValues(\"trigger.within\");\n\t\t\tif (currentWithin === 0) {\n\t\t\t\tform.setValue(\"trigger.within\", DEFAULT_PROACTIVE_WITHIN);\n\t\t\t}\n\t\t} else if (previousPosture === \"Proactive\" && value === \"Reactive\") {\n\t\t\tconst afterValues = form.getValues(\"trigger.after\") ?? [];\n\t\t\tform.setValue(\"trigger.expect\", afterValues);\n\t\t\tform.setValue(\"trigger.after\", []);\n\t\t}\n\t};\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"trigger.posture\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>When I</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<RadioGroup\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={handlePostureChange}\n\t\t\t\t\t\t\tclassName=\"flex gap-4\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{POSTURE_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<div key={option.value} className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<RadioGroupItem\n\t\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t\t\tid={`custom-${option.value}`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Label htmlFor={`custom-${option.value}`}>\n\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</RadioGroup>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { cn } from \"@/utils\";\n\nconst SECONDS_IN_MINUTE = 60;\nconst SECONDS_IN_HOUR = 3600;\nconst SECONDS_IN_DAY = 86400;\n\ntype DurationUnit = {\n\tlabel: string;\n\tvalue: number;\n};\n\nconst DURATION_UNITS: DurationUnit[] = [\n\t{ label: \"Seconds\", value: 1 },\n\t{ label: \"Minutes\", value: SECONDS_IN_MINUTE },\n\t{ label: \"Hours\", value: SECONDS_IN_HOUR },\n\t{ label: \"Days\", value: SECONDS_IN_DAY },\n];\n\nfunction getDefaultUnitForValue(value: number): number {\n\tif (value > 0 && value % SECONDS_IN_DAY === 0) {\n\t\treturn SECONDS_IN_DAY;\n\t}\n\tif (value > 0 && value % SECONDS_IN_HOUR === 0) {\n\t\treturn SECONDS_IN_HOUR;\n\t}\n\tif (value > 0 && value % SECONDS_IN_MINUTE === 0) {\n\t\treturn SECONDS_IN_MINUTE;\n\t}\n\treturn 1;\n}\n\nexport type DurationInputProps = {\n\tvalue: number;\n\tonChange: (seconds: number) => void;\n\tmin?: number;\n\tmax?: number;\n\tclassName?: string;\n\tdisabled?: boolean;\n};\n\nexport function DurationInput({\n\tvalue,\n\tonChange,\n\tmin = 0,\n\tmax,\n\tclassName,\n\tdisabled = false,\n}: DurationInputProps) {\n\tconst [unit, setUnit] = useState<number>(() => getDefaultUnitForValue(value));\n\n\tconst availableUnits = useMemo(() => {\n\t\treturn DURATION_UNITS.filter((u) => u.value >= min);\n\t}, [min]);\n\n\tconst quantity = useMemo(() => {\n\t\treturn value / unit;\n\t}, [value, unit]);\n\n\tconst handleQuantityChange = useCallback(\n\t\t(newQuantity: number) => {\n\t\t\tlet newValue = newQuantity * unit;\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\t\t\tonChange(newValue);\n\t\t},\n\t\t[onChange, unit, max],\n\t);\n\n\tconst handleUnitChange = useCallback(\n\t\t(newUnitValue: string) => {\n\t\t\tconst newUnit = Number(newUnitValue);\n\t\t\tconst oldUnit = unit;\n\t\t\tsetUnit(newUnit);\n\t\t\tlet newValue = (value / oldUnit) * newUnit;\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\t\t\tonChange(newValue);\n\t\t},\n\t\t[onChange, unit, value, max],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!availableUnits.some((u) => u.value === unit)) {\n\t\t\tconst firstAvailable = availableUnits[0];\n\t\t\tif (firstAvailable) {\n\t\t\t\tsetUnit(firstAvailable.value);\n\t\t\t}\n\t\t}\n\t}, [availableUnits, unit]);\n\n\treturn (\n\t\t<div className={cn(\"grid grid-cols-[1fr_7rem] gap-2 w-full\", className)}>\n\t\t\t<Input\n\t\t\t\ttype=\"number\"\n\t\t\t\tmin={0}\n\t\t\t\tvalue={quantity}\n\t\t\t\tonChange={(e) => handleQuantityChange(Number(e.target.value))}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Duration quantity\"\n\t\t\t/>\n\t\t\t<Select\n\t\t\t\tvalue={String(unit)}\n\t\t\t\tonValueChange={handleUnitChange}\n\t\t\t\tdisabled={disabled}\n\t\t\t>\n\t\t\t\t<SelectTrigger aria-label=\"Duration unit\">\n\t\t\t\t\t<SelectValue />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t{availableUnits.map((u) => (\n\t\t\t\t\t\t<SelectItem key={u.value} value={String(u.value)}>\n\t\t\t\t\t\t\t{u.label}\n\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t))}\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n}\n","import {\n\tuseCallback,\n\tuseDeferredValue,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { useResourceOptions } from \"@/components/events/events-resource-filter/use-resource-options\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { Typography } from \"@/components/ui/typography\";\n\nconst FALLBACK_MAX_DISPLAYED = 2;\nconst PLUS_N_WIDTH = 40;\n\nexport type EventResourceComboboxProps = {\n\tselectedResourceIds: string[];\n\tonToggleResource: (resourceId: string) => void;\n\temptyMessage?: string;\n};\n\ntype ResourceGroup = {\n\tlabel: string;\n\toptions: Array<{ label: string; value: string }>;\n};\n\nexport function EventResourceCombobox({\n\tselectedResourceIds,\n\tonToggleResource,\n\temptyMessage = \"All resources\",\n}: EventResourceComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst measureRef = useRef<HTMLDivElement>(null);\n\n\t// Measure container width using ResizeObserver\n\tuseEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tsetContainerWidth(entry.contentRect.width);\n\t\t\t}\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\t// Use existing hook that fetches all resource types\n\tconst { resourceOptions } = useResourceOptions();\n\n\t// Group resources by type\n\tconst groupedResources = useMemo(() => {\n\t\tconst groups: ResourceGroup[] = [\n\t\t\t{ label: \"Automations\", options: [] },\n\t\t\t{ label: \"Blocks\", options: [] },\n\t\t\t{ label: \"Deployments\", options: [] },\n\t\t\t{ label: \"Flows\", options: [] },\n\t\t\t{ label: \"Work Pools\", options: [] },\n\t\t\t{ label: \"Work Queues\", options: [] },\n\t\t];\n\n\t\tfor (const resource of resourceOptions) {\n\t\t\tconst option = {\n\t\t\t\tlabel: resource.name,\n\t\t\t\tvalue: resource.resourceId,\n\t\t\t};\n\n\t\t\tswitch (resource.type) {\n\t\t\t\tcase \"automation\":\n\t\t\t\t\tgroups[0].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"block\":\n\t\t\t\t\tgroups[1].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"deployment\":\n\t\t\t\t\tgroups[2].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"flow\":\n\t\t\t\t\tgroups[3].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"work-pool\":\n\t\t\t\t\tgroups[4].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"work-queue\":\n\t\t\t\t\tgroups[5].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn groups\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\toptions: group.options.sort((a, b) => a.label.localeCompare(b.label)),\n\t\t\t}))\n\t\t\t.filter((group) => group.options.length > 0);\n\t}, [resourceOptions]);\n\n\t// Filter based on search\n\tconst filteredGroups = useMemo(() => {\n\t\tif (!deferredSearch) return groupedResources;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn groupedResources\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\toptions: group.options.filter(\n\t\t\t\t\t(opt) =>\n\t\t\t\t\t\topt.label.toLowerCase().includes(lower) ||\n\t\t\t\t\t\topt.value.toLowerCase().includes(lower),\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.options.length > 0);\n\t}, [groupedResources, deferredSearch]);\n\n\t// Check if search term could be a custom resource ID (must contain \".\")\n\tconst showCustomOption = useMemo(() => {\n\t\tif (!deferredSearch.trim()) return false;\n\t\tif (!deferredSearch.includes(\".\")) return false;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn !resourceOptions.some(\n\t\t\t(opt) => opt.resourceId.toLowerCase() === lower,\n\t\t);\n\t}, [deferredSearch, resourceOptions]);\n\n\t// Calculate how many names fit in the available width\n\tconst calculateVisibleCount = useCallback(\n\t\t(names: string[]): number => {\n\t\t\tconst measureEl = measureRef.current;\n\t\t\tif (!measureEl || containerWidth === 0 || names.length === 0) {\n\t\t\t\treturn Math.min(names.length, FALLBACK_MAX_DISPLAYED);\n\t\t\t}\n\n\t\t\t// Available width for names (reserve space for \"+N\" if needed)\n\t\t\tconst availableWidth =\n\t\t\t\tnames.length > 1 ? containerWidth - PLUS_N_WIDTH : containerWidth;\n\n\t\t\tlet visibleCount = 0;\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\t\t\t\t// Measure each name by temporarily setting content\n\t\t\t\tmeasureEl.textContent = names.slice(0, i + 1).join(\", \");\n\t\t\t\tconst nameWidth = measureEl.offsetWidth;\n\n\t\t\t\tif (nameWidth <= availableWidth) {\n\t\t\t\t\tvisibleCount = i + 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If all names fit, return all\n\t\t\tif (visibleCount === names.length) {\n\t\t\t\treturn names.length;\n\t\t\t}\n\n\t\t\t// Return at least 1 name\n\t\t\treturn Math.max(1, visibleCount);\n\t\t},\n\t\t[containerWidth],\n\t);\n\n\tconst renderSelectedResources = () => {\n\t\tif (selectedResourceIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tconst selectedNames = selectedResourceIds.map((id) => {\n\t\t\tconst resource = resourceOptions.find((r) => r.resourceId === id);\n\t\t\treturn resource?.name ?? id;\n\t\t});\n\n\t\tconst visibleCount = calculateVisibleCount(selectedNames);\n\t\tconst visible = selectedNames.slice(0, visibleCount);\n\t\tconst extraCount = selectedNames.length - visibleCount;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"flex flex-1 min-w-0 items-center gap-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t\t{/* Hidden element for measuring text width */}\n\t\t\t\t<div\n\t\t\t\t\tref={measureRef}\n\t\t\t\t\tclassName=\"absolute invisible whitespace-nowrap\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleSelect = (value: string) => {\n\t\tonToggleResource(value);\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedResourceIds.length > 0}>\n\t\t\t\t{renderSelectedResources()}\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 resources...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No resources found</ComboboxCommandEmtpy>\n\t\t\t\t\t{showCustomOption && (\n\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey=\"__custom__\"\n\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(deferredSearch)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(deferredSearch)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deferredSearch}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAdd &quot;{deferredSearch}&quot;\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t)}\n\t\t\t\t\t{filteredGroups.map((group) => (\n\t\t\t\t\t\t<ComboboxCommandGroup key={group.label} heading={group.label}>\n\t\t\t\t\t\t\t{group.options.map((option) => (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(option.value)}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleSelect(option.value)}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t))}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildEventsCountQuery } from \"@/api/events\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nexport type EventsComboboxProps = {\n\tselectedEvents: string[];\n\tonToggleEvent: (event: string) => void;\n\temptyMessage?: string;\n};\n\n/**\n * Generate wildcard prefix options from event names.\n * E.g., [\"prefect.flow-run.Completed\", \"prefect.flow-run.Failed\"]\n * generates [\"prefect.*\", \"prefect.flow-run.*\"]\n *\n * Only includes prefixes that match more than one event but not all events.\n */\nfunction getEventPrefixValues(events: string[]): string[] {\n\tconst prefixCounts = new Map<string, number>();\n\n\tfor (const event of events) {\n\t\tconst parts = event.split(\".\");\n\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\tconst prefix = parts.slice(0, i).join(\".\");\n\t\t\tprefixCounts.set(prefix, (prefixCounts.get(prefix) ?? 0) + 1);\n\t\t}\n\t}\n\n\treturn Array.from(prefixCounts.entries())\n\t\t.filter(([, count]) => count > 1 && count < events.length)\n\t\t.map(([prefix]) => `${prefix}.*`);\n}\n\nexport function EventsCombobox({\n\tselectedEvents,\n\tonToggleEvent,\n\temptyMessage = \"All events\",\n}: EventsComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\t// Create a stable filter for the past week (computed once on mount)\n\tconst [occurredFilter] = useState(() => ({\n\t\tsince: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tuntil: new Date().toISOString(),\n\t}));\n\n\t// Fetch event counts for the past week\n\tconst { data: eventCounts = [] } = useQuery(\n\t\tbuildEventsCountQuery(\"event\", {\n\t\t\tfilter: {\n\t\t\t\toccurred: occurredFilter,\n\t\t\t\torder: \"DESC\",\n\t\t\t},\n\t\t\ttime_unit: \"day\",\n\t\t\ttime_interval: 1,\n\t\t}),\n\t);\n\n\t// Extract event labels and generate prefix options\n\tconst options = useMemo(() => {\n\t\tconst eventLabels = eventCounts.map((e) => e.label);\n\t\tconst prefixes = getEventPrefixValues(eventLabels);\n\t\treturn [...eventLabels, ...prefixes].sort((a, b) => a.localeCompare(b));\n\t}, [eventCounts]);\n\n\t// Filter options based on search\n\tconst filteredOptions = useMemo(() => {\n\t\tif (!deferredSearch) return options;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn options.filter((opt) => opt.toLowerCase().includes(lower));\n\t}, [options, deferredSearch]);\n\n\t// Check if search term is a valid custom value\n\tconst showCustomOption = useMemo(() => {\n\t\tif (!deferredSearch.trim()) return false;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn !options.some((opt) => opt.toLowerCase() === lower);\n\t}, [deferredSearch, options]);\n\n\tconst renderSelectedEvents = () => {\n\t\tif (selectedEvents.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tconst visibleNames = selectedEvents.slice(0, 2);\n\t\tconst overflow = selectedEvents.length - visibleNames.length;\n\t\treturn (\n\t\t\t<div className=\"flex min-w-0 items-center justify-start gap-1\">\n\t\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t\t{visibleNames.join(\", \")}\n\t\t\t\t</span>\n\t\t\t\t{overflow > 0 && (\n\t\t\t\t\t<span className=\"shrink-0 text-muted-foreground\">+{overflow}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleSelect = (value: string) => {\n\t\tonToggleEvent(value);\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedEvents.length > 0}>\n\t\t\t\t{renderSelectedEvents()}\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 events...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No events found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{showCustomOption && (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey=\"__custom__\"\n\t\t\t\t\t\t\t\tselected={selectedEvents.includes(deferredSearch)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(deferredSearch)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deferredSearch}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAdd &quot;{deferredSearch}&quot;\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredOptions.map((event) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={event}\n\t\t\t\t\t\t\t\tselected={selectedEvents.includes(event)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(event)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={event}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{event}\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 { ChevronRight } from \"lucide-react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCollapsible,\n\tCollapsibleContent,\n\tCollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { CustomPostureSelect } from \"./custom-posture-select\";\nimport { EventResourceCombobox } from \"./event-resource-combobox\";\nimport { EventsCombobox } from \"./events-combobox\";\n\nexport const CustomTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"flex items-end gap-4\">\n\t\t\t\t<CustomPostureSelect />\n\t\t\t</div>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"trigger.expect\"\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst events = field.value ?? [];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Any event matching</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<EventsCombobox\n\t\t\t\t\t\t\t\t\tselectedEvents={events}\n\t\t\t\t\t\t\t\t\tonToggleEvent={(event) => {\n\t\t\t\t\t\t\t\t\t\tconst newEvents = events.includes(event)\n\t\t\t\t\t\t\t\t\t\t\t? events.filter((e) => e !== event)\n\t\t\t\t\t\t\t\t\t\t\t: [...events, event];\n\t\t\t\t\t\t\t\t\t\tfield.onChange(newEvents);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</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\t\t\t/>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"trigger.match\"\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst resourceIds =\n\t\t\t\t\t\t(field.value?.[\"prefect.resource.id\"] as string[] | undefined) ??\n\t\t\t\t\t\t[];\n\t\t\t\t\tconst resourceIdsArray = Array.isArray(resourceIds)\n\t\t\t\t\t\t? resourceIds\n\t\t\t\t\t\t: [resourceIds];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>From the following resources</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<EventResourceCombobox\n\t\t\t\t\t\t\t\t\tselectedResourceIds={resourceIdsArray}\n\t\t\t\t\t\t\t\t\tonToggleResource={(resourceId) => {\n\t\t\t\t\t\t\t\t\t\tconst newIds = resourceIdsArray.includes(resourceId)\n\t\t\t\t\t\t\t\t\t\t\t? resourceIdsArray.filter((id) => id !== resourceId)\n\t\t\t\t\t\t\t\t\t\t\t: [...resourceIdsArray, resourceId];\n\t\t\t\t\t\t\t\t\t\tif (newIds.length > 0) {\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange({ \"prefect.resource.id\": newIds });\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange({});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</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\t\t\t/>\n\n\t\t\t<div className=\"flex items-end gap-2\">\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.threshold\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem className=\"w-20\">\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\ttype=\"number\"\n\t\t\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.onChange(Number(e.target.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\t\t\t\t<span className=\"pb-2 text-sm text-muted-foreground\">times within</span>\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={posture === \"Proactive\" ? 10 : 0}\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\t\t\t</div>\n\n\t\t\t<Collapsible>\n\t\t\t\t<CollapsibleTrigger className=\"flex items-center gap-2 text-sm font-medium\">\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4 transition-transform data-[state=open]:rotate-90\" />\n\t\t\t\t\tEvaluation Options\n\t\t\t\t</CollapsibleTrigger>\n\t\t\t\t<CollapsibleContent className=\"mt-4 space-y-4 pl-6\">\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.after\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst events = field.value ?? [];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>\n\t\t\t\t\t\t\t\t\t\tEvaluate trigger only after observing an event matching\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<EventsCombobox\n\t\t\t\t\t\t\t\t\t\t\tselectedEvents={events}\n\t\t\t\t\t\t\t\t\t\t\tonToggleEvent={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newEvents = events.includes(event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? events.filter((e) => e !== event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: [...events, event];\n\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(newEvents);\n\t\t\t\t\t\t\t\t\t\t\t}}\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/>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.match_related\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst resourceIds =\n\t\t\t\t\t\t\t\t(field.value?.[\"prefect.resource.id\"] as\n\t\t\t\t\t\t\t\t\t| string[]\n\t\t\t\t\t\t\t\t\t| undefined) ?? [];\n\t\t\t\t\t\t\tconst resourceIdsArray = Array.isArray(resourceIds)\n\t\t\t\t\t\t\t\t? resourceIds\n\t\t\t\t\t\t\t\t: [resourceIds];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Filter for events related to</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<EventResourceCombobox\n\t\t\t\t\t\t\t\t\t\t\tselectedResourceIds={resourceIdsArray}\n\t\t\t\t\t\t\t\t\t\t\tonToggleResource={(resourceId) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newIds = resourceIdsArray.includes(resourceId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? resourceIdsArray.filter((id) => id !== resourceId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: [...resourceIdsArray, resourceId];\n\t\t\t\t\t\t\t\t\t\t\t\tif (newIds.length > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange({ \"prefect.resource.id\": newIds });\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange({});\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/>\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/>\n\t\t\t\t</CollapsibleContent>\n\t\t\t</Collapsible>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport {\n\tuseCallback,\n\tuseDeferredValue,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport {\n\tbuildFilterDeploymentsQuery,\n\ttype Deployment,\n} from \"@/api/deployments\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { Typography } from \"@/components/ui/typography\";\n\nconst FALLBACK_MAX_DISPLAYED = 2;\nconst PLUS_N_WIDTH = 40;\n\ntype AutomationDeploymentComboboxProps = {\n\tselectedDeploymentIds: string[];\n\tonSelectDeploymentIds: (deploymentIds: string[]) => void;\n};\n\nexport const AutomationDeploymentCombobox = ({\n\tselectedDeploymentIds,\n\tonSelectDeploymentIds,\n}: AutomationDeploymentComboboxProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst measureRef = useRef<HTMLDivElement>(null);\n\n\tconst selectedDeploymentsSet = useMemo(\n\t\t() => new Set(selectedDeploymentIds),\n\t\t[selectedDeploymentIds],\n\t);\n\n\t// Measure container width using ResizeObserver\n\tuseEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tsetContainerWidth(entry.contentRect.width);\n\t\t\t}\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tconst { data: deployments = [] } = useQuery(\n\t\tbuildFilterDeploymentsQuery({\n\t\t\tdeployments: deferredSearch\n\t\t\t\t? {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { like_: deferredSearch },\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst { data: selectedDeploymentsData = [] } = useQuery(\n\t\tbuildFilterDeploymentsQuery(\n\t\t\t{\n\t\t\t\tdeployments:\n\t\t\t\t\tselectedDeploymentsSet.size > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tid: { any_: selectedDeploymentIds },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\tlimit: selectedDeploymentsSet.size || 1,\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: selectedDeploymentsSet.size > 0 },\n\t\t),\n\t);\n\n\tconst handleSelectDeployment = (deploymentId: string) => {\n\t\tconst updatedDeployments = new Set(selectedDeploymentsSet);\n\t\tif (selectedDeploymentsSet.has(deploymentId)) {\n\t\t\tupdatedDeployments.delete(deploymentId);\n\t\t} else {\n\t\t\tupdatedDeployments.add(deploymentId);\n\t\t}\n\t\tonSelectDeploymentIds(Array.from(updatedDeployments));\n\t};\n\n\tconst handleClearAll = () => {\n\t\tonSelectDeploymentIds([]);\n\t};\n\n\t// Calculate how many names fit in the available width\n\tconst calculateVisibleCount = useCallback(\n\t\t(names: string[]): number => {\n\t\t\tconst measureEl = measureRef.current;\n\t\t\tif (!measureEl || containerWidth === 0 || names.length === 0) {\n\t\t\t\treturn Math.min(names.length, FALLBACK_MAX_DISPLAYED);\n\t\t\t}\n\n\t\t\t// Available width for names (reserve space for \"+N\" if needed)\n\t\t\tconst availableWidth =\n\t\t\t\tnames.length > 1 ? containerWidth - PLUS_N_WIDTH : containerWidth;\n\n\t\t\tlet visibleCount = 0;\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\t\t\t\t// Measure each name by temporarily setting content\n\t\t\t\tmeasureEl.textContent = names.slice(0, i + 1).join(\", \");\n\t\t\t\tconst nameWidth = measureEl.offsetWidth;\n\n\t\t\t\tif (nameWidth <= availableWidth) {\n\t\t\t\t\tvisibleCount = i + 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If all names fit, return all\n\t\t\tif (visibleCount === names.length) {\n\t\t\t\treturn names.length;\n\t\t\t}\n\n\t\t\t// Return at least 1 name\n\t\t\treturn Math.max(1, visibleCount);\n\t\t},\n\t\t[containerWidth],\n\t);\n\n\tconst renderSelectedDeployments = () => {\n\t\tif (selectedDeploymentsSet.size === 0) {\n\t\t\treturn \"All deployments\";\n\t\t}\n\n\t\tconst selectedDeploymentNames = selectedDeploymentsData\n\t\t\t.filter((deployment) => selectedDeploymentsSet.has(deployment.id))\n\t\t\t.map((deployment) => deployment.name);\n\n\t\tconst visibleCount = calculateVisibleCount(selectedDeploymentNames);\n\t\tconst visible = selectedDeploymentNames.slice(0, visibleCount);\n\t\tconst extraCount = selectedDeploymentNames.length - visibleCount;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"flex flex-1 min-w-0 items-center gap-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t\t{/* Hidden element for measuring text width */}\n\t\t\t\t<div\n\t\t\t\t\tref={measureRef}\n\t\t\t\t\tclassName=\"absolute invisible whitespace-nowrap\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst filteredDeployments = useMemo(() => {\n\t\treturn deployments.filter(\n\t\t\t(deployment: Deployment) =>\n\t\t\t\t!deferredSearch ||\n\t\t\t\tdeployment.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deployments, deferredSearch]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\taria-label=\"Select deployments\"\n\t\t\t\tselected={selectedDeploymentsSet.size === 0}\n\t\t\t>\n\t\t\t\t{renderSelectedDeployments()}\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 deployments...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No deployments found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\taria-label=\"All deployments\"\n\t\t\t\t\t\t\tonSelect={handleClearAll}\n\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\tvalue=\"__all__\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Checkbox checked={selectedDeploymentsSet.size === 0} />\n\t\t\t\t\t\t\tAll deployments\n\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t{filteredDeployments.map((deployment: Deployment) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={deployment.id}\n\t\t\t\t\t\t\t\taria-label={deployment.name}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelectDeployment(deployment.id)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deployment.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Checkbox checked={selectedDeploymentsSet.has(deployment.id)} />\n\t\t\t\t\t\t\t\t{deployment.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 { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FormControl, FormField, FormItem } from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst POSTURE_OPTIONS = [\n\t{ value: \"Reactive\", label: \"Enters\" },\n\t{ value: \"Proactive\", label: \"Stays in\" },\n] as const;\n\nconst DEFAULT_PROACTIVE_WITHIN = 30;\n\nexport const PostureSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"trigger.posture\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={(value: \"Reactive\" | \"Proactive\") => {\n\t\t\t\t\t\t\t\tconst previousPosture = field.value;\n\t\t\t\t\t\t\t\tfield.onChange(value);\n\n\t\t\t\t\t\t\t\t// Move state values between expect and after when posture changes\n\t\t\t\t\t\t\t\t// Reactive uses \"expect\", Proactive uses \"after\"\n\t\t\t\t\t\t\t\tif (previousPosture === \"Reactive\" && value === \"Proactive\") {\n\t\t\t\t\t\t\t\t\t// Moving from Reactive to Proactive: move expect to after\n\t\t\t\t\t\t\t\t\tconst expectValues = form.getValues(\"trigger.expect\") ?? [];\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.after\", expectValues);\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.expect\", []);\n\t\t\t\t\t\t\t\t\t// Set a default within value if it's 0\n\t\t\t\t\t\t\t\t\tconst currentWithin = form.getValues(\"trigger.within\");\n\t\t\t\t\t\t\t\t\tif (currentWithin === 0) {\n\t\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.within\", DEFAULT_PROACTIVE_WITHIN);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tpreviousPosture === \"Proactive\" &&\n\t\t\t\t\t\t\t\t\tvalue === \"Reactive\"\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// Moving from Proactive to Reactive: move after to expect\n\t\t\t\t\t\t\t\t\tconst afterValues = form.getValues(\"trigger.after\") ?? [];\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.expect\", afterValues);\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.after\", []);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger aria-label=\"select posture\" className=\"w-[160px]\">\n\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select posture\" />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t{POSTURE_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { AutomationDeploymentCombobox } from \"./automation-deployment-combobox\";\nimport { PostureSelect } from \"./posture-select\";\n\nconst SECONDS_IN_DAY = 86400;\nconst MAX_WITHIN_SECONDS = 30 * SECONDS_IN_DAY;\n\nconst DEPLOYMENT_STATUSES = [\n\t{ value: \"prefect.deployment.ready\", label: \"Ready\" },\n\t{ value: \"prefect.deployment.not-ready\", label: \"Not Ready\" },\n\t{ value: \"prefect.deployment.disabled\", label: \"Disabled\" },\n];\n\nconst DEPLOYMENT_RESOURCE_PREFIX = \"prefect.deployment.\";\nconst ALL_DEPLOYMENTS_PATTERN = \"prefect.deployment.*\";\n\nconst extractDeploymentIds = (\n\tmatchValue: string | string[] | undefined,\n): string[] => {\n\tif (!matchValue) return [];\n\tconst values = Array.isArray(matchValue) ? matchValue : [matchValue];\n\treturn values\n\t\t.filter((v) => v !== ALL_DEPLOYMENTS_PATTERN)\n\t\t.map((v) => v.replace(DEPLOYMENT_RESOURCE_PREFIX, \"\"));\n};\n\nconst buildMatchPattern = (deploymentIds: string[]): string | string[] => {\n\tif (deploymentIds.length === 0) {\n\t\treturn ALL_DEPLOYMENTS_PATTERN;\n\t}\n\treturn deploymentIds.map((id) => `${DEPLOYMENT_RESOURCE_PREFIX}${id}`);\n};\n\nexport const DeploymentStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\tconst matchValue = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t});\n\n\tconst selectedDeploymentIds = useMemo(() => {\n\t\tconst match = matchValue as Record<string, string | string[]> | undefined;\n\t\tconst resourceId = match?.[\"prefect.resource.id\"];\n\t\treturn extractDeploymentIds(resourceId);\n\t}, [matchValue]);\n\n\tconst handleDeploymentIdsChange = useCallback(\n\t\t(deploymentIds: string[]) => {\n\t\t\tconst currentMatch = form.getValues(\"trigger.match\") ?? {};\n\t\t\tform.setValue(\"trigger.match\", {\n\t\t\t\t...currentMatch,\n\t\t\t\t\"prefect.resource.id\": buildMatchPattern(deploymentIds),\n\t\t\t});\n\t\t},\n\t\t[form],\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Deployments</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<AutomationDeploymentCombobox\n\t\t\t\t\t\tselectedDeploymentIds={selectedDeploymentIds}\n\t\t\t\t\t\tonSelectDeploymentIds={handleDeploymentIdsChange}\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Deployment</FormLabel>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"grid gap-2\"\n\t\t\t\t\tstyle={{ gridTemplateColumns: \"10rem 1fr\" }}\n\t\t\t\t>\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.expect\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst selectedStatus = field.value?.[0];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\tvalue={selectedStatus ?? \"\"}\n\t\t\t\t\t\t\t\t\tonValueChange={(value) => field.onChange([value])}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<SelectTrigger className=\"w-full\">\n\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t{DEPLOYMENT_STATUSES.map((status) => (\n\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t\t\t\t\t\t\t{status.label}\n\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Within</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={10}\n\t\t\t\t\t\t\t\t\tmax={MAX_WITHIN_SECONDS}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nconst MAX_VISIBLE_FLOWS = 2;\n\ntype FlowMultiSelectProps = {\n\tselectedFlowIds: string[];\n\tonToggleFlow: (flowId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function FlowMultiSelect({\n\tselectedFlowIds,\n\tonToggleFlow,\n\temptyMessage = \"Any flow\",\n}: FlowMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: flows = [] } = useQuery(\n\t\tbuildListFlowsQuery({\n\t\t\tflows: deferredSearch\n\t\t\t\t? {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { like_: deferredSearch },\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst { data: selectedFlowsData = [] } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows:\n\t\t\t\t\tselectedFlowIds.length > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tid: { any_: selectedFlowIds },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\tlimit: selectedFlowIds.length || 1,\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: selectedFlowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst filteredFlows = useMemo(() => {\n\t\treturn flows.filter(\n\t\t\t(flow: Flow) =>\n\t\t\t\t!deferredSearch ||\n\t\t\t\tflow.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [flows, deferredSearch]);\n\n\tconst renderSelectedFlows = () => {\n\t\tif (selectedFlowIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedFlowNames = selectedFlowsData\n\t\t\t.filter((flow) => selectedFlowIds.includes(flow.id))\n\t\t\t.map((flow) => flow.name);\n\n\t\tconst visibleNames = selectedFlowNames.slice(0, MAX_VISIBLE_FLOWS);\n\t\tconst overflow = selectedFlowIds.length - visibleNames.length;\n\n\t\treturn (\n\t\t\t<div className=\"flex min-w-0 items-center justify-start gap-1\">\n\t\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t\t{visibleNames.join(\", \")}\n\t\t\t\t</span>\n\t\t\t\t{overflow > 0 && (\n\t\t\t\t\t<span className=\"shrink-0 text-muted-foreground\">+{overflow}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedFlowIds.length > 0}>\n\t\t\t\t{renderSelectedFlows()}\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 flows...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No flows found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredFlows.map((flow: Flow) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={flow.id}\n\t\t\t\t\t\t\t\tselected={selectedFlowIds.includes(flow.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleFlow(flow.id);\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\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={flow.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{flow.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 { useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\tSTATE_NAME_TO_TYPE,\n\tSTATE_NAMES,\n\tSTATE_NAMES_WITHOUT_SCHEDULED,\n\ttype StateName,\n} from \"@/api/flow-runs/constants\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\nconst ALL_RUN_STATES = \"All run states\";\nconst ALL_EXCEPT_SCHEDULED = \"All except scheduled\";\n\ntype StateMultiSelectProps = {\n\tselectedStates: StateName[];\n\tonStateChange: (states: StateName[]) => void;\n\temptyMessage?: string;\n};\n\nfunction isAllExceptScheduled(states: StateName[]): boolean {\n\tif (states.length !== STATE_NAMES.length - 1) return false;\n\treturn !states.includes(\"Scheduled\");\n}\n\nexport function StateMultiSelect({\n\tselectedStates,\n\tonStateChange,\n\temptyMessage = \"Any state\",\n}: StateMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst displayValue = useMemo(() => {\n\t\tif (selectedStates.length === 0) {\n\t\t\treturn ALL_RUN_STATES;\n\t\t}\n\t\tif (isAllExceptScheduled(selectedStates)) {\n\t\t\treturn ALL_EXCEPT_SCHEDULED;\n\t\t}\n\t\treturn selectedStates;\n\t}, [selectedStates]);\n\n\tconst filteredStates = useMemo(() => {\n\t\tconst lowerSearch = deferredSearch.toLowerCase();\n\t\treturn STATE_NAMES.filter((name) =>\n\t\t\tname.toLowerCase().includes(lowerSearch),\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst showConvenienceOptions = useMemo(() => {\n\t\tconst lowerSearch = deferredSearch.toLowerCase();\n\t\treturn (\n\t\t\tALL_RUN_STATES.toLowerCase().includes(lowerSearch) ||\n\t\t\tALL_EXCEPT_SCHEDULED.toLowerCase().includes(lowerSearch)\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst handleConvenienceSelect = (option: string) => {\n\t\tif (option === ALL_RUN_STATES) {\n\t\t\tonStateChange([]);\n\t\t} else if (option === ALL_EXCEPT_SCHEDULED) {\n\t\t\tonStateChange([...STATE_NAMES_WITHOUT_SCHEDULED]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\tconst handleStateToggle = (stateName: StateName) => {\n\t\tif (selectedStates.includes(stateName)) {\n\t\t\tonStateChange(selectedStates.filter((s) => s !== stateName));\n\t\t} else {\n\t\t\tonStateChange([...selectedStates, stateName]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\tconst renderSelectedStates = () => {\n\t\tif (displayValue === ALL_RUN_STATES) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tif (displayValue === ALL_EXCEPT_SCHEDULED) {\n\t\t\treturn <span>All except scheduled</span>;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{selectedStates.map((stateName) => (\n\t\t\t\t\t<StateBadge\n\t\t\t\t\t\tkey={stateName}\n\t\t\t\t\t\ttype={STATE_NAME_TO_TYPE[stateName]}\n\t\t\t\t\t\tname={stateName}\n\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedStates.length > 0}>\n\t\t\t\t{renderSelectedStates()}\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 states...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No state found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{showConvenienceOptions && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tselected={displayValue === ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleConvenienceSelect(ALL_RUN_STATES)}\n\t\t\t\t\t\t\t\t\tvalue={ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tAll run states\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tselected={displayValue === ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleConvenienceSelect(ALL_EXCEPT_SCHEDULED)}\n\t\t\t\t\t\t\t\t\tvalue={ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tAll except scheduled\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredStates.map((stateName) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={stateName}\n\t\t\t\t\t\t\t\tselected={selectedStates.includes(stateName)}\n\t\t\t\t\t\t\t\tonSelect={() => handleStateToggle(stateName)}\n\t\t\t\t\t\t\t\tvalue={stateName}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\ttype={STATE_NAME_TO_TYPE[stateName]}\n\t\t\t\t\t\t\t\t\tname={stateName}\n\t\t\t\t\t\t\t\t/>\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 { useFormContext, useWatch } from \"react-hook-form\";\nimport type { StateName } from \"@/api/flow-runs/constants\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FlowMultiSelect } from \"@/components/flows/flow-multi-select\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { PostureSelect } from \"./posture-select\";\nimport { StateMultiSelect } from \"./state-multi-select\";\n\ntype MatchRelated = Record<string, string | string[]> | undefined;\n\n// Convert state names to event strings (e.g., \"Completed\" -> \"prefect.flow-run.Completed\")\n// When no states selected, returns wildcard [\"prefect.flow-run.*\"] (Vue behavior)\nfunction toStateNameEvents(stateNames: StateName[]): string[] {\n\tif (stateNames.length === 0) {\n\t\treturn [\"prefect.flow-run.*\"];\n\t}\n\treturn stateNames.map((name) => `prefect.flow-run.${name}`);\n}\n\n// Convert event strings back to state names (e.g., \"prefect.flow-run.Completed\" -> \"Completed\")\n// Wildcard \"prefect.flow-run.*\" returns empty array (means \"any state\")\nfunction fromStateNameEvents(events: string[] | undefined): StateName[] {\n\tif (!events || events.length === 0) {\n\t\treturn [];\n\t}\n\tif (events.includes(\"prefect.flow-run.*\")) {\n\t\treturn [];\n\t}\n\treturn events\n\t\t.filter((event) => event.startsWith(\"prefect.flow-run.\"))\n\t\t.map((event) => event.replace(\"prefect.flow-run.\", \"\") as StateName);\n}\n\nfunction extractFlowIdsFromMatchRelated(matchRelated: MatchRelated): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.flow.\"))\n\t\t.map((id) => id.replace(\"prefect.flow.\", \"\"));\n}\n\nfunction extractTagsFromMatchRelated(matchRelated: MatchRelated): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.tag.\"))\n\t\t.map((id) => id.replace(\"prefect.tag.\", \"\"));\n}\n\nfunction buildMatchRelated(flowIds: string[], tags: string[]): MatchRelated {\n\tconst flowResourceIds = flowIds.map((id) => `prefect.flow.${id}`);\n\tconst tagResourceIds = tags.map((tag) => `prefect.tag.${tag}`);\n\n\t// Return empty object when no flows/tags selected (matches Vue behavior)\n\tif (flowResourceIds.length === 0 && tagResourceIds.length === 0) {\n\t\treturn {};\n\t}\n\n\t// Set role based on which type is selected (Vue behavior)\n\t// Since tags are hidden when flows are selected, only one type will be present\n\tconst role = flowResourceIds.length > 0 ? \"flow\" : \"tag\";\n\tconst resourceIds = [...flowResourceIds, ...tagResourceIds];\n\n\treturn {\n\t\t\"prefect.resource.role\": role,\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nexport const FlowRunStateTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\t// Determine which field to use based on posture\n\t// Reactive: use \"expect\" (states to enter)\n\t// Proactive: use \"after\" (states to stay in)\n\tconst stateFieldName =\n\t\tposture === \"Proactive\" ? \"trigger.after\" : \"trigger.expect\";\n\n\tconst matchRelated = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match_related\",\n\t}) as MatchRelated;\n\n\tconst selectedFlowIds = extractFlowIdsFromMatchRelated(matchRelated);\n\tconst selectedTags = extractTagsFromMatchRelated(matchRelated);\n\n\tconst handleFlowToggle = (flowId: string) => {\n\t\tconst currentFlowIds = selectedFlowIds;\n\t\tconst newFlowIds = currentFlowIds.includes(flowId)\n\t\t\t? currentFlowIds.filter((id) => id !== flowId)\n\t\t\t: [...currentFlowIds, flowId];\n\n\t\t// Clear tags when flows are selected (Vue behavior)\n\t\tconst newTags = newFlowIds.length > 0 ? [] : selectedTags;\n\t\tform.setValue(\n\t\t\t\"trigger.match_related\",\n\t\t\tbuildMatchRelated(newFlowIds, newTags),\n\t\t);\n\t};\n\n\tconst handleTagsChange = (tags: string[]) => {\n\t\tform.setValue(\n\t\t\t\"trigger.match_related\",\n\t\t\tbuildMatchRelated(selectedFlowIds, tags),\n\t\t);\n\t};\n\n\t// Hide tags input when flows are selected (Vue behavior)\n\tconst showTagsInput = selectedFlowIds.length === 0;\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Flows</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<FlowMultiSelect\n\t\t\t\t\t\tselectedFlowIds={selectedFlowIds}\n\t\t\t\t\t\tonToggleFlow={handleFlowToggle}\n\t\t\t\t\t\temptyMessage=\"All flows\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t{showTagsInput && (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>Flow Run Tags</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<TagsInput\n\t\t\t\t\t\t\tvalue={selectedTags}\n\t\t\t\t\t\t\tonChange={handleTagsChange}\n\t\t\t\t\t\t\tplaceholder=\"All tags\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Flow Run</FormLabel>\n\t\t\t\t<div className=\"grid grid-cols-[10rem_1fr] gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname={stateFieldName}\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\t// Convert event strings to state names for UI display\n\t\t\t\t\t\t\tconst eventStrings = field.value ?? [];\n\t\t\t\t\t\t\tconst selectedStates = fromStateNameEvents(eventStrings);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<StateMultiSelect\n\t\t\t\t\t\t\t\t\t\tselectedStates={selectedStates}\n\t\t\t\t\t\t\t\t\t\tonStateChange={(states) => {\n\t\t\t\t\t\t\t\t\t\t\t// Convert state names to event strings for storage\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange(toStateNameEvents(states));\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\temptyMessage=\"Any state\"\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);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import type { ReactNode } from \"react\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\nexport type FormMode = \"Form\" | \"JSON\";\n\ntype FormModeToggleProps = {\n\tdefaultValue?: FormMode;\n\t/** Controlled value - when provided, the component becomes controlled */\n\tvalue?: FormMode;\n\t/** Callback when the mode changes - required for controlled mode */\n\tonValueChange?: (value: FormMode) => void;\n\tformContent: ReactNode;\n\tjsonContent: ReactNode;\n};\n\nexport const FormModeToggle = ({\n\tdefaultValue = \"Form\",\n\tvalue,\n\tonValueChange,\n\tformContent,\n\tjsonContent,\n}: FormModeToggleProps) => {\n\t// When value is provided, use controlled mode; otherwise use uncontrolled mode\n\tconst tabsProps =\n\t\tvalue !== undefined\n\t\t\t? { value, onValueChange: onValueChange as (value: string) => void }\n\t\t\t: { defaultValue };\n\n\treturn (\n\t\t<Tabs {...tabsProps}>\n\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t<TabsList>\n\t\t\t\t\t<TabsTrigger value=\"Form\">Form</TabsTrigger>\n\t\t\t\t\t<TabsTrigger value=\"JSON\">JSON</TabsTrigger>\n\t\t\t\t</TabsList>\n\t\t\t</div>\n\t\t\t<TabsContent value=\"Form\">{formContent}</TabsContent>\n\t\t\t<TabsContent value=\"JSON\">{jsonContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n","import { useState } from \"react\";\nimport { z } from \"zod\";\nimport { TriggerSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport type { JsonInputOnChange } from \"@/components/ui/json-input\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Label } from \"@/components/ui/label\";\n\ntype TriggerJsonInputProps = {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\terror?: string;\n};\n\nexport const TriggerJsonInput = ({\n\tvalue,\n\tonChange,\n\terror,\n}: TriggerJsonInputProps) => {\n\tconst [localError, setLocalError] = useState<string | null>(null);\n\n\tconst formatJson = () => {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(value);\n\t\t\tonChange(JSON.stringify(parsed, null, 2));\n\t\t} catch {\n\t\t\t// Invalid JSON, do nothing\n\t\t}\n\t};\n\n\tconst validate = (json: string): boolean => {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(json);\n\t\t\tTriggerSchema.parse(parsed);\n\t\t\tsetLocalError(null);\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\tif (e instanceof SyntaxError) {\n\t\t\t\tsetLocalError(\"Invalid JSON syntax\");\n\t\t\t} else if (e instanceof z.ZodError) {\n\t\t\t\tsetLocalError(e.errors[0]?.message ?? \"Invalid trigger configuration\");\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Label>Trigger Configuration</Label>\n\t\t\t\t<Button variant=\"ghost\" size=\"sm\" onClick={formatJson}>\n\t\t\t\t\tFormat\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\tEdit the trigger configuration as JSON.{\" \"}\n\t\t\t\t<a\n\t\t\t\t\thref=\"https://docs.prefect.io/v3/automate/events/automations-triggers\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclassName=\"underline hover:text-foreground\"\n\t\t\t\t>\n\t\t\t\t\tView documentation\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t\t<JsonInput\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={onChange as JsonInputOnChange}\n\t\t\t\tonBlur={() => validate(value)}\n\t\t\t/>\n\t\t\t{(localError || error) && (\n\t\t\t\t<p className=\"text-sm text-destructive\">{localError || error}</p>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FormControl, FormField, FormItem } from \"@/components/ui/form\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst TEMPLATE_TRIGGERS = {\n\t\"deployment-status\": \"Deployment status\",\n\t\"flow-run-state\": \"Flow run state\",\n\t\"work-pool-status\": \"Work pool status\",\n\t\"work-queue-status\": \"Work queue status\",\n\tcustom: \"Custom\",\n} as const;\n\nexport type TemplateTriggers = keyof typeof TEMPLATE_TRIGGERS;\n\n// Type alias for consistency with ticket specification\nexport type TriggerTemplate = TemplateTriggers;\n\ntype AutomationsTriggerTemplateSelectProps = {\n\tonValueChange: (value: TemplateTriggers) => void;\n\tvalue?: TemplateTriggers;\n};\n\nexport const AutomationsTriggerTemplateSelect = ({\n\tonValueChange,\n\tvalue,\n}: AutomationsTriggerTemplateSelectProps) => {\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t<Label htmlFor=\"automations-trigger-template-select\">\n\t\t\t\tTrigger Template\n\t\t\t</Label>\n\t\t\t<Select value={value} onValueChange={onValueChange}>\n\t\t\t\t<SelectTrigger\n\t\t\t\t\tid=\"automations-trigger-template-select\"\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t>\n\t\t\t\t\t<SelectValue placeholder=\"Select template\" />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t{Object.keys(TEMPLATE_TRIGGERS).map((key) => (\n\t\t\t\t\t\t\t<SelectItem key={key} value={key}>\n\t\t\t\t\t\t\t\t{TEMPLATE_TRIGGERS[key as TemplateTriggers]}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectGroup>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n};\n\ntype TriggerTemplateSelectFieldProps = {\n\tonTemplateChange?: (template: TriggerTemplate) => void;\n};\n\nexport const TriggerTemplateSelectField = ({\n\tonTemplateChange,\n}: TriggerTemplateSelectFieldProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"triggerTemplate\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<AutomationsTriggerTemplateSelect\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\tonTemplateChange?.(value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import type { EventTrigger } from \"@/components/automations/automations-wizard/automation-schema\";\nimport type { TriggerTemplate } from \"@/components/automations/automations-wizard/automations-trigger-template-select\";\n\nconst BASE_TRIGGER: EventTrigger = {\n\ttype: \"event\",\n\tposture: \"Reactive\",\n\tthreshold: 1,\n\twithin: 0,\n};\n\nexport const getDefaultTriggerForTemplate = (\n\ttemplate: TriggerTemplate,\n): EventTrigger => {\n\tswitch (template) {\n\t\tcase \"flow-run-state\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.flow-run.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.flow-run.*\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"deployment-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.deployment.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.deployment.not-ready\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"work-pool-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.work-pool.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\n\t\t\t\t\t\"prefect.work-pool.not-ready\",\n\t\t\t\t\t// compatibility with old event name\n\t\t\t\t\t\"prefect.work-pool.not_ready\",\n\t\t\t\t],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"work-queue-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.work-queue.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.work-queue.not-ready\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"custom\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\t// Include sensible defaults so users see a working example\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": [\"prefect.flow-run.*\"] },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.flow-run.Failed\"],\n\t\t\t\tfor_each: [],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 5,\n\t\t\t\twithin: 60,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn BASE_TRIGGER;\n\t}\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } 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\n// Show all selected work pool names and let CSS truncation handle overflow\n\ntype WorkPoolMultiSelectProps = {\n\tselectedWorkPoolIds: string[];\n\tonToggleWorkPool: (workPoolId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function WorkPoolMultiSelect({\n\tselectedWorkPoolIds,\n\tonToggleWorkPool,\n\temptyMessage = \"All work pools\",\n}: WorkPoolMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workPools = [] } = useQuery(buildFilterWorkPoolsQuery());\n\n\t// Filter to only show work pools with a status (excluding push/agent pools)\n\t// and apply search filter\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools\n\t\t\t.filter((workPool: WorkPool) => workPool.status !== null)\n\t\t\t.filter(\n\t\t\t\t(workPool: WorkPool) =>\n\t\t\t\t\t!deferredSearch ||\n\t\t\t\t\tworkPool.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t\t);\n\t}, [workPools, deferredSearch]);\n\n\t// Get selected work pools data for display\n\tconst selectedWorkPoolsData = useMemo(() => {\n\t\treturn workPools.filter((workPool: WorkPool) =>\n\t\t\tselectedWorkPoolIds.includes(workPool.id),\n\t\t);\n\t}, [workPools, selectedWorkPoolIds]);\n\n\tconst renderSelectedWorkPools = () => {\n\t\tif (selectedWorkPoolIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkPoolNames = selectedWorkPoolsData.map(\n\t\t\t(workPool) => workPool.name,\n\t\t);\n\n\t\t// Show all names and let CSS truncation handle overflow\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkPoolNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkPoolIds.length > 0}>\n\t\t\t\t{renderSelectedWorkPools()}\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 work pools...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work pools found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredWorkPools.map((workPool: 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={selectedWorkPoolIds.includes(workPool.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleWorkPool(workPool.id);\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\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={workPool.id}\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 { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { WorkPoolMultiSelect } from \"@/components/work-pools/work-pool-multi-select\";\nimport { PostureSelect } from \"./posture-select\";\n\n// Status options with their corresponding event arrays (matching Vue implementation)\n// \"not_ready\" maps to two events for backwards compatibility\nconst WORK_POOL_STATUSES = [\n\t{ value: \"ready\", label: \"Ready\", events: [\"prefect.work-pool.ready\"] },\n\t{\n\t\tvalue: \"not_ready\",\n\t\tlabel: \"Not Ready\",\n\t\tevents: [\"prefect.work-pool.not-ready\", \"prefect.work-pool.not_ready\"],\n\t},\n\t{ value: \"paused\", label: \"Paused\", events: [\"prefect.work-pool.paused\"] },\n] as const;\n\n// Get status value from events array (for reading from form state)\nfunction getStatusFromEvents(events: string[] | undefined): string {\n\tif (!events || events.length === 0) return \"not_ready\";\n\n\tfor (const status of WORK_POOL_STATUSES) {\n\t\tif (status.events.some((e) => events.includes(e))) {\n\t\t\treturn status.value;\n\t\t}\n\t}\n\treturn \"not_ready\";\n}\n\n// Get events for a status value\nfunction getEventsForStatus(statusValue: string): string[] {\n\tconst status = WORK_POOL_STATUSES.find((s) => s.value === statusValue);\n\treturn status ? [...status.events] : [];\n}\n\n// Get events for all statuses EXCEPT the given one (for Proactive expect)\nfunction getEventsExceptStatus(statusValue: string): string[] {\n\treturn WORK_POOL_STATUSES.filter((s) => s.value !== statusValue).flatMap(\n\t\t(s) => [...s.events],\n\t);\n}\n\ntype Match = Record<string, string | string[]> | undefined;\n\n// Extract work pool IDs from match['prefect.resource.id']\n// Returns empty array for wildcard \"prefect.work-pool.*\" (meaning \"all work pools\")\nfunction extractWorkPoolIdsFromMatch(match: Match): string[] {\n\tif (!match) return [];\n\n\tconst resourceIds = match[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\t// Handle wildcard case - \"all work pools\" means no specific pools selected\n\tif (resourceIds === \"prefect.work-pool.*\") return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter(\n\t\t\t(id) =>\n\t\t\t\tid.startsWith(\"prefect.work-pool.\") && id !== \"prefect.work-pool.*\",\n\t\t)\n\t\t.map((id) => id.replace(\"prefect.work-pool.\", \"\"));\n}\n\n// Build match object with work pool IDs\nfunction buildMatch(workPoolIds: string[]): Match {\n\tif (workPoolIds.length === 0) {\n\t\treturn {\n\t\t\t\"prefect.resource.id\": \"prefect.work-pool.*\",\n\t\t};\n\t}\n\n\treturn {\n\t\t\"prefect.resource.id\": workPoolIds.map((id) => `prefect.work-pool.${id}`),\n\t};\n}\n\n// Status select component that handles posture-dependent behavior\nconst StatusSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\tconst expect = useWatch<AutomationWizardSchema>({ name: \"trigger.expect\" }) as\n\t\t| string[]\n\t\t| undefined;\n\tconst after = useWatch<AutomationWizardSchema>({ name: \"trigger.after\" }) as\n\t\t| string[]\n\t\t| undefined;\n\n\t// Get current status based on posture\n\t// Reactive: status is in expect, Proactive: status is in after\n\tconst currentStatus =\n\t\tposture === \"Proactive\"\n\t\t\t? getStatusFromEvents(after)\n\t\t\t: getStatusFromEvents(expect);\n\n\tconst handleStatusChange = (statusValue: string) => {\n\t\tconst statusEvents = getEventsForStatus(statusValue);\n\t\tconst otherStatusEvents = getEventsExceptStatus(statusValue);\n\n\t\tif (posture === \"Proactive\") {\n\t\t\t// Proactive: selected status goes to \"after\", other statuses go to \"expect\"\n\t\t\tform.setValue(\"trigger.after\", statusEvents);\n\t\t\tform.setValue(\"trigger.expect\", otherStatusEvents);\n\t\t} else {\n\t\t\t// Reactive: selected status goes to \"expect\", \"after\" is empty\n\t\t\tform.setValue(\"trigger.expect\", statusEvents);\n\t\t\tform.setValue(\"trigger.after\", []);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Select value={currentStatus} onValueChange={handleStatusChange}>\n\t\t\t<SelectTrigger aria-label=\"select status\" className=\"min-w-0 flex-1\">\n\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{WORK_POOL_STATUSES.map((status) => (\n\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t{status.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nexport const WorkPoolStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\tconst match = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t}) as Match;\n\n\tconst selectedWorkPoolIds = extractWorkPoolIdsFromMatch(match);\n\n\tconst handleWorkPoolToggle = (workPoolId: string) => {\n\t\tconst currentWorkPoolIds = selectedWorkPoolIds;\n\t\tconst newWorkPoolIds = currentWorkPoolIds.includes(workPoolId)\n\t\t\t? currentWorkPoolIds.filter((id) => id !== workPoolId)\n\t\t\t: [...currentWorkPoolIds, workPoolId];\n\n\t\tform.setValue(\"trigger.match\", buildMatch(newWorkPoolIds));\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pools</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkPoolMultiSelect\n\t\t\t\t\t\tselectedWorkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\tonToggleWorkPool={handleWorkPoolToggle}\n\t\t\t\t\t\temptyMessage=\"All work pools\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pool</FormLabel>\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<StatusSelect />\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 30}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } 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 WorkPoolsComboboxProps = {\n\tselectedWorkPoolIds: string[];\n\tonToggleWorkPool: (workPoolId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function WorkPoolsCombobox({\n\tselectedWorkPoolIds,\n\tonToggleWorkPool,\n\temptyMessage = \"All work pools\",\n}: WorkPoolsComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workPools = [] } = useQuery(\n\t\tbuildFilterWorkPoolsQuery({\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools.filter((workPool: WorkPool) => {\n\t\t\tif (!workPool.status) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!deferredSearch) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn workPool.name.toLowerCase().includes(deferredSearch.toLowerCase());\n\t\t});\n\t}, [workPools, deferredSearch]);\n\n\tconst renderSelectedWorkPools = () => {\n\t\tif (selectedWorkPoolIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkPoolNames = workPools\n\t\t\t.filter((workPool) => selectedWorkPoolIds.includes(workPool.id))\n\t\t\t.map((workPool) => workPool.name);\n\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkPoolNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkPoolIds.length > 0}>\n\t\t\t\t{renderSelectedWorkPools()}\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 work pools...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work pools found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredWorkPools.map((workPool: 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={selectedWorkPoolIds.includes(workPool.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleWorkPool(workPool.id);\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\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={workPool.id}\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 { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkQueuesQuery, type WorkQueue } from \"@/api/work-queues\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\ntype WorkQueuesComboboxProps = {\n\tselectedWorkQueueIds: string[];\n\tonToggleWorkQueue: (workQueueId: string) => void;\n\tworkPoolIds?: string[];\n\temptyMessage?: string;\n};\n\nexport function WorkQueuesCombobox({\n\tselectedWorkQueueIds,\n\tonToggleWorkQueue,\n\tworkPoolIds = [],\n\temptyMessage = \"All work queues\",\n}: WorkQueuesComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workQueues = [] } = useQuery(\n\t\tbuildFilterWorkQueuesQuery({\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkQueues = useMemo(() => {\n\t\treturn workQueues.filter((workQueue: WorkQueue) => {\n\t\t\t// Filter by work pool IDs if specified\n\t\t\tif (\n\t\t\t\tworkPoolIds.length > 0 &&\n\t\t\t\t(!workQueue.work_pool_id ||\n\t\t\t\t\t!workPoolIds.includes(workQueue.work_pool_id))\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!deferredSearch) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn workQueue.name\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(deferredSearch.toLowerCase());\n\t\t});\n\t}, [workQueues, workPoolIds, deferredSearch]);\n\n\t// Group work queues by work pool name\n\tconst groupedWorkQueues = useMemo(() => {\n\t\tconst groups: Record<string, WorkQueue[]> = {};\n\n\t\tfor (const workQueue of filteredWorkQueues) {\n\t\t\tconst poolName = workQueue.work_pool_name ?? \"Unknown\";\n\t\t\tif (!groups[poolName]) {\n\t\t\t\tgroups[poolName] = [];\n\t\t\t}\n\t\t\tgroups[poolName].push(workQueue);\n\t\t}\n\n\t\t// Sort groups by pool name and sort queues within each group by name\n\t\tconst sortedGroupNames = Object.keys(groups).sort((a, b) =>\n\t\t\ta.localeCompare(b),\n\t\t);\n\n\t\treturn sortedGroupNames.map((poolName) => ({\n\t\t\tpoolName,\n\t\t\tqueues: groups[poolName].sort((a, b) => a.name.localeCompare(b.name)),\n\t\t}));\n\t}, [filteredWorkQueues]);\n\n\tconst renderSelectedWorkQueues = () => {\n\t\tif (selectedWorkQueueIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkQueueNames = workQueues\n\t\t\t.filter((workQueue) => selectedWorkQueueIds.includes(workQueue.id))\n\t\t\t.map((workQueue) => workQueue.name);\n\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkQueueNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkQueueIds.length > 0}>\n\t\t\t\t{renderSelectedWorkQueues()}\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 work queues...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work queues found</ComboboxCommandEmtpy>\n\t\t\t\t\t{groupedWorkQueues.map((group) => (\n\t\t\t\t\t\t<ComboboxCommandGroup key={group.poolName} heading={group.poolName}>\n\t\t\t\t\t\t\t{group.queues.map((workQueue: WorkQueue) => (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={workQueue.id}\n\t\t\t\t\t\t\t\t\tselected={selectedWorkQueueIds.includes(workQueue.id)}\n\t\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\t\tonToggleWorkQueue(workQueue.id);\n\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\tvalue={workQueue.id}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{workQueue.name}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t))}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { PostureSelect } from \"./posture-select\";\nimport { WorkPoolsCombobox } from \"./work-pools-combobox\";\nimport { WorkQueuesCombobox } from \"./work-queues-combobox\";\n\nconst WORK_QUEUE_STATUSES = [\n\t{ value: \"prefect.work-queue.ready\", label: \"Ready\" },\n\t{ value: \"prefect.work-queue.not-ready\", label: \"Not Ready\" },\n\t{ value: \"prefect.work-queue.paused\", label: \"Paused\" },\n];\n\ntype MatchRelated = Record<string, string | string[]> | undefined;\ntype Match = Record<string, string | string[]> | undefined;\n\nfunction extractWorkPoolIdsFromMatchRelated(\n\tmatchRelated: MatchRelated,\n): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.work-pool.\"))\n\t\t.map((id) => id.replace(\"prefect.work-pool.\", \"\"));\n}\n\nfunction extractWorkQueueIdsFromMatch(match: Match): string[] {\n\tif (!match) return [];\n\n\tconst resourceIds = match[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\n\tif (ids.includes(\"prefect.work-queue.*\")) {\n\t\treturn [];\n\t}\n\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.work-queue.\"))\n\t\t.map((id) => id.replace(\"prefect.work-queue.\", \"\"));\n}\n\nfunction buildMatchRelated(workPoolIds: string[]): MatchRelated {\n\tif (workPoolIds.length === 0) {\n\t\treturn {};\n\t}\n\n\tconst resourceIds = workPoolIds.map((id) => `prefect.work-pool.${id}`);\n\n\treturn {\n\t\t\"prefect.resource.role\": \"work-pool\",\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nfunction buildMatch(workQueueIds: string[]): Match {\n\tif (workQueueIds.length === 0) {\n\t\treturn { \"prefect.resource.id\": \"prefect.work-queue.*\" };\n\t}\n\n\tconst resourceIds = workQueueIds.map((id) => `prefect.work-queue.${id}`);\n\n\treturn {\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nexport const WorkQueueStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\tconst matchRelated = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match_related\",\n\t}) as MatchRelated;\n\n\tconst match = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t}) as Match;\n\n\tconst selectedWorkPoolIds = extractWorkPoolIdsFromMatchRelated(matchRelated);\n\tconst selectedWorkQueueIds = extractWorkQueueIdsFromMatch(match);\n\n\tconst handleWorkPoolToggle = (workPoolId: string) => {\n\t\tconst currentWorkPoolIds = selectedWorkPoolIds;\n\t\tconst newWorkPoolIds = currentWorkPoolIds.includes(workPoolId)\n\t\t\t? currentWorkPoolIds.filter((id) => id !== workPoolId)\n\t\t\t: [...currentWorkPoolIds, workPoolId];\n\n\t\tform.setValue(\"trigger.match_related\", buildMatchRelated(newWorkPoolIds));\n\t};\n\n\tconst handleWorkQueueToggle = (workQueueId: string) => {\n\t\tconst currentWorkQueueIds = selectedWorkQueueIds;\n\t\tconst newWorkQueueIds = currentWorkQueueIds.includes(workQueueId)\n\t\t\t? currentWorkQueueIds.filter((id) => id !== workQueueId)\n\t\t\t: [...currentWorkQueueIds, workQueueId];\n\n\t\tform.setValue(\"trigger.match\", buildMatch(newWorkQueueIds));\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pools</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkPoolsCombobox\n\t\t\t\t\t\tselectedWorkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\tonToggleWorkPool={handleWorkPoolToggle}\n\t\t\t\t\t\temptyMessage=\"All work pools\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Queues</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkQueuesCombobox\n\t\t\t\t\t\tselectedWorkQueueIds={selectedWorkQueueIds}\n\t\t\t\t\t\tonToggleWorkQueue={handleWorkQueueToggle}\n\t\t\t\t\t\tworkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\temptyMessage=\"All work queues\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Queue</FormLabel>\n\t\t\t\t<div className=\"grid grid-cols-[10rem_1fr] gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.expect\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst selectedStatus = field.value?.[0];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\t\tvalue={selectedStatus ?? \"\"}\n\t\t\t\t\t\t\t\t\t\tonValueChange={(value) => field.onChange([value])}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SelectTrigger className=\"w-full\">\n\t\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t\t{WORK_QUEUE_STATUSES.map((status) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{status.label}\n\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))}\n\t\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\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\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n\ttype AutomationWizardSchema,\n\ttype Trigger,\n\tTriggerSchema,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\ttype TriggerTemplate,\n\tTriggerTemplateSelectField,\n} from \"@/components/automations/automations-wizard/automations-trigger-template-select\";\nimport { CustomTriggerFields } from \"./custom-trigger-fields\";\nimport { DeploymentStatusTriggerFields } from \"./deployment-status-trigger-fields\";\nimport { FlowRunStateTriggerFields } from \"./flow-run-state-trigger-fields\";\nimport { type FormMode, FormModeToggle } from \"./form-mode-toggle\";\nimport { TriggerJsonInput } from \"./trigger-json-input\";\nimport { getDefaultTriggerForTemplate } from \"./trigger-step-utils\";\nimport { WorkPoolStatusTriggerFields } from \"./work-pool-status-trigger-fields\";\nimport { WorkQueueStatusTriggerFields } from \"./work-queue-status-trigger-fields\";\n\nexport const TriggerStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst triggerTemplate = form.watch(\"triggerTemplate\");\n\tconst trigger = form.watch(\"trigger\");\n\n\tconst [mode, setMode] = useState<FormMode>(\"Form\");\n\tconst [jsonString, setJsonString] = useState<string>(\"\");\n\tconst [jsonError, setJsonError] = useState<string | undefined>(undefined);\n\n\t// Serialize trigger to JSON string\n\tconst serializeTrigger = useCallback(() => {\n\t\treturn JSON.stringify(trigger, null, 2);\n\t}, [trigger]);\n\n\t// Update jsonString when trigger changes (while in Form mode)\n\tuseEffect(() => {\n\t\tif (mode === \"Form\") {\n\t\t\tsetJsonString(serializeTrigger());\n\t\t}\n\t}, [mode, serializeTrigger]);\n\n\t// Validate and parse JSON string\n\tconst validateAndParseJson = useCallback(\n\t\t(json: string): { valid: boolean; trigger?: Trigger; error?: string } => {\n\t\t\ttry {\n\t\t\t\tconst parsed: unknown = JSON.parse(json);\n\t\t\t\tconst validatedTrigger = TriggerSchema.parse(parsed);\n\t\t\t\treturn { valid: true, trigger: validatedTrigger };\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof SyntaxError) {\n\t\t\t\t\treturn { valid: false, error: \"Invalid JSON syntax\" };\n\t\t\t\t}\n\t\t\t\tif (e instanceof z.ZodError) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terror: e.errors[0]?.message ?? \"Invalid trigger configuration\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn { valid: false, error: \"Unknown error\" };\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\t// Handle mode change with validation\n\tconst handleModeChange = useCallback(\n\t\t(newMode: FormMode) => {\n\t\t\tif (mode === newMode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (newMode === \"Form\") {\n\t\t\t\t// Switching from JSON to Form - validate and sync JSON to form\n\t\t\t\tconst result = validateAndParseJson(jsonString);\n\t\t\t\tif (!result.valid) {\n\t\t\t\t\tsetJsonError(result.error);\n\t\t\t\t\treturn; // Block switch if JSON is invalid\n\t\t\t\t}\n\t\t\t\t// Update form with parsed trigger\n\t\t\t\tif (result.trigger) {\n\t\t\t\t\tform.setValue(\"trigger\", result.trigger);\n\t\t\t\t}\n\t\t\t\tsetJsonError(undefined);\n\t\t\t} else {\n\t\t\t\t// Switching from Form to JSON - serialize current trigger\n\t\t\t\tsetJsonString(serializeTrigger());\n\t\t\t\tsetJsonError(undefined);\n\t\t\t}\n\n\t\t\tsetMode(newMode);\n\t\t},\n\t\t[mode, jsonString, validateAndParseJson, form, serializeTrigger],\n\t);\n\n\t// Handle JSON input changes - immediately sync valid JSON to form\n\tconst handleJsonChange = useCallback(\n\t\t(value: string) => {\n\t\t\tsetJsonString(value);\n\n\t\t\t// Try to parse and validate the JSON\n\t\t\tconst result = validateAndParseJson(value);\n\t\t\tif (result.valid && result.trigger) {\n\t\t\t\t// Valid JSON - sync to form immediately\n\t\t\t\tform.setValue(\"trigger\", result.trigger);\n\t\t\t\tsetJsonError(undefined);\n\t\t\t}\n\t\t\t// Don't set error on every keystroke - only on blur or mode switch\n\t\t},\n\t\t[validateAndParseJson, form],\n\t);\n\n\tconst handleTemplateChange = (value: TriggerTemplate) => {\n\t\tconst newTrigger = getDefaultTriggerForTemplate(value);\n\t\tform.setValue(\"trigger\", newTrigger);\n\t\t// Reset JSON string when template changes\n\t\tsetJsonString(JSON.stringify(newTrigger, null, 2));\n\t\tsetJsonError(undefined);\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-6\">\n\t\t\t<TriggerTemplateSelectField onTemplateChange={handleTemplateChange} />\n\t\t\t{triggerTemplate && (\n\t\t\t\t<FormModeToggle\n\t\t\t\t\tvalue={mode}\n\t\t\t\t\tonValueChange={handleModeChange}\n\t\t\t\t\tformContent={<TriggerTemplateFields template={triggerTemplate} />}\n\t\t\t\t\tjsonContent={\n\t\t\t\t\t\t<TriggerJsonInput\n\t\t\t\t\t\t\tvalue={jsonString}\n\t\t\t\t\t\t\tonChange={handleJsonChange}\n\t\t\t\t\t\t\terror={jsonError}\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</div>\n\t);\n};\n\ntype TriggerTemplateFieldsProps = {\n\ttemplate: TriggerTemplate;\n};\n\nconst TriggerTemplateFields = ({ template }: TriggerTemplateFieldsProps) => {\n\tswitch (template) {\n\t\tcase \"flow-run-state\":\n\t\t\treturn <FlowRunStateTriggerFields />;\n\t\tcase \"deployment-status\":\n\t\t\treturn <DeploymentStatusTriggerFields />;\n\t\tcase \"work-pool-status\":\n\t\t\treturn <WorkPoolStatusTriggerFields />;\n\t\tcase \"work-queue-status\":\n\t\t\treturn <WorkQueueStatusTriggerFields />;\n\t\tcase \"custom\":\n\t\t\treturn <CustomTriggerFields />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Link } from \"@tanstack/react-router\";\nimport { useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardFooter } from \"@/components/ui/card\";\nimport { Form, FormMessage } from \"@/components/ui/form\";\nimport { Stepper } from \"@/components/ui/stepper\";\nimport { useStepper } from \"@/hooks/use-stepper\";\nimport { ActionsStep } from \"./actions-step\";\nimport { AutomationWizardSchema } from \"./automation-schema\";\nimport { DetailsStep } from \"./details-step\";\nimport { TriggerStep } from \"./trigger-step\";\n\ntype AutomationWizardFormInput = z.input<typeof AutomationWizardSchema>;\ntype AutomationWizardFormOutput = z.output<typeof AutomationWizardSchema>;\n\nconst WIZARD_STEPS = [\"Trigger\", \"Actions\", \"Details\"] as const;\ntype WizardStep = (typeof WIZARD_STEPS)[number];\n\nconst DEFAULT_FORM_VALUES = {\n\tactions: [{ type: undefined }],\n\ttrigger: {\n\t\ttype: \"event\" as const,\n\t\tposture: \"Reactive\" as const,\n\t\tthreshold: 1,\n\t\twithin: 0,\n\t},\n};\n\nexport type AutomationWizardProps = {\n\tdefaultValues?: Partial<AutomationWizardFormInput>;\n\tonSubmit: (values: AutomationWizardFormOutput) => void;\n\tsubmitLabel?: string;\n\tisSubmitting?: boolean;\n};\n\nexport const AutomationWizard = ({\n\tdefaultValues = {},\n\tonSubmit,\n\tsubmitLabel = \"Save\",\n\tisSubmitting = false,\n}: AutomationWizardProps) => {\n\tconst isEditMode = Boolean(\n\t\tdefaultValues && Object.keys(defaultValues).length > 0,\n\t);\n\tconst initialVisitedSteps = isEditMode\n\t\t? new Set([0, 1, 2])\n\t\t: new Set<number>([0]);\n\tconst stepper = useStepper(WIZARD_STEPS.length, 0, initialVisitedSteps);\n\tconst form = useForm<\n\t\tAutomationWizardFormInput,\n\t\tunknown,\n\t\tAutomationWizardFormOutput\n\t>({\n\t\tresolver: zodResolver(AutomationWizardSchema),\n\t\tdefaultValues: {\n\t\t\t...DEFAULT_FORM_VALUES,\n\t\t\t...defaultValues,\n\t\t} as AutomationWizardFormInput,\n\t});\n\n\tconst currentStep = WIZARD_STEPS[stepper.currentStep];\n\tconst WIZARD_STEPS_MAP = {\n\t\tTrigger: {\n\t\t\trender: () => <TriggerStep />,\n\t\t\ttrigger: () => form.trigger(\"trigger\"),\n\t\t},\n\t\tActions: {\n\t\t\trender: () => <ActionsStep />,\n\t\t\ttrigger: () => form.trigger(\"actions\"),\n\t\t},\n\t\tDetails: {\n\t\t\trender: () => <DetailsStep />,\n\t\t\ttrigger: () => form.trigger([\"description\", \"name\"]),\n\t\t},\n\t} as const;\n\n\tconst handleIncrementStep = async (step: WizardStep) => {\n\t\tconst isValid = await WIZARD_STEPS_MAP[step].trigger();\n\t\tif (isValid) {\n\t\t\tstepper.incrementStep();\n\t\t}\n\t};\n\n\treturn (\n\t\t<Form {...form}>\n\t\t\t<form onSubmit={(e) => void form.handleSubmit(onSubmit)(e)}>\n\t\t\t\t<div className=\"flex flex-col gap-8\">\n\t\t\t\t\t<Stepper\n\t\t\t\t\t\tsteps={WIZARD_STEPS}\n\t\t\t\t\t\tcurrentStepNum={stepper.currentStep}\n\t\t\t\t\t\tonClick={(step) => stepper.changeStep(step.stepNum)}\n\t\t\t\t\t\tcompletedSteps={stepper.completedStepsSet}\n\t\t\t\t\t\tvisitedSteps={stepper.visitedStepsSet}\n\t\t\t\t\t/>\n\t\t\t\t\t<Card className=\"p-4 pt-8\">\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t{WIZARD_STEPS_MAP[currentStep].render()}\n\t\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t\t<CardFooter className=\"mt-6 flex gap-2 justify-end\">\n\t\t\t\t\t\t\t<Button type=\"button\" variant=\"outline\">\n\t\t\t\t\t\t\t\t<Link to=\"/automations\">Cancel</Link>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tdisabled={stepper.isStartingStep}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tonClick={stepper.decrementStep}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tPrevious\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t{stepper.isFinalStep ? (\n\t\t\t\t\t\t\t\t<Button key=\"save\" type=\"submit\" loading={isSubmitting}>\n\t\t\t\t\t\t\t\t\t{submitLabel}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tkey=\"next\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => void handleIncrementStep(currentStep)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNext\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</CardFooter>\n\t\t\t\t\t</Card>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</Form>\n\t);\n};\n"],"names":["AUTOMATION_ACTION_TYPES","ActionTypeSelect","index","form","useFormContext","jsx","FormField","field","FormItem","FormLabel","FormControl","jsxs","Select","type","defaultActionField","getDefaultActionField","UNASSIGNED","SelectTrigger","SelectValue","SelectContent","SelectGroup","SelectLabel","key","SelectItem","ChangeFlowRunStateFields","stateField","Fragment","StateSelect","FormMessage","Input","RUN_STATES","Textarea","FlowRunActionDescription","action","text","Typography","DEFAULT_NUM_SKELETONS","LoadingSelectState","length","_","Skeleton","INFER_OPTION","getButtonLabel","data","fieldValue","automation","SelectAutomationsFields","search","setSearch","useState","isSuccess","useQuery","buildListAutomationsQuery","deferredSearch","useDeferredValue","filteredData","useMemo","isInferredOptionFiltered","buttonLabel","Combobox","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","ComboboxCommandGroup","ComboboxCommandItem","value","useListDeploymentsWithFlows","filter","deploymentsData","deploymentsStatus","buildPaginateDeploymentsQuery","deploymentsFlowIds","deployment","flowsData","flowsStatus","buildListFlowsQuery","flowMap","flow","deploymentsWithFlows","count","limit","pages","page","d","DeploymentLabel","SelectDeploymentsFields","actionType","deploymentId","useWatch","debouncedSearch","useDebounce","deploymentWithFlow","Icon","workPool","wp","SelectWorkPoolsFields","buildFilterWorkPoolsQuery","workQueue","wq","SelectWorkQueuesFields","buildFilterWorkQueuesQuery","filteredMap","filteredWorkQueues","work_pool_name","workPoolName","workQueues","SendNotificationFields","blockTypes","isLoadingBlockTypes","buildListFilterBlockTypesQuery","blockTypeSlugs","bt","blockDocuments","isLoadingBlockDocuments","buildListFilterBlockDocumentsQuery","isLoading","groupedBlockDocuments","blockType","doc","group","filteredGroups","lowerSearch","getSelectedBlockDocument","useCallback","blockDocumentId","selectedDoc","TemplateField","name","label","placeholder","multiline","validateTemplate","useValidateTemplate","validationError","setValidationError","isValidating","setIsValidating","debouncedValue","useEffect","result","InputComponent","ActionStep","onRemove","Button","ActionTypeAdditionalFields","ActionsStep","fields","append","remove","useFieldArray","id","DetailsStep","POSTURE_OPTIONS","DEFAULT_PROACTIVE_WITHIN","CustomPostureSelect","handlePostureChange","previousPosture","expectValues","afterValues","RadioGroup","option","RadioGroupItem","Label","SECONDS_IN_MINUTE","SECONDS_IN_HOUR","SECONDS_IN_DAY","DURATION_UNITS","getDefaultUnitForValue","DurationInput","onChange","min","max","className","disabled","unit","setUnit","availableUnits","u","quantity","handleQuantityChange","newQuantity","newValue","handleUnitChange","newUnitValue","newUnit","oldUnit","firstAvailable","cn","e","FALLBACK_MAX_DISPLAYED","PLUS_N_WIDTH","EventResourceCombobox","selectedResourceIds","onToggleResource","emptyMessage","containerWidth","setContainerWidth","containerRef","useRef","measureRef","container","observer","entries","entry","resourceOptions","useResourceOptions","groupedResources","groups","resource","a","b","lower","opt","showCustomOption","calculateVisibleCount","names","measureEl","availableWidth","visibleCount","i","renderSelectedResources","selectedNames","r","visible","extraCount","handleSelect","getEventPrefixValues","events","prefixCounts","event","parts","prefix","EventsCombobox","selectedEvents","onToggleEvent","occurredFilter","eventCounts","buildEventsCountQuery","options","eventLabels","prefixes","filteredOptions","renderSelectedEvents","visibleNames","overflow","CustomTriggerFields","posture","newEvents","resourceIds","resourceIdsArray","resourceId","newIds","Collapsible","CollapsibleTrigger","ChevronRight","CollapsibleContent","AutomationDeploymentCombobox","selectedDeploymentIds","onSelectDeploymentIds","selectedDeploymentsSet","deployments","buildFilterDeploymentsQuery","selectedDeploymentsData","handleSelectDeployment","updatedDeployments","handleClearAll","renderSelectedDeployments","selectedDeploymentNames","filteredDeployments","Checkbox","PostureSelect","MAX_WITHIN_SECONDS","DEPLOYMENT_STATUSES","DEPLOYMENT_RESOURCE_PREFIX","ALL_DEPLOYMENTS_PATTERN","extractDeploymentIds","matchValue","v","buildMatchPattern","deploymentIds","DeploymentStatusTriggerFields","handleDeploymentIdsChange","currentMatch","selectedStatus","status","MAX_VISIBLE_FLOWS","FlowMultiSelect","selectedFlowIds","onToggleFlow","flows","selectedFlowsData","filteredFlows","renderSelectedFlows","ALL_RUN_STATES","ALL_EXCEPT_SCHEDULED","isAllExceptScheduled","states","STATE_NAMES","StateMultiSelect","selectedStates","onStateChange","displayValue","filteredStates","showConvenienceOptions","handleConvenienceSelect","STATE_NAMES_WITHOUT_SCHEDULED","handleStateToggle","stateName","s","renderSelectedStates","StateBadge","STATE_NAME_TO_TYPE","toStateNameEvents","stateNames","fromStateNameEvents","extractFlowIdsFromMatchRelated","matchRelated","extractTagsFromMatchRelated","buildMatchRelated","flowIds","tags","flowResourceIds","tagResourceIds","tag","role","FlowRunStateTriggerFields","stateFieldName","selectedTags","handleFlowToggle","flowId","currentFlowIds","newFlowIds","newTags","handleTagsChange","showTagsInput","TagsInput","eventStrings","FormModeToggle","defaultValue","onValueChange","formContent","jsonContent","tabsProps","Tabs","TabsList","TabsTrigger","TabsContent","TriggerJsonInput","error","localError","setLocalError","formatJson","parsed","validate","json","TriggerSchema","z.ZodError","JsonInput","TEMPLATE_TRIGGERS","AutomationsTriggerTemplateSelect","TriggerTemplateSelectField","onTemplateChange","BASE_TRIGGER","getDefaultTriggerForTemplate","template","WorkPoolMultiSelect","selectedWorkPoolIds","onToggleWorkPool","workPools","filteredWorkPools","selectedWorkPoolsData","renderSelectedWorkPools","selectedWorkPoolNames","WORK_POOL_STATUSES","getStatusFromEvents","getEventsForStatus","statusValue","getEventsExceptStatus","extractWorkPoolIdsFromMatch","match","buildMatch","workPoolIds","StatusSelect","expect","after","currentStatus","handleStatusChange","statusEvents","otherStatusEvents","WorkPoolStatusTriggerFields","handleWorkPoolToggle","workPoolId","currentWorkPoolIds","newWorkPoolIds","WorkPoolsCombobox","WorkQueuesCombobox","selectedWorkQueueIds","onToggleWorkQueue","groupedWorkQueues","poolName","renderSelectedWorkQueues","selectedWorkQueueNames","WORK_QUEUE_STATUSES","extractWorkPoolIdsFromMatchRelated","extractWorkQueueIdsFromMatch","ids","workQueueIds","WorkQueueStatusTriggerFields","handleWorkQueueToggle","workQueueId","currentWorkQueueIds","newWorkQueueIds","TriggerStep","triggerTemplate","trigger","mode","setMode","jsonString","setJsonString","jsonError","setJsonError","serializeTrigger","validateAndParseJson","handleModeChange","newMode","handleJsonChange","handleTemplateChange","newTrigger","TriggerTemplateFields","WIZARD_STEPS","DEFAULT_FORM_VALUES","AutomationWizard","defaultValues","onSubmit","submitLabel","isSubmitting","initialVisitedSteps","stepper","useStepper","useForm","zodResolver","AutomationWizardSchema","currentStep","WIZARD_STEPS_MAP","handleIncrementStep","step","Form","Stepper","Card","CardContent","CardFooter","Link"],"mappings":"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"}