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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/cli/__init__.py +1 -0
  3. prefect/cli/cloud/asset.py +135 -0
  4. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js +2 -0
  5. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js.map +1 -0
  6. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js +2 -0
  7. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js.map +1 -0
  8. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js +2 -0
  9. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js.map +1 -0
  10. prefect/server/ui-v2/assets/automation._id-CEHa-X0X.js +2 -0
  11. prefect/server/ui-v2/assets/{automation._id-CMiura1b.js.map → automation._id-CEHa-X0X.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js → automation_._id.edit-BRWAsELa.js} +2 -2
  13. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js.map → automation_._id.edit-BRWAsELa.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js → automations-header-Dr6v5dPp.js} +2 -2
  15. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js.map → automations-header-Dr6v5dPp.js.map} +1 -1
  16. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js +2 -0
  17. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js.map +1 -0
  18. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js +2 -0
  19. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js.map +1 -0
  20. prefect/server/ui-v2/assets/block-type-logo-scnMsyY5.js +2 -0
  21. prefect/server/ui-v2/assets/{block-type-logo-DuvU7goV.js.map → block-type-logo-scnMsyY5.js.map} +1 -1
  22. prefect/server/ui-v2/assets/block._id-BY42cyjR.js +2 -0
  23. prefect/server/ui-v2/assets/block._id-BY42cyjR.js.map +1 -0
  24. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js → block_._id.edit-n2jwU5yr.js} +2 -2
  25. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js.map → block_._id.edit-n2jwU5yr.js.map} +1 -1
  26. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js +2 -0
  27. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js.map +1 -0
  28. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js +2 -0
  29. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js.map +1 -0
  30. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js → catalog_._slug_.create-rboQmoyW.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js.map → catalog_._slug_.create-rboQmoyW.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js → collapsible-Lk7MRvBH.js} +2 -2
  33. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js.map → collapsible-Lk7MRvBH.js.map} +1 -1
  34. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js +2 -0
  35. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js.map +1 -0
  36. prefect/server/ui-v2/assets/create-CtsA2QIl.js +2 -0
  37. prefect/server/ui-v2/assets/{create-BrNwbpVu.js.map → create-CtsA2QIl.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{create-DWgkh2HT.js → create-DJPAEZ93.js} +2 -2
  39. prefect/server/ui-v2/assets/create-DJPAEZ93.js.map +1 -0
  40. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js → data-table-bk-0xKWT.js} +2 -2
  41. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js.map → data-table-bk-0xKWT.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js → delete-confirmation-dialog-BZg9EOfN.js} +2 -2
  43. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js.map → delete-confirmation-dialog-BZg9EOfN.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js → deployment-action-header-DwuMPgVg.js} +2 -2
  45. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js.map → deployment-action-header-DwuMPgVg.js.map} +1 -1
  46. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js +3 -0
  47. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js.map +1 -0
  48. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js → deployment-links-B67P-6Ph.js} +2 -2
  49. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js.map → deployment-links-B67P-6Ph.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment._id-DXrb6frJ.js → deployment._id-BVOBfMVf.js} +2 -2
  51. prefect/server/ui-v2/assets/deployment._id-BVOBfMVf.js.map +1 -0
  52. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js +2 -0
  53. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js.map +1 -0
  54. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js +2 -0
  55. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js.map +1 -0
  56. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js +2 -0
  57. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js.map +1 -0
  58. prefect/server/ui-v2/assets/deployment_._id.run-DFVA4Xhx.js +2 -0
  59. prefect/server/ui-v2/assets/{deployment_._id.run-CnacOmhY.js.map → deployment_._id.run-DFVA4Xhx.js.map} +1 -1
  60. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js → dropdown-menu-fRiq5bS-.js} +2 -2
  61. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js.map → dropdown-menu-fRiq5bS-.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js → event-resource-display-C1ZAey-o.js} +2 -2
  63. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js.map → event-resource-display-C1ZAey-o.js.map} +1 -1
  64. prefect/server/ui-v2/assets/event._eventDate._eventId-CcbtP9Ag.js +2 -0
  65. prefect/server/ui-v2/assets/{event._eventDate._eventId-CKTuT_8S.js.map → event._eventDate._eventId-CcbtP9Ag.js.map} +1 -1
  66. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js +2 -0
  67. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js.map +1 -0
  68. prefect/server/ui-v2/assets/{flow-run._id-BKv9Meqc.js → flow-run._id-Dn9R_Tjy.js} +2 -2
  69. prefect/server/ui-v2/assets/flow-run._id-Dn9R_Tjy.js.map +1 -0
  70. prefect/server/ui-v2/assets/{flow-run._id-ZTkjj6bM.js → flow-run._id-Dwx7ojcj.js} +2 -2
  71. prefect/server/ui-v2/assets/flow-run._id-Dwx7ojcj.js.map +1 -0
  72. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js +4 -0
  73. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js.map +1 -0
  74. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js +2 -0
  75. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js.map +1 -0
  76. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js +2 -0
  77. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js.map +1 -0
  78. prefect/server/ui-v2/assets/{form-DOdmIC3A.js → form-Cl5Hk9bq.js} +2 -2
  79. prefect/server/ui-v2/assets/{form-DOdmIC3A.js.map → form-Cl5Hk9bq.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{header-DcIuN5UN.js → header-BuI436ik.js} +2 -2
  81. prefect/server/ui-v2/assets/{header-DcIuN5UN.js.map → header-BuI436ik.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{header-CnBwASd-.js → header-DcAQCxQl.js} +2 -2
  83. prefect/server/ui-v2/assets/{header-CnBwASd-.js.map → header-DcAQCxQl.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-DxE-NzAK.js → header-qlcK4NLD.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-DxE-NzAK.js.map → header-qlcK4NLD.js.map} +1 -1
  86. prefect/server/ui-v2/assets/index--Z69UYXV.js +2 -0
  87. prefect/server/ui-v2/assets/index--Z69UYXV.js.map +1 -0
  88. prefect/server/ui-v2/assets/{index-D0R9_LIL.js → index-BO4Qqsm8.js} +2 -2
  89. prefect/server/ui-v2/assets/index-BO4Qqsm8.js.map +1 -0
  90. prefect/server/ui-v2/assets/index-Bg45XS_V.js +2 -0
  91. prefect/server/ui-v2/assets/index-Bg45XS_V.js.map +1 -0
  92. prefect/server/ui-v2/assets/{index-BIBIJufF.js → index-BleYpDoN.js} +2 -2
  93. prefect/server/ui-v2/assets/index-BleYpDoN.js.map +1 -0
  94. prefect/server/ui-v2/assets/{index-DyOAqIOp.js → index-C63VUjOh.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-DyOAqIOp.js.map → index-C63VUjOh.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-DfKXdmko.js → index-C6LgWyJb.js} +2 -2
  97. prefect/server/ui-v2/assets/index-C6LgWyJb.js.map +1 -0
  98. prefect/server/ui-v2/assets/index-CE-bVgqj.js +2 -0
  99. prefect/server/ui-v2/assets/{index-DlAHvqFx.js.map → index-CE-bVgqj.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{index-V_xTKaEb.js → index-CPpeVt8m.js} +13 -13
  101. prefect/server/ui-v2/assets/index-CPpeVt8m.js.map +1 -0
  102. prefect/server/ui-v2/assets/index-CYaUe0Ym.js +2 -0
  103. prefect/server/ui-v2/assets/index-CYaUe0Ym.js.map +1 -0
  104. prefect/server/ui-v2/assets/{index-C5RMFRyZ.js → index-Clbms0kg.js} +2 -2
  105. prefect/server/ui-v2/assets/index-Clbms0kg.js.map +1 -0
  106. prefect/server/ui-v2/assets/index-D13YFoYA.js +2 -0
  107. prefect/server/ui-v2/assets/index-D13YFoYA.js.map +1 -0
  108. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js → index-D73a_nGu.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js.map → index-D73a_nGu.js.map} +1 -1
  110. prefect/server/ui-v2/assets/index-DJXBzX1E.css +1 -0
  111. prefect/server/ui-v2/assets/{index-BO60ehN6.js → index-DPPPaOr_.js} +2 -2
  112. prefect/server/ui-v2/assets/index-DPPPaOr_.js.map +1 -0
  113. prefect/server/ui-v2/assets/{index-DP8W-xJo.js → index-DU9ShbqW.js} +2 -2
  114. prefect/server/ui-v2/assets/index-DU9ShbqW.js.map +1 -0
  115. prefect/server/ui-v2/assets/index-DdR1lzZk.js +2 -0
  116. prefect/server/ui-v2/assets/index-DdR1lzZk.js.map +1 -0
  117. prefect/server/ui-v2/assets/{index-B9ttjsyu.js → index-ELo08q04.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-B9ttjsyu.js.map → index-ELo08q04.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{index-BTL1xHS9.js → index-cp6PTdHp.js} +2 -2
  120. prefect/server/ui-v2/assets/{index-BTL1xHS9.js.map → index-cp6PTdHp.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{index-D6G96ToY.js → index-kM_g8J0u.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-D6G96ToY.js.map → index-kM_g8J0u.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-q5Y3hlDT.js → index-mYcm9Rkr.js} +2 -2
  124. prefect/server/ui-v2/assets/index-mYcm9Rkr.js.map +1 -0
  125. prefect/server/ui-v2/assets/{index-D9cOtoSU.js → index-yavn_NBp.js} +2 -2
  126. prefect/server/ui-v2/assets/index-yavn_NBp.js.map +1 -0
  127. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js → json-input-iUzf6BvZ.js} +2 -2
  128. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js.map → json-input-iUzf6BvZ.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js → key-value-DI27Dv4P.js} +2 -2
  130. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js.map → key-value-DI27Dv4P.js.map} +1 -1
  131. prefect/server/ui-v2/assets/key._key-C-nk2nld.js +2 -0
  132. prefect/server/ui-v2/assets/key._key-C-nk2nld.js.map +1 -0
  133. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js → lazy-markdown-D_y73qoD.js} +2 -2
  134. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js.map → lazy-markdown-D_y73qoD.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js → login-DR_xuMmg.js} +2 -2
  136. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js.map → login-DR_xuMmg.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js → markdown-input-hzlzpUdj.js} +2 -2
  138. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js.map → markdown-input-hzlzpUdj.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js → python-example-snippet-d8bTNJ0J.js} +3 -3
  140. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js.map → python-example-snippet-d8bTNJ0J.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{python-input-niCawr8m.js → python-input-Bxdnzvx3.js} +2 -2
  142. prefect/server/ui-v2/assets/{python-input-niCawr8m.js.map → python-input-Bxdnzvx3.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js → radio-group-0oOEMJCS.js} +2 -2
  144. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js.map → radio-group-0oOEMJCS.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js → route-error-state-BqbnZCc-.js} +2 -2
  146. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js.map → route-error-state-BqbnZCc-.js.map} +1 -1
  147. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js → schema-form-BD-WM4S0.js} +2 -2
  148. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js.map → schema-form-BD-WM4S0.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js → schema-form-input-string-format-datetime-Dg3zVAp5.js} +4 -4
  150. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js.map → schema-form-input-string-format-datetime-Dg3zVAp5.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js → settings-Dm6yMLix.js} +2 -2
  152. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js.map → settings-Dm6yMLix.js.map} +1 -1
  153. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js → sort-filter-X6JyRc0-.js} +2 -2
  154. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js.map → sort-filter-X6JyRc0-.js.map} +1 -1
  155. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js → table-Xyel2BEw.js} +2 -2
  156. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js.map → table-Xyel2BEw.js.map} +1 -1
  157. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js → tags-input-DqZ8v99z.js} +2 -2
  158. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js.map → tags-input-DqZ8v99z.js.map} +1 -1
  159. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js} +2 -2
  160. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js.map → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js.map} +1 -1
  161. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js → task-run._id-9DcrUEGz.js} +3 -3
  162. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js.map → task-run._id-9DcrUEGz.js.map} +1 -1
  163. prefect/server/ui-v2/assets/{task-run._id-CQGeAiBh.js → task-run._id-DJkoLl_e.js} +2 -2
  164. prefect/server/ui-v2/assets/task-run._id-DJkoLl_e.js.map +1 -0
  165. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js +2 -0
  166. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js.map +1 -0
  167. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js → textarea-DFEOJJdc.js} +2 -2
  168. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js.map → textarea-DFEOJJdc.js.map} +1 -1
  169. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js → timezone-select-NViFNNLz.js} +2 -2
  170. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js.map → timezone-select-NViFNNLz.js.map} +1 -1
  171. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js → toggle-group-EMgSOoYH.js} +2 -2
  172. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js.map → toggle-group-EMgSOoYH.js.map} +1 -1
  173. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js +2 -0
  174. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js.map +1 -0
  175. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js → use-delete-block-document-confirmation-dialog-CxRkBKPg.js} +2 -2
  176. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js.map → use-delete-block-document-confirmation-dialog-CxRkBKPg.js.map} +1 -1
  177. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js +2 -0
  178. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js.map +1 -0
  179. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js → use-get-artifacts-flow-task-runs-D7Djt53s.js} +2 -2
  180. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js.map → use-get-artifacts-flow-task-runs-D7Djt53s.js.map} +1 -1
  181. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js → use-quick-run-Cpy0t7dX.js} +2 -2
  182. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js.map → use-quick-run-Cpy0t7dX.js.map} +1 -1
  183. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js → use-state-favicon-CMsL9s6j.js} +2 -2
  184. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js.map → use-state-favicon-CMsL9s6j.js.map} +1 -1
  185. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js +2 -0
  186. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js.map +1 -0
  187. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js → utilities-D9BfvLg5.js} +2 -2
  188. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js.map → utilities-D9BfvLg5.js.map} +1 -1
  189. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js +2 -0
  190. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js.map +1 -0
  191. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js → work-pool-queue-toggle-f_-cTWxB.js} +2 -2
  192. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js.map → work-pool-queue-toggle-f_-cTWxB.js.map} +1 -1
  193. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js → work-pool._workPoolName-zBqgkYLT.js} +2 -2
  194. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js.map → work-pool._workPoolName-zBqgkYLT.js.map} +1 -1
  195. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js → work-pool_._workPoolName.edit-B-8_CnfA.js} +2 -2
  196. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js.map → work-pool_._workPoolName.edit-B-8_CnfA.js.map} +1 -1
  197. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js → work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js} +2 -2
  198. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js.map +1 -0
  199. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js → work-queue-icon-text-BqqQ413o.js} +2 -2
  200. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js.map → work-queue-icon-text-BqqQ413o.js.map} +1 -1
  201. prefect/server/ui-v2/index.html +2 -2
  202. prefect/task_engine.py +26 -12
  203. prefect/workers/base.py +18 -1
  204. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/METADATA +1 -1
  205. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/RECORD +208 -207
  206. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js +0 -2
  207. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js.map +0 -1
  208. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js +0 -2
  209. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js.map +0 -1
  210. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js +0 -2
  211. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js.map +0 -1
  212. prefect/server/ui-v2/assets/automation._id-CMiura1b.js +0 -2
  213. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js +0 -2
  214. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js.map +0 -1
  215. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js +0 -2
  216. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js.map +0 -1
  217. prefect/server/ui-v2/assets/block-type-logo-DuvU7goV.js +0 -2
  218. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js +0 -2
  219. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js.map +0 -1
  220. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js +0 -2
  221. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js.map +0 -1
  222. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js +0 -2
  223. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js.map +0 -1
  224. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js +0 -2
  225. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js.map +0 -1
  226. prefect/server/ui-v2/assets/create-BrNwbpVu.js +0 -2
  227. prefect/server/ui-v2/assets/create-DWgkh2HT.js.map +0 -1
  228. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js +0 -3
  229. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js.map +0 -1
  230. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js +0 -2
  231. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js.map +0 -1
  232. prefect/server/ui-v2/assets/deployment._id-DXrb6frJ.js.map +0 -1
  233. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js +0 -2
  234. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js.map +0 -1
  235. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js +0 -2
  236. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js.map +0 -1
  237. prefect/server/ui-v2/assets/deployment_._id.run-CnacOmhY.js +0 -2
  238. prefect/server/ui-v2/assets/event._eventDate._eventId-CKTuT_8S.js +0 -2
  239. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js +0 -2
  240. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js.map +0 -1
  241. prefect/server/ui-v2/assets/flow-run._id-BKv9Meqc.js.map +0 -1
  242. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js +0 -4
  243. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js.map +0 -1
  244. prefect/server/ui-v2/assets/flow-run._id-ZTkjj6bM.js.map +0 -1
  245. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js +0 -2
  246. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js.map +0 -1
  247. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js +0 -2
  248. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js.map +0 -1
  249. prefect/server/ui-v2/assets/index-BIBIJufF.js.map +0 -1
  250. prefect/server/ui-v2/assets/index-BO60ehN6.js.map +0 -1
  251. prefect/server/ui-v2/assets/index-BS7fbJ2s.js +0 -2
  252. prefect/server/ui-v2/assets/index-BS7fbJ2s.js.map +0 -1
  253. prefect/server/ui-v2/assets/index-C5RMFRyZ.js.map +0 -1
  254. prefect/server/ui-v2/assets/index-D0R9_LIL.js.map +0 -1
  255. prefect/server/ui-v2/assets/index-D9cOtoSU.js.map +0 -1
  256. prefect/server/ui-v2/assets/index-DEpWUeaO.js +0 -2
  257. prefect/server/ui-v2/assets/index-DEpWUeaO.js.map +0 -1
  258. prefect/server/ui-v2/assets/index-DP8W-xJo.js.map +0 -1
  259. prefect/server/ui-v2/assets/index-DfKXdmko.js.map +0 -1
  260. prefect/server/ui-v2/assets/index-DiVKp6rW.js +0 -2
  261. prefect/server/ui-v2/assets/index-DiVKp6rW.js.map +0 -1
  262. prefect/server/ui-v2/assets/index-DlAHvqFx.js +0 -2
  263. prefect/server/ui-v2/assets/index-VNFzALsC.js +0 -2
  264. prefect/server/ui-v2/assets/index-VNFzALsC.js.map +0 -1
  265. prefect/server/ui-v2/assets/index-V_xTKaEb.js.map +0 -1
  266. prefect/server/ui-v2/assets/index-WIq8QUNT.js +0 -2
  267. prefect/server/ui-v2/assets/index-WIq8QUNT.js.map +0 -1
  268. prefect/server/ui-v2/assets/index-m9O-nIOl.css +0 -1
  269. prefect/server/ui-v2/assets/index-q5Y3hlDT.js.map +0 -1
  270. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js +0 -2
  271. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js.map +0 -1
  272. prefect/server/ui-v2/assets/task-run._id-CQGeAiBh.js.map +0 -1
  273. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js +0 -2
  274. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js.map +0 -1
  275. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js +0 -2
  276. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js.map +0 -1
  277. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js +0 -2
  278. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js.map +0 -1
  279. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js +0 -2
  280. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js.map +0 -1
  281. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js +0 -2
  282. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js.map +0 -1
  283. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js.map +0 -1
  284. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/WHEEL +0 -0
  285. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/entry_points.txt +0 -0
  286. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev7.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow._id-V6-Qhkwk.js","sources":["../../src/components/flows/detail/delete-flow-dialog.tsx","../../src/components/flows/detail/mini-deployment-activity.tsx","../../src/components/flows/detail/deployment-columns.tsx","../../src/components/flows/detail/flow-deployments-tab.tsx","../../src/components/flows/detail/flow-details.tsx","../../src/components/flows/detail/flow-menu.tsx","../../src/components/flows/detail/flow-page-header.tsx","../../src/components/flows/detail/flow-stats-summary/cumulative-task-runs-card.tsx","../../src/components/flows/detail/flow-stats-summary/flow-runs-history-card.tsx","../../src/components/flows/detail/flow-stats-summary/index.tsx","../../src/components/flows/detail/index.tsx","../../src/routes/flows/flow.$id.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport type { Flow } from \"@/api/flows\";\nimport { useDeleteFlowById } from \"@/api/flows\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\ntype DeleteFlowDialogProps = {\n\tflow: Flow;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tonDeleted?: () => void;\n};\n\nexport const DeleteFlowDialog = ({\n\tflow,\n\topen,\n\tonOpenChange,\n\tonDeleted,\n}: DeleteFlowDialogProps) => {\n\tconst navigate = useNavigate();\n\tconst { deleteFlow, isPending } = useDeleteFlowById();\n\n\tconst handleDelete = () => {\n\t\tdeleteFlow(flow.id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Flow deleted\");\n\t\t\t\tonDeleted?.();\n\t\t\t\tvoid navigate({ to: \"/flows\" });\n\t\t\t},\n\t\t\tonError: () => {\n\t\t\t\ttoast.error(\"Failed to delete flow\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<DeleteConfirmationDialog\n\t\t\tisOpen={open}\n\t\t\ttitle=\"Delete Flow\"\n\t\t\tdescription={`Are you sure you want to delete ${flow.name}? This action cannot be undone.`}\n\t\t\tisLoading={isPending}\n\t\t\tloadingText=\"Deleting...\"\n\t\t\tonConfirm={handleDelete}\n\t\t\tonClose={() => onOpenChange(false)}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subSeconds } from \"date-fns\";\nimport { secondsInWeek } from \"date-fns/constants\";\nimport { useCallback, useState } from \"react\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\nconst BAR_WIDTH = 4;\nconst BAR_GAP = 2;\n\ninterface MiniDeploymentActivityProps {\n\tdeploymentId: string;\n}\n\nexport const MiniDeploymentActivity = ({\n\tdeploymentId,\n}: MiniDeploymentActivityProps) => {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\tupdateBars();\n\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => {\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tconst effectiveNumberOfBars = debouncedNumberOfBars || numberOfBars;\n\n\tconst { data: flowRuns } = useQuery(\n\t\tbuildFilterFlowRunsQuery({\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: [deploymentId] },\n\t\t\t},\n\t\t\tlimit: Math.min(60, effectiveNumberOfBars || 60),\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst enrichedFlowRuns =\n\t\tflowRuns?.map((flowRun) => ({\n\t\t\t...flowRun,\n\t\t})) ?? [];\n\n\treturn (\n\t\t<div className=\"w-full\" ref={chartRef}>\n\t\t\t<FlowRunActivityBarChart\n\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\tstartDate={subSeconds(new Date(), secondsInWeek)}\n\t\t\t\tendDate={new Date()}\n\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\tnumberOfBars={effectiveNumberOfBars}\n\t\t\t\tclassName=\"h-8 w-full\"\n\t\t\t\tchartId={`deployment-${deploymentId}`}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { components } from \"@/api/prefect\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { ScheduleBadgeGroup } from \"@/components/ui/schedule-badge\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { MiniDeploymentActivity } from \"./mini-deployment-activity\";\n\ntype Deployment = components[\"schemas\"][\"DeploymentResponse\"];\n\nexport const columns: ColumnDef<Deployment>[] = [\n\t{\n\t\tid: \"select\",\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\tonCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(!!value)}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t\tmaxSize: 20,\n\t\tminSize: 20,\n\t},\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: \"Name\",\n\t\tcell: ({ row }) => row.original.name,\n\t},\n\t{\n\t\taccessorKey: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => {\n\t\t\tconst status = row.original.paused\n\t\t\t\t? \"PAUSED\"\n\t\t\t\t: (row.original.status ?? \"NOT_READY\");\n\t\t\treturn <StatusBadge status={status} />;\n\t\t},\n\t},\n\t{\n\t\taccessorKey: \"tags\",\n\t\theader: \"Tags\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{row.original.tags?.map((tag) => (\n\t\t\t\t\t<span\n\t\t\t\t\t\tkey={tag}\n\t\t\t\t\t\tclassName=\"bg-gray-100 text-gray-800 text-xs font-medium px-2 py-0.5 rounded\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{tag}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t),\n\t},\n\t{\n\t\taccessorKey: \"schedules\",\n\t\theader: \"Schedules\",\n\t\tcell: ({ row }) => {\n\t\t\tconst schedules = row.original.schedules;\n\t\t\tif (!schedules || schedules.length === 0) return null;\n\t\t\treturn <ScheduleBadgeGroup schedules={schedules} />;\n\t\t},\n\t\tsize: 150,\n\t},\n\t{\n\t\taccessorKey: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: ({ row }) => {\n\t\t\tif (!row.original.id) return null;\n\t\t\treturn <MiniDeploymentActivity deploymentId={row.original.id} />;\n\t\t},\n\t},\n\t{\n\t\tid: \"actions\",\n\t\tcell: ({ row }) => {\n\t\t\tif (!row.original.id) return null;\n\n\t\t\treturn (\n\t\t\t\t<DropdownMenu>\n\t\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"ghost\" className=\"size-8 p-0\">\n\t\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t\t<Icon id=\"MoreHorizontal\" className=\"size-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(row.original.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCopy ID\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t</DropdownMenu>\n\t\t\t);\n\t\t},\n\t\tminSize: 30,\n\t\tmaxSize: 30,\n\t},\n];\n","import type { OnChangeFn, PaginationState } from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { Trash2 } from \"lucide-react\";\nimport type { ChangeEvent } from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { useDeleteDeployment } from \"@/api/deployments\";\nimport type { components } from \"@/api/prefect\";\nimport { Button } from \"@/components/ui/button\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { FlowRunActivityBarGraphTooltipProvider } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { columns as baseDeploymentColumns } from \"./deployment-columns\";\n\ntype DeploymentSort = components[\"schemas\"][\"DeploymentSort\"];\n\nconst SORT_OPTIONS: { label: string; value: DeploymentSort }[] = [\n\t{ label: \"Created\", value: \"CREATED_DESC\" },\n\t{ label: \"A to Z\", value: \"NAME_ASC\" },\n\t{ label: \"Z to A\", value: \"NAME_DESC\" },\n];\n\ntype FlowDeploymentsTabProps = {\n\tdeployments: components[\"schemas\"][\"DeploymentResponse\"][];\n\tdeploymentsCount: number;\n\tdeploymentsPages: number;\n\tdeploymentSearch: string | undefined;\n\tonDeploymentSearchChange: (search: string) => void;\n\tdeploymentTags: string[];\n\tonDeploymentTagsChange: (tags: string[]) => void;\n\tdeploymentSort: DeploymentSort;\n\tonDeploymentSortChange: (sort: DeploymentSort) => void;\n\tdeploymentPagination: { page: number; limit: number };\n\tonDeploymentPaginationChange: (pagination: {\n\t\tpage: number;\n\t\tlimit: number;\n\t}) => void;\n};\n\nexport const FlowDeploymentsTab = ({\n\tdeployments,\n\tdeploymentsCount,\n\tdeploymentsPages,\n\tdeploymentSearch,\n\tonDeploymentSearchChange,\n\tdeploymentTags,\n\tonDeploymentTagsChange,\n\tdeploymentSort,\n\tonDeploymentSortChange,\n\tdeploymentPagination,\n\tonDeploymentPaginationChange,\n}: FlowDeploymentsTabProps) => {\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\tconst { deleteDeployment } = useDeleteDeployment();\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tconst currentPagination: PaginationState = {\n\t\t\t\tpageIndex: deploymentPagination.page - 1,\n\t\t\t\tpageSize: deploymentPagination.limit,\n\t\t\t};\n\t\t\tconst newPagination =\n\t\t\t\ttypeof updater === \"function\" ? updater(currentPagination) : updater;\n\t\t\tonDeploymentPaginationChange({\n\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t});\n\t\t\tsetRowSelection({});\n\t\t},\n\t\t[deploymentPagination, onDeploymentPaginationChange],\n\t);\n\n\tconst deploymentsTable = useReactTable({\n\t\tdata: deployments,\n\t\tcolumns: baseDeploymentColumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tpageCount: deploymentsPages,\n\t\tstate: {\n\t\t\trowSelection,\n\t\t\tpagination: {\n\t\t\t\tpageIndex: deploymentPagination.page - 1,\n\t\t\t\tpageSize: deploymentPagination.limit,\n\t\t\t},\n\t\t},\n\t\tonRowSelectionChange: setRowSelection,\n\t\tonPaginationChange: handlePaginationChange,\n\t\tgetRowId: (row) => row.id,\n\t});\n\n\tconst selectedCount = Object.keys(rowSelection).length;\n\n\tconst handleDeleteSelected = useCallback(() => {\n\t\tconst selectedIds = Object.keys(rowSelection);\n\t\tfor (const id of selectedIds) {\n\t\t\tdeleteDeployment(id);\n\t\t}\n\t\tsetRowSelection({});\n\t\tsetShowDeleteDialog(false);\n\t}, [rowSelection, deleteDeployment]);\n\n\tconst handleDeploymentTagsChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (Array.isArray(e)) {\n\t\t\t\tonDeploymentTagsChange(e);\n\t\t\t}\n\t\t},\n\t\t[onDeploymentTagsChange],\n\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"grid grid-cols-12 items-center gap-2\">\n\t\t\t\t{/* Count and selection info - first column */}\n\t\t\t\t<div className=\"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-3\">\n\t\t\t\t\t{selectedCount > 0 ? (\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t{selectedCount} selected\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 text-destructive hover:text-destructive\"\n\t\t\t\t\t\t\t\tonClick={() => setShowDeleteDialog(true)}\n\t\t\t\t\t\t\t\taria-label=\"Delete selected deployments\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Trash2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{deploymentsCount} Deployment{deploymentsCount !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Controls - middle columns */}\n\t\t\t\t<div className=\"xl:col-span-4 md:col-span-6 col-span-12 md:order-1 order-0\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search deployments...\"\n\t\t\t\t\t\tvalue={deploymentSearch ?? \"\"}\n\t\t\t\t\t\tonChange={(e) => onDeploymentSearchChange(e.target.value)}\n\t\t\t\t\t\taria-label=\"Search deployments\"\n\t\t\t\t\t\tdebounceMs={300}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-3 md:col-span-6 col-span-12 md:order-2 order-1\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tvalue={deploymentTags}\n\t\t\t\t\t\tonChange={handleDeploymentTagsChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Sort - last column with left border on desktop */}\n\t\t\t\t<div className=\"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-3 order-2\">\n\t\t\t\t\t<Select\n\t\t\t\t\t\tvalue={deploymentSort}\n\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\tonDeploymentSortChange(value as DeploymentSort)\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectTrigger className=\"w-full\" aria-label=\"Sort deployments\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{SORT_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t{/* Override table container overflow to allow chart tooltips to escape */}\n\t\t\t\t<div className=\"[&_[data-slot=table-container]]:overflow-visible\">\n\t\t\t\t\t<DataTable table={deploymentsTable} />\n\t\t\t\t</div>\n\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\n\t\t\t<Dialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n\t\t\t\t<DialogContent>\n\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t<DialogTitle>Delete Deployments</DialogTitle>\n\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\tAre you sure you want to delete {selectedCount} deployment\n\t\t\t\t\t\t\t{selectedCount !== 1 ? \"s\" : \"\"}? This action cannot be undone.\n\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tonClick={() => setShowDeleteDialog(false)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button variant=\"destructive\" onClick={handleDeleteSelected}>\n\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DialogFooter>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t</div>\n\t);\n};\n","import type { Flow } from \"@/api/flows\";\nimport { FormattedDate } from \"@/components/ui/formatted-date\";\n\ntype FlowDetailsProps = {\n\tflow: Flow;\n};\n\nexport const FlowDetails = ({ flow }: FlowDetailsProps) => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Flow ID</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.id}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Created</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.created ? (\n\t\t\t\t\t\t<FormattedDate date={flow.created} format=\"absolute\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"N/A\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t\t<dl className=\"flex flex-col gap-2\">\n\t\t\t\t<dt className=\"text-muted-foreground\">Updated</dt>\n\t\t\t\t<dd className=\"text-sm font-medium leading-none font-mono\">\n\t\t\t\t\t{flow.updated ? (\n\t\t\t\t\t\t<FormattedDate date={flow.updated} format=\"absolute\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"N/A\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</div>\n\t);\n};\n","import { toast } from \"sonner\";\nimport type { Flow } from \"@/api/flows\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport type FlowMenuProps = {\n\tflow: Flow;\n\tonDelete: () => void;\n};\n\nexport const FlowMenu = ({ flow, onDelete }: FlowMenuProps) => {\n\tconst handleCopyId = () => {\n\t\tvoid navigator.clipboard.writeText(flow.id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={handleCopyId}>Copy ID</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem variant=\"destructive\" onClick={onDelete}>\n\t\t\t\t\tDelete\n\t\t\t\t</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import type { Flow } from \"@/api/flows\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { FlowMenu } from \"./flow-menu\";\n\ntype FlowPageHeaderProps = {\n\tflow: Flow;\n\tonDelete: () => void;\n};\n\nexport function FlowPageHeader({ flow, onDelete }: FlowPageHeaderProps) {\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink to=\"/flows\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tFlows\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t<BreadcrumbPage>{flow.name}</BreadcrumbPage>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<FlowMenu flow={flow} onDelete={onDelete} />\n\t\t</div>\n\t);\n}\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { Area, AreaChart } from \"recharts\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildTaskRunsHistoryQuery,\n\ttype HistoryResponse,\n} from \"@/api/task-runs\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { type ChartConfig, ChartContainer } from \"@/components/ui/chart\";\nimport {\n\tbuildCompletedTaskRunsCountFilter,\n\tbuildFailedTaskRunsCountFilter,\n\tbuildRunningTaskRunsCountFilter,\n\tbuildTaskRunsHistoryFilterForFlow,\n\tbuildTotalTaskRunsCountFilter,\n} from \"./query-filters\";\n\nconst REFETCH_INTERVAL = 30_000;\n\ntype CumulativeTaskRunsCardProps = {\n\tflowId: string;\n};\n\ntype ChartDataPoint = {\n\ttimestamp: string;\n\tcompleted: number;\n\tfailed: number;\n};\n\nconst chartConfig = {\n\tcompleted: {\n\t\tlabel: \"Completed\",\n\t\tcolor: \"hsl(142.1 76.2% 36.3%)\",\n\t},\n\tfailed: {\n\t\tlabel: \"Failed\",\n\t\tcolor: \"hsl(0 84.2% 60.2%)\",\n\t},\n} satisfies ChartConfig;\n\nconst transformHistoryToChartData = (\n\thistory: HistoryResponse[],\n): ChartDataPoint[] => {\n\tconst chartData: ChartDataPoint[] = [];\n\tlet cumulativeCompleted = 0;\n\tlet cumulativeFailed = 0;\n\n\tfor (const item of history) {\n\t\tlet completedCount = 0;\n\t\tlet failedCount = 0;\n\n\t\tfor (const state of item.states) {\n\t\t\tif (state.state_type === \"COMPLETED\") {\n\t\t\t\tcompletedCount += state.count_runs;\n\t\t\t} else if (\n\t\t\t\tstate.state_type === \"FAILED\" ||\n\t\t\t\tstate.state_type === \"CRASHED\"\n\t\t\t) {\n\t\t\t\tfailedCount += state.count_runs;\n\t\t\t}\n\t\t}\n\n\t\tcumulativeCompleted += completedCount;\n\t\tcumulativeFailed += failedCount;\n\n\t\tchartData.push({\n\t\t\ttimestamp: item.interval_start,\n\t\t\tcompleted: cumulativeCompleted,\n\t\t\tfailed: cumulativeFailed,\n\t\t});\n\t}\n\n\treturn chartData;\n};\n\nexport function CumulativeTaskRunsCard({\n\tflowId,\n}: CumulativeTaskRunsCardProps) {\n\tconst [\n\t\t{ data: total },\n\t\t{ data: completed },\n\t\t{ data: failed },\n\t\t{ data: running },\n\t\t{ data: history },\n\t] = useSuspenseQueries({\n\t\tqueries: [\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildTotalTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildCompletedTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildFailedTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildRunningTaskRunsCountFilter(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildTaskRunsHistoryQuery(\n\t\t\t\tbuildTaskRunsHistoryFilterForFlow(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t],\n\t});\n\n\tconst chartData = useMemo(\n\t\t() => transformHistoryToChartData(history),\n\t\t[history],\n\t);\n\n\tconst hasFailedData = chartData.some((point) => point.failed > 0);\n\n\tconst percentComparisonTotal = total - running;\n\tconst completedPercentage =\n\t\tpercentComparisonTotal > 0\n\t\t\t? ((completed / percentComparisonTotal) * 100).toFixed(0)\n\t\t\t: \"0\";\n\tconst failedPercentage =\n\t\tpercentComparisonTotal > 0\n\t\t\t? ((failed / percentComparisonTotal) * 100).toFixed(1)\n\t\t\t: \"0\";\n\n\treturn (\n\t\t<Card className=\"flex-1 relative overflow-hidden pb-20\">\n\t\t\t<CardHeader className=\"pb-2\">\n\t\t\t\t<CardTitle>Task Runs</CardTitle>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t<div className=\"grid gap-1\">\n\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-base\">\n\t\t\t\t\t\t<span className=\"font-semibold\">{total}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{running > 0 && (\n\t\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"font-semibold text-blue-600\">{running}</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Running</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t<span className=\"font-semibold text-green-600\">{completed}</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Completed</span>\n\t\t\t\t\t\t<span className=\"text-green-600\">{completedPercentage}%</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{failed > 0 && (\n\t\t\t\t\t\t<div className=\"inline-flex items-end gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"font-semibold text-red-600\">{failed}</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Failed</span>\n\t\t\t\t\t\t\t<span className=\"text-red-600\">{failedPercentage}%</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\t\t\t<div className=\"absolute bottom-4 left-0 right-0 h-16\">\n\t\t\t\t<ChartContainer config={chartConfig} className=\"h-full w-full\">\n\t\t\t\t\t<AreaChart\n\t\t\t\t\t\tdata={chartData}\n\t\t\t\t\t\tmargin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\tid=\"completedGradientFlow\"\n\t\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\t\ty1=\"1\"\n\t\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\t\ty2=\"0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-completed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-completed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\tid=\"failedGradientFlow\"\n\t\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\t\ty1=\"1\"\n\t\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\t\ty2=\"0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\t\tstopColor=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t{hasFailedData && (\n\t\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\t\tdataKey=\"failed\"\n\t\t\t\t\t\t\t\tstroke=\"var(--color-failed)\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\t\tfill=\"url(#failedGradientFlow)\"\n\t\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey=\"completed\"\n\t\t\t\t\t\t\tstroke=\"var(--color-completed)\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\tfill=\"url(#completedGradientFlow)\"\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</AreaChart>\n\t\t\t\t</ChartContainer>\n\t\t\t</div>\n\t\t</Card>\n\t);\n}\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { subDays } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n} from \"@/api/flow-runs\";\nimport type { Flow } from \"@/api/flows\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport {\n\tFlowRunActivityBarChart,\n\tFlowRunActivityBarGraphTooltipProvider,\n} from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport {\n\tbuildFlowRunsCountFilterForHistory,\n\tbuildFlowRunsHistoryFilter,\n} from \"./query-filters\";\n\nconst BAR_WIDTH = 8;\nconst BAR_GAP = 4;\nconst REFETCH_INTERVAL = 30_000;\n\ntype FlowRunsHistoryCardProps = {\n\tflowId: string;\n\tflow: Flow;\n};\n\nexport function FlowRunsHistoryCard({\n\tflowId,\n\tflow,\n}: FlowRunsHistoryCardProps) {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\tupdateBars();\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => resizeObserver.disconnect();\n\t}, []);\n\n\tconst effectiveNumberOfBars = debouncedNumberOfBars || numberOfBars;\n\t// Use a fixed limit of 60 to ensure query key stability with prefetch\n\tconst QUERY_LIMIT = 60;\n\n\tconst [{ data: flowRuns }, { data: totalCount }] = useSuspenseQueries({\n\t\tqueries: [\n\t\t\tbuildFilterFlowRunsQuery(\n\t\t\t\tbuildFlowRunsHistoryFilter(flowId, QUERY_LIMIT),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\tbuildFlowRunsCountFilterForHistory(flowId),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t],\n\t});\n\n\tconst enrichedFlowRuns = useMemo(\n\t\t() =>\n\t\t\tflowRuns.map((flowRun: FlowRun) => ({\n\t\t\t\t...flowRun,\n\t\t\t\tflow,\n\t\t\t})),\n\t\t[flowRuns, flow],\n\t);\n\n\tconst { startDate, endDate } = useMemo((): {\n\t\tstartDate: Date;\n\t\tendDate: Date;\n\t} => {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\tstartDate: subDays(now, 7),\n\t\t\tendDate: now,\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t<Card className=\"flex-1\">\n\t\t\t<CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n\t\t\t\t<CardTitle>Flow Runs</CardTitle>\n\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} total\n\t\t\t\t</span>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t<div className=\"h-24\" ref={chartRef}>\n\t\t\t\t\t{effectiveNumberOfBars === 0 ? (\n\t\t\t\t\t\t<Skeleton className=\"h-full w-full\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t\t\t\t<FlowRunActivityBarChart\n\t\t\t\t\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\t\t\t\t\tstartDate={startDate}\n\t\t\t\t\t\t\t\tendDate={endDate}\n\t\t\t\t\t\t\t\tnumberOfBars={effectiveNumberOfBars}\n\t\t\t\t\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\t\t\t\t\tclassName=\"h-full w-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","import type { Flow } from \"@/api/flows\";\nimport { CumulativeTaskRunsCard } from \"./cumulative-task-runs-card\";\nimport { FlowRunsHistoryCard } from \"./flow-runs-history-card\";\n\ntype FlowStatsSummaryProps = {\n\tflowId: string;\n\tflow: Flow;\n};\n\nexport function FlowStatsSummary({ flowId, flow }: FlowStatsSummaryProps) {\n\treturn (\n\t\t<div className=\"grid gap-5 md:grid-cols-[2fr_1fr]\">\n\t\t\t<FlowRunsHistoryCard flowId={flowId} flow={flow} />\n\t\t\t<CumulativeTaskRunsCard flowId={flowId} />\n\t\t</div>\n\t);\n}\n","import { useNavigate } from \"@tanstack/react-router\";\nimport { type JSX, useCallback, useState } from \"react\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport type { Flow } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport type { FlowRunCardData } from \"@/components/flow-runs/flow-run-card\";\nimport {\n\tFlowRunsList,\n\tFlowRunsPagination,\n\tFlowRunsRowCount,\n\ttype PaginationState,\n\ttype SortFilters,\n\tuseFlowRunsSelectedRows,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport { SortFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter\";\nimport { StateFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filter\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { DeleteFlowDialog } from \"./delete-flow-dialog\";\nimport { FlowDeploymentsTab } from \"./flow-deployments-tab\";\nimport { FlowDetails } from \"./flow-details\";\nimport { FlowPageHeader } from \"./flow-page-header\";\nimport { FlowStatsSummary } from \"./flow-stats-summary\";\n\nexport default function FlowDetail({\n\tflow,\n\tflowRuns,\n\tflowRunsCount,\n\tflowRunsPages,\n\tdeployments,\n\tdeploymentsCount,\n\tdeploymentsPages,\n\ttab = \"runs\",\n\tpagination,\n\tonPaginationChange,\n\tonPrefetchPage,\n\tsort,\n\tonSortChange,\n\tflowRunSearch,\n\tonFlowRunSearchChange,\n\tselectedStates,\n\tonSelectFilter,\n\tdeploymentSearch,\n\tonDeploymentSearchChange,\n\tdeploymentTags,\n\tonDeploymentTagsChange,\n\tdeploymentSort,\n\tonDeploymentSortChange,\n\tdeploymentPagination,\n\tonDeploymentPaginationChange,\n}: {\n\tflow: Flow;\n\tflowRuns: FlowRun[];\n\tflowRunsCount: number;\n\tflowRunsPages: number;\n\tdeployments: components[\"schemas\"][\"DeploymentResponse\"][];\n\tdeploymentsCount: number;\n\tdeploymentsPages: number;\n\ttab: \"runs\" | \"deployments\" | \"details\";\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonPrefetchPage: (page: number) => void;\n\tsort: SortFilters;\n\tonSortChange: (sort: SortFilters) => void;\n\tflowRunSearch: string | undefined;\n\tonFlowRunSearchChange: (search: string) => void;\n\tselectedStates: Set<FlowRunState>;\n\tonSelectFilter: (states: Set<FlowRunState>) => void;\n\tdeploymentSearch: string | undefined;\n\tonDeploymentSearchChange: (search: string) => void;\n\tdeploymentTags: string[];\n\tonDeploymentTagsChange: (tags: string[]) => void;\n\tdeploymentSort: components[\"schemas\"][\"DeploymentSort\"];\n\tonDeploymentSortChange: (\n\t\tsort: components[\"schemas\"][\"DeploymentSort\"],\n\t) => void;\n\tdeploymentPagination: { page: number; limit: number };\n\tonDeploymentPaginationChange: (pagination: {\n\t\tpage: number;\n\t\tlimit: number;\n\t}) => void;\n}): JSX.Element {\n\tconst navigate = useNavigate();\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\tconst [selectedRows, setSelectedRows, { onSelectRow, clearSet }] =\n\t\tuseFlowRunsSelectedRows();\n\n\t// Enrich paginated flow runs with flow object for the list\n\tconst enrichedFlowRuns: FlowRunCardData[] = flowRuns.map((flowRun) => ({\n\t\t...flowRun,\n\t\tflow: flow,\n\t}));\n\n\t// Handler to clear filters\n\tconst onClearFilters = useCallback(() => {\n\t\tonFlowRunSearchChange(\"\");\n\t\tonSelectFilter(new Set());\n\t\tclearSet();\n\t}, [onFlowRunSearchChange, onSelectFilter, clearSet]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"container mx-auto flex flex-col gap-4\">\n\t\t\t\t<FlowPageHeader\n\t\t\t\t\tflow={flow}\n\t\t\t\t\tonDelete={() => setShowDeleteDialog(true)}\n\t\t\t\t/>\n\t\t\t\t<FlowStatsSummary flowId={flow.id} flow={flow} />\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={tab}\n\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \".\",\n\t\t\t\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\ttab: value as \"runs\" | \"deployments\" | \"details\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<TabsList>\n\t\t\t\t\t\t<TabsTrigger value=\"runs\">Runs</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"deployments\">Deployments</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"details\">Details</TabsTrigger>\n\t\t\t\t\t</TabsList>\n\t\t\t\t\t<TabsContent value=\"runs\" className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t<FlowRunsRowCount\n\t\t\t\t\t\t\t\tcount={flowRunsCount}\n\t\t\t\t\t\t\t\tresults={enrichedFlowRuns}\n\t\t\t\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\t\t\t\tsetSelectedRows={setSelectedRows}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-4\">\n\t\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\t\t\t\tvalue={flowRunSearch ?? \"\"}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onFlowRunSearchChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"w-64\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<StateFilter\n\t\t\t\t\t\t\t\t\tselectedFilters={selectedStates}\n\t\t\t\t\t\t\t\t\tonSelectFilter={onSelectFilter}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<SortFilter value={sort} onSelect={onSortChange} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<FlowRunsList\n\t\t\t\t\t\t\tflowRuns={enrichedFlowRuns}\n\t\t\t\t\t\t\tselectedRows={selectedRows}\n\t\t\t\t\t\t\tonSelect={onSelectRow}\n\t\t\t\t\t\t\tonClearFilters={onClearFilters}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FlowRunsPagination\n\t\t\t\t\t\t\tcount={flowRunsCount}\n\t\t\t\t\t\t\tpages={flowRunsPages}\n\t\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\t\tonChangePagination={onPaginationChange}\n\t\t\t\t\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</TabsContent>\n\t\t\t\t\t<TabsContent value=\"deployments\">\n\t\t\t\t\t\t<FlowDeploymentsTab\n\t\t\t\t\t\t\tdeployments={deployments}\n\t\t\t\t\t\t\tdeploymentsCount={deploymentsCount}\n\t\t\t\t\t\t\tdeploymentsPages={deploymentsPages}\n\t\t\t\t\t\t\tdeploymentSearch={deploymentSearch}\n\t\t\t\t\t\t\tonDeploymentSearchChange={onDeploymentSearchChange}\n\t\t\t\t\t\t\tdeploymentTags={deploymentTags}\n\t\t\t\t\t\t\tonDeploymentTagsChange={onDeploymentTagsChange}\n\t\t\t\t\t\t\tdeploymentSort={deploymentSort}\n\t\t\t\t\t\t\tonDeploymentSortChange={onDeploymentSortChange}\n\t\t\t\t\t\t\tdeploymentPagination={deploymentPagination}\n\t\t\t\t\t\t\tonDeploymentPaginationChange={onDeploymentPaginationChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</TabsContent>\n\t\t\t\t\t<TabsContent value=\"details\">\n\t\t\t\t\t\t<FlowDetails flow={flow} />\n\t\t\t\t\t</TabsContent>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t\t<DeleteFlowDialog\n\t\t\t\tflow={flow}\n\t\t\t\topen={showDeleteDialog}\n\t\t\t\tonOpenChange={setShowDeleteDialog}\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQueries,\n} from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { buildPaginateDeploymentsQuery } from \"@/api/deployments\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildFilterFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsPaginateFilter,\n} from \"@/api/flow-runs\";\nimport {\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildFLowDetailsQuery,\n} from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildGetFlowRunsTaskRunsCountQuery,\n\tbuildTaskRunsHistoryQuery,\n} from \"@/api/task-runs\";\nimport {\n\ttype PaginationState,\n\tSORT_FILTERS,\n\ttype SortFilters,\n} from \"@/components/flow-runs/flow-runs-list\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport FlowDetail from \"@/components/flows/detail\";\nimport {\n\tbuildCompletedTaskRunsCountFilter,\n\tbuildFailedTaskRunsCountFilter,\n\tbuildFlowRunsCountFilterForHistory,\n\tbuildFlowRunsHistoryFilter,\n\tbuildRunningTaskRunsCountFilter,\n\tbuildTaskRunsHistoryFilterForFlow,\n\tbuildTotalTaskRunsCountFilter,\n} from \"@/components/flows/detail/flow-stats-summary/query-filters\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\n\n// Route for /flows/flow/$id\n\n// This file contains the route definition and loader function for the /flows/flow/$id route.\n\n// 1. searchParams defined as a zod schema for validating and typechecking the search query.\n// 2. filterFlowRunsBySearchParams function that takes a search object and returns a filter for flow runs.\n// 3. Route definition using createFileRoute function:\n// - It uses useSuspenseQueries to fetch data for the flow, flow runs, deployments, and related counts.\n// - Passes the fetched data to the FlowDetail component.\n// - Includes a loader function to prefetch data on the server side.\n\nconst searchParams = z\n\t.object({\n\t\ttab: z.enum([\"runs\", \"deployments\", \"details\"]).optional().default(\"runs\"),\n\t\t\"runs.page\": z.number().int().positive().optional().default(1),\n\t\t\"runs.limit\": z.number().int().positive().max(100).optional().default(10),\n\t\t\"runs.sort\": z.enum(SORT_FILTERS).optional().default(\"START_TIME_DESC\"),\n\t\t\"runs.flowRuns.nameLike\": z.string().optional().default(\"\"),\n\t\t\"runs.flowRuns.state.name\": z.array(z.string()).optional(),\n\t\ttype: z.enum([\"span\", \"range\"]).optional(),\n\t\tseconds: z.number().int().positive().optional(),\n\t\tstartDateTime: z.date().optional(),\n\t\tendDateTime: z.date().optional(),\n\t\t\"deployments.page\": z.number().int().positive().optional().default(1),\n\t\t\"deployments.limit\": z.number().int().positive().optional().default(10),\n\t\t\"deployments.nameLike\": z.string().optional(),\n\t\t\"deployments.tags\": z.array(z.string()).optional(),\n\t\t\"deployments.sort\": z\n\t\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t\t.optional()\n\t\t\t.default(\"NAME_ASC\"),\n\t})\n\t.optional()\n\t.default({});\n\ntype SearchParams = z.infer<typeof searchParams>;\n\nconst buildPaginationBody = (\n\tsearch: SearchParams,\n\tflowId: string,\n): FlowRunsPaginateFilter => {\n\tconst flowRunSearch = search[\"runs.flowRuns.nameLike\"];\n\tconst stateFilters = search[\"runs.flowRuns.state.name\"] ?? [];\n\n\tconst hasFilters = flowRunSearch || stateFilters.length > 0;\n\tconst flowRunsFilter = hasFilters\n\t\t? {\n\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t...(flowRunSearch && {\n\t\t\t\t\tname: { like_: flowRunSearch },\n\t\t\t\t}),\n\t\t\t\t...(stateFilters.length > 0 && {\n\t\t\t\t\tstate: {\n\t\t\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t\t\tname: { any_: stateFilters },\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\tpage: search[\"runs.page\"],\n\t\tlimit: search[\"runs.limit\"],\n\t\tsort: search[\"runs.sort\"],\n\t\tflow_runs: flowRunsFilter,\n\t\tflows: { operator: \"and_\" as const, id: { any_: [flowId] } },\n\t};\n};\n\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpage: search[\"runs.page\"],\n\t\t\tlimit: search[\"runs.limit\"],\n\t\t}),\n\t\t[search[\"runs.page\"], search[\"runs.limit\"]],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.page\": newPagination.page,\n\t\t\t\t\t\"runs.limit\": newPagination.limit,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortChange = useCallback(\n\t\t(sort: SortFilters) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, \"runs.sort\": sort, \"runs.page\": 1 }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"runs.sort\"], onSortChange] as const;\n};\n\nconst useFlowRunSearch = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onFlowRunSearchChange = useCallback(\n\t\t(flowRunSearch: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.flowRuns.nameLike\": flowRunSearch,\n\t\t\t\t\t\"runs.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"runs.flowRuns.nameLike\"], onFlowRunSearchChange] as const;\n};\n\nconst useStateFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst selectedStates = useMemo(\n\t\t() => new Set((search[\"runs.flowRuns.state.name\"] || []) as FlowRunState[]),\n\t\t[search[\"runs.flowRuns.state.name\"]],\n\t);\n\n\tconst onSelectFilter = useCallback(\n\t\t(states: Set<FlowRunState>) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"runs.flowRuns.state.name\": Array.from(states),\n\t\t\t\t\t\"runs.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn { selectedStates, onSelectFilter };\n};\n\nconst useDeploymentSearch = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentSearchChange = useCallback(\n\t\t(deploymentSearch: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.nameLike\": deploymentSearch || undefined,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.nameLike\"], onDeploymentSearchChange] as const;\n};\n\nconst useDeploymentTagsFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentTagsChange = useCallback(\n\t\t(tags: string[]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.tags\": tags.length > 0 ? tags : undefined,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.tags\"] ?? [], onDeploymentTagsChange] as const;\n};\n\nconst useDeploymentSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onDeploymentSortChange = useCallback(\n\t\t(sort: components[\"schemas\"][\"DeploymentSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.sort\": sort,\n\t\t\t\t\t\"deployments.page\": 1,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search[\"deployments.sort\"], onDeploymentSortChange] as const;\n};\n\nconst useDeploymentPagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst deploymentPagination = useMemo(\n\t\t() => ({\n\t\t\tpage: search[\"deployments.page\"],\n\t\t\tlimit: search[\"deployments.limit\"],\n\t\t}),\n\t\t[search[\"deployments.page\"], search[\"deployments.limit\"]],\n\t);\n\n\tconst onDeploymentPaginationChange = useCallback(\n\t\t(newPagination: { page: number; limit: number }) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t\"deployments.page\": newPagination.page,\n\t\t\t\t\t\"deployments.limit\": newPagination.limit,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [deploymentPagination, onDeploymentPaginationChange] as const;\n};\n\nconst FlowDetailRoute = () => {\n\tconst queryClient = useQueryClient();\n\tconst { id } = Route.useParams();\n\tconst search = Route.useSearch();\n\n\t// Navigation hooks for flow runs\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [flowRunSearch, onFlowRunSearchChange] = useFlowRunSearch();\n\tconst { selectedStates, onSelectFilter } = useStateFilter();\n\n\t// Navigation hooks for deployments\n\tconst [deploymentSearch, onDeploymentSearchChange] = useDeploymentSearch();\n\tconst [deploymentTags, onDeploymentTagsChange] = useDeploymentTagsFilter();\n\tconst [deploymentSort, onDeploymentSortChange] = useDeploymentSort();\n\tconst [deploymentPagination, onDeploymentPaginationChange] =\n\t\tuseDeploymentPagination();\n\n\t// Suspense queries for stable data (flow)\n\tconst [{ data: flow }] = useSuspenseQueries({\n\t\tqueries: [buildFLowDetailsQuery(id)],\n\t});\n\n\t// Use useQuery for deployments to leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: deploymentsPage } = useQuery(\n\t\tbuildPaginateDeploymentsQuery({\n\t\t\tsort: search[\"deployments.sort\"],\n\t\t\tpage: search[\"deployments.page\"],\n\t\t\tlimit: search[\"deployments.limit\"],\n\t\t\tflows: { operator: \"and_\", id: { any_: [id] } },\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_or_deployment_name: { like_: search[\"deployments.nameLike\"] },\n\t\t\t\ttags: { operator: \"and_\", all_: search[\"deployments.tags\"] || [] },\n\t\t\t},\n\t\t}),\n\t);\n\n\t// Set page title based on flow name\n\tusePageTitle(flow?.name ? `Flow: ${flow.name}` : \"Flow\");\n\n\t// Use useQuery for paginated flow runsto leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: flowRunsPage } = useQuery(\n\t\tbuildPaginateFlowRunsQuery(buildPaginationBody(search, id), 30_000),\n\t);\n\n\tconst flowRuns = flowRunsPage?.results ?? [];\n\n\t// Prefetch task run counts for the current page's flow runs\n\t// This ensures the data is ready when FlowRunCard renders\n\tuseEffect(() => {\n\t\tconst flowRunIds = flowRuns.map((run) => run.id);\n\t\tif (flowRunIds.length > 0) {\n\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t);\n\t\t}\n\t}, [queryClient, flowRuns]);\n\n\t// Prefetch handler for pagination hover\n\tconst onPrefetchPage = useCallback(\n\t\t(page: number) => {\n\t\t\tconst filter = buildPaginationBody(\n\t\t\t\t{\n\t\t\t\t\t...search,\n\t\t\t\t\t\"runs.page\": page,\n\t\t\t\t},\n\t\t\t\tid,\n\t\t\t);\n\t\t\t// Prefetch the page data, then chain prefetch of task run counts\n\t\t\tvoid (async () => {\n\t\t\t\tconst pageData = await queryClient.ensureQueryData(\n\t\t\t\t\tbuildPaginateFlowRunsQuery(filter, 30_000),\n\t\t\t\t);\n\t\t\t\tconst flowRunIds = pageData?.results?.map((run) => run.id) ?? [];\n\t\t\t\tif (flowRunIds.length > 0) {\n\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\t[queryClient, search, id],\n\t);\n\n\treturn (\n\t\t<FlowDetail\n\t\t\tflow={flow}\n\t\t\tflowRuns={flowRuns}\n\t\t\tflowRunsCount={flowRunsPage?.count ?? 0}\n\t\t\tflowRunsPages={flowRunsPage?.pages ?? 0}\n\t\t\tdeployments={deploymentsPage?.results ?? []}\n\t\t\tdeploymentsCount={deploymentsPage?.count ?? 0}\n\t\t\tdeploymentsPages={deploymentsPage?.pages ?? 0}\n\t\t\ttab={search.tab}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\tsort={sort}\n\t\t\tonSortChange={onSortChange}\n\t\t\tflowRunSearch={flowRunSearch}\n\t\t\tonFlowRunSearchChange={onFlowRunSearchChange}\n\t\t\tselectedStates={selectedStates}\n\t\t\tonSelectFilter={onSelectFilter}\n\t\t\tdeploymentSearch={deploymentSearch}\n\t\t\tonDeploymentSearchChange={onDeploymentSearchChange}\n\t\t\tdeploymentTags={deploymentTags}\n\t\t\tonDeploymentTagsChange={onDeploymentTagsChange}\n\t\t\tdeploymentSort={deploymentSort}\n\t\t\tonDeploymentSortChange={onDeploymentSortChange}\n\t\t\tdeploymentPagination={deploymentPagination}\n\t\t\tonDeploymentPaginationChange={onDeploymentPaginationChange}\n\t\t/>\n\t);\n};\n\nexport const Route = createFileRoute(\"/flows/flow/$id\")({\n\tcomponent: FlowDetailRoute,\n\tvalidateSearch: zodValidator(searchParams),\n\tloaderDeps: ({ search }) => ({\n\t\tflowRunsDeps: search,\n\t}),\n\tloader: ({ params: { id }, context, deps }) => {\n\t\tconst REFETCH_INTERVAL = 30_000;\n\n\t\t// Prefetch flow details\n\t\tvoid context.queryClient.prefetchQuery(buildFLowDetailsQuery(id));\n\n\t\t// Prefetch paginated flow runs without blocking (uses keepPreviousData)\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\tbuildPaginationBody(deps.flowRunsDeps, id),\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\n\t\t// Prefetch deployments with filter parameters\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateDeploymentsQuery({\n\t\t\t\tsort: deps.flowRunsDeps[\"deployments.sort\"],\n\t\t\t\tpage: deps.flowRunsDeps[\"deployments.page\"],\n\t\t\t\tlimit: deps.flowRunsDeps[\"deployments.limit\"],\n\t\t\t\tflows: { operator: \"and_\", id: { any_: [id] } },\n\t\t\t\tdeployments: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_or_deployment_name: {\n\t\t\t\t\t\tlike_: deps.flowRunsDeps[\"deployments.nameLike\"],\n\t\t\t\t\t},\n\t\t\t\t\ttags: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tall_: deps.flowRunsDeps[\"deployments.tags\"] || [],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// Prefetch deployments count\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildDeploymentsCountByFlowQuery([id]),\n\t\t);\n\n\t\t// Prefetch FlowStatsSummary queries\n\t\t// FlowRunsHistoryCard queries\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildFilterFlowRunsQuery(\n\t\t\t\tbuildFlowRunsHistoryFilter(id, 60),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\tbuildFlowRunsCountFilterForHistory(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\n\t\t// CumulativeTaskRunsCard queries\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildTotalTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildCompletedTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildFailedTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountTaskRunsQuery(\n\t\t\t\tbuildRunningTaskRunsCountFilter(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildTaskRunsHistoryQuery(\n\t\t\t\tbuildTaskRunsHistoryFilterForFlow(id),\n\t\t\t\tREFETCH_INTERVAL,\n\t\t\t),\n\t\t);\n\n\t\t// Background async chain: prefetch task run counts for each flow run\n\t\t// This prevents suspense when FlowRunCard renders\n\t\tvoid (async () => {\n\t\t\tconst pageData = await context.queryClient.ensureQueryData(\n\t\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\t\tbuildPaginationBody(deps.flowRunsDeps, id),\n\t\t\t\t\t30_000,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst flowRunIds = pageData?.results?.map((run) => run.id) ?? [];\n\t\t\tif (flowRunIds.length > 0) {\n\t\t\t\tvoid context.queryClient.prefetchQuery(\n\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery(flowRunIds),\n\t\t\t\t);\n\t\t\t}\n\t\t})();\n\n\t\t// Ensure flow details are loaded (critical data)\n\t\treturn context.queryClient.ensureQueryData(buildFLowDetailsQuery(id));\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\n});\n"],"names":["DeleteFlowDialog","flow","open","onOpenChange","onDeleted","navigate","useNavigate","deleteFlow","isPending","useDeleteFlowById","handleDelete","toast","jsx","DeleteConfirmationDialog","BAR_WIDTH","BAR_GAP","MiniDeploymentActivity","deploymentId","numberOfBars","setNumberOfBars","useState","debouncedNumberOfBars","useDebounce","chartRef","useCallback","node","updateBars","chartWidth","resizeObserver","effectiveNumberOfBars","flowRuns","useQuery","buildFilterFlowRunsQuery","enrichedFlowRuns","flowRun","FlowRunActivityBarChart","subSeconds","secondsInWeek","columns","table","Checkbox","value","row","status","StatusBadge","tag","schedules","ScheduleBadgeGroup","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuItem","SORT_OPTIONS","FlowDeploymentsTab","deployments","deploymentsCount","deploymentsPages","deploymentSearch","onDeploymentSearchChange","deploymentTags","onDeploymentTagsChange","deploymentSort","onDeploymentSortChange","deploymentPagination","onDeploymentPaginationChange","rowSelection","setRowSelection","showDeleteDialog","setShowDeleteDialog","deleteDeployment","useDeleteDeployment","handlePaginationChange","updater","currentPagination","newPagination","deploymentsTable","useReactTable","baseDeploymentColumns","getCoreRowModel","selectedCount","handleDeleteSelected","selectedIds","id","handleDeploymentTagsChange","e","Trash2","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","FlowRunActivityBarGraphTooltipProvider","DataTable","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","FlowDetails","FormattedDate","FlowMenu","onDelete","handleCopyId","DropdownMenuLabel","FlowPageHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","REFETCH_INTERVAL","chartConfig","transformHistoryToChartData","history","chartData","cumulativeCompleted","cumulativeFailed","item","completedCount","failedCount","state","CumulativeTaskRunsCard","flowId","total","completed","failed","running","useSuspenseQueries","buildCountTaskRunsQuery","buildTotalTaskRunsCountFilter","buildCompletedTaskRunsCountFilter","buildFailedTaskRunsCountFilter","buildRunningTaskRunsCountFilter","buildTaskRunsHistoryQuery","buildTaskRunsHistoryFilterForFlow","useMemo","hasFailedData","point","percentComparisonTotal","completedPercentage","failedPercentage","Card","CardHeader","CardTitle","CardContent","ChartContainer","AreaChart","Area","FlowRunsHistoryCard","QUERY_LIMIT","totalCount","buildFlowRunsHistoryFilter","buildCountFlowRunsQuery","buildFlowRunsCountFilterForHistory","startDate","endDate","now","subDays","Skeleton","FlowStatsSummary","FlowDetail","flowRunsCount","flowRunsPages","tab","pagination","onPaginationChange","onPrefetchPage","sort","onSortChange","flowRunSearch","onFlowRunSearchChange","selectedStates","onSelectFilter","selectedRows","setSelectedRows","onSelectRow","clearSet","useFlowRunsSelectedRows","onClearFilters","Fragment","Tabs","prev","TabsList","TabsTrigger","TabsContent","FlowRunsRowCount","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","z","optional","default","number","int","positive","max","SORT_FILTERS","string","type","seconds","startDateTime","date","endDateTime","buildPaginationBody","search","stateFilters","flowRunsFilter","length","operator","name","like_","any_","undefined","page","limit","flow_runs","flows","usePagination","Route","useSearch","to","replace","useSort","useFlowRunSearch","useStateFilter","Set","states","Array","from","useDeploymentSearch","useDeploymentTagsFilter","tags","useDeploymentSort","useDeploymentPagination","FlowDetailRoute","queryClient","useQueryClient","useParams","data","queries","buildFLowDetailsQuery","deploymentsPage","buildPaginateDeploymentsQuery","flow_or_deployment_name","all_","usePageTitle","flowRunsPage","buildPaginateFlowRunsQuery","results","useEffect","flowRunIds","map","run","prefetchQuery","buildGetFlowRunsTaskRunsCountQuery","filter","ensureQueryData","count","pages"],"mappings":"8jDAaO,MAAMA,GAAmB,CAAC,CAChC,KAAAC,EACA,KAAAC,EACA,aAAAC,EACA,UAAAC,CACD,IAA6B,CAC5B,MAAMC,EAAWC,GAAA,EACX,CAAE,WAAAC,EAAY,UAAAC,CAAA,EAAcC,GAAA,EAE5BC,EAAe,IAAM,CAC1BH,EAAWN,EAAK,GAAI,CACnB,UAAW,IAAM,CAChBU,EAAM,QAAQ,cAAc,EAC5BP,IAAA,EACKC,EAAS,CAAE,GAAI,SAAU,CAC/B,EACA,QAAS,IAAM,CACdM,EAAM,MAAM,uBAAuB,CACpC,CAAA,CACA,CACF,EAEA,OACCC,EAAAA,IAACC,GAAA,CACA,OAAQX,EACR,MAAM,cACN,YAAa,mCAAmCD,EAAK,IAAI,kCACzD,UAAWO,EACX,YAAY,cACZ,UAAWE,EACX,QAAS,IAAMP,EAAa,EAAK,CAAA,CAAA,CAGpC,ECtCMW,GAAY,EACZC,GAAU,EAMHC,GAAyB,CAAC,CACtC,aAAAC,CACD,IAAmC,CAClC,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAAA,SAAiB,CAAC,EACpDC,EAAwBC,GAAYJ,EAAc,GAAG,EAErDK,EAAWC,cAAaC,GAAgC,CAC7D,GAAI,CAACA,EAAM,OAEX,MAAMC,EAAa,IAAM,CACxB,MAAMC,EAAaF,EAAK,sBAAA,EAAwB,MAChDN,EAAgB,KAAK,MAAMQ,GAAcb,GAAYC,GAAQ,CAAC,CAC/D,EAEAW,EAAA,EAEA,MAAME,EAAiB,IAAI,eAAeF,CAAU,EACpD,OAAAE,EAAe,QAAQH,CAAI,EACpB,IAAM,CACZG,EAAe,WAAA,CAChB,CACD,EAAG,CAAA,CAAE,EAECC,EAAwBR,GAAyBH,EAEjD,CAAE,KAAMY,CAAA,EAAaC,EAC1BC,GAAyB,CACxB,YAAa,CACZ,SAAU,OACV,GAAI,CAAE,KAAM,CAACf,CAAY,CAAA,CAAE,EAE5B,MAAO,KAAK,IAAI,GAAIY,GAAyB,EAAE,EAC/C,KAAM,kBACN,OAAQ,CAAA,CACR,CAAA,EAGII,EACLH,GAAU,IAAKI,IAAa,CAC3B,GAAGA,CAAA,EACF,GAAK,CAAA,EAER,OACCtB,EAAAA,IAAC,MAAA,CAAI,UAAU,SAAS,IAAKW,EAC5B,SAAAX,EAAAA,IAACuB,GAAA,CACA,iBAAAF,EACA,UAAWG,GAAW,IAAI,KAAQC,EAAa,EAC/C,YAAa,KACb,SAAUvB,GACV,aAAce,EACd,UAAU,aACV,QAAS,cAAcZ,CAAY,EAAA,CAAA,EAErC,CAEF,ECrDaqB,GAAmC,CAC/C,CACC,GAAI,SACJ,OAAQ,CAAC,CAAE,MAAAC,CAAA,IACV3B,EAAAA,IAAC4B,EAAA,CACA,QAASD,EAAM,yBAAA,EACf,gBAAkBE,GAAUF,EAAM,0BAA0B,CAAC,CAACE,CAAK,EACnE,aAAW,YAAA,CAAA,EAGb,KAAM,CAAC,CAAE,IAAAC,CAAA,IACR9B,EAAAA,IAAC4B,EAAA,CACA,QAASE,EAAI,cAAA,EACb,gBAAkBD,GAAUC,EAAI,eAAe,CAAC,CAACD,CAAK,EACtD,aAAW,YAAA,CAAA,EAGb,cAAe,GACf,aAAc,GACd,QAAS,GACT,QAAS,EAAA,EAEV,CACC,YAAa,OACb,OAAQ,OACR,KAAM,CAAC,CAAE,IAAAC,KAAUA,EAAI,SAAS,IAAA,EAEjC,CACC,YAAa,SACb,OAAQ,SACR,KAAM,CAAC,CAAE,IAAAA,KAAU,CAClB,MAAMC,EAASD,EAAI,SAAS,OACzB,SACCA,EAAI,SAAS,QAAU,YAC3B,OAAO9B,MAACgC,IAAY,OAAAD,EAAgB,CACrC,CAAA,EAED,CACC,YAAa,OACb,OAAQ,OACR,KAAM,CAAC,CAAE,IAAAD,CAAA,IACR9B,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACb,SAAA8B,EAAI,SAAS,MAAM,IAAKG,GACxBjC,EAAAA,IAAC,OAAA,CAEA,UAAU,oEAET,SAAAiC,CAAA,EAHIA,CAAA,CAKN,CAAA,CACF,CAAA,EAGF,CACC,YAAa,YACb,OAAQ,YACR,KAAM,CAAC,CAAE,IAAAH,KAAU,CAClB,MAAMI,EAAYJ,EAAI,SAAS,UAC/B,MAAI,CAACI,GAAaA,EAAU,SAAW,EAAU,KAC1ClC,MAACmC,IAAmB,UAAAD,EAAsB,CAClD,EACA,KAAM,GAAA,EAEP,CACC,YAAa,WACb,OAAQ,WACR,KAAM,CAAC,CAAE,IAAAJ,KACHA,EAAI,SAAS,GACX9B,EAAAA,IAACI,GAAA,CAAuB,aAAc0B,EAAI,SAAS,GAAI,EADjC,IAE9B,EAED,CACC,GAAI,UACJ,KAAM,CAAC,CAAE,IAAAA,KACHA,EAAI,SAAS,UAGhBM,GAAA,CACA,SAAA,CAAApC,EAAAA,IAACqC,GAAA,CAAoB,QAAO,GAC3B,SAAAC,EAAAA,KAACC,GAAO,QAAQ,QAAQ,UAAU,aACjC,SAAA,CAAAvC,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,YAAS,EACnCA,EAAAA,IAACwC,GAAA,CAAK,GAAG,iBAAiB,UAAU,QAAA,CAAS,CAAA,CAAA,CAC9C,CAAA,CACD,EACAxC,EAAAA,IAACyC,GAAA,CAAoB,MAAM,MAC1B,SAAAzC,EAAAA,IAAC0C,EAAA,CACA,QAAS,IAAA,CACH,UAAU,UAAU,UAAUZ,EAAI,SAAS,EAAE,GAEnD,SAAA,SAAA,CAAA,CAED,CACD,CAAA,EACD,EAnB4B,KAsB9B,QAAS,GACT,QAAS,EAAA,CAEX,ECjFMa,GAA2D,CAChE,CAAE,MAAO,UAAW,MAAO,cAAA,EAC3B,CAAE,MAAO,SAAU,MAAO,UAAA,EAC1B,CAAE,MAAO,SAAU,MAAO,WAAA,CAC3B,EAmBaC,GAAqB,CAAC,CAClC,YAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,yBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,qBAAAC,EACA,6BAAAC,CACD,IAA+B,CAC9B,KAAM,CAACC,EAAcC,CAAe,EAAIjD,EAAAA,SAA4B,CAAA,CAAE,EAChE,CAACkD,EAAkBC,CAAmB,EAAInD,EAAAA,SAAS,EAAK,EACxD,CAAE,iBAAAoD,CAAA,EAAqBC,GAAA,EAEvBC,EAAsDlD,EAAAA,YAC1DmD,GAAY,CACZ,MAAMC,EAAqC,CAC1C,UAAWV,EAAqB,KAAO,EACvC,SAAUA,EAAqB,KAAA,EAE1BW,EACL,OAAOF,GAAY,WAAaA,EAAQC,CAAiB,EAAID,EAC9DR,EAA6B,CAC5B,KAAMU,EAAc,UAAY,EAChC,MAAOA,EAAc,QAAA,CACrB,EACDR,EAAgB,CAAA,CAAE,CACnB,EACA,CAACH,EAAsBC,CAA4B,CAAA,EAG9CW,EAAmBC,GAAc,CACtC,KAAMtB,EACN,QAASuB,GACT,gBAAiBC,GAAA,EACjB,iBAAkB,GAClB,UAAWtB,EACX,MAAO,CACN,aAAAS,EACA,WAAY,CACX,UAAWF,EAAqB,KAAO,EACvC,SAAUA,EAAqB,KAAA,CAChC,EAED,qBAAsBG,EACtB,mBAAoBK,EACpB,SAAWhC,GAAQA,EAAI,EAAA,CACvB,EAEKwC,EAAgB,OAAO,KAAKd,CAAY,EAAE,OAE1Ce,EAAuB3D,EAAAA,YAAY,IAAM,CAC9C,MAAM4D,EAAc,OAAO,KAAKhB,CAAY,EAC5C,UAAWiB,KAAMD,EAChBZ,EAAiBa,CAAE,EAEpBhB,EAAgB,CAAA,CAAE,EAClBE,EAAoB,EAAK,CAC1B,EAAG,CAACH,EAAcI,CAAgB,CAAC,EAE7Bc,EACwB9D,EAAAA,YAC5B+D,GAAgD,CAC5C,MAAM,QAAQA,CAAC,GAClBxB,EAAuBwB,CAAC,CAE1B,EACA,CAACxB,CAAsB,CAAA,EAGxB,OACCb,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uCAEd,SAAA,CAAAtC,EAAAA,IAAC,MAAA,CAAI,UAAU,iFACb,SAAAsE,EAAgB,EAChBhC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAA,EAAAA,KAAC,IAAA,CAAE,UAAU,gCACX,SAAA,CAAAgC,EAAc,WAAA,EAChB,EACAtE,EAAAA,IAACuC,EAAA,CACA,QAAQ,QACR,KAAK,OACL,UAAU,kDACV,QAAS,IAAMoB,EAAoB,EAAI,EACvC,aAAW,8BAEX,SAAA3D,EAAAA,IAAC4E,GAAA,CAAO,UAAU,SAAA,CAAU,CAAA,CAAA,CAC7B,CAAA,CACD,EAEAtC,EAAAA,KAAC,IAAA,CAAE,UAAU,gCACX,SAAA,CAAAQ,EAAiB,cAAYA,IAAqB,EAAI,IAAM,EAAA,CAAA,CAC9D,CAAA,CAEF,EAGA9C,EAAAA,IAAC,MAAA,CAAI,UAAU,6DACd,SAAAA,EAAAA,IAAC6E,GAAA,CACA,YAAY,wBACZ,MAAO7B,GAAoB,GAC3B,SAAW2B,GAAM1B,EAAyB0B,EAAE,OAAO,KAAK,EACxD,aAAW,qBACX,WAAY,GAAA,CAAA,EAEd,EACA3E,EAAAA,IAAC,MAAA,CAAI,UAAU,6DACd,SAAAA,EAAAA,IAAC8E,GAAA,CACA,YAAY,iBACZ,MAAO5B,EACP,SAAUwB,CAAA,CAAA,EAEZ,EAGA1E,EAAAA,IAAC,MAAA,CAAI,UAAU,iGACd,SAAAsC,EAAAA,KAACyC,GAAA,CACA,MAAO3B,EACP,cAAgBvB,GACfwB,EAAuBxB,CAAuB,EAG/C,SAAA,CAAA7B,EAAAA,IAACgF,GAAA,CAAc,UAAU,SAAS,aAAW,mBAC5C,SAAAhF,EAAAA,IAACiF,GAAA,CAAY,YAAY,SAAA,CAAU,CAAA,CACpC,QACCC,GAAA,CACC,SAAAvC,GAAa,IAAKwC,GAClBnF,EAAAA,IAACoF,GAAA,CAA8B,MAAOD,EAAO,MAC3C,SAAAA,EAAO,OADQA,EAAO,KAExB,CACA,CAAA,CACF,CAAA,CAAA,CAAA,CACD,CACD,CAAA,EACD,EAEAnF,EAAAA,IAACqF,GAAA,CAEA,SAAArF,EAAAA,IAAC,MAAA,CAAI,UAAU,mDACd,SAAAA,EAAAA,IAACsF,GAAA,CAAU,MAAOpB,CAAA,CAAkB,CAAA,CACrC,EACD,QAECqB,GAAA,CAAO,KAAM7B,EAAkB,aAAcC,EAC7C,gBAAC6B,GAAA,CACA,SAAA,CAAAlD,OAACmD,GAAA,CACA,SAAA,CAAAzF,EAAAA,IAAC0F,IAAY,SAAA,oBAAA,CAAkB,SAC9BC,GAAA,CAAkB,SAAA,CAAA,mCACerB,EAAc,cAC9CA,IAAkB,EAAI,IAAM,GAAG,iCAAA,CAAA,CACjC,CAAA,EACD,SACCsB,GAAA,CACA,SAAA,CAAA5F,EAAAA,IAACuC,EAAA,CACA,QAAQ,UACR,QAAS,IAAMoB,EAAoB,EAAK,EACxC,SAAA,QAAA,CAAA,QAGApB,EAAA,CAAO,QAAQ,cAAc,QAASgC,EAAsB,SAAA,QAAA,CAE7D,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,CAAA,EACD,CAEF,EC9NasB,GAAc,CAAC,CAAE,KAAAxG,KAE5BiD,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sBACb,SAAA,CAAAtC,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,UAAO,EAC7CA,EAAAA,IAAC,KAAA,CAAG,UAAU,6CACZ,WAAK,EAAA,CACP,CAAA,EACD,EACAsC,EAAAA,KAAC,KAAA,CAAG,UAAU,sBACb,SAAA,CAAAtC,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,UAAO,EAC7CA,EAAAA,IAAC,KAAA,CAAG,UAAU,6CACZ,WAAK,QACLA,EAAAA,IAAC8F,EAAA,CAAc,KAAMzG,EAAK,QAAS,OAAO,UAAA,CAAW,EAErD,KAAA,CAEF,CAAA,EACD,EACAiD,EAAAA,KAAC,KAAA,CAAG,UAAU,sBACb,SAAA,CAAAtC,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,UAAO,EAC7CA,EAAAA,IAAC,KAAA,CAAG,UAAU,6CACZ,WAAK,QACLA,EAAAA,IAAC8F,EAAA,CAAc,KAAMzG,EAAK,QAAS,OAAO,UAAA,CAAW,EAErD,KAAA,CAEF,CAAA,CAAA,CACD,CAAA,EACD,ECnBW0G,GAAW,CAAC,CAAE,KAAA1G,EAAM,SAAA2G,KAA8B,CAC9D,MAAMC,EAAe,IAAM,CACrB,UAAU,UAAU,UAAU5G,EAAK,EAAE,EAC1CU,EAAM,QAAQ,WAAW,CAC1B,EAEA,cACEqC,GAAA,CACA,SAAA,CAAApC,EAAAA,IAACqC,GAAA,CAAoB,QAAO,GAC3B,SAAAC,EAAAA,KAACC,GAAO,QAAQ,UAAU,UAAU,aACnC,SAAA,CAAAvC,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,YAAS,EACnCA,EAAAA,IAACwC,GAAA,CAAK,GAAG,eAAe,UAAU,QAAA,CAAS,CAAA,CAAA,CAC5C,CAAA,CACD,EACAF,EAAAA,KAACG,GAAA,CAAoB,MAAM,MAC1B,SAAA,CAAAzC,EAAAA,IAACkG,IAAkB,SAAA,SAAA,CAAO,EAC1BlG,EAAAA,IAAC0C,EAAA,CAAiB,QAASuD,EAAc,SAAA,UAAO,QAC/CvD,EAAA,CAAiB,QAAQ,cAAc,QAASsD,EAAU,SAAA,QAAA,CAE3D,CAAA,CAAA,CACD,CAAA,EACD,CAEF,ECxBO,SAASG,GAAe,CAAE,KAAA9G,EAAM,SAAA2G,GAAiC,CACvE,OACC1D,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAtC,EAAAA,IAACoG,GAAA,CACA,gBAACC,GAAA,CACA,SAAA,CAAArG,EAAAA,IAACsG,EAAA,CACA,eAACC,GAAA,CAAe,GAAG,SAAS,UAAU,wBAAwB,iBAE9D,CAAA,CACD,QACCC,GAAA,EAAoB,EACrBxG,EAAAA,IAACsG,GAAe,UAAU,wBACzB,eAACG,GAAA,CAAgB,SAAApH,EAAK,KAAK,CAAA,CAC5B,CAAA,CAAA,CACD,CAAA,CACD,EACAW,EAAAA,IAAC+F,GAAA,CAAS,KAAA1G,EAAY,SAAA2G,CAAA,CAAoB,CAAA,EAC3C,CAEF,CCjBA,MAAMU,EAAmB,IAYnBC,GAAc,CACnB,UAAW,CACV,MAAO,YACP,MAAO,wBAAA,EAER,OAAQ,CACP,MAAO,SACP,MAAO,oBAAA,CAET,EAEMC,GACLC,GACsB,CACtB,MAAMC,EAA8B,CAAA,EACpC,IAAIC,EAAsB,EACtBC,EAAmB,EAEvB,UAAWC,KAAQJ,EAAS,CAC3B,IAAIK,EAAiB,EACjBC,EAAc,EAElB,UAAWC,KAASH,EAAK,OACpBG,EAAM,aAAe,YACxBF,GAAkBE,EAAM,YAExBA,EAAM,aAAe,UACrBA,EAAM,aAAe,aAErBD,GAAeC,EAAM,YAIvBL,GAAuBG,EACvBF,GAAoBG,EAEpBL,EAAU,KAAK,CACd,UAAWG,EAAK,eAChB,UAAWF,EACX,OAAQC,CAAA,CACR,CACF,CAEA,OAAOF,CACR,EAEO,SAASO,GAAuB,CACtC,OAAAC,CACD,EAAgC,CAC/B,KAAM,CACL,CAAE,KAAMC,CAAA,EACR,CAAE,KAAMC,CAAA,EACR,CAAE,KAAMC,CAAA,EACR,CAAE,KAAMC,CAAA,EACR,CAAE,KAAMb,CAAA,CAAQ,EACbc,EAAmB,CACtB,QAAS,CACRC,EACCC,GAA8BP,CAAM,EACpCZ,CAAA,EAEDkB,EACCE,GAAkCR,CAAM,EACxCZ,CAAA,EAEDkB,EACCG,GAA+BT,CAAM,EACrCZ,CAAA,EAEDkB,EACCI,GAAgCV,CAAM,EACtCZ,CAAA,EAEDuB,GACCC,GAAkCZ,CAAM,EACxCZ,CAAA,CACD,CACD,CACA,EAEKI,EAAYqB,EAAAA,QACjB,IAAMvB,GAA4BC,CAAO,EACzC,CAACA,CAAO,CAAA,EAGHuB,EAAgBtB,EAAU,KAAMuB,GAAUA,EAAM,OAAS,CAAC,EAE1DC,EAAyBf,EAAQG,EACjCa,EACLD,EAAyB,GACpBd,EAAYc,EAA0B,KAAK,QAAQ,CAAC,EACtD,IACEE,EACLF,EAAyB,GACpBb,EAASa,EAA0B,KAAK,QAAQ,CAAC,EACnD,IAEJ,OACChG,EAAAA,KAACmG,GAAA,CAAK,UAAU,wCACf,SAAA,CAAAzI,EAAAA,IAAC0I,IAAW,UAAU,OACrB,SAAA1I,MAAC2I,GAAA,CAAU,qBAAS,CAAA,CACrB,EACA3I,MAAC4I,GAAA,CACA,SAAAtG,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAtC,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACd,SAAAA,EAAAA,IAAC,QAAK,UAAU,gBAAiB,WAAM,CAAA,CACxC,EACC0H,EAAU,GACVpF,OAAC,MAAA,CAAI,UAAU,sCACd,SAAA,CAAAtC,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,SAAA0H,EAAQ,EACvD1H,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,SAAA,CAAO,CAAA,EAChD,EAEDsC,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACd,SAAA,CAAAtC,EAAAA,IAAC,OAAA,CAAK,UAAU,+BAAgC,SAAAwH,EAAU,EAC1DxH,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,YAAS,EACjDsC,EAAAA,KAAC,OAAA,CAAK,UAAU,iBAAkB,SAAA,CAAAiG,EAAoB,GAAA,CAAA,CAAC,CAAA,EACxD,EACCd,EAAS,GACTnF,OAAC,MAAA,CAAI,UAAU,sCACd,SAAA,CAAAtC,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA8B,SAAAyH,EAAO,EACrDzH,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,SAAM,EAC9CsC,EAAAA,KAAC,OAAA,CAAK,UAAU,eAAgB,SAAA,CAAAkG,EAAiB,GAAA,CAAA,CAAC,CAAA,CAAA,CACnD,CAAA,CAAA,CAEF,CAAA,CACD,EACAxI,EAAAA,IAAC,OAAI,UAAU,wCACd,eAAC6I,GAAA,CAAe,OAAQlC,GAAa,UAAU,gBAC9C,SAAArE,EAAAA,KAACwG,GAAA,CACA,KAAMhC,EACN,OAAQ,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAA,EAE7C,SAAA,CAAAxE,OAAC,OAAA,CACA,SAAA,CAAAA,EAAAA,KAAC,iBAAA,CACA,GAAG,wBACH,GAAG,IACH,GAAG,IACH,GAAG,IACH,GAAG,IAEH,SAAA,CAAAtC,EAAAA,IAAC,OAAA,CACA,OAAO,KACP,UAAU,yBACV,YAAa,CAAA,CAAA,EAEdA,EAAAA,IAAC,OAAA,CACA,OAAO,OACP,UAAU,yBACV,YAAa,EAAA,CAAA,CACd,CAAA,CAAA,EAEDsC,EAAAA,KAAC,iBAAA,CACA,GAAG,qBACH,GAAG,IACH,GAAG,IACH,GAAG,IACH,GAAG,IAEH,SAAA,CAAAtC,EAAAA,IAAC,OAAA,CACA,OAAO,KACP,UAAU,sBACV,YAAa,CAAA,CAAA,EAEdA,EAAAA,IAAC,OAAA,CACA,OAAO,OACP,UAAU,sBACV,YAAa,EAAA,CAAA,CACd,CAAA,CAAA,CACD,EACD,EACCoI,GACApI,EAAAA,IAAC+I,EAAA,CACA,KAAK,WACL,QAAQ,SACR,OAAO,sBACP,YAAa,EACb,UAAW,GACX,KAAK,2BACL,IAAK,GACL,kBAAmB,EAAA,CAAA,EAGrB/I,EAAAA,IAAC+I,EAAA,CACA,KAAK,WACL,QAAQ,YACR,OAAO,yBACP,YAAa,EACb,UAAW,GACX,KAAK,8BACL,IAAK,GACL,kBAAmB,EAAA,CAAA,CACpB,CAAA,CAAA,EAEF,CAAA,CACD,CAAA,EACD,CAEF,CC/MA,MAAM7I,GAAY,EACZC,GAAU,EACVuG,GAAmB,IAOlB,SAASsC,GAAoB,CACnC,OAAA1B,EACA,KAAAjI,CACD,EAA6B,CAC5B,KAAM,CAACiB,EAAcC,CAAe,EAAIC,EAAAA,SAAiB,CAAC,EACpDC,EAAwBC,GAAYJ,EAAc,GAAG,EAErDK,EAAWC,cAAaC,GAAgC,CAC7D,GAAI,CAACA,EAAM,OAEX,MAAMC,EAAa,IAAM,CACxB,MAAMC,EAAaF,EAAK,sBAAA,EAAwB,MAChDN,EAAgB,KAAK,MAAMQ,GAAcb,GAAYC,GAAQ,CAAC,CAC/D,EAEAW,EAAA,EACA,MAAME,EAAiB,IAAI,eAAeF,CAAU,EACpD,OAAAE,EAAe,QAAQH,CAAI,EACpB,IAAMG,EAAe,WAAA,CAC7B,EAAG,CAAA,CAAE,EAECC,EAAwBR,GAAyBH,EAEjD2I,EAAc,GAEd,CAAC,CAAE,KAAM/H,CAAA,EAAY,CAAE,KAAMgI,CAAA,CAAY,EAAIvB,EAAmB,CACrE,QAAS,CACRvG,GACC+H,GAA2B7B,EAAQ2B,CAAW,EAC9CvC,EAAA,EAED0C,GACCC,GAAmC/B,CAAM,EACzCZ,EAAA,CACD,CACD,CACA,EAEKrF,EAAmB8G,EAAAA,QACxB,IACCjH,EAAS,IAAKI,IAAsB,CACnC,GAAGA,EACH,KAAAjC,CAAA,EACC,EACH,CAAC6B,EAAU7B,CAAI,CAAA,EAGV,CAAE,UAAAiK,EAAW,QAAAC,CAAA,EAAYpB,EAAAA,QAAQ,IAGlC,CACJ,MAAMqB,MAAU,KAChB,MAAO,CACN,UAAWC,GAAQD,CAAM,EACzB,QAASA,CAAA,CAEX,EAAG,CAAA,CAAE,EAEL,OACClH,EAAAA,KAACmG,GAAA,CAAK,UAAU,SACf,SAAA,CAAAnG,EAAAA,KAACoG,GAAA,CAAW,UAAU,kDACrB,SAAA,CAAA1I,EAAAA,IAAC2I,IAAU,SAAA,WAAA,CAAS,EACpBrG,EAAAA,KAAC,OAAA,CAAK,UAAU,gCACd,SAAA,CAAA4G,EAAW,QAAA,CAAA,CACb,CAAA,EACD,QACCN,GAAA,CACA,SAAA5I,MAAC,MAAA,CAAI,UAAU,OAAO,IAAKW,EACzB,SAAAM,IAA0B,QACzByI,GAAA,CAAS,UAAU,gBAAgB,QAEnCrE,GAAA,CACA,SAAArF,EAAAA,IAACuB,GAAA,CACA,iBAAAF,EACA,UAAAiI,EACA,QAAAC,EACA,aAActI,EACd,SAAUf,GACV,UAAU,eAAA,CAAA,CACX,CACD,EAEF,CAAA,CACD,CAAA,EACD,CAEF,CC3GO,SAASyJ,GAAiB,CAAE,OAAArC,EAAQ,KAAAjI,GAA+B,CACzE,OACCiD,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAtC,EAAAA,IAACgJ,GAAA,CAAoB,OAAA1B,EAAgB,KAAAjI,CAAA,CAAY,EACjDW,MAACqH,IAAuB,OAAAC,CAAA,CAAgB,CAAA,EACzC,CAEF,CCSA,SAAwBsC,GAAW,CAClC,KAAAvK,EACA,SAAA6B,EACA,cAAA2I,EACA,cAAAC,EACA,YAAAjH,EACA,iBAAAC,EACA,iBAAAC,EACA,IAAAgH,EAAM,OACN,WAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,KAAAC,EACA,aAAAC,EACA,cAAAC,EACA,sBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,iBAAAxH,EACA,yBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,qBAAAC,EACA,6BAAAC,CACD,EA+BgB,CACf,MAAM9D,EAAWC,GAAA,EACX,CAACgE,EAAkBC,CAAmB,EAAInD,EAAAA,SAAS,EAAK,EACxD,CAACiK,EAAcC,GAAiB,CAAE,YAAAC,GAAa,SAAAC,CAAA,CAAU,EAC9DC,GAAA,EAGKxJ,EAAsCH,EAAS,IAAKI,IAAa,CACtE,GAAGA,EACH,KAAAjC,CAAA,EACC,EAGIyL,GAAiBlK,EAAAA,YAAY,IAAM,CACxC0J,EAAsB,EAAE,EACxBE,EAAe,IAAI,GAAK,EACxBI,EAAA,CACD,EAAG,CAACN,EAAuBE,EAAgBI,CAAQ,CAAC,EAEpD,OACCtI,EAAAA,KAAAyI,WAAA,CACC,SAAA,CAAAzI,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACd,SAAA,CAAAtC,EAAAA,IAACmG,GAAA,CACA,KAAA9G,EACA,SAAU,IAAMsE,EAAoB,EAAI,CAAA,CAAA,EAEzC3D,EAAAA,IAAC2J,GAAA,CAAiB,OAAQtK,EAAK,GAAI,KAAAA,EAAY,EAC/CiD,EAAAA,KAAC0I,GAAA,CACA,MAAOjB,EACP,cAAgBlI,GAAA,CACVpC,EAAS,CACb,GAAI,IACJ,OAASwL,KAAU,CAClB,GAAGA,GACH,IAAKpJ,CAAA,EACN,CACA,GAGF,SAAA,CAAAS,OAAC4I,GAAA,CACA,SAAA,CAAAlL,EAAAA,IAACmL,EAAA,CAAY,MAAM,OAAO,SAAA,OAAI,EAC9BnL,EAAAA,IAACmL,EAAA,CAAY,MAAM,cAAc,SAAA,cAAW,EAC5CnL,EAAAA,IAACmL,EAAA,CAAY,MAAM,UAAU,SAAA,SAAA,CAAO,CAAA,EACrC,EACA7I,EAAAA,KAAC8I,EAAA,CAAY,MAAM,OAAO,UAAU,sBACnC,SAAA,CAAA9I,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAtC,EAAAA,IAACqL,GAAA,CACA,MAAOxB,EACP,QAASxI,EACT,aAAAoJ,EACA,gBAAAC,EAAA,CAAA,EAEDpI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAtC,EAAAA,IAAC6E,GAAA,CACA,YAAY,qBACZ,MAAOwF,GAAiB,GACxB,SAAW1F,GAAM2F,EAAsB3F,EAAE,OAAO,KAAK,EACrD,UAAU,MAAA,CAAA,EAEX3E,EAAAA,IAACsL,GAAA,CACA,gBAAiBf,EACjB,eAAAC,CAAA,CAAA,EAEDxK,EAAAA,IAACuL,GAAA,CAAW,MAAOpB,EAAM,SAAUC,CAAA,CAAc,CAAA,CAAA,CAClD,CAAA,EACD,EACApK,EAAAA,IAACwL,GAAA,CACA,SAAUnK,EACV,aAAAoJ,EACA,SAAUE,GACV,eAAAG,EAAA,CAAA,EAED9K,EAAAA,IAACyL,GAAA,CACA,MAAO5B,EACP,MAAOC,EACP,WAAAE,EACA,mBAAoBC,EACpB,eAAAC,CAAA,CAAA,CACD,EACD,EACAlK,EAAAA,IAACoL,EAAA,CAAY,MAAM,cAClB,SAAApL,EAAAA,IAAC4C,GAAA,CACA,YAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,yBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,qBAAAC,EACA,6BAAAC,CAAA,CAAA,EAEF,QACC6H,EAAA,CAAY,MAAM,UAClB,SAAApL,EAAAA,IAAC6F,GAAA,CAAY,KAAAxG,EAAY,CAAA,CAC1B,CAAA,CAAA,CAAA,CACD,EACD,EACAW,EAAAA,IAACZ,GAAA,CACA,KAAAC,EACA,KAAMqE,EACN,aAAcC,CAAA,CAAA,CACf,EACD,CAEF,CCrIqB+H,GACZ,CACP3B,IAAK2B,EAAO,CAAC,OAAQ,cAAe,SAAS,CAAC,EAAEC,SAAAA,EAAWC,QAAQ,MAAM,EACzE,YAAaF,EAAEG,EAASC,IAAAA,EAAMC,SAAAA,EAAWJ,SAAAA,EAAWC,QAAQ,CAAC,EAC7D,aAAcF,EAAEG,EAASC,MAAMC,SAAAA,EAAWC,IAAI,GAAG,EAAEL,WAAWC,QAAQ,EAAE,EACxE,YAAaF,EAAOO,EAAY,EAAEN,SAAAA,EAAWC,QAAQ,iBAAiB,EACtE,yBAA0BF,EAAEQ,EAASP,SAAAA,EAAWC,QAAQ,EAAE,EAC1D,2BAA4BF,EAAQA,EAAEQ,CAAQ,EAAEP,SAAAA,EAChDQ,KAAMT,EAAO,CAAC,OAAQ,OAAO,CAAC,EAAEC,SAAAA,EAChCS,QAASV,EAAEG,EAASC,MAAMC,SAAAA,EAAWJ,SAAAA,EACrCU,cAAeX,GAAEY,EAAOX,SAAAA,EACxBY,YAAab,GAAEY,EAAOX,SAAAA,EACtB,mBAAoBD,EAAEG,EAASC,IAAAA,EAAMC,SAAAA,EAAWJ,SAAAA,EAAWC,QAAQ,CAAC,EACpE,oBAAqBF,EAAEG,EAASC,IAAAA,EAAMC,SAAAA,EAAWJ,SAAAA,EAAWC,QAAQ,EAAE,EACtE,uBAAwBF,EAAEQ,EAASP,SAAAA,EACnC,mBAAoBD,EAAQA,EAAEQ,CAAQ,EAAEP,SAAAA,EACxC,mBAAoBD,EACb,CAAC,eAAgB,eAAgB,WAAY,WAAW,CAAC,EAC9DC,WACAC,QAAQ,UAAU,CACrB,CAAC,EACAD,WACAC,QAAQ,CAAA,CAAE,EAIZ,MAAMY,GAAsBA,CAC3BC,EACAnF,IAC4B,CAC5B,MAAM+C,EAAgBoC,EAAO,wBAAwB,EAC/CC,EAAeD,EAAO,0BAA0B,GAAK,CAAA,EAGrDE,EADatC,GAAiBqC,EAAaE,OAAS,EAEvD,CACAC,SAAU,OACV,GAAIxC,GAAiB,CACpByC,KAAM,CAAEC,MAAO1C,CAAAA,CAAc,EAE9B,GAAIqC,EAAaE,OAAS,GAAK,CAC9BxF,MAAO,CACNyF,SAAU,OACVC,KAAM,CAAEE,KAAMN,CAAAA,CAAa,CAC5B,CACD,EAEAO,OAEH,MAAO,CACNC,KAAMT,EAAO,WAAW,EACxBU,MAAOV,EAAO,YAAY,EAC1BtC,KAAMsC,EAAO,WAAW,EACxBW,UAAWT,EACXU,MAAO,CAAER,SAAU,OAAiBpI,GAAI,CAAEuI,KAAM,CAAC1F,CAAM,CAAA,CAAE,CAAE,CAE7D,EAEMgG,GAAgBA,IAAM,CAC3B,MAAMb,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjBsK,EAA8B7B,EAAAA,QACnC,KAAO,CACN+E,KAAMT,EAAO,WAAW,EACxBU,MAAOV,EAAO,YAAY,CAAA,GAE3B,CAACA,EAAO,WAAW,EAAGA,EAAO,YAAY,CAAC,CAC3C,EAEMxC,EAAqBrJ,cACzBqD,GAAmC,CAC9BxE,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAClB,GAAGA,EACH,YAAahH,EAAciJ,KAC3B,aAAcjJ,EAAckJ,KAAAA,GAE7BO,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAACuK,EAAYC,CAAkB,CACvC,EAEM0D,GAAUA,IAAM,CACrB,MAAMlB,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjB0K,EAAexJ,cACnBuJ,GAAsB,CACjB1K,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAAE,GAAGA,EAAM,YAAad,EAAM,YAAa,CAAA,GAC9DuD,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAACgN,EAAO,WAAW,EAAGrC,CAAY,CAC1C,EAEMwD,GAAmBA,IAAM,CAC9B,MAAMnB,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjB4K,EAAwB1J,cAC5ByJ,GAA0B,CACrB5K,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAClB,GAAGA,EACH,yBAA0BZ,EAC1B,YAAa,CAAA,GAEdqD,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAACgN,EAAO,wBAAwB,EAAGnC,CAAqB,CAChE,EAEMuD,GAAiBA,IAAM,CAC5B,MAAMpB,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjB6K,EAAiBpC,EAAAA,QACtB,IAAM,IAAI2F,IAAKrB,EAAO,0BAA0B,GAAK,CAAA,CAAqB,EAC1E,CAACA,EAAO,0BAA0B,CAAC,CACpC,EAEMjC,EAAiB5J,cACrBmN,GAA8B,CACzBtO,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAClB,GAAGA,EACH,2BAA4B+C,MAAMC,KAAKF,CAAM,EAC7C,YAAa,CAAA,GAEdL,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAAE8K,eAAAA,EAAgBC,eAAAA,CAAAA,CAC1B,EAEM0D,GAAsBA,IAAM,CACjC,MAAMzB,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjBuD,EAA2BrC,cAC/BoC,GAA6B,CACxBvD,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAClB,GAAGA,EACH,uBAAwBjI,GAAoBiK,OAC5C,mBAAoB,CAAA,GAErBS,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAACgN,EAAO,sBAAsB,EAAGxJ,CAAwB,CACjE,EAEMkL,GAA0BA,IAAM,CACrC,MAAM1B,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjByD,EAAyBvC,cAC7BwN,GAAmB,CACd3O,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAClB,GAAGA,EACH,mBAAoBmD,EAAKxB,OAAS,EAAIwB,EAAOnB,OAC7C,mBAAoB,CAAA,GAErBS,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAACgN,EAAO,kBAAkB,GAAK,CAAA,EAAItJ,CAAsB,CACjE,EAEMkL,GAAoBA,IAAM,CAC/B,MAAM5B,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjB2D,EAAyBzC,cAC7BuJ,GAAkD,CAC7C1K,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAClB,GAAGA,EACH,mBAAoBd,EACpB,mBAAoB,CAAA,GAErBuD,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAACgN,EAAO,kBAAkB,EAAGpJ,CAAsB,CAC3D,EAEMiL,GAA0BA,IAAM,CACrC,MAAM7B,EAASc,EAAMC,UAAAA,EACf/N,EAAW8N,EAAM7N,YAAAA,EAEjB4D,EAAuB6E,EAAAA,QAC5B,KAAO,CACN+E,KAAMT,EAAO,kBAAkB,EAC/BU,MAAOV,EAAO,mBAAmB,CAAA,GAElC,CAACA,EAAO,kBAAkB,EAAGA,EAAO,mBAAmB,CAAC,CACzD,EAEMlJ,EAA+B3C,cACnCqD,GAAmD,CAC9CxE,EAAS,CACbgO,GAAI,IACJhB,OAASxB,IAAU,CAClB,GAAGA,EACH,mBAAoBhH,EAAciJ,KAClC,oBAAqBjJ,EAAckJ,KAAAA,GAEpCO,QAAS,EAAA,CACT,CACF,EACA,CAACjO,CAAQ,CACV,EAEA,MAAO,CAAC6D,EAAsBC,CAA4B,CAC3D,EAEMgL,GAAkBA,IAAM,CAC7B,MAAMC,EAAcC,GAAAA,EACd,CAAEhK,GAAAA,CAAAA,EAAO8I,EAAMmB,UAAAA,EACfjC,EAASc,EAAMC,UAAAA,EAGf,CAACxD,EAAYC,CAAkB,EAAIqD,GAAAA,EACnC,CAACnD,EAAMC,CAAY,EAAIuD,GAAAA,EACvB,CAACtD,EAAeC,CAAqB,EAAIsD,GAAAA,EACzC,CAAErD,eAAAA,EAAgBC,eAAAA,CAAAA,EAAmBqD,GAAAA,EAGrC,CAAC7K,EAAkBC,CAAwB,EAAIiL,GAAAA,EAC/C,CAAChL,EAAgBC,CAAsB,EAAIgL,GAAAA,EAC3C,CAAC/K,EAAgBC,CAAsB,EAAIgL,GAAAA,EAC3C,CAAC/K,EAAsBC,CAA4B,EACxD+K,GAAAA,EAGK,CAAC,CAAEK,KAAMtP,CAAAA,CAAM,EAAIsI,EAAmB,CAC3CiH,QAAS,CAACC,GAAsBpK,CAAE,CAAC,CAAA,CACnC,EAIK,CAAEkK,KAAMG,CAAAA,EAAoB3N,EACjC4N,GAA8B,CAC7B5E,KAAMsC,EAAO,kBAAkB,EAC/BS,KAAMT,EAAO,kBAAkB,EAC/BU,MAAOV,EAAO,mBAAmB,EACjCY,MAAO,CAAER,SAAU,OAAQpI,GAAI,CAAEuI,KAAM,CAACvI,CAAE,CAAA,CAAE,EAC5C5B,YAAa,CACZgK,SAAU,OACVmC,wBAAyB,CAAEjC,MAAON,EAAO,sBAAsB,CAAA,EAC/D2B,KAAM,CAAEvB,SAAU,OAAQoC,KAAMxC,EAAO,kBAAkB,GAAK,CAAA,CAAA,CAAG,CAClE,CACA,CACF,EAGAyC,GAAa7P,GAAMyN,KAAO,SAASzN,EAAKyN,IAAI,GAAK,MAAM,EAIvD,KAAM,CAAE6B,KAAMQ,CAAAA,EAAiBhO,EAC9BiO,EAA2B5C,GAAoBC,EAAQhI,CAAE,EAAG,GAAM,CACnE,EAEMvD,EAAWiO,GAAcE,SAAW,CAAA,EAI1CC,EAAAA,UAAU,IAAM,CACf,MAAMC,EAAarO,EAASsO,IAAKC,GAAQA,EAAIhL,EAAE,EAC3C8K,EAAW3C,OAAS,GAClB4B,EAAYkB,cAChBC,EAAmCJ,CAAU,CAC9C,CAEF,EAAG,CAACf,EAAatN,CAAQ,CAAC,EAG1B,MAAMgJ,EAAiBtJ,cACrBsM,GAAiB,CACjB,MAAM0C,EAASpD,GACd,CACC,GAAGC,EACH,YAAaS,CAAAA,EAEdzI,CACD,GAEM,SAAY,CAIjB,MAAM8K,GAHW,MAAMf,EAAYqB,gBAClCT,EAA2BQ,EAAQ,GAAM,CAC1C,IAC6BP,SAASG,OAAaC,EAAIhL,EAAE,GAAK,CAAA,EAC1D8K,EAAW3C,OAAS,GAClB4B,EAAYkB,cAChBC,EAAmCJ,CAAU,CAC9C,CAEF,GAAA,CACD,EACA,CAACf,EAAa/B,EAAQhI,CAAE,CACzB,EAEA,OACCzE,EAAAA,IAAC4J,IACA,KAAAvK,EACA,SAAA6B,EACA,cAAeiO,GAAcW,OAAS,EACtC,cAAeX,GAAcY,OAAS,EACtC,YAAajB,GAAiBO,SAAW,CAAA,EACzC,iBAAkBP,GAAiBgB,OAAS,EAC5C,iBAAkBhB,GAAiBiB,OAAS,EAC5C,IAAKtD,EAAO1C,IACZ,WAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,KAAAC,EACA,aAAAC,EACA,cAAAC,EACA,sBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,iBAAAxH,EACA,yBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,eAAAC,EACA,uBAAAC,EACA,qBAAAC,EACA,6BAAAC,EAA2D,CAG9D"}
@@ -1,2 +1,2 @@
1
- import{r as s,j as n}from"./vendor-tanstack-BdLtprmr.js";import{S as F}from"./vendor-radix-CJc458uP.js";import{g as x,F as u,C as p}from"./vendor-forms-BlFSCfFw.js";import{a_ as i,i as I}from"./index-V_xTKaEb.js";const l=s.createContext({}),f=s.createContext({}),d=()=>{const e=s.useContext(l),t=s.useContext(f),{getFieldState:r,formState:o}=x(),m=r(e.name,o);if(!e)throw new Error("useFormField should be used within <FormField>");const{id:a}=t;return{id:a,name:e.name,formItemId:`${a}-form-item`,formDescriptionId:`${a}-form-item-description`,formMessageId:`${a}-form-item-message`,...m}},R=u,S=({...e})=>n.jsx(l.Provider,{value:{name:e.name},children:n.jsx(p,{...e})}),C=s.forwardRef(({className:e,...t},r)=>{const o=s.useId();return n.jsx(f.Provider,{value:{id:o},children:n.jsx("div",{ref:r,className:i("space-y-2",e),...t})})});C.displayName="FormItem";const g=s.forwardRef(({className:e,...t},r)=>{const{error:o,formItemId:m}=d();return n.jsx(I,{ref:r,className:i(o&&"text-destructive",e),htmlFor:m,...t})});g.displayName="FormLabel";const j=s.forwardRef(({...e},t)=>{const{error:r,formItemId:o,formDescriptionId:m,formMessageId:a}=d();return n.jsx(F,{ref:t,id:o,"aria-describedby":r?`${m} ${a}`:`${m}`,"aria-invalid":!!r,...e})});j.displayName="FormControl";const v=s.forwardRef(({className:e,...t},r)=>{const{formDescriptionId:o}=d();return n.jsx("p",{ref:r,id:o,className:i("text-[0.8rem] text-muted-foreground",e),...t})});v.displayName="FormDescription";const N=s.forwardRef(({className:e,children:t,...r},o)=>{const{error:m,formMessageId:a}=d(),c=m?String(m?.message):t;return c?n.jsx("p",{ref:o,id:a,className:i("text-[0.8rem] font-medium text-destructive",e),...r,children:c}):null});N.displayName="FormMessage";export{R as F,N as a,S as b,C as c,g as d,j as e};
2
- //# sourceMappingURL=form-DOdmIC3A.js.map
1
+ import{r as s,j as n}from"./vendor-tanstack-BdLtprmr.js";import{S as F}from"./vendor-radix-CJc458uP.js";import{g as x,F as u,C as p}from"./vendor-forms-BlFSCfFw.js";import{aZ as i,i as I}from"./index-CPpeVt8m.js";const l=s.createContext({}),f=s.createContext({}),d=()=>{const e=s.useContext(l),t=s.useContext(f),{getFieldState:r,formState:o}=x(),m=r(e.name,o);if(!e)throw new Error("useFormField should be used within <FormField>");const{id:a}=t;return{id:a,name:e.name,formItemId:`${a}-form-item`,formDescriptionId:`${a}-form-item-description`,formMessageId:`${a}-form-item-message`,...m}},R=u,S=({...e})=>n.jsx(l.Provider,{value:{name:e.name},children:n.jsx(p,{...e})}),C=s.forwardRef(({className:e,...t},r)=>{const o=s.useId();return n.jsx(f.Provider,{value:{id:o},children:n.jsx("div",{ref:r,className:i("space-y-2",e),...t})})});C.displayName="FormItem";const g=s.forwardRef(({className:e,...t},r)=>{const{error:o,formItemId:m}=d();return n.jsx(I,{ref:r,className:i(o&&"text-destructive",e),htmlFor:m,...t})});g.displayName="FormLabel";const j=s.forwardRef(({...e},t)=>{const{error:r,formItemId:o,formDescriptionId:m,formMessageId:a}=d();return n.jsx(F,{ref:t,id:o,"aria-describedby":r?`${m} ${a}`:`${m}`,"aria-invalid":!!r,...e})});j.displayName="FormControl";const v=s.forwardRef(({className:e,...t},r)=>{const{formDescriptionId:o}=d();return n.jsx("p",{ref:r,id:o,className:i("text-[0.8rem] text-muted-foreground",e),...t})});v.displayName="FormDescription";const N=s.forwardRef(({className:e,children:t,...r},o)=>{const{error:m,formMessageId:a}=d(),c=m?String(m?.message):t;return c?n.jsx("p",{ref:o,id:a,className:i("text-[0.8rem] font-medium text-destructive",e),...r,children:c}):null});N.displayName="FormMessage";export{R as F,N as a,S as b,C as c,g as d,j as e};
2
+ //# sourceMappingURL=form-Cl5Hk9bq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-DOdmIC3A.js","sources":["../../src/components/ui/form/hooks.ts","../../src/components/ui/form/form.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n\ttype FieldPath,\n\ttype FieldValues,\n\tuseFormContext,\n} from \"react-hook-form\";\n\ntype FormFieldContextValue<\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n\tname: TName;\n};\n\nexport const FormFieldContext = React.createContext<FormFieldContextValue>(\n\t{} as FormFieldContextValue,\n);\n\ntype FormItemContextValue = {\n\tid: string;\n};\n\nexport const FormItemContext = React.createContext<FormItemContextValue>(\n\t{} as FormItemContextValue,\n);\n\nexport const useFormField = () => {\n\tconst fieldContext = React.useContext(FormFieldContext);\n\tconst itemContext = React.useContext(FormItemContext);\n\tconst { getFieldState, formState } = useFormContext();\n\n\tconst fieldState = getFieldState(fieldContext.name, formState);\n\n\tif (!fieldContext) {\n\t\tthrow new Error(\"useFormField should be used within <FormField>\");\n\t}\n\n\tconst { id } = itemContext;\n\n\treturn {\n\t\tid,\n\t\tname: fieldContext.name,\n\t\tformItemId: `${id}-form-item`,\n\t\tformDescriptionId: `${id}-form-item-description`,\n\t\tformMessageId: `${id}-form-item-message`,\n\t\t...fieldState,\n\t};\n};\n","import type * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport {\n\tController,\n\ttype ControllerProps,\n\ttype FieldPath,\n\ttype FieldValues,\n\tFormProvider,\n} from \"react-hook-form\";\nimport { Label } from \"@/components/ui/label\";\nimport { cn } from \"@/utils\";\nimport { FormFieldContext, FormItemContext, useFormField } from \"./hooks\";\n\nconst Form = FormProvider;\n\nconst FormField = <\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n\t...props\n}: ControllerProps<TFieldValues, TName>) => {\n\treturn (\n\t\t<FormFieldContext.Provider value={{ name: props.name }}>\n\t\t\t<Controller {...props} />\n\t\t</FormFieldContext.Provider>\n\t);\n};\n\nconst FormItem = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n\tconst id = React.useId();\n\n\treturn (\n\t\t<FormItemContext.Provider value={{ id }}>\n\t\t\t<div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n\t\t</FormItemContext.Provider>\n\t);\n});\nFormItem.displayName = \"FormItem\";\n\ntype FormLabelProps = React.ComponentPropsWithoutRef<\n\ttypeof LabelPrimitive.Root\n> & {\n\tclassName?: string;\n};\n\nconst FormLabel = React.forwardRef<\n\tReact.ElementRef<typeof LabelPrimitive.Root>,\n\tFormLabelProps\n>(({ className, ...props }, ref) => {\n\tconst { error, formItemId } = useFormField();\n\n\treturn (\n\t\t<Label\n\t\t\tref={ref}\n\t\t\tclassName={cn(error && \"text-destructive\", className)}\n\t\t\thtmlFor={formItemId}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<\n\tReact.ElementRef<typeof Slot>,\n\tReact.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n\tconst { error, formItemId, formDescriptionId, formMessageId } =\n\t\tuseFormField();\n\n\treturn (\n\t\t<Slot\n\t\t\tref={ref}\n\t\t\tid={formItemId}\n\t\t\taria-describedby={\n\t\t\t\t!error\n\t\t\t\t\t? `${formDescriptionId}`\n\t\t\t\t\t: `${formDescriptionId} ${formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={!!error}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n\tconst { formDescriptionId } = useFormField();\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formDescriptionId}\n\t\t\tclassName={cn(\"text-[0.8rem] text-muted-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n\tconst { error, formMessageId } = useFormField();\n\tconst body = error ? String(error?.message) : children;\n\n\tif (!body) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formMessageId}\n\t\t\tclassName={cn(\"text-[0.8rem] font-medium text-destructive\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{body}\n\t\t</p>\n\t);\n});\nFormMessage.displayName = \"FormMessage\";\n\nexport {\n\tForm,\n\tFormItem,\n\tFormLabel,\n\tFormControl,\n\tFormDescription,\n\tFormMessage,\n\tFormField,\n};\n"],"names":["FormFieldContext","React.createContext","FormItemContext","useFormField","fieldContext","React.useContext","itemContext","getFieldState","formState","useFormContext","fieldState","id","Form","FormProvider","FormField","props","jsx","Controller","FormItem","React.forwardRef","className","ref","React.useId","cn","FormLabel","error","formItemId","Label","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","children","body"],"mappings":"qNAcO,MAAMA,EAAmBC,EAAAA,cAC/B,CAAA,CACD,EAMaC,EAAkBD,EAAAA,cAC9B,CAAA,CACD,EAEaE,EAAe,IAAM,CACjC,MAAMC,EAAeC,EAAAA,WAAiBL,CAAgB,EAChDM,EAAcD,EAAAA,WAAiBH,CAAe,EAC9C,CAAE,cAAAK,EAAe,UAAAC,CAAA,EAAcC,EAAA,EAE/BC,EAAaH,EAAcH,EAAa,KAAMI,CAAS,EAE7D,GAAI,CAACJ,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGjE,KAAM,CAAE,GAAAO,GAAOL,EAEf,MAAO,CACN,GAAAK,EACA,KAAMP,EAAa,KACnB,WAAY,GAAGO,CAAE,aACjB,kBAAmB,GAAGA,CAAE,yBACxB,cAAe,GAAGA,CAAE,qBACpB,GAAGD,CAAA,CAEL,ECjCME,EAAOC,EAEPC,EAAY,CAGhB,CACD,GAAGC,CACJ,IAEEC,EAAAA,IAAChB,EAAiB,SAAjB,CAA0B,MAAO,CAAE,KAAMe,EAAM,IAAA,EAC/C,SAAAC,EAAAA,IAACC,EAAA,CAAY,GAAGF,EAAO,EACxB,EAIIG,EAAWC,EAAAA,WAGf,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,MAAMV,EAAKW,EAAAA,MAAM,EAEjB,aACEpB,EAAgB,SAAhB,CAAyB,MAAO,CAAE,GAAAS,GAClC,SAAAK,EAAAA,IAAC,MAAA,CAAI,IAAAK,EAAU,UAAWE,EAAG,YAAaH,CAAS,EAAI,GAAGL,EAAO,EAClE,CAEF,CAAC,EACDG,EAAS,YAAc,WAQvB,MAAMM,EAAYL,EAAAA,WAGhB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,MAAAI,EAAO,WAAAC,CAAA,EAAevB,EAAA,EAE9B,OACCa,EAAAA,IAACW,EAAA,CACA,IAAAN,EACA,UAAWE,EAAGE,GAAS,mBAAoBL,CAAS,EACpD,QAASM,EACR,GAAGX,CAAA,CAAA,CAGP,CAAC,EACDS,EAAU,YAAc,YAExB,MAAMI,EAAcT,EAAAA,WAGlB,CAAC,CAAE,GAAGJ,CAAA,EAASM,IAAQ,CACxB,KAAM,CAAE,MAAAI,EAAO,WAAAC,EAAY,kBAAAG,EAAmB,cAAAC,CAAA,EAC7C3B,EAAA,EAED,OACCa,EAAAA,IAACe,EAAA,CACA,IAAAV,EACA,GAAIK,EACJ,mBACED,EAEE,GAAGI,CAAiB,IAAIC,CAAa,GADrC,GAAGD,CAAiB,GAGxB,eAAc,CAAC,CAACJ,EACf,GAAGV,CAAA,CAAA,CAGP,CAAC,EACDa,EAAY,YAAc,cAE1B,MAAMI,EAAkBb,EAAAA,WAGtB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,kBAAAQ,CAAA,EAAsB1B,EAAA,EAE9B,OACCa,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIQ,EACJ,UAAWN,EAAG,sCAAuCH,CAAS,EAC7D,GAAGL,CAAA,CAAA,CAGP,CAAC,EACDiB,EAAgB,YAAc,kBAE9B,MAAMC,EAAcd,EAAAA,WAGlB,CAAC,CAAE,UAAAC,EAAW,SAAAc,EAAU,GAAGnB,CAAA,EAASM,IAAQ,CAC7C,KAAM,CAAE,MAAAI,EAAO,cAAAK,CAAA,EAAkB3B,EAAA,EAC3BgC,EAAOV,EAAQ,OAAOA,GAAO,OAAO,EAAIS,EAE9C,OAAKC,EAKJnB,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIS,EACJ,UAAWP,EAAG,6CAA8CH,CAAS,EACpE,GAAGL,EAEH,SAAAoB,CAAA,CAAA,EAVK,IAaT,CAAC,EACDF,EAAY,YAAc"}
1
+ {"version":3,"file":"form-Cl5Hk9bq.js","sources":["../../src/components/ui/form/hooks.ts","../../src/components/ui/form/form.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n\ttype FieldPath,\n\ttype FieldValues,\n\tuseFormContext,\n} from \"react-hook-form\";\n\ntype FormFieldContextValue<\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n\tname: TName;\n};\n\nexport const FormFieldContext = React.createContext<FormFieldContextValue>(\n\t{} as FormFieldContextValue,\n);\n\ntype FormItemContextValue = {\n\tid: string;\n};\n\nexport const FormItemContext = React.createContext<FormItemContextValue>(\n\t{} as FormItemContextValue,\n);\n\nexport const useFormField = () => {\n\tconst fieldContext = React.useContext(FormFieldContext);\n\tconst itemContext = React.useContext(FormItemContext);\n\tconst { getFieldState, formState } = useFormContext();\n\n\tconst fieldState = getFieldState(fieldContext.name, formState);\n\n\tif (!fieldContext) {\n\t\tthrow new Error(\"useFormField should be used within <FormField>\");\n\t}\n\n\tconst { id } = itemContext;\n\n\treturn {\n\t\tid,\n\t\tname: fieldContext.name,\n\t\tformItemId: `${id}-form-item`,\n\t\tformDescriptionId: `${id}-form-item-description`,\n\t\tformMessageId: `${id}-form-item-message`,\n\t\t...fieldState,\n\t};\n};\n","import type * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport {\n\tController,\n\ttype ControllerProps,\n\ttype FieldPath,\n\ttype FieldValues,\n\tFormProvider,\n} from \"react-hook-form\";\nimport { Label } from \"@/components/ui/label\";\nimport { cn } from \"@/utils\";\nimport { FormFieldContext, FormItemContext, useFormField } from \"./hooks\";\n\nconst Form = FormProvider;\n\nconst FormField = <\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n\t...props\n}: ControllerProps<TFieldValues, TName>) => {\n\treturn (\n\t\t<FormFieldContext.Provider value={{ name: props.name }}>\n\t\t\t<Controller {...props} />\n\t\t</FormFieldContext.Provider>\n\t);\n};\n\nconst FormItem = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n\tconst id = React.useId();\n\n\treturn (\n\t\t<FormItemContext.Provider value={{ id }}>\n\t\t\t<div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n\t\t</FormItemContext.Provider>\n\t);\n});\nFormItem.displayName = \"FormItem\";\n\ntype FormLabelProps = React.ComponentPropsWithoutRef<\n\ttypeof LabelPrimitive.Root\n> & {\n\tclassName?: string;\n};\n\nconst FormLabel = React.forwardRef<\n\tReact.ElementRef<typeof LabelPrimitive.Root>,\n\tFormLabelProps\n>(({ className, ...props }, ref) => {\n\tconst { error, formItemId } = useFormField();\n\n\treturn (\n\t\t<Label\n\t\t\tref={ref}\n\t\t\tclassName={cn(error && \"text-destructive\", className)}\n\t\t\thtmlFor={formItemId}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<\n\tReact.ElementRef<typeof Slot>,\n\tReact.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n\tconst { error, formItemId, formDescriptionId, formMessageId } =\n\t\tuseFormField();\n\n\treturn (\n\t\t<Slot\n\t\t\tref={ref}\n\t\t\tid={formItemId}\n\t\t\taria-describedby={\n\t\t\t\t!error\n\t\t\t\t\t? `${formDescriptionId}`\n\t\t\t\t\t: `${formDescriptionId} ${formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={!!error}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n\tconst { formDescriptionId } = useFormField();\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formDescriptionId}\n\t\t\tclassName={cn(\"text-[0.8rem] text-muted-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<\n\tHTMLParagraphElement,\n\tReact.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n\tconst { error, formMessageId } = useFormField();\n\tconst body = error ? String(error?.message) : children;\n\n\tif (!body) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tid={formMessageId}\n\t\t\tclassName={cn(\"text-[0.8rem] font-medium text-destructive\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{body}\n\t\t</p>\n\t);\n});\nFormMessage.displayName = \"FormMessage\";\n\nexport {\n\tForm,\n\tFormItem,\n\tFormLabel,\n\tFormControl,\n\tFormDescription,\n\tFormMessage,\n\tFormField,\n};\n"],"names":["FormFieldContext","React.createContext","FormItemContext","useFormField","fieldContext","React.useContext","itemContext","getFieldState","formState","useFormContext","fieldState","id","Form","FormProvider","FormField","props","jsx","Controller","FormItem","React.forwardRef","className","ref","React.useId","cn","FormLabel","error","formItemId","Label","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","children","body"],"mappings":"qNAcO,MAAMA,EAAmBC,EAAAA,cAC/B,CAAA,CACD,EAMaC,EAAkBD,EAAAA,cAC9B,CAAA,CACD,EAEaE,EAAe,IAAM,CACjC,MAAMC,EAAeC,EAAAA,WAAiBL,CAAgB,EAChDM,EAAcD,EAAAA,WAAiBH,CAAe,EAC9C,CAAE,cAAAK,EAAe,UAAAC,CAAA,EAAcC,EAAA,EAE/BC,EAAaH,EAAcH,EAAa,KAAMI,CAAS,EAE7D,GAAI,CAACJ,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGjE,KAAM,CAAE,GAAAO,GAAOL,EAEf,MAAO,CACN,GAAAK,EACA,KAAMP,EAAa,KACnB,WAAY,GAAGO,CAAE,aACjB,kBAAmB,GAAGA,CAAE,yBACxB,cAAe,GAAGA,CAAE,qBACpB,GAAGD,CAAA,CAEL,ECjCME,EAAOC,EAEPC,EAAY,CAGhB,CACD,GAAGC,CACJ,IAEEC,EAAAA,IAAChB,EAAiB,SAAjB,CAA0B,MAAO,CAAE,KAAMe,EAAM,IAAA,EAC/C,SAAAC,EAAAA,IAACC,EAAA,CAAY,GAAGF,EAAO,EACxB,EAIIG,EAAWC,EAAAA,WAGf,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,MAAMV,EAAKW,EAAAA,MAAM,EAEjB,aACEpB,EAAgB,SAAhB,CAAyB,MAAO,CAAE,GAAAS,GAClC,SAAAK,EAAAA,IAAC,MAAA,CAAI,IAAAK,EAAU,UAAWE,EAAG,YAAaH,CAAS,EAAI,GAAGL,EAAO,EAClE,CAEF,CAAC,EACDG,EAAS,YAAc,WAQvB,MAAMM,EAAYL,EAAAA,WAGhB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,MAAAI,EAAO,WAAAC,CAAA,EAAevB,EAAA,EAE9B,OACCa,EAAAA,IAACW,EAAA,CACA,IAAAN,EACA,UAAWE,EAAGE,GAAS,mBAAoBL,CAAS,EACpD,QAASM,EACR,GAAGX,CAAA,CAAA,CAGP,CAAC,EACDS,EAAU,YAAc,YAExB,MAAMI,EAAcT,EAAAA,WAGlB,CAAC,CAAE,GAAGJ,CAAA,EAASM,IAAQ,CACxB,KAAM,CAAE,MAAAI,EAAO,WAAAC,EAAY,kBAAAG,EAAmB,cAAAC,CAAA,EAC7C3B,EAAA,EAED,OACCa,EAAAA,IAACe,EAAA,CACA,IAAAV,EACA,GAAIK,EACJ,mBACED,EAEE,GAAGI,CAAiB,IAAIC,CAAa,GADrC,GAAGD,CAAiB,GAGxB,eAAc,CAAC,CAACJ,EACf,GAAGV,CAAA,CAAA,CAGP,CAAC,EACDa,EAAY,YAAc,cAE1B,MAAMI,EAAkBb,EAAAA,WAGtB,CAAC,CAAE,UAAAC,EAAW,GAAGL,CAAA,EAASM,IAAQ,CACnC,KAAM,CAAE,kBAAAQ,CAAA,EAAsB1B,EAAA,EAE9B,OACCa,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIQ,EACJ,UAAWN,EAAG,sCAAuCH,CAAS,EAC7D,GAAGL,CAAA,CAAA,CAGP,CAAC,EACDiB,EAAgB,YAAc,kBAE9B,MAAMC,EAAcd,EAAAA,WAGlB,CAAC,CAAE,UAAAC,EAAW,SAAAc,EAAU,GAAGnB,CAAA,EAASM,IAAQ,CAC7C,KAAM,CAAE,MAAAI,EAAO,cAAAK,CAAA,EAAkB3B,EAAA,EAC3BgC,EAAOV,EAAQ,OAAOA,GAAO,OAAO,EAAIS,EAE9C,OAAKC,EAKJnB,EAAAA,IAAC,IAAA,CACA,IAAAK,EACA,GAAIS,EACJ,UAAWP,EAAG,6CAA8CH,CAAS,EACpE,GAAGL,EAEH,SAAAoB,CAAA,CAAA,EAVK,IAaT,CAAC,EACDF,EAAY,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as s,L as e}from"./vendor-tanstack-BdLtprmr.js";import{B as a,g as r,h as o,q as i,I as t}from"./index-V_xTKaEb.js";const n=()=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(o,{className:"text-xl font-semibold",children:"Work pools"})})}),s.jsx(e,{to:"/work-pools/create",children:s.jsx(i,{size:"icon",className:"size-7",variant:"outline",children:s.jsx(t,{id:"Plus",className:"size-4"})})})]});export{n as W};
2
- //# sourceMappingURL=header-DcIuN5UN.js.map
1
+ import{j as s,L as e}from"./vendor-tanstack-BdLtprmr.js";import{B as a,g as r,h as o,q as i,I as t}from"./index-CPpeVt8m.js";const n=()=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(o,{className:"text-xl font-semibold",children:"Work pools"})})}),s.jsx(e,{to:"/work-pools/create",children:s.jsx(i,{size:"icon",className:"size-7",variant:"outline",children:s.jsx(t,{id:"Plus",className:"size-4"})})})]});export{n as W};
2
+ //# sourceMappingURL=header-BuI436ik.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"header-DcIuN5UN.js","sources":["../../src/components/work-pools/header.tsx"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const WorkPoolsPageHeader = () => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\tWork pools\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t\t<Link to=\"/work-pools/create\">\n\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</Link>\n\t</div>\n);\n"],"names":["WorkPoolsPageHeader","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Link","Button","Icon"],"mappings":"6HASO,MAAMA,EAAsB,IAClCC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,YAAA,CAElD,CAAA,CACD,EACD,QACCC,EAAA,CAAK,GAAG,qBACR,SAAAJ,EAAAA,IAACK,EAAA,CAAO,KAAK,OAAO,UAAU,SAAS,QAAQ,UAC9C,eAACC,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,EACpC,CAAA,CACD,CAAA,CAAA,CACD"}
1
+ {"version":3,"file":"header-BuI436ik.js","sources":["../../src/components/work-pools/header.tsx"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const WorkPoolsPageHeader = () => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\tWork pools\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t\t<Link to=\"/work-pools/create\">\n\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</Link>\n\t</div>\n);\n"],"names":["WorkPoolsPageHeader","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Link","Button","Icon"],"mappings":"6HASO,MAAMA,EAAsB,IAClCC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,YAAA,CAElD,CAAA,CACD,EACD,QACCC,EAAA,CAAK,GAAG,qBACR,SAAAJ,EAAAA,IAACK,EAAA,CAAO,KAAK,OAAO,UAAU,SAAS,QAAQ,UAC9C,eAACC,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,EACpC,CAAA,CACD,CAAA,CAAA,CACD"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-tanstack-BdLtprmr.js";import{B as s,g as r,h as t}from"./index-V_xTKaEb.js";const c=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(s,{children:e.jsx(r,{children:e.jsx(t,{className:"text-xl font-semibold",children:"Deployments"})})})});export{c as D};
2
- //# sourceMappingURL=header-CnBwASd-.js.map
1
+ import{j as e}from"./vendor-tanstack-BdLtprmr.js";import{B as s,g as r,h as t}from"./index-CPpeVt8m.js";const c=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(s,{children:e.jsx(r,{children:e.jsx(t,{className:"text-xl font-semibold",children:"Deployments"})})})});export{c as D};
2
+ //# sourceMappingURL=header-DcAQCxQl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"header-CnBwASd-.js","sources":["../../src/components/deployments/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const DeploymentsPageHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tDeployments\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n"],"names":["DeploymentsPageHeader","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem"],"mappings":"wGAMO,MAAMA,EAAwB,IAEnCC,MAAC,MAAA,CAAI,UAAU,0BACd,eAACC,EAAA,CACA,SAAAD,MAACE,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,aAAA,CAElD,EACD,EACD,CAAA,CACD"}
1
+ {"version":3,"file":"header-DcAQCxQl.js","sources":["../../src/components/deployments/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const DeploymentsPageHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tDeployments\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n"],"names":["DeploymentsPageHeader","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem"],"mappings":"wGAMO,MAAMA,EAAwB,IAEnCC,MAAC,MAAA,CAAI,UAAU,0BACd,eAACC,EAAA,CACA,SAAAD,MAACE,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,aAAA,CAElD,EACD,EACD,CAAA,CACD"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./vendor-tanstack-BdLtprmr.js";import{B as a,g as r,h as i,q as t,I as c}from"./index-V_xTKaEb.js";const n=({onAddVariableClick:e})=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(i,{className:"text-xl font-semibold",children:"Variables"})})}),e&&s.jsx(t,{size:"icon",className:"size-7",variant:"outline",onClick:()=>e(),children:s.jsx(c,{id:"Plus",className:"size-4"})})]});export{n as V};
2
- //# sourceMappingURL=header-DxE-NzAK.js.map
1
+ import{j as s}from"./vendor-tanstack-BdLtprmr.js";import{B as a,g as r,h as i,q as t,I as c}from"./index-CPpeVt8m.js";const n=({onAddVariableClick:e})=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(i,{className:"text-xl font-semibold",children:"Variables"})})}),e&&s.jsx(t,{size:"icon",className:"size-7",variant:"outline",onClick:()=>e(),children:s.jsx(c,{id:"Plus",className:"size-4"})})]});export{n as V};
2
+ //# sourceMappingURL=header-qlcK4NLD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"header-DxE-NzAK.js","sources":["../../src/components/variables/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype VariablesPageHeaderProps = {\n\tonAddVariableClick?: () => void;\n};\n\nexport const VariablesPageHeader = ({\n\tonAddVariableClick,\n}: VariablesPageHeaderProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tVariables\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t{onAddVariableClick && (\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"size-7\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onAddVariableClick()}\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["VariablesPageHeader","onAddVariableClick","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Button","Icon"],"mappings":"sHAYO,MAAMA,EAAsB,CAAC,CACnC,mBAAAC,CACD,IAEEC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,WAAA,CAElD,CAAA,CACD,EACD,EACCL,GACAE,EAAAA,IAACI,EAAA,CACA,KAAK,OACL,UAAU,SACV,QAAQ,UACR,QAAS,IAAMN,EAAA,EAEf,SAAAE,EAAAA,IAACK,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,EAEF"}
1
+ {"version":3,"file":"header-qlcK4NLD.js","sources":["../../src/components/variables/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype VariablesPageHeaderProps = {\n\tonAddVariableClick?: () => void;\n};\n\nexport const VariablesPageHeader = ({\n\tonAddVariableClick,\n}: VariablesPageHeaderProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tVariables\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t{onAddVariableClick && (\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"size-7\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onAddVariableClick()}\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["VariablesPageHeader","onAddVariableClick","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Button","Icon"],"mappings":"sHAYO,MAAMA,EAAsB,CAAC,CACnC,mBAAAC,CACD,IAEEC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,WAAA,CAElD,CAAA,CACD,EACD,EACCL,GACAE,EAAAA,IAACI,EAAA,CACA,KAAK,OACL,UAAU,SACV,QAAQ,UACR,QAAS,IAAMN,EAAA,EAEf,SAAAE,EAAAA,IAACK,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,EAEF"}
@@ -0,0 +1,2 @@
1
+ import{r as c,j as e,E as h}from"./vendor-tanstack-BdLtprmr.js";import{U as j,V as b,S as v,a as S,b as A,c as C,e as N,I as x,B as E,g as T,h as k,D as y,E as I,t as D,v as M,w as V,x as w,ax as L,bw as p,bx as B,by as R}from"./index-CPpeVt8m.js";import{A as _}from"./artifact-card-BnPKAfkY.js";import{T as G,a as f}from"./toggle-group-EMgSOoYH.js";import{u as Q}from"./use-debounce-callback-Dk7Ebi48.js";import"./vendor-react-HBv6Kpyp.js";import"./vendor-radix-CJc458uP.js";import"./vendor-recharts-CY3PKigC.js";import"./vendor-forms-BlFSCfFw.js";import"./vendor-date-Cl1Jav-N.js";import"./lazy-markdown-D_y73qoD.js";const F=[{value:"all",label:"All Types"},{value:"markdown",label:"Markdown"},{value:"progress",label:"Progress"},{value:"image",label:"Image"},{value:"table",label:"Table"}],P=({filters:t,onFilterChange:s,totalCount:l,displayMode:d,setDisplayMode:i})=>{const r=c.useCallback(a=>{s([...t.filter(u=>u.id!=="name"),{id:"name",label:"Name",value:a}])},[t,s]),o=c.useCallback(a=>{s([...t.filter(u=>u.id!=="type"),{id:"type",label:"Type",value:a}])},[t,s]),m=c.useMemo(()=>t.find(a=>a.id==="type")?.value,[t]),n=c.useMemo(()=>t.find(a=>a.id==="name")?.value,[t]);return e.jsxs("div",{"data-testid":"artifact-filter",className:"flex justify-between items-center",children:[e.jsx("div",{children:e.jsxs("p",{className:"text-base text-sm text-muted-foreground",children:[l," ",j(l,"artifact")]})}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx(b,{"data-testid":"search-input",defaultValue:n,placeholder:"Search artifacts",onChange:a=>r(a.target.value)}),e.jsxs("div",{className:"flex gap-4",children:[e.jsxs(v,{"data-testid":"type-select",value:m,onValueChange:o,children:[e.jsx(S,{"aria-label":"Artifact type",children:e.jsx(A,{placeholder:"Type"})}),e.jsx(C,{children:F.map(({value:a,label:u})=>e.jsx(N,{value:a,children:u},a))})]}),e.jsx("div",{children:e.jsxs(G,{type:"single",defaultValue:d,onValueChange:a=>i(a),children:[e.jsx(f,{"data-testid":"grid-layout",value:"grid",children:e.jsx(x,{id:"LayoutGrid"})}),e.jsx(f,{"data-testid":"list-layout",value:"list",children:e.jsx(x,{id:"AlignJustify"})})]})})]})]})]})},q=()=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(E,{children:e.jsx(T,{children:e.jsx(k,{className:"text-xl font-semibold",children:"Artifacts"})})})}),e.jsx(y,{id:"artifacts-guide",label:"Documentation"})]}),z=()=>e.jsxs(I,{children:[e.jsx("div",{className:"flex items-center gap-3",children:e.jsx(D,{id:"Image"})}),e.jsx(M,{children:"Create an artifact to get started"}),e.jsx(V,{children:"Artifacts are byproducts of your runs; they can be anything from a markdown string to a table."}),e.jsx(w,{children:e.jsx(y,{id:"artifacts-guide"})})]}),H=({filters:t,onFilterChange:s,artifactsList:l,artifactsCount:d})=>{const[i,r]=L("artifacts-grid-style","grid"),o=c.useMemo(()=>i==="grid"?"grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4":"grid-cols-1",[i]),m=c.useMemo(()=>l.reduce((n,a)=>(n.find(u=>u.key===a.key)||n.push(a),n),[]),[l]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(q,{}),e.jsx(P,{filters:t,onFilterChange:s,totalCount:d,setDisplayMode:r,displayMode:i}),m.length===0?e.jsx(z,{}):e.jsx("div",{className:o,children:m.map(n=>e.jsx(_,{artifact:n},n.id))})]})},g=t=>({artifacts:{operator:"and_",type:{any_:t?.type&&t?.type!=="all"?[t.type]:void 0},key:{like_:t?.name??""}},sort:"CREATED_DESC",offset:0}),J=()=>{const t=p.useSearch(),s=p.useNavigate(),l=c.useMemo(()=>[{id:"type",label:"Type",value:t.type??"all"},{id:"name",label:"Name",value:t.name}],[t.type,t.name]),d=Q(c.useCallback(i=>{i&&s({to:".",search:()=>i.filter(r=>r.value).reduce((r,o)=>(o.value&&(r[o.id]=o.value),r),{}),replace:!0})},[s]),400);return{filters:l,onFilterChange:d}};function se(){const t=p.useSearch(),{filters:s,onFilterChange:l}=J(),[{data:d},{data:i}]=h({queries:[B(g(t)),R(g(t))]});return e.jsx(H,{filters:s,onFilterChange:l,artifactsCount:d,artifactsList:i})}export{se as component};
2
+ //# sourceMappingURL=index--Z69UYXV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index--Z69UYXV.js","sources":["../../src/components/artifacts/artifacts-filter.tsx","../../src/components/artifacts/artifacts-header.tsx","../../src/components/artifacts/empty-state.tsx","../../src/components/artifacts/artifacts-page.tsx","../../src/routes/artifacts/index.tsx?tsr-split=component"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { pluralize } from \"@/utils\";\nimport { Icon } from \"../ui/icons\";\nimport { ToggleGroup, ToggleGroupItem } from \"../ui/toggle-group\";\nimport type { filterType } from \"./types\";\n\ntype ArtifactsFilterProps = {\n\tfilters: filterType[];\n\tonFilterChange: (newFilters: filterType[]) => void;\n\ttotalCount: number;\n\tsetDisplayMode: (mode: string) => void;\n\tdisplayMode: string;\n};\n\nconst artifactTypeOptions = [\n\t{ value: \"all\", label: \"All Types\" },\n\t{ value: \"markdown\", label: \"Markdown\" },\n\t{ value: \"progress\", label: \"Progress\" },\n\t{ value: \"image\", label: \"Image\" },\n\t{ value: \"table\", label: \"Table\" },\n] as const;\n\nexport const ArtifactsFilterComponent = ({\n\tfilters,\n\tonFilterChange,\n\ttotalCount,\n\tdisplayMode,\n\tsetDisplayMode,\n}: ArtifactsFilterProps) => {\n\tconst changeArtifactName = useCallback(\n\t\t(value: string) => {\n\t\t\tonFilterChange([\n\t\t\t\t...filters.filter((filter) => filter.id !== \"name\"),\n\t\t\t\t{ id: \"name\", label: \"Name\", value },\n\t\t\t]);\n\t\t},\n\t\t[filters, onFilterChange],\n\t);\n\n\tconst changeArtifactType = useCallback(\n\t\t(value: string) => {\n\t\t\tonFilterChange([\n\t\t\t\t...filters.filter((filter) => filter.id !== \"type\"),\n\t\t\t\t{ id: \"type\", label: \"Type\", value },\n\t\t\t]);\n\t\t},\n\t\t[filters, onFilterChange],\n\t);\n\n\tconst typeValue = useMemo(\n\t\t() => filters.find((val) => val.id === \"type\")?.value,\n\t\t[filters],\n\t);\n\n\tconst nameValue = useMemo(\n\t\t() => filters.find((val) => val.id === \"name\")?.value,\n\t\t[filters],\n\t);\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"artifact-filter\"\n\t\t\tclassName=\"flex justify-between items-center\"\n\t\t>\n\t\t\t<div>\n\t\t\t\t<p className=\"text-base text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} {pluralize(totalCount, \"artifact\")}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t<SearchInput\n\t\t\t\t\tdata-testid=\"search-input\"\n\t\t\t\t\tdefaultValue={nameValue}\n\t\t\t\t\tplaceholder=\"Search artifacts\"\n\t\t\t\t\tonChange={(e) => changeArtifactName(e.target.value)}\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<Select\n\t\t\t\t\t\tdata-testid=\"type-select\"\n\t\t\t\t\t\tvalue={typeValue}\n\t\t\t\t\t\tonValueChange={changeArtifactType}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Artifact type\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Type\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{artifactTypeOptions.map(({ value, label }) => (\n\t\t\t\t\t\t\t\t<SelectItem key={value} value={value}>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<ToggleGroup\n\t\t\t\t\t\t\ttype=\"single\"\n\t\t\t\t\t\t\tdefaultValue={displayMode}\n\t\t\t\t\t\t\tonValueChange={(value: string) => setDisplayMode(value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ToggleGroupItem data-testid=\"grid-layout\" value=\"grid\">\n\t\t\t\t\t\t\t\t<Icon id=\"LayoutGrid\" />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t\t<ToggleGroupItem data-testid=\"list-layout\" value=\"list\">\n\t\t\t\t\t\t\t\t<Icon id=\"AlignJustify\" />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t</ToggleGroup>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\n\nexport const ArtifactsHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tArtifacts\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\t\t\t</div>\n\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t</div>\n\t);\n};\n","import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const ArtifactsEmptyState = () => (\n\t<EmptyState>\n\t\t<div className=\"flex items-center gap-3\">\n\t\t\t<EmptyStateIcon id=\"Image\" />\n\t\t</div>\n\t\t<EmptyStateTitle>Create an artifact to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tArtifacts are byproducts of your runs; they can be anything from a\n\t\t\tmarkdown string to a table.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"artifacts-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useMemo } from \"react\";\nimport type { Artifact } from \"@/api/artifacts\";\nimport { useLocalStorage } from \"@/hooks/use-local-storage\";\nimport { ArtifactCard } from \"./artifact-card\";\nimport { ArtifactsFilterComponent } from \"./artifacts-filter\";\nimport { ArtifactsHeader } from \"./artifacts-header\";\nimport { ArtifactsEmptyState } from \"./empty-state\";\nimport type { filterType } from \"./types\";\n\nexport type ArtifactsPageProps = {\n\tfilters: filterType[];\n\tonFilterChange: (newFilters: filterType[]) => void;\n\tartifactsCount: number;\n\tartifactsList: Artifact[];\n};\n\nexport const ArtifactsPage = ({\n\tfilters,\n\tonFilterChange,\n\tartifactsList,\n\tartifactsCount,\n}: ArtifactsPageProps) => {\n\tconst [displayMode, setDisplayMode] = useLocalStorage<string>(\n\t\t\"artifacts-grid-style\",\n\t\t\"grid\",\n\t);\n\n\tconst gridClass = useMemo(() => {\n\t\treturn displayMode === \"grid\"\n\t\t\t? \"grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4\"\n\t\t\t: \"grid-cols-1\";\n\t}, [displayMode]);\n\n\tconst artifactsListFiltered = useMemo(\n\t\t() =>\n\t\t\t// reduced vs set to preserve sort order\n\t\t\tartifactsList.reduce((acc, artifact) => {\n\t\t\t\tif (!acc.find((a) => a.key === artifact.key)) {\n\t\t\t\t\tacc.push(artifact);\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t}, [] as Artifact[]),\n\t\t[artifactsList],\n\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ArtifactsHeader />\n\t\t\t<ArtifactsFilterComponent\n\t\t\t\tfilters={filters}\n\t\t\t\tonFilterChange={onFilterChange}\n\t\t\t\ttotalCount={artifactsCount}\n\t\t\t\tsetDisplayMode={setDisplayMode}\n\t\t\t\tdisplayMode={displayMode}\n\t\t\t/>\n\n\t\t\t{artifactsListFiltered.length === 0 ? (\n\t\t\t\t<ArtifactsEmptyState />\n\t\t\t) : (\n\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t{artifactsListFiltered.map((artifact) => (\n\t\t\t\t\t\t<ArtifactCard key={artifact.id} artifact={artifact} />\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype ArtifactsFilter,\n\tbuildCountArtifactsQuery,\n\tbuildListArtifactsQuery,\n} from \"@/api/artifacts\";\nimport { ArtifactsPage } from \"@/components/artifacts/artifacts-page\";\nimport type { filterType } from \"@/components/artifacts/types\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport useDebounceCallback from \"@/hooks/use-debounce-callback\";\n\n/**\n * Schema for validating URL search parameters for the artifacts page.\n * @property {number} page - The page number to display. Must be positive. Defaults to 1.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n */\nconst searchParams = z.object({\n\ttype: z.string().optional().catch(\"\"),\n\tname: z.string().optional().catch(\"\"),\n});\n\n/**\n * Builds filter parameters for artifacts query from search params\n *\n * @param search - Optional validated search parameters containing page and limit\n * @returns ArtifactsFilter with type and name\n *\n * @example\n * ```ts\n * const filter = buildFilterBody({ type: \"markdown\", name: \"my-dataset\" })\n * // Returns {\n * //\t\tartifacts: {\n * //\t\t\toperator: \"and_\",\n * //\t\t\ttype: { any_: [\"markdown\"] },\n * //\t\t\tkey: { like_: \"my-dataset\" }\n * //\t\t},\n * //\t\tsort: \"CREATED_DESC\",\n * //\t\toffset: 0\n * //}\n * ```\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\ttype: {\n\t\t\tany_: search?.type && search?.type !== \"all\" ? [search.type] : undefined, // Filter by artifact type\n\t\t},\n\t\tkey: {\n\t\t\tlike_: search?.name ?? \"\", // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: async ({ deps, context }) => {\n\t\tconst [artifactsCount, artifactsList] = await Promise.all([\n\t\t\tcontext.queryClient.ensureQueryData(buildCountArtifactsQuery(deps)),\n\t\t\tcontext.queryClient.ensureQueryData(buildListArtifactsQuery(deps)),\n\t\t]);\n\n\t\treturn { artifactsCount, artifactsList };\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\n});\n\nconst useFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst filters = useMemo(\n\t\t() => [\n\t\t\t{ id: \"type\", label: \"Type\", value: search.type ?? \"all\" },\n\t\t\t{ id: \"name\", label: \"Name\", value: search.name },\n\t\t],\n\t\t[search.type, search.name],\n\t);\n\n\tconst onFilterChange = useDebounceCallback(\n\t\tuseCallback(\n\t\t\t(newFilters: filterType[]) => {\n\t\t\t\tif (!newFilters) return;\n\t\t\t\tvoid navigate({\n\t\t\t\t\tto: \".\",\n\t\t\t\t\tsearch: () =>\n\t\t\t\t\t\tnewFilters\n\t\t\t\t\t\t\t.filter((filter) => filter.value)\n\t\t\t\t\t\t\t.reduce(\n\t\t\t\t\t\t\t\t(prev, curr) => {\n\t\t\t\t\t\t\t\t\tif (!curr.value) return prev;\n\t\t\t\t\t\t\t\t\tprev[curr.id] = curr.value;\n\t\t\t\t\t\t\t\t\treturn prev;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{} as Record<string, string>,\n\t\t\t\t\t\t\t),\n\t\t\t\t\treplace: true,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[navigate],\n\t\t),\n\t\t400,\n\t);\n\n\treturn { filters, onFilterChange };\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst { filters, onFilterChange } = useFilter();\n\n\tconst [{ data: artifactsCount }, { data: artifactsList }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildCountArtifactsQuery(buildFilterBody(search)),\n\t\t\t\tbuildListArtifactsQuery(buildFilterBody(search)),\n\t\t\t],\n\t\t});\n\n\treturn (\n\t\t<ArtifactsPage\n\t\t\tfilters={filters}\n\t\t\tonFilterChange={onFilterChange}\n\t\t\tartifactsCount={artifactsCount}\n\t\t\tartifactsList={artifactsList}\n\t\t/>\n\t);\n}\n"],"names":["artifactTypeOptions","ArtifactsFilterComponent","filters","onFilterChange","totalCount","displayMode","setDisplayMode","changeArtifactName","useCallback","value","filter","changeArtifactType","typeValue","useMemo","val","nameValue","jsxs","jsx","pluralize","SearchInput","e","Select","SelectTrigger","SelectValue","SelectContent","label","SelectItem","ToggleGroup","ToggleGroupItem","Icon","ArtifactsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","DocsLink","ArtifactsEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","ArtifactsPage","artifactsList","artifactsCount","useLocalStorage","gridClass","artifactsListFiltered","acc","artifact","a","ArtifactCard","buildFilterBody","search","artifacts","operator","type","any_","undefined","key","like_","name","sort","offset","useFilter","Route","useSearch","navigate","useNavigate","id","useDebounceCallback","newFilters","to","reduce","prev","curr","replace","RouteComponent","data","useSuspenseQueries","queries","buildCountArtifactsQuery","buildListArtifactsQuery"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,L as C,t as y,r as m,C as U,D as z,n as W,s as A}from"./vendor-tanstack-BdLtprmr.js";import{aQ as Y,aR as _,aS as B,aT as P,aU as Q,U as O,aV as q,aW as V,q as Z,I as L,y as H,ao as E,V as X,S as G,a as J,b as ee,c as ae,e as te,E as se,t as ne,v as le,w as oe,x as re,D as ie,B as ce,g as de,h as ue,aX as h,aY as F,aZ as D}from"./index-V_xTKaEb.js";import{D as me}from"./data-table-QSHqmTar.js";import{T as pe}from"./tags-input-2KSBvO_K.js";import{D as ge,a as fe,b as he,c as xe,d as R,e as we}from"./dropdown-menu-B9LKPlz7.js";import{Y as ye}from"./vendor-date-Cl1Jav-N.js";import{o as je,e as Se,a as _e,n as I,s as M}from"./vendor-forms-BlFSCfFw.js";import"./vendor-react-HBv6Kpyp.js";import"./vendor-radix-CJc458uP.js";import"./vendor-recharts-CY3PKigC.js";import"./table-ChOwO4Pk.js";const Ce=({row:t})=>t.original.id?e.jsxs("div",{className:"flex flex-col pl-4",children:[e.jsx(C,{to:"/flows/flow/$id",params:{id:t.original.id},className:"text-sm font-medium truncate",title:t.original.name,children:t.original.name}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["Created"," ",t.original?.created&&Y(t.original.created,"dateTime")]})]}):null,ve=({row:t})=>{const a=t.original.id,{data:n}=y({..._({flows:{operator:"and_",id:{any_:[a??""]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:1,sort:"START_TIME_DESC"}),enabled:!!a}),s=n?.[0];return!a||!s?null:e.jsxs("div",{className:"flex items-center gap-1",children:[s.state_type&&e.jsx(B,{type:s.state_type,name:s.state_name??void 0}),e.jsx(C,{to:"/runs/flow-run/$id",params:{id:s.id??""},children:e.jsx("span",{className:"text-sm text-blue-700 hover:underline",children:s.name})})]})},be=({row:t})=>{const a=t.original.id,{data:n}=y(P(a?[a]:[],{enabled:!!a})),s=a?n?.[a]:null;return!a||!s?null:e.jsxs("div",{className:"flex items-center gap-1",children:[s.state_type&&e.jsx(B,{type:s.state_type,name:s.state_name}),e.jsx(C,{to:"/runs/flow-run/$id",params:{id:s.id??""},children:e.jsx("span",{className:"text-sm text-blue-700 hover:underline",children:s.name})})]})},Ne=({row:t})=>{const a=t.original.id,{data:n}=y(Q(a?[a]:[],{enabled:!!a}));if(!a)return null;const s=n?.[a]??0;return s===0?e.jsx("span",{className:"text-sm text-muted-foreground",children:"None"}):e.jsx(C,{to:"/flows/flow/$id",params:{id:a},search:{tab:"deployments"},children:e.jsxs("span",{className:"text-sm text-blue-700 hover:underline",children:[s," ",O(s,"Deployment")]})})},De=({row:t})=>{const a=t.original.id,{deleteFlow:n}=V();return a?e.jsx("div",{className:"flex justify-end",children:e.jsxs(ge,{children:[e.jsx(fe,{asChild:!0,children:e.jsxs(Z,{variant:"ghost",className:"h-8 w-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(L,{id:"MoreVertical",className:"h-4 w-4"})]})}),e.jsxs(he,{align:"end",children:[e.jsx(xe,{children:"Actions"}),e.jsx(R,{onClick:()=>{navigator.clipboard.writeText(a),H.success("ID copied")},children:"Copy ID"}),e.jsx(we,{}),e.jsx(R,{onClick:()=>n(a),children:"Delete"}),e.jsx(R,{children:"Automate"})]})]})}):null},k=16,Re=({row:t})=>{const a=t.original.id,{startDate:n,endDate:s}=m.useMemo(()=>{const i=new Date;return{startDate:ye(i),endDate:i}},[]),{data:o}=y({..._({flows:{operator:"and_",id:{any_:[a??""]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:k,sort:"START_TIME_DESC"}),enabled:!!a});return a?e.jsx(q,{chartId:`flow-activity-${a}`,enrichedFlowRuns:o??[],startDate:n,endDate:s,numberOfBars:k,className:"h-[24px] w-[140px]"}):null},Te=[{id:"select",header:({table:t})=>e.jsx(E,{checked:t.getIsAllPageRowsSelected(),onCheckedChange:a=>t.toggleAllPageRowsSelected(!!a),"aria-label":"Select all"}),cell:({row:t})=>e.jsx(E,{checked:t.getIsSelected(),onCheckedChange:a=>t.toggleSelected(!!a),"aria-label":"Select row"}),enableSorting:!1,enableHiding:!1,maxSize:10},{accessorKey:"name",header:()=>e.jsx("div",{className:"pl-4",children:"Flow"}),cell:Ce},{accessorKey:"lastRuns",header:"Last Run",cell:ve},{accessorKey:"nextRuns",header:"Next Run",cell:be},{accessorKey:"deployments",header:"Deployments",cell:Ne},{accessorKey:"activity",header:"Activity",cell:Re},{id:"actions",cell:De}],Ae=[{label:"A to Z",value:"NAME_ASC"},{label:"Z to A",value:"NAME_DESC"},{label:"Created",value:"CREATED_DESC"}];function Ee({flows:t,count:a,pageCount:n,sort:s,pagination:o,onPaginationChange:i,onSortChange:g,columnFilters:c,onColumnFiltersChange:r,onPrefetchPage:x}){const{deleteFlow:w}=V(),[f,v]=m.useState({}),b=c.find(l=>l.id==="name")?.value??"",N=c.find(l=>l.id==="tags")?.value??[],j=m.useCallback(l=>{const u=c.filter(p=>p.id!=="name");r(l?[...u,{id:"name",value:l}]:u)},[r,c]),T=m.useCallback(l=>{const u=Array.isArray(l)?l:[],p=c.filter($=>$.id!=="tags");r(u.length?[...p,{id:"tags",value:u}]:p)},[r,c]),S=m.useCallback(l=>{let u=o;typeof l=="function"?u=l(o):u=l,i(u)},[o,i]),d=U({columns:Te,data:t,getCoreRowModel:z(),manualPagination:!0,pageCount:n,state:{rowSelection:f,pagination:o},onRowSelectionChange:v,onPaginationChange:S}),K=()=>{const u=Object.keys(f).map(p=>t[Number(p)].id);for(const p of u)w(p);d.toggleAllRowsSelected(!1)};return e.jsxs("div",{className:"h-full",children:[e.jsxs("div",{className:"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center",children:[e.jsx("div",{className:"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first",children:Object.keys(f).length>0?e.jsxs("p",{className:"text-sm text-muted-foreground flex items-center",children:[Object.keys(f).length," selected",e.jsx(L,{id:"Trash2",className:"ml-2 cursor-pointer h-4 w-4 inline",onClick:K})]}):e.jsxs("p",{className:"text-sm text-muted-foreground",children:[a," ",O(a,"Flow")]})}),e.jsx("div",{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",children:e.jsx(X,{placeholder:"Flow names",value:b,onChange:l=>j(l.target.value)})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-3",children:e.jsx(pe,{placeholder:"Filter by tags",onChange:T,value:N})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-2",children:e.jsxs(G,{value:s,onValueChange:g,children:[e.jsx(J,{"aria-label":"Flow sort order",className:"w-full",children:e.jsx(ee,{placeholder:"Sort by"})}),e.jsx(ae,{children:Ae.map(l=>e.jsx(te,{value:l.value,children:l.label},l.value))})]})})]}),e.jsx(me,{table:d,onPrefetchPage:x})]})}const Fe=()=>e.jsxs(se,{children:[e.jsx(ne,{id:"Workflow"}),e.jsx(le,{children:"Run a flow to get started"}),e.jsx(oe,{children:"Flows are Python functions that encapsulate workflow logic and allow users to interact with and reason about the state of their workflows."}),e.jsx(re,{children:e.jsx(ie,{id:"flows-guide"})})]}),Ie=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(ce,{children:e.jsx(de,{children:e.jsx(ue,{className:"text-xl font-semibold",children:"Flows"})})})});function Me({flows:t,count:a,totalCount:n,pageCount:s,sort:o,pagination:i,onPaginationChange:g,onSortChange:c,columnFilters:r,onColumnFiltersChange:x,onPrefetchPage:w}){return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Ie,{}),n===0?e.jsx(Fe,{}):e.jsx(Ee,{flows:t,count:a,pageCount:s,sort:o,pagination:i,onPaginationChange:g,onSortChange:c,columnFilters:r,onColumnFiltersChange:x,onPrefetchPage:w})]})}je({name:M().optional(),page:I().int().positive().optional().default(1).catch(1),limit:I().int().positive().max(100).optional().default(10).catch(10),tags:_e(M()).optional(),sort:Se(["CREATED_DESC","UPDATED_DESC","NAME_ASC","NAME_DESC"]).optional().default("NAME_ASC")}).optional().default({});const ke=t=>{const a=!!t?.name,n=!!t?.tags?.length;return!a&&!n?{page:t?.page??1,limit:t?.limit??10,sort:t?.sort??"NAME_ASC"}:{page:t?.page??1,limit:t?.limit??10,sort:t?.sort??"NAME_ASC",flows:{operator:"and_",...a&&{name:{like_:t?.name}},...n&&{tags:{operator:"and_",all_:t?.tags}}}}},Be=16,Pe=()=>{const t=h.useSearch(),a=h.useNavigate(),n=m.useMemo(()=>({pageIndex:(t.page??1)-1,pageSize:t.limit??10}),[t.page,t.limit]),s=m.useCallback(o=>{a({to:".",search:i=>({...i,page:o.pageIndex+1,limit:o.pageSize}),replace:!0})},[a]);return[n,s]},Qe=()=>{const t=h.useSearch(),a=h.useNavigate(),n=m.useCallback(s=>{a({to:".",search:o=>({...o,sort:s}),replace:!0})},[a]);return[t.sort,n]},Oe=()=>{const t=h.useSearch(),a=h.useNavigate(),n=m.useMemo(()=>[{id:"name",value:t.name},{id:"tags",value:t.tags}],[t.name,t.tags]),s=m.useCallback(o=>{a({to:".",search:i=>{const g=o.find(r=>r.id==="name")?.value,c=o.find(r=>r.id==="tags")?.value;return{...i,page:1,name:g,tags:c}},replace:!0})},[a]);return[n,s]};function Xe(){const t=h.useSearch(),a=W(),[n,s]=Pe(),[o,i]=Qe(),[g,c]=Oe(),r=ke(t),{data:x}=A(F({offset:0,sort:t.sort,flows:r.flows??void 0})),{data:w}=A(F({offset:0,sort:"NAME_ASC"})),{data:f}=y(D(r,3e4)),v=f?.results??[],b=m.useCallback(N=>{const j={...r,page:N};a.prefetchQuery(D(j,3e4)).then(()=>{const S=a.getQueryData(D(j,3e4).queryKey)?.results?.map(d=>d.id).filter(d=>!!d)??[];if(S.length!==0)for(const d of S)a.prefetchQuery(P([d])),a.prefetchQuery(Q([d])),a.prefetchQuery(_({flows:{operator:"and_",id:{any_:[d]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:1,sort:"START_TIME_DESC"})),a.prefetchQuery(_({flows:{operator:"and_",id:{any_:[d]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:Be,sort:"START_TIME_DESC"}))})},[a,r]);return e.jsx(Me,{flows:v,count:x??0,totalCount:w??0,pageCount:f?.pages??0,sort:o,pagination:n,onPaginationChange:s,onSortChange:i,columnFilters:g,onColumnFiltersChange:c,onPrefetchPage:b})}export{Xe as component};
2
- //# sourceMappingURL=index-D0R9_LIL.js.map
1
+ import{j as e,L as C,t as y,r as m,C as U,D as z,n as W,s as A}from"./vendor-tanstack-BdLtprmr.js";import{aP as Y,aQ as _,aR as B,aS as P,aT as Q,U as O,aU as q,aV as V,q as H,I as L,y as Z,ao as E,V as X,S as G,a as J,b as ee,c as ae,e as te,E as se,t as ne,v as le,w as oe,x as re,D as ie,B as ce,g as de,h as ue,aW as h,aX as F,aY as D}from"./index-CPpeVt8m.js";import{D as me}from"./data-table-bk-0xKWT.js";import{T as pe}from"./tags-input-DqZ8v99z.js";import{D as ge,a as fe,b as he,c as xe,d as R,e as we}from"./dropdown-menu-fRiq5bS-.js";import{Y as ye}from"./vendor-date-Cl1Jav-N.js";import{o as je,e as Se,a as _e,n as I,s as M}from"./vendor-forms-BlFSCfFw.js";import"./vendor-react-HBv6Kpyp.js";import"./vendor-radix-CJc458uP.js";import"./vendor-recharts-CY3PKigC.js";import"./table-Xyel2BEw.js";const Ce=({row:t})=>t.original.id?e.jsxs("div",{className:"flex flex-col pl-4",children:[e.jsx(C,{to:"/flows/flow/$id",params:{id:t.original.id},className:"text-sm font-medium truncate",title:t.original.name,children:t.original.name}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["Created"," ",t.original?.created&&Y(t.original.created,"dateTime")]})]}):null,ve=({row:t})=>{const a=t.original.id,{data:n}=y({..._({flows:{operator:"and_",id:{any_:[a??""]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:1,sort:"START_TIME_DESC"}),enabled:!!a}),s=n?.[0];return!a||!s?null:e.jsxs("div",{className:"flex items-center gap-1",children:[s.state_type&&e.jsx(B,{type:s.state_type,name:s.state_name??void 0}),e.jsx(C,{to:"/runs/flow-run/$id",params:{id:s.id??""},children:e.jsx("span",{className:"text-sm text-blue-700 hover:underline",children:s.name})})]})},be=({row:t})=>{const a=t.original.id,{data:n}=y(P(a?[a]:[],{enabled:!!a})),s=a?n?.[a]:null;return!a||!s?null:e.jsxs("div",{className:"flex items-center gap-1",children:[s.state_type&&e.jsx(B,{type:s.state_type,name:s.state_name}),e.jsx(C,{to:"/runs/flow-run/$id",params:{id:s.id??""},children:e.jsx("span",{className:"text-sm text-blue-700 hover:underline",children:s.name})})]})},Ne=({row:t})=>{const a=t.original.id,{data:n}=y(Q(a?[a]:[],{enabled:!!a}));if(!a)return null;const s=n?.[a]??0;return s===0?e.jsx("span",{className:"text-sm text-muted-foreground",children:"None"}):e.jsx(C,{to:"/flows/flow/$id",params:{id:a},search:{tab:"deployments"},children:e.jsxs("span",{className:"text-sm text-blue-700 hover:underline",children:[s," ",O(s,"Deployment")]})})},De=({row:t})=>{const a=t.original.id,{deleteFlow:n}=V();return a?e.jsx("div",{className:"flex justify-end",children:e.jsxs(ge,{children:[e.jsx(fe,{asChild:!0,children:e.jsxs(H,{variant:"ghost",className:"h-8 w-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(L,{id:"MoreVertical",className:"h-4 w-4"})]})}),e.jsxs(he,{align:"end",children:[e.jsx(xe,{children:"Actions"}),e.jsx(R,{onClick:()=>{navigator.clipboard.writeText(a),Z.success("ID copied")},children:"Copy ID"}),e.jsx(we,{}),e.jsx(R,{onClick:()=>n(a),children:"Delete"}),e.jsx(R,{children:"Automate"})]})]})}):null},k=16,Re=({row:t})=>{const a=t.original.id,{startDate:n,endDate:s}=m.useMemo(()=>{const i=new Date;return{startDate:ye(i),endDate:i}},[]),{data:o}=y({..._({flows:{operator:"and_",id:{any_:[a??""]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:k,sort:"START_TIME_DESC"}),enabled:!!a});return a?e.jsx(q,{chartId:`flow-activity-${a}`,enrichedFlowRuns:o??[],startDate:n,endDate:s,numberOfBars:k,className:"h-[24px] w-[140px]"}):null},Te=[{id:"select",header:({table:t})=>e.jsx(E,{checked:t.getIsAllPageRowsSelected(),onCheckedChange:a=>t.toggleAllPageRowsSelected(!!a),"aria-label":"Select all"}),cell:({row:t})=>e.jsx(E,{checked:t.getIsSelected(),onCheckedChange:a=>t.toggleSelected(!!a),"aria-label":"Select row"}),enableSorting:!1,enableHiding:!1,maxSize:10},{accessorKey:"name",header:()=>e.jsx("div",{className:"pl-4",children:"Flow"}),cell:Ce},{accessorKey:"lastRuns",header:"Last Run",cell:ve},{accessorKey:"nextRuns",header:"Next Run",cell:be},{accessorKey:"deployments",header:"Deployments",cell:Ne},{accessorKey:"activity",header:"Activity",cell:Re},{id:"actions",cell:De}],Ae=[{label:"A to Z",value:"NAME_ASC"},{label:"Z to A",value:"NAME_DESC"},{label:"Created",value:"CREATED_DESC"}];function Ee({flows:t,count:a,pageCount:n,sort:s,pagination:o,onPaginationChange:i,onSortChange:g,columnFilters:c,onColumnFiltersChange:r,onPrefetchPage:x}){const{deleteFlow:w}=V(),[f,v]=m.useState({}),b=c.find(l=>l.id==="name")?.value??"",N=c.find(l=>l.id==="tags")?.value??[],j=m.useCallback(l=>{const u=c.filter(p=>p.id!=="name");r(l?[...u,{id:"name",value:l}]:u)},[r,c]),T=m.useCallback(l=>{const u=Array.isArray(l)?l:[],p=c.filter($=>$.id!=="tags");r(u.length?[...p,{id:"tags",value:u}]:p)},[r,c]),S=m.useCallback(l=>{let u=o;typeof l=="function"?u=l(o):u=l,i(u)},[o,i]),d=U({columns:Te,data:t,getCoreRowModel:z(),manualPagination:!0,pageCount:n,state:{rowSelection:f,pagination:o},onRowSelectionChange:v,onPaginationChange:S}),K=()=>{const u=Object.keys(f).map(p=>t[Number(p)].id);for(const p of u)w(p);d.toggleAllRowsSelected(!1)};return e.jsxs("div",{className:"h-full",children:[e.jsxs("div",{className:"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center",children:[e.jsx("div",{className:"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first",children:Object.keys(f).length>0?e.jsxs("p",{className:"text-sm text-muted-foreground flex items-center",children:[Object.keys(f).length," selected",e.jsx(L,{id:"Trash2",className:"ml-2 cursor-pointer h-4 w-4 inline",onClick:K})]}):e.jsxs("p",{className:"text-sm text-muted-foreground",children:[a," ",O(a,"Flow")]})}),e.jsx("div",{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",children:e.jsx(X,{placeholder:"Flow names",value:b,onChange:l=>j(l.target.value)})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-3",children:e.jsx(pe,{placeholder:"Filter by tags",onChange:T,value:N})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-2",children:e.jsxs(G,{value:s,onValueChange:g,children:[e.jsx(J,{"aria-label":"Flow sort order",className:"w-full",children:e.jsx(ee,{placeholder:"Sort by"})}),e.jsx(ae,{children:Ae.map(l=>e.jsx(te,{value:l.value,children:l.label},l.value))})]})})]}),e.jsx(me,{table:d,onPrefetchPage:x})]})}const Fe=()=>e.jsxs(se,{children:[e.jsx(ne,{id:"Workflow"}),e.jsx(le,{children:"Run a flow to get started"}),e.jsx(oe,{children:"Flows are Python functions that encapsulate workflow logic and allow users to interact with and reason about the state of their workflows."}),e.jsx(re,{children:e.jsx(ie,{id:"flows-guide"})})]}),Ie=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(ce,{children:e.jsx(de,{children:e.jsx(ue,{className:"text-xl font-semibold",children:"Flows"})})})});function Me({flows:t,count:a,totalCount:n,pageCount:s,sort:o,pagination:i,onPaginationChange:g,onSortChange:c,columnFilters:r,onColumnFiltersChange:x,onPrefetchPage:w}){return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Ie,{}),n===0?e.jsx(Fe,{}):e.jsx(Ee,{flows:t,count:a,pageCount:s,sort:o,pagination:i,onPaginationChange:g,onSortChange:c,columnFilters:r,onColumnFiltersChange:x,onPrefetchPage:w})]})}je({name:M().optional(),page:I().int().positive().optional().default(1).catch(1),limit:I().int().positive().max(100).optional().default(10).catch(10),tags:_e(M()).optional(),sort:Se(["CREATED_DESC","UPDATED_DESC","NAME_ASC","NAME_DESC"]).optional().default("NAME_ASC")}).optional().default({});const ke=t=>{const a=!!t?.name,n=!!t?.tags?.length;return!a&&!n?{page:t?.page??1,limit:t?.limit??10,sort:t?.sort??"NAME_ASC"}:{page:t?.page??1,limit:t?.limit??10,sort:t?.sort??"NAME_ASC",flows:{operator:"and_",...a&&{name:{like_:t?.name}},...n&&{tags:{operator:"and_",all_:t?.tags}}}}},Be=16,Pe=()=>{const t=h.useSearch(),a=h.useNavigate(),n=m.useMemo(()=>({pageIndex:(t.page??1)-1,pageSize:t.limit??10}),[t.page,t.limit]),s=m.useCallback(o=>{a({to:".",search:i=>({...i,page:o.pageIndex+1,limit:o.pageSize}),replace:!0})},[a]);return[n,s]},Qe=()=>{const t=h.useSearch(),a=h.useNavigate(),n=m.useCallback(s=>{a({to:".",search:o=>({...o,sort:s}),replace:!0})},[a]);return[t.sort,n]},Oe=()=>{const t=h.useSearch(),a=h.useNavigate(),n=m.useMemo(()=>[{id:"name",value:t.name},{id:"tags",value:t.tags}],[t.name,t.tags]),s=m.useCallback(o=>{a({to:".",search:i=>{const g=o.find(r=>r.id==="name")?.value,c=o.find(r=>r.id==="tags")?.value;return{...i,page:1,name:g,tags:c}},replace:!0})},[a]);return[n,s]};function Xe(){const t=h.useSearch(),a=W(),[n,s]=Pe(),[o,i]=Qe(),[g,c]=Oe(),r=ke(t),{data:x}=A(F({offset:0,sort:t.sort,flows:r.flows??void 0})),{data:w}=A(F({offset:0,sort:"NAME_ASC"})),{data:f}=y(D(r,3e4)),v=f?.results??[],b=m.useCallback(N=>{const j={...r,page:N};a.prefetchQuery(D(j,3e4)).then(()=>{const S=a.getQueryData(D(j,3e4).queryKey)?.results?.map(d=>d.id).filter(d=>!!d)??[];if(S.length!==0)for(const d of S)a.prefetchQuery(P([d])),a.prefetchQuery(Q([d])),a.prefetchQuery(_({flows:{operator:"and_",id:{any_:[d]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:1,sort:"START_TIME_DESC"})),a.prefetchQuery(_({flows:{operator:"and_",id:{any_:[d]}},flow_runs:{operator:"and_",start_time:{is_null_:!1}},offset:0,limit:Be,sort:"START_TIME_DESC"}))})},[a,r]);return e.jsx(Me,{flows:v,count:x??0,totalCount:w??0,pageCount:f?.pages??0,sort:o,pagination:n,onPaginationChange:s,onSortChange:i,columnFilters:g,onColumnFiltersChange:c,onPrefetchPage:b})}export{Xe as component};
2
+ //# sourceMappingURL=index-BO4Qqsm8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BO4Qqsm8.js","sources":["../../src/components/flows/cells.tsx","../../src/components/flows/columns.tsx","../../src/components/flows/data-table.tsx","../../src/components/flows/empty-state/flows-empty-state.tsx","../../src/components/flows/flows-page-header.tsx","../../src/components/flows/flows-page.tsx","../../src/routes/flows/index.tsx?tsr-split=component"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { subWeeks } from \"date-fns\";\nimport { useMemo } from \"react\";\nimport { toast } from \"sonner\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport {\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildNextRunsByFlowQuery,\n\tuseDeleteFlowById,\n} from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateIcon } from \"@/components/ui/state-badge\";\nimport { pluralize } from \"@/utils\";\nimport { formatDate } from \"@/utils/date\";\n\ntype Flow = components[\"schemas\"][\"Flow\"];\n\nexport const FlowName = ({ row }: { row: { original: Flow } }) => {\n\tif (!row.original.id) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-col pl-4\">\n\t\t\t<Link\n\t\t\t\tto=\"/flows/flow/$id\"\n\t\t\t\tparams={{ id: row.original.id }}\n\t\t\t\tclassName=\"text-sm font-medium truncate\"\n\t\t\t\ttitle={row.original.name}\n\t\t\t>\n\t\t\t\t{row.original.name}\n\t\t\t</Link>\n\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\tCreated{\" \"}\n\t\t\t\t{row.original?.created && formatDate(row.original.created, \"dateTime\")}\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n\nexport const FlowLastRun = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: flowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflows: { operator: \"and_\", id: { any_: [flowId ?? \"\"] } },\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tstart_time: { is_null_: false },\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t}),\n\t\tenabled: !!flowId,\n\t});\n\n\tconst lastRun = flowRuns?.[0];\n\tif (!flowId || !lastRun) return null;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-1\">\n\t\t\t{lastRun.state_type && (\n\t\t\t\t<StateIcon\n\t\t\t\t\ttype={lastRun.state_type}\n\t\t\t\t\tname={lastRun.state_name ?? undefined}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<Link to=\"/runs/flow-run/$id\" params={{ id: lastRun.id ?? \"\" }}>\n\t\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t\t{lastRun.name}\n\t\t\t\t</span>\n\t\t\t</Link>\n\t\t</div>\n\t);\n};\n\nexport const FlowNextRun = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: nextRunsMap } = useQuery(\n\t\tbuildNextRunsByFlowQuery(flowId ? [flowId] : [], { enabled: !!flowId }),\n\t);\n\n\tconst nextRun = flowId ? nextRunsMap?.[flowId] : null;\n\tif (!flowId || !nextRun) return null;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-1\">\n\t\t\t{nextRun.state_type && (\n\t\t\t\t<StateIcon type={nextRun.state_type} name={nextRun.state_name} />\n\t\t\t)}\n\t\t\t<Link to=\"/runs/flow-run/$id\" params={{ id: nextRun.id ?? \"\" }}>\n\t\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t\t{nextRun.name}\n\t\t\t\t</span>\n\t\t\t</Link>\n\t\t</div>\n\t);\n};\n\nexport const FlowDeploymentCount = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: countsMap } = useQuery(\n\t\tbuildDeploymentsCountByFlowQuery(flowId ? [flowId] : [], {\n\t\t\tenabled: !!flowId,\n\t\t}),\n\t);\n\tif (!flowId) return null;\n\n\tconst count = countsMap?.[flowId] ?? 0;\n\n\tif (count === 0) {\n\t\treturn <span className=\"text-sm text-muted-foreground\">None</span>;\n\t}\n\n\treturn (\n\t\t<Link\n\t\t\tto=\"/flows/flow/$id\"\n\t\t\tparams={{ id: flowId }}\n\t\t\tsearch={{ tab: \"deployments\" }}\n\t\t>\n\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t{count} {pluralize(count, \"Deployment\")}\n\t\t\t</span>\n\t\t</Link>\n\t);\n};\n\nexport const FlowActionMenu = ({ row }: { row: { original: Flow } }) => {\n\tconst id = row.original.id;\n\n\tconst { deleteFlow } = useDeleteFlowById();\n\n\tif (!id) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"flex justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"ghost\" className=\"h-8 w-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t<DropdownMenuItem onClick={() => deleteFlow(id)}>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>Automate</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nconst NUMBER_OF_ACTIVITY_BARS = 16;\n\nexport const FlowActivity = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\n\tconst { startDate, endDate } = useMemo((): {\n\t\tstartDate: Date;\n\t\tendDate: Date;\n\t} => {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\tstartDate: subWeeks(now, 1),\n\t\t\tendDate: now,\n\t\t};\n\t}, []);\n\n\tconst { data: flowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflows: { operator: \"and_\", id: { any_: [flowId ?? \"\"] } },\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tstart_time: { is_null_: false },\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tlimit: NUMBER_OF_ACTIVITY_BARS,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t}),\n\t\tenabled: !!flowId,\n\t});\n\n\tif (!flowId) return null;\n\n\treturn (\n\t\t<FlowRunActivityBarChart\n\t\t\tchartId={`flow-activity-${flowId}`}\n\t\t\tenrichedFlowRuns={flowRuns ?? []}\n\t\t\tstartDate={startDate}\n\t\t\tendDate={endDate}\n\t\t\tnumberOfBars={NUMBER_OF_ACTIVITY_BARS}\n\t\t\tclassName=\"h-[24px] w-[140px]\"\n\t\t/>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { components } from \"@/api/prefect\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tFlowActionMenu,\n\tFlowActivity,\n\tFlowDeploymentCount,\n\tFlowLastRun,\n\tFlowName,\n\tFlowNextRun,\n} from \"./cells\";\n\ntype Flow = components[\"schemas\"][\"Flow\"];\n\nexport const columns: ColumnDef<Flow>[] = [\n\t{\n\t\tid: \"select\",\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\tonCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(!!value)}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t\tmaxSize: 10,\n\t},\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: () => <div className=\"pl-4\">Flow</div>,\n\t\tcell: FlowName,\n\t},\n\t{\n\t\taccessorKey: \"lastRuns\",\n\t\theader: \"Last Run\",\n\t\tcell: FlowLastRun,\n\t},\n\t{\n\t\taccessorKey: \"nextRuns\",\n\t\theader: \"Next Run\",\n\t\tcell: FlowNextRun,\n\t},\n\t{\n\t\taccessorKey: \"deployments\",\n\t\theader: \"Deployments\",\n\t\tcell: FlowDeploymentCount,\n\t},\n\t{\n\t\taccessorKey: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: FlowActivity,\n\t},\n\t{\n\t\tid: \"actions\",\n\t\tcell: FlowActionMenu,\n\t},\n];\n","import type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport type React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { type Flow, useDeleteFlowById } from \"@/api/flows\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { columns } from \"./columns\";\n\nconst FLOW_SORT_OPTIONS = [\n\t{ label: \"A to Z\", value: \"NAME_ASC\" },\n\t{ label: \"Z to A\", value: \"NAME_DESC\" },\n\t{ label: \"Created\", value: \"CREATED_DESC\" },\n] as const;\n\ntype FlowSortValue = \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\" | \"UPDATED_DESC\";\n\nexport default function FlowsTable({\n\tflows,\n\tcount,\n\tpageCount,\n\tsort,\n\tpagination,\n\tonPaginationChange,\n\tonSortChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tonPrefetchPage,\n}: {\n\tflows: Flow[];\n\tcount: number;\n\tpageCount: number;\n\tsort: FlowSortValue;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: FlowSortValue) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tonPrefetchPage?: (page: number) => void;\n}) {\n\tconst { deleteFlow } = useDeleteFlowById();\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\tconst nameSearchValue = (columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value ?? \"\") as string;\n\tconst tagsSearchValue = (columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value ?? []) as string[];\n\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : [];\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tcolumns: columns,\n\t\tdata: flows,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tpageCount,\n\t\tstate: {\n\t\t\trowSelection,\n\t\t\tpagination,\n\t\t},\n\t\tonRowSelectionChange: setRowSelection,\n\t\tonPaginationChange: handlePaginationChange,\n\t});\n\n\tconst handleDeleteRows = () => {\n\t\tconst selectedRows = Object.keys(rowSelection);\n\n\t\tconst idsToDelete = selectedRows.map((rowId) => flows[Number(rowId)].id);\n\n\t\tfor (const id of idsToDelete) {\n\t\t\tdeleteFlow(id);\n\t\t}\n\n\t\ttable.toggleAllRowsSelected(false);\n\t};\n\n\treturn (\n\t\t<div className=\"h-full\">\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t{Object.keys(rowSelection).length > 0 ? (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground flex items-center\">\n\t\t\t\t\t\t\t{Object.keys(rowSelection).length} selected\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tid=\"Trash2\"\n\t\t\t\t\t\t\t\tclassName=\"ml-2 cursor-pointer h-4 w-4 inline\"\n\t\t\t\t\t\t\t\tonClick={handleDeleteRows}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{count} {pluralize(count, \"Flow\")}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Flow names\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sort} onValueChange={onSortChange}>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Flow sort order\" className=\"w-full\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{FLOW_SORT_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} onPrefetchPage={onPrefetchPage} />\n\t\t</div>\n\t);\n}\n","import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const FlowsEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Workflow\" />\n\t\t<EmptyStateTitle>Run a flow to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tFlows are Python functions that encapsulate workflow logic and allow users\n\t\t\tto interact with and reason about the state of their workflows.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"flows-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const FlowsHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tFlows\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n","import type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport type { Flow } from \"@/api/flows\";\nimport FlowsTable from \"./data-table\";\nimport { FlowsEmptyState } from \"./empty-state\";\nimport { FlowsHeader } from \"./flows-page-header\";\n\ntype FlowSortValue = \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\" | \"UPDATED_DESC\";\n\ntype FlowsPageProps = {\n\tflows: Flow[];\n\tcount: number;\n\ttotalCount: number;\n\tpageCount: number;\n\tsort: FlowSortValue;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: FlowSortValue) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tonPrefetchPage?: (page: number) => void;\n};\n\nexport default function FlowsPage({\n\tflows,\n\tcount,\n\ttotalCount,\n\tpageCount,\n\tsort,\n\tpagination,\n\tonPaginationChange,\n\tonSortChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tonPrefetchPage,\n}: FlowsPageProps) {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<FlowsHeader />\n\t\t\t{totalCount === 0 ? (\n\t\t\t\t<FlowsEmptyState />\n\t\t\t) : (\n\t\t\t\t<FlowsTable\n\t\t\t\t\tflows={flows}\n\t\t\t\t\tcount={count}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tsort={sort}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tonSortChange={onSortChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport {\n\tbuildCountFlowsFilteredQuery,\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildNextRunsByFlowQuery,\n\tbuildPaginateFlowsQuery,\n\ttype FlowsPaginateFilter,\n} from \"@/api/flows\";\nimport FlowsPage from \"@/components/flows/flows-page\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n// Route for /flows/\n\nconst searchParams = z\n\t.object({\n\t\tname: z.string().optional(),\n\t\tpage: z.number().int().positive().optional().default(1).catch(1),\n\t\tlimit: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.positive()\n\t\t\t.max(100)\n\t\t\t.optional()\n\t\t\t.default(10)\n\t\t\t.catch(10),\n\t\ttags: z.array(z.string()).optional(),\n\t\tsort: z\n\t\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t\t.optional()\n\t\t\t.default(\"NAME_ASC\"),\n\t})\n\t.optional()\n\t.default({});\n\ntype SearchParams = z.infer<typeof searchParams>;\n\nconst buildPaginationBody = (search?: SearchParams): FlowsPaginateFilter => {\n\tconst hasNameFilter = Boolean(search?.name);\n\tconst hasTagsFilter = Boolean(search?.tags?.length);\n\n\tif (!hasNameFilter && !hasTagsFilter) {\n\t\treturn {\n\t\t\tpage: search?.page ?? 1,\n\t\t\tlimit: search?.limit ?? 10,\n\t\t\tsort: search?.sort ?? \"NAME_ASC\",\n\t\t};\n\t}\n\n\treturn {\n\t\tpage: search?.page ?? 1,\n\t\tlimit: search?.limit ?? 10,\n\t\tsort: search?.sort ?? \"NAME_ASC\",\n\t\tflows: {\n\t\t\toperator: \"and_\",\n\t\t\t...(hasNameFilter && { name: { like_: search?.name } }),\n\t\t\t...(hasTagsFilter && {\n\t\t\t\ttags: { operator: \"and_\", all_: search?.tags },\n\t\t\t}),\n\t\t},\n\t};\n};\n\nconst NUMBER_OF_ACTIVITY_BARS = 16;\n\nfunction FlowsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load flows\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Flows</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/flows/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: FlowsRoute,\n\terrorComponent: FlowsErrorComponent,\n\tloaderDeps: ({ search }) => buildPaginationBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch current page queries without blocking the loader\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowsQuery(deps, 30_000),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowsFilteredQuery({\n\t\t\t\toffset: 0,\n\t\t\t\tsort: deps.sort,\n\t\t\t\tflows: deps.flows ?? undefined,\n\t\t\t}),\n\t\t);\n\t\t// Prefetch total count for empty state check\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowsFilteredQuery({\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t}),\n\t\t);\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\n});\n\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// Convert URL params (1-based page) to TanStack Table's PaginationState (0-based pageIndex)\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex: (search.page ?? 1) - 1,\n\t\t\tpageSize: search.limit ?? 10,\n\t\t}),\n\t\t[search.page, search.limit],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t// Convert TanStack Table's 0-based pageIndex back to 1-based page for URL\n\t\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\ntype FlowSort = \"CREATED_DESC\" | \"UPDATED_DESC\" | \"NAME_ASC\" | \"NAME_DESC\";\n\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortChange = useCallback(\n\t\t(sort: FlowSort) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortChange] as const;\n};\n\nconst useFlowsColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"name\", value: search.name },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.name, search.tags],\n\t);\n\n\tconst onColumnFiltersChange = useCallback(\n\t\t(newColumnFilters: ColumnFiltersState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => {\n\t\t\t\t\tconst name = newColumnFilters.find((filter) => filter.id === \"name\")\n\t\t\t\t\t\t?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tpage: 1,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [columnFilters, onColumnFiltersChange] as const;\n};\n\nfunction FlowsRoute() {\n\tconst search = Route.useSearch();\n\tconst queryClient = useQueryClient();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [columnFilters, onColumnFiltersChange] = useFlowsColumnFilters();\n\n\tconst paginationBody = buildPaginationBody(search);\n\n\t// Use useSuspenseQuery for count (stable key, won't cause suspense on search change)\n\tconst { data: count } = useSuspenseQuery(\n\t\tbuildCountFlowsFilteredQuery({\n\t\t\toffset: 0,\n\t\t\tsort: search.sort,\n\t\t\tflows: paginationBody.flows ?? undefined,\n\t\t}),\n\t);\n\n\t// Get total count of all flows (without filters) to determine if empty state should be shown\n\tconst { data: totalCount } = useSuspenseQuery(\n\t\tbuildCountFlowsFilteredQuery({\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\t// Use useQuery for paginated flows to leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: flowsPage } = useQuery(\n\t\tbuildPaginateFlowsQuery(paginationBody, 30_000),\n\t);\n\n\tconst flows = flowsPage?.results ?? [];\n\n\t// Prefetch a page and its child component data when user hovers over pagination buttons\n\tconst onPrefetchPage = useCallback(\n\t\t(page: number) => {\n\t\t\tconst pageDeps = { ...paginationBody, page };\n\t\t\tvoid queryClient\n\t\t\t\t.prefetchQuery(buildPaginateFlowsQuery(pageDeps, 30_000))\n\t\t\t\t.then(() => {\n\t\t\t\t\t// Get the prefetched page data from cache\n\t\t\t\t\tconst pageData = queryClient.getQueryData<{\n\t\t\t\t\t\tresults?: Array<{ id?: string }>;\n\t\t\t\t\t}>(buildPaginateFlowsQuery(pageDeps, 30_000).queryKey);\n\n\t\t\t\t\tconst flowIds =\n\t\t\t\t\t\tpageData?.results\n\t\t\t\t\t\t\t?.map((flow) => flow.id)\n\t\t\t\t\t\t\t.filter((id): id is string => Boolean(id)) ?? [];\n\n\t\t\t\t\tif (flowIds.length === 0) return;\n\n\t\t\t\t\t// Prefetch child component queries for each flow individually\n\t\t\t\t\t// Using individual flow IDs ensures query keys match what components use\n\t\t\t\t\tfor (const flowId of flowIds) {\n\t\t\t\t\t\t// FlowNextRun query - uses single flow ID array for query key matching\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(buildNextRunsByFlowQuery([flowId]));\n\n\t\t\t\t\t\t// FlowDeploymentCount query - uses single flow ID array for query key matching\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildDeploymentsCountByFlowQuery([flowId]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// FlowLastRun query - last completed run\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildFilterFlowRunsQuery({\n\t\t\t\t\t\t\t\tflows: { operator: \"and_\", id: { any_: [flowId] } },\n\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tstart_time: { is_null_: false },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tlimit: 1,\n\t\t\t\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// FlowActivity query - recent runs for activity chart\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildFilterFlowRunsQuery({\n\t\t\t\t\t\t\t\tflows: { operator: \"and_\", id: { any_: [flowId] } },\n\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tstart_time: { is_null_: false },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tlimit: NUMBER_OF_ACTIVITY_BARS,\n\t\t\t\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\t[queryClient, paginationBody],\n\t);\n\n\treturn (\n\t\t<FlowsPage\n\t\t\tflows={flows}\n\t\t\tcount={count ?? 0}\n\t\t\ttotalCount={totalCount ?? 0}\n\t\t\tpageCount={flowsPage?.pages ?? 0}\n\t\t\tsort={sort as \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\"}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t\tonSortChange={onSortChange}\n\t\t\tcolumnFilters={columnFilters}\n\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t/>\n\t);\n}\n"],"names":["FlowName","row","jsxs","jsx","Link","formatDate","FlowLastRun","flowId","flowRuns","useQuery","buildFilterFlowRunsQuery","lastRun","StateIcon","FlowNextRun","nextRunsMap","buildNextRunsByFlowQuery","nextRun","FlowDeploymentCount","countsMap","buildDeploymentsCountByFlowQuery","count","pluralize","FlowActionMenu","id","deleteFlow","useDeleteFlowById","DropdownMenu","DropdownMenuTrigger","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","toast","DropdownMenuSeparator","NUMBER_OF_ACTIVITY_BARS","FlowActivity","startDate","endDate","useMemo","now","subWeeks","FlowRunActivityBarChart","columns","table","Checkbox","value","FLOW_SORT_OPTIONS","FlowsTable","flows","pageCount","sort","pagination","onPaginationChange","onSortChange","columnFilters","onColumnFiltersChange","onPrefetchPage","rowSelection","setRowSelection","useState","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","useCallback","filters","handleTagsSearchChange","e","tags","handlePaginationChange","updater","newPagination","useReactTable","getCoreRowModel","handleDeleteRows","idsToDelete","rowId","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","DataTable","FlowsEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","FlowsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","FlowsPage","totalCount","z","name","string","optional","page","number","int","positive","default","catch","limit","max","buildPaginationBody","search","hasNameFilter","Boolean","hasTagsFilter","length","operator","like_","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","pageSize","to","prev","replace","useSort","useFlowsColumnFilters","newColumnFilters","find","FlowsRoute","queryClient","useQueryClient","paginationBody","data","useSuspenseQuery","buildCountFlowsFilteredQuery","offset","undefined","flowsPage","buildPaginateFlowsQuery","results","pageDeps","prefetchQuery","then","flowIds","getQueryData","queryKey","map","flow","any_","flow_runs","start_time","is_null_","pages"],"mappings":"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"}