prefect 3.6.14.dev3__py3-none-any.whl → 3.6.14.dev4__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 (251) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/futures.py +17 -4
  3. prefect/runner/runner.py +113 -29
  4. prefect/server/ui-v2/assets/{artifact-card-CNabu-6j.js → artifact-card-DmR_0bKj.js} +2 -2
  5. prefect/server/ui-v2/assets/{artifact-card-CNabu-6j.js.map → artifact-card-DmR_0bKj.js.map} +1 -1
  6. prefect/server/ui-v2/assets/{artifact._id-Emkhr_0h.js → artifact._id-BF4365i6.js} +2 -2
  7. prefect/server/ui-v2/assets/{artifact._id-Emkhr_0h.js.map → artifact._id-BF4365i6.js.map} +1 -1
  8. prefect/server/ui-v2/assets/{automation-schema-CRKJHa4q.js → automation-schema-crrFcHTg.js} +2 -2
  9. prefect/server/ui-v2/assets/{automation-schema-CRKJHa4q.js.map → automation-schema-crrFcHTg.js.map} +1 -1
  10. prefect/server/ui-v2/assets/{automation-wizard-Cej8aik5.js → automation-wizard-DMI3p_HA.js} +2 -2
  11. prefect/server/ui-v2/assets/{automation-wizard-Cej8aik5.js.map → automation-wizard-DMI3p_HA.js.map} +1 -1
  12. prefect/server/ui-v2/assets/automation._id-C_ZATYDQ.js +2 -0
  13. prefect/server/ui-v2/assets/{automation._id-Bm1T3_NO.js.map → automation._id-C_ZATYDQ.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automation_._id.edit-C5NIVfxR.js → automation_._id.edit-Dkc09fFA.js} +2 -2
  15. prefect/server/ui-v2/assets/{automation_._id.edit-C5NIVfxR.js.map → automation_._id.edit-Dkc09fFA.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{automations-header-CdJSlWw8.js → automations-header-H_FW9LY7.js} +2 -2
  17. prefect/server/ui-v2/assets/{automations-header-CdJSlWw8.js.map → automations-header-H_FW9LY7.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{base-job-template-form-section-DX_X28oU.js → base-job-template-form-section-CVnxwfEi.js} +2 -2
  19. prefect/server/ui-v2/assets/{base-job-template-form-section-DX_X28oU.js.map → base-job-template-form-section-CVnxwfEi.js.map} +1 -1
  20. prefect/server/ui-v2/assets/{block-type-details-BcpcwaJS.js → block-type-details-BIzTWlfj.js} +2 -2
  21. prefect/server/ui-v2/assets/{block-type-details-BcpcwaJS.js.map → block-type-details-BIzTWlfj.js.map} +1 -1
  22. prefect/server/ui-v2/assets/block-type-logo-B3XAhRSL.js +2 -0
  23. prefect/server/ui-v2/assets/{block-type-logo-ox5VqJuy.js.map → block-type-logo-B3XAhRSL.js.map} +1 -1
  24. prefect/server/ui-v2/assets/{block._id-BD6wu3yC.js → block._id-Bj0YEdv1.js} +2 -2
  25. prefect/server/ui-v2/assets/{block._id-BD6wu3yC.js.map → block._id-Bj0YEdv1.js.map} +1 -1
  26. prefect/server/ui-v2/assets/{block_._id.edit-aneXPzUW.js → block_._id.edit-C7sUQ8mQ.js} +2 -2
  27. prefect/server/ui-v2/assets/{block_._id.edit-aneXPzUW.js.map → block_._id.edit-C7sUQ8mQ.js.map} +1 -1
  28. prefect/server/ui-v2/assets/{catalog-C7ttFKuv.js → catalog-Cywf-iho.js} +2 -2
  29. prefect/server/ui-v2/assets/{catalog-C7ttFKuv.js.map → catalog-Cywf-iho.js.map} +1 -1
  30. prefect/server/ui-v2/assets/{catalog_._slug-CrcphBbo.js → catalog_._slug-qLWMRQt3.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog_._slug-CrcphBbo.js.map → catalog_._slug-qLWMRQt3.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{catalog_._slug_.create-Dd7ATIKq.js → catalog_._slug_.create-LslFlpde.js} +2 -2
  33. prefect/server/ui-v2/assets/{catalog_._slug_.create-Dd7ATIKq.js.map → catalog_._slug_.create-LslFlpde.js.map} +1 -1
  34. prefect/server/ui-v2/assets/{collapsible-D5U2XK4R.js → collapsible-BszH-EeY.js} +2 -2
  35. prefect/server/ui-v2/assets/{collapsible-D5U2XK4R.js.map → collapsible-BszH-EeY.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{concurrency-limit._id-D-xV_tiF.js → concurrency-limit._id-Dam_Ftkw.js} +2 -2
  37. prefect/server/ui-v2/assets/{concurrency-limit._id-D-xV_tiF.js.map → concurrency-limit._id-Dam_Ftkw.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{create-Da7OBOa5.js → create-B11nNTmT.js} +2 -2
  39. prefect/server/ui-v2/assets/{create-Da7OBOa5.js.map → create-B11nNTmT.js.map} +1 -1
  40. prefect/server/ui-v2/assets/create-B8EFPjmO.js +2 -0
  41. prefect/server/ui-v2/assets/{create-CiMo25er.js.map → create-B8EFPjmO.js.map} +1 -1
  42. prefect/server/ui-v2/assets/cronstrue-IJcBJ9tZ.js +2 -0
  43. prefect/server/ui-v2/assets/cronstrue-IJcBJ9tZ.js.map +1 -0
  44. prefect/server/ui-v2/assets/{data-table-Bfa8_ZJd.js → data-table-C1eRvlXV.js} +2 -2
  45. prefect/server/ui-v2/assets/{data-table-Bfa8_ZJd.js.map → data-table-C1eRvlXV.js.map} +1 -1
  46. prefect/server/ui-v2/assets/{delete-confirmation-dialog-D18TITKv.js → delete-confirmation-dialog-DCmC1ZTD.js} +2 -2
  47. prefect/server/ui-v2/assets/{delete-confirmation-dialog-D18TITKv.js.map → delete-confirmation-dialog-DCmC1ZTD.js.map} +1 -1
  48. prefect/server/ui-v2/assets/deployment-action-header-WD51TIyE.js +2 -0
  49. prefect/server/ui-v2/assets/{deployment-action-header-AamGn0qI.js.map → deployment-action-header-WD51TIyE.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment-form-QIRH-pew.js → deployment-form-FaqDdnNa.js} +3 -3
  51. prefect/server/ui-v2/assets/{deployment-form-QIRH-pew.js.map → deployment-form-FaqDdnNa.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment-links-yTRvIDd3.js → deployment-links-CLax44tW.js} +2 -2
  53. prefect/server/ui-v2/assets/{deployment-links-yTRvIDd3.js.map → deployment-links-CLax44tW.js.map} +1 -1
  54. prefect/server/ui-v2/assets/{deployment._id-CCBPOCfw.js → deployment._id-CbWiylvh.js} +2 -2
  55. prefect/server/ui-v2/assets/{deployment._id-CCBPOCfw.js.map → deployment._id-CbWiylvh.js.map} +1 -1
  56. prefect/server/ui-v2/assets/{deployment._id-m4luvPWl.js → deployment._id-DrtOyhFC.js} +2 -2
  57. prefect/server/ui-v2/assets/{deployment._id-m4luvPWl.js.map → deployment._id-DrtOyhFC.js.map} +1 -1
  58. prefect/server/ui-v2/assets/deployment_._id.duplicate-CqlNWQfz.js +2 -0
  59. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DFjSeYn4.js.map → deployment_._id.duplicate-CqlNWQfz.js.map} +1 -1
  60. prefect/server/ui-v2/assets/deployment_._id.edit-CbvCe2YU.js +2 -0
  61. prefect/server/ui-v2/assets/{deployment_._id.edit-5-mFOphJ.js.map → deployment_._id.edit-CbvCe2YU.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{deployment_._id.run-CwVe5hPJ.js → deployment_._id.run-BnIFeR-d.js} +2 -2
  63. prefect/server/ui-v2/assets/{deployment_._id.run-CwVe5hPJ.js.map → deployment_._id.run-BnIFeR-d.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{dropdown-menu-g64QiYKu.js → dropdown-menu-Bhox1zoa.js} +2 -2
  65. prefect/server/ui-v2/assets/{dropdown-menu-g64QiYKu.js.map → dropdown-menu-Bhox1zoa.js.map} +1 -1
  66. prefect/server/ui-v2/assets/{event-resource-display-BqqHFc0B.js → event-resource-display-65B76oFV.js} +2 -2
  67. prefect/server/ui-v2/assets/{event-resource-display-BqqHFc0B.js.map → event-resource-display-65B76oFV.js.map} +1 -1
  68. prefect/server/ui-v2/assets/{event._eventDate._eventId-BR0eukkm.js → event._eventDate._eventId-CxPjH2H7.js} +2 -2
  69. prefect/server/ui-v2/assets/{event._eventDate._eventId-BR0eukkm.js.map → event._eventDate._eventId-CxPjH2H7.js.map} +1 -1
  70. prefect/server/ui-v2/assets/{flow-run-graph-kZfaIevn.js → flow-run-graph-ZOatFLjv.js} +2 -2
  71. prefect/server/ui-v2/assets/{flow-run-graph-kZfaIevn.js.map → flow-run-graph-ZOatFLjv.js.map} +1 -1
  72. prefect/server/ui-v2/assets/flow-run._id-1RC-URiA.js +2 -0
  73. prefect/server/ui-v2/assets/{flow-run._id-Caq--9Lr.js.map → flow-run._id-1RC-URiA.js.map} +1 -1
  74. prefect/server/ui-v2/assets/flow-run._id-CDFeuz16.js +2 -0
  75. prefect/server/ui-v2/assets/{flow-run._id-DiA0_X5m.js.map → flow-run._id-CDFeuz16.js.map} +1 -1
  76. prefect/server/ui-v2/assets/{flow-run._id-BX0UeXTj.js → flow-run._id-U6rzXfvR.js} +4 -4
  77. prefect/server/ui-v2/assets/{flow-run._id-BX0UeXTj.js.map → flow-run._id-U6rzXfvR.js.map} +1 -1
  78. prefect/server/ui-v2/assets/{flow-runs-pagination-CoZZ-ed_.js → flow-runs-pagination-D_d5hdM0.js} +2 -2
  79. prefect/server/ui-v2/assets/{flow-runs-pagination-CoZZ-ed_.js.map → flow-runs-pagination-D_d5hdM0.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{flow._id-nRzTWzLb.js → flow._id-DkeN8TLS.js} +2 -2
  81. prefect/server/ui-v2/assets/{flow._id-nRzTWzLb.js.map → flow._id-DkeN8TLS.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{form-CdcF42XZ.js → form-CJfDUosd.js} +2 -2
  83. prefect/server/ui-v2/assets/{form-CdcF42XZ.js.map → form-CJfDUosd.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-DijI5Lcu.js → header-C5liWcfp.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-DijI5Lcu.js.map → header-C5liWcfp.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{header-DkJo9Uge.js → header-MZZX5lQ8.js} +2 -2
  87. prefect/server/ui-v2/assets/{header-DkJo9Uge.js.map → header-MZZX5lQ8.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{header-DV0gMQER.js → header-vYbWNFdK.js} +2 -2
  89. prefect/server/ui-v2/assets/{header-DV0gMQER.js.map → header-vYbWNFdK.js.map} +1 -1
  90. prefect/server/ui-v2/assets/{index-VUajxmNL.js → index-4xVLy12E.js} +2 -2
  91. prefect/server/ui-v2/assets/{index-VUajxmNL.js.map → index-4xVLy12E.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-KlV75baW.js → index-5fQrQZ3K.js} +2 -2
  93. prefect/server/ui-v2/assets/{index-KlV75baW.js.map → index-5fQrQZ3K.js.map} +1 -1
  94. prefect/server/ui-v2/assets/index-7bWZ2Znt.js +2 -0
  95. prefect/server/ui-v2/assets/{index-CqvGvZOq.js.map → index-7bWZ2Znt.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-Chtop8D8.js → index-BOVwKiXn.js} +2 -2
  97. prefect/server/ui-v2/assets/{index-Chtop8D8.js.map → index-BOVwKiXn.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{index-BZ9TDxSy.js → index-BPmw935P.js} +2 -2
  99. prefect/server/ui-v2/assets/{index-BZ9TDxSy.js.map → index-BPmw935P.js.map} +1 -1
  100. prefect/server/ui-v2/assets/index-BR6bwuK4.js +2 -0
  101. prefect/server/ui-v2/assets/{index-BCKNs_w7.js.map → index-BR6bwuK4.js.map} +1 -1
  102. prefect/server/ui-v2/assets/{index-DYKO0qOd.js → index-B_3WKH2_.js} +2 -2
  103. prefect/server/ui-v2/assets/{index-DYKO0qOd.js.map → index-B_3WKH2_.js.map} +1 -1
  104. prefect/server/ui-v2/assets/{index-BV3WqCCv.js → index-BgOHAC5L.js} +2 -2
  105. prefect/server/ui-v2/assets/{index-BV3WqCCv.js.map → index-BgOHAC5L.js.map} +1 -1
  106. prefect/server/ui-v2/assets/{index-CUZXozY8.js → index-Bmd9p_xN.js} +2 -2
  107. prefect/server/ui-v2/assets/{index-CUZXozY8.js.map → index-Bmd9p_xN.js.map} +1 -1
  108. prefect/server/ui-v2/assets/{index-faXvGo5k.js → index-BmdTLblr.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-faXvGo5k.js.map → index-BmdTLblr.js.map} +1 -1
  110. prefect/server/ui-v2/assets/{index-Cuh3BwlA.js → index-CCCwtbSq.js} +2 -2
  111. prefect/server/ui-v2/assets/{index-Cuh3BwlA.js.map → index-CCCwtbSq.js.map} +1 -1
  112. prefect/server/ui-v2/assets/{index-yTjygRmH.js → index-CbJNJTr8.js} +2 -2
  113. prefect/server/ui-v2/assets/{index-yTjygRmH.js.map → index-CbJNJTr8.js.map} +1 -1
  114. prefect/server/ui-v2/assets/index-CcyfsgGP.js +2 -0
  115. prefect/server/ui-v2/assets/{index-BijfHkUE.js.map → index-CcyfsgGP.js.map} +1 -1
  116. prefect/server/ui-v2/assets/{index-AXV1ellj.js → index-CfHvTOAO.js} +2 -2
  117. prefect/server/ui-v2/assets/{index-AXV1ellj.js.map → index-CfHvTOAO.js.map} +1 -1
  118. prefect/server/ui-v2/assets/{index-BGZtCgRR.js → index-ClXbR8i0.js} +2 -2
  119. prefect/server/ui-v2/assets/{index-BGZtCgRR.js.map → index-ClXbR8i0.js.map} +1 -1
  120. prefect/server/ui-v2/assets/{index-BfuGBXBN.js → index-Cyw9YHlj.js} +2 -2
  121. prefect/server/ui-v2/assets/{index-BfuGBXBN.js.map → index-Cyw9YHlj.js.map} +1 -1
  122. prefect/server/ui-v2/assets/{index-BZqccBpn.js → index-DLuXqHi9.js} +6 -6
  123. prefect/server/ui-v2/assets/index-DLuXqHi9.js.map +1 -0
  124. prefect/server/ui-v2/assets/{index-BmUvoLOK.js → index-DeeA9nPM.js} +2 -2
  125. prefect/server/ui-v2/assets/{index-BmUvoLOK.js.map → index-DeeA9nPM.js.map} +1 -1
  126. prefect/server/ui-v2/assets/index-MeJBhX-C.js +2 -0
  127. prefect/server/ui-v2/assets/{index-CUJoNEgb.js.map → index-MeJBhX-C.js.map} +1 -1
  128. prefect/server/ui-v2/assets/{index-DO_c3_A_.js → index-enqoJV8x.js} +2 -2
  129. prefect/server/ui-v2/assets/{index-DO_c3_A_.js.map → index-enqoJV8x.js.map} +1 -1
  130. prefect/server/ui-v2/assets/{json-input-DFgWdLGv.js → json-input-CJ1Ipjax.js} +2 -2
  131. prefect/server/ui-v2/assets/{json-input-DFgWdLGv.js.map → json-input-CJ1Ipjax.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{key._key-CpeWM0mN.js → key._key-B0wb5Umi.js} +2 -2
  133. prefect/server/ui-v2/assets/{key._key-CpeWM0mN.js.map → key._key-B0wb5Umi.js.map} +1 -1
  134. prefect/server/ui-v2/assets/{lazy-markdown-Bzi0YUUV.js → lazy-markdown-sP3PYQgB.js} +3 -3
  135. prefect/server/ui-v2/assets/{lazy-markdown-Bzi0YUUV.js.map → lazy-markdown-sP3PYQgB.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{login-CM0nuDdd.js → login-DNY0o3XU.js} +2 -2
  137. prefect/server/ui-v2/assets/{login-CM0nuDdd.js.map → login-DNY0o3XU.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{markdown-input-CGOAnaWz.js → markdown-input-Bos2JYXW.js} +2 -2
  139. prefect/server/ui-v2/assets/{markdown-input-CGOAnaWz.js.map → markdown-input-Bos2JYXW.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{python-example-snippet-CyJ28Tm-.js → python-example-snippet-CWSJRd48.js} +3 -3
  141. prefect/server/ui-v2/assets/{python-example-snippet-CyJ28Tm-.js.map → python-example-snippet-CWSJRd48.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{python-input-D8_x22t4.js → python-input-Bu4995lK.js} +2 -2
  143. prefect/server/ui-v2/assets/{python-input-D8_x22t4.js.map → python-input-Bu4995lK.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{radio-group-Dgu38qwz.js → radio-group-C0D0oLYd.js} +2 -2
  145. prefect/server/ui-v2/assets/{radio-group-Dgu38qwz.js.map → radio-group-C0D0oLYd.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{route-error-state-CVHTggxQ.js → route-error-state-DzKu_Iw_.js} +2 -2
  147. prefect/server/ui-v2/assets/{route-error-state-CVHTggxQ.js.map → route-error-state-DzKu_Iw_.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{schema-form-DqRLX--T.js → schema-form-BD95b0iS.js} +2 -2
  149. prefect/server/ui-v2/assets/schema-form-BD95b0iS.js.map +1 -0
  150. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DuEmswz-.js → schema-form-input-string-format-datetime-DyDs1jNl.js} +4 -4
  151. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DuEmswz-.js.map → schema-form-input-string-format-datetime-DyDs1jNl.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{settings-CtKmYnoo.js → settings-a90cwhBe.js} +2 -2
  153. prefect/server/ui-v2/assets/{settings-CtKmYnoo.js.map → settings-a90cwhBe.js.map} +1 -1
  154. prefect/server/ui-v2/assets/{sort-filter-BNQ6rjAG.js → sort-filter-CCltjs1E.js} +2 -2
  155. prefect/server/ui-v2/assets/{sort-filter-BNQ6rjAG.js.map → sort-filter-CCltjs1E.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{table-CJS-5Aky.js → table-CrPymfJD.js} +2 -2
  157. prefect/server/ui-v2/assets/{table-CJS-5Aky.js.map → table-CrPymfJD.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{tags-input-CDvuqe9B.js → tags-input-BdNYl8nS.js} +2 -2
  159. prefect/server/ui-v2/assets/{tags-input-CDvuqe9B.js.map → tags-input-BdNYl8nS.js.map} +1 -1
  160. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-DMqNFEVn.js → task-run-concurrency-limits-reset-dialog-B4bdiAgf.js} +2 -2
  161. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-DMqNFEVn.js.map → task-run-concurrency-limits-reset-dialog-B4bdiAgf.js.map} +1 -1
  162. prefect/server/ui-v2/assets/{task-run._id-CV5t0LR0.js → task-run._id-BQac40_I.js} +3 -3
  163. prefect/server/ui-v2/assets/{task-run._id-CV5t0LR0.js.map → task-run._id-BQac40_I.js.map} +1 -1
  164. prefect/server/ui-v2/assets/task-run._id-BzeMfM08.js +2 -0
  165. prefect/server/ui-v2/assets/{task-run._id-CiVsXKpy.js.map → task-run._id-BzeMfM08.js.map} +1 -1
  166. prefect/server/ui-v2/assets/task-runs-pagination-WFGIqR6p.js +2 -0
  167. prefect/server/ui-v2/assets/{task-runs-pagination-DGjxL4DO.js.map → task-runs-pagination-WFGIqR6p.js.map} +1 -1
  168. prefect/server/ui-v2/assets/{textarea-Mne2s-1n.js → textarea-CGFflH-n.js} +2 -2
  169. prefect/server/ui-v2/assets/{textarea-Mne2s-1n.js.map → textarea-CGFflH-n.js.map} +1 -1
  170. prefect/server/ui-v2/assets/{timezone-select-CPBtT8tA.js → timezone-select-ClE9nfKA.js} +2 -2
  171. prefect/server/ui-v2/assets/{timezone-select-CPBtT8tA.js.map → timezone-select-ClE9nfKA.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{toggle-group-CvPe0UY1.js → toggle-group-Dnv_LMnU.js} +2 -2
  173. prefect/server/ui-v2/assets/{toggle-group-CvPe0UY1.js.map → toggle-group-Dnv_LMnU.js.map} +1 -1
  174. prefect/server/ui-v2/assets/{use-debounce-callback-Dcf0d0U7.js → use-debounce-callback-CVfZS_LP.js} +2 -2
  175. prefect/server/ui-v2/assets/{use-debounce-callback-Dcf0d0U7.js.map → use-debounce-callback-CVfZS_LP.js.map} +1 -1
  176. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DnRkM1Cj.js → use-delete-automation-confirmation-dialog-CRGV6wvn.js} +2 -2
  177. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DnRkM1Cj.js.map → use-delete-automation-confirmation-dialog-CRGV6wvn.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CMHtwDvb.js → use-delete-block-document-confirmation-dialog-DNMP_gtr.js} +2 -2
  179. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CMHtwDvb.js.map → use-delete-block-document-confirmation-dialog-DNMP_gtr.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{use-delete-confirmation-dialog-Bka9YDdO.js → use-delete-confirmation-dialog-C5d6hPL-.js} +2 -2
  181. prefect/server/ui-v2/assets/{use-delete-confirmation-dialog-Bka9YDdO.js.map → use-delete-confirmation-dialog-C5d6hPL-.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DB4pe2_m.js → use-flow-runs-selected-rows-D3-TVsRL.js} +2 -2
  183. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DB4pe2_m.js.map → use-flow-runs-selected-rows-D3-TVsRL.js.map} +1 -1
  184. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DUPrB7V9.js → use-get-artifacts-flow-task-runs-I3Wb9fOV.js} +2 -2
  185. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DUPrB7V9.js.map → use-get-artifacts-flow-task-runs-I3Wb9fOV.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{use-is-overflowing-Cc-Qm0vx.js → use-is-overflowing-CyVH32I2.js} +2 -2
  187. prefect/server/ui-v2/assets/{use-is-overflowing-Cc-Qm0vx.js.map → use-is-overflowing-CyVH32I2.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{use-page-title-ELpQMkBC.js → use-page-title-CImKMV-D.js} +2 -2
  189. prefect/server/ui-v2/assets/{use-page-title-ELpQMkBC.js.map → use-page-title-CImKMV-D.js.map} +1 -1
  190. prefect/server/ui-v2/assets/use-quick-run-Be-i6Tzi.js +2 -0
  191. prefect/server/ui-v2/assets/{use-quick-run-uAasMmAv.js.map → use-quick-run-Be-i6Tzi.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{use-state-favicon-CzOUYzQe.js → use-state-favicon-DtW_I9k3.js} +2 -2
  193. prefect/server/ui-v2/assets/{use-state-favicon-CzOUYzQe.js.map → use-state-favicon-DtW_I9k3.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{use-stepper-DvHmfROo.js → use-stepper-BSvi_u_j.js} +2 -2
  195. prefect/server/ui-v2/assets/{use-stepper-DvHmfROo.js.map → use-stepper-BSvi_u_j.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{utilities-XA-1-LhA.js → utilities-BCBDUmEl.js} +2 -2
  197. prefect/server/ui-v2/assets/{utilities-XA-1-LhA.js.map → utilities-BCBDUmEl.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{vendor-codemirror-Dn73yRFx.js → vendor-codemirror-OTxfneaa.js} +2 -2
  199. prefect/server/ui-v2/assets/{vendor-codemirror-Dn73yRFx.js.map → vendor-codemirror-OTxfneaa.js.map} +1 -1
  200. prefect/server/ui-v2/assets/{vendor-date-Bxa7CHB1.js → vendor-date-CRz8gtWZ.js} +2 -2
  201. prefect/server/ui-v2/assets/{vendor-date-Bxa7CHB1.js.map → vendor-date-CRz8gtWZ.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{vendor-forms-mroZAMaw.js → vendor-forms-D-iybWES.js} +2 -2
  203. prefect/server/ui-v2/assets/{vendor-forms-mroZAMaw.js.map → vendor-forms-D-iybWES.js.map} +1 -1
  204. prefect/server/ui-v2/assets/{vendor-markdown-BV905mMk.js → vendor-markdown-TdbL8FCd.js} +2 -2
  205. prefect/server/ui-v2/assets/{vendor-markdown-BV905mMk.js.map → vendor-markdown-TdbL8FCd.js.map} +1 -1
  206. prefect/server/ui-v2/assets/{vendor-radix-CP6hQtRc.js → vendor-radix-DRMjKWJW.js} +5 -5
  207. prefect/server/ui-v2/assets/{vendor-radix-CP6hQtRc.js.map → vendor-radix-DRMjKWJW.js.map} +1 -1
  208. prefect/server/ui-v2/assets/{vendor-recharts-BOcghvr2.js → vendor-recharts-BGjDGXVf.js} +2 -2
  209. prefect/server/ui-v2/assets/{vendor-recharts-BOcghvr2.js.map → vendor-recharts-BGjDGXVf.js.map} +1 -1
  210. prefect/server/ui-v2/assets/{vendor-tanstack-CLpbOGYv.js → vendor-tanstack-CWDKYA_B.js} +2 -2
  211. prefect/server/ui-v2/assets/{vendor-tanstack-CLpbOGYv.js.map → vendor-tanstack-CWDKYA_B.js.map} +1 -1
  212. prefect/server/ui-v2/assets/{work-pool-filter-D4DI4Hd5.js → work-pool-filter-BuJB9elW.js} +2 -2
  213. prefect/server/ui-v2/assets/{work-pool-filter-D4DI4Hd5.js.map → work-pool-filter-BuJB9elW.js.map} +1 -1
  214. prefect/server/ui-v2/assets/{work-pool-queue-toggle--tVsqhDi.js → work-pool-queue-toggle-DP2ONU28.js} +2 -2
  215. prefect/server/ui-v2/assets/{work-pool-queue-toggle--tVsqhDi.js.map → work-pool-queue-toggle-DP2ONU28.js.map} +1 -1
  216. prefect/server/ui-v2/assets/{work-pool._workPoolName-Ba0XSN4m.js → work-pool._workPoolName-BjhJe3F4.js} +2 -2
  217. prefect/server/ui-v2/assets/{work-pool._workPoolName-Ba0XSN4m.js.map → work-pool._workPoolName-BjhJe3F4.js.map} +1 -1
  218. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-lHDf1Aih.js +2 -0
  219. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CeYLESXS.js.map → work-pool_._workPoolName.edit-lHDf1Aih.js.map} +1 -1
  220. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CHvlnO-U.js → work-pool_._workPoolName.queue._workQueueName-CLthz7sB.js} +2 -2
  221. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CHvlnO-U.js.map → work-pool_._workPoolName.queue._workQueueName-CLthz7sB.js.map} +1 -1
  222. prefect/server/ui-v2/assets/{work-queue-icon-text-DnQAtUi_.js → work-queue-icon-text-4iEAtZOh.js} +2 -2
  223. prefect/server/ui-v2/assets/{work-queue-icon-text-DnQAtUi_.js.map → work-queue-icon-text-4iEAtZOh.js.map} +1 -1
  224. prefect/server/ui-v2/assets/{zod-cc-7bk3x.js → zod-CjGf5GIv.js} +2 -2
  225. prefect/server/ui-v2/assets/{zod-cc-7bk3x.js.map → zod-CjGf5GIv.js.map} +1 -1
  226. prefect/server/ui-v2/index.html +6 -6
  227. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/METADATA +2 -2
  228. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/RECORD +231 -231
  229. prefect/server/ui-v2/assets/automation._id-Bm1T3_NO.js +0 -2
  230. prefect/server/ui-v2/assets/block-type-logo-ox5VqJuy.js +0 -2
  231. prefect/server/ui-v2/assets/create-CiMo25er.js +0 -2
  232. prefect/server/ui-v2/assets/cronstrue-CeanGOEE.js +0 -2
  233. prefect/server/ui-v2/assets/cronstrue-CeanGOEE.js.map +0 -1
  234. prefect/server/ui-v2/assets/deployment-action-header-AamGn0qI.js +0 -2
  235. prefect/server/ui-v2/assets/deployment_._id.duplicate-DFjSeYn4.js +0 -2
  236. prefect/server/ui-v2/assets/deployment_._id.edit-5-mFOphJ.js +0 -2
  237. prefect/server/ui-v2/assets/flow-run._id-Caq--9Lr.js +0 -2
  238. prefect/server/ui-v2/assets/flow-run._id-DiA0_X5m.js +0 -2
  239. prefect/server/ui-v2/assets/index-BCKNs_w7.js +0 -2
  240. prefect/server/ui-v2/assets/index-BZqccBpn.js.map +0 -1
  241. prefect/server/ui-v2/assets/index-BijfHkUE.js +0 -2
  242. prefect/server/ui-v2/assets/index-CUJoNEgb.js +0 -2
  243. prefect/server/ui-v2/assets/index-CqvGvZOq.js +0 -2
  244. prefect/server/ui-v2/assets/schema-form-DqRLX--T.js.map +0 -1
  245. prefect/server/ui-v2/assets/task-run._id-CiVsXKpy.js +0 -2
  246. prefect/server/ui-v2/assets/task-runs-pagination-DGjxL4DO.js +0 -2
  247. prefect/server/ui-v2/assets/use-quick-run-uAasMmAv.js +0 -2
  248. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CeYLESXS.js +0 -2
  249. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/WHEEL +0 -0
  250. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/entry_points.txt +0 -0
  251. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index-VUajxmNL.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 { Typography } from \"../ui/typography\";\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<Typography variant=\"body\" className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} {pluralize(totalCount, \"artifact\")}\n\t\t\t\t</Typography>\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 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});\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","Typography","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
+ {"version":3,"file":"index-4xVLy12E.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 { Typography } from \"../ui/typography\";\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<Typography variant=\"body\" className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} {pluralize(totalCount, \"artifact\")}\n\t\t\t\t</Typography>\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 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});\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","Typography","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":"8mBAuBA,MAAMA,EAAsB,CAC3B,CAAE,MAAO,MAAO,MAAO,WAAA,EACvB,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,QAAS,MAAO,OAAA,EACzB,CAAE,MAAO,QAAS,MAAO,OAAA,CAC1B,EAEaC,EAA2B,CAAC,CACxC,QAAAC,EACA,eAAAC,EACA,WAAAC,EACA,YAAAC,EACA,eAAAC,CACD,IAA4B,CAC3B,MAAMC,EAAqBC,EAAAA,YACzBC,GAAkB,CAClBN,EAAe,CACd,GAAGD,EAAQ,OAAQQ,GAAWA,EAAO,KAAO,MAAM,EAClD,CAAE,GAAI,OAAQ,MAAO,OAAQ,MAAAD,CAAA,CAAM,CACnC,CACF,EACA,CAACP,EAASC,CAAc,CAAA,EAGnBQ,EAAqBH,EAAAA,YACzBC,GAAkB,CAClBN,EAAe,CACd,GAAGD,EAAQ,OAAQQ,GAAWA,EAAO,KAAO,MAAM,EAClD,CAAE,GAAI,OAAQ,MAAO,OAAQ,MAAAD,CAAA,CAAM,CACnC,CACF,EACA,CAACP,EAASC,CAAc,CAAA,EAGnBS,EAAYC,EAAAA,QACjB,IAAMX,EAAQ,KAAMY,GAAQA,EAAI,KAAO,MAAM,GAAG,MAChD,CAACZ,CAAO,CAAA,EAGHa,EAAYF,EAAAA,QACjB,IAAMX,EAAQ,KAAMY,GAAQA,EAAI,KAAO,MAAM,GAAG,MAChD,CAACZ,CAAO,CAAA,EAET,OACCc,EAAAA,KAAC,MAAA,CACA,cAAY,kBACZ,UAAU,oCAEV,SAAA,CAAAC,EAAAA,IAAC,OACA,SAAAD,OAACE,EAAA,CAAW,QAAQ,OAAO,UAAU,gCACnC,SAAA,CAAAd,EAAW,IAAEe,EAAUf,EAAY,UAAU,CAAA,CAAA,CAC/C,CAAA,CACD,EACAY,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAACG,EAAA,CACA,cAAY,eACZ,aAAcL,EACd,YAAY,mBACZ,SAAWM,GAAMd,EAAmBc,EAAE,OAAO,KAAK,CAAA,CAAA,EAGnDL,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAA,EAAAA,KAACM,EAAA,CACA,cAAY,cACZ,MAAOV,EACP,cAAeD,EAEf,SAAA,CAAAM,EAAAA,IAACM,GAAc,aAAW,gBACzB,eAACC,EAAA,CAAY,YAAY,OAAO,CAAA,CACjC,EACAP,EAAAA,IAACQ,EAAA,CACC,SAAAzB,EAAoB,IAAI,CAAC,CAAE,MAAAS,EAAO,MAAAiB,CAAA,UACjCC,EAAA,CAAuB,MAAAlB,EACtB,SAAAiB,CAAA,EADejB,CAEjB,CACA,CAAA,CACF,CAAA,CAAA,CAAA,QAEA,MAAA,CACA,SAAAO,EAAAA,KAACY,EAAA,CACA,KAAK,SACL,aAAcvB,EACd,cAAgBI,GAAkBH,EAAeG,CAAK,EAEtD,SAAA,CAAAQ,EAAAA,IAACY,EAAA,CAAgB,cAAY,cAAc,MAAM,OAChD,SAAAZ,EAAAA,IAACa,EAAA,CAAK,GAAG,YAAA,CAAa,CAAA,CACvB,EACAb,EAAAA,IAACY,EAAA,CAAgB,cAAY,cAAc,MAAM,OAChD,SAAAZ,EAAAA,IAACa,EAAA,CAAK,GAAG,cAAA,CAAe,CAAA,CACzB,CAAA,CAAA,CAAA,CACD,CACD,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CAAA,CAAA,CAGH,ECjHaC,EAAkB,IAE7Bf,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACd,SAAAA,EAAAA,IAACe,GACA,SAAAf,EAAAA,IAACgB,EAAA,CACA,SAAAhB,MAACiB,EAAA,CAAe,UAAU,wBAAwB,SAAA,YAElD,CAAA,CACD,EACD,EACD,EACAjB,EAAAA,IAACkB,EAAA,CAAS,GAAG,kBAAkB,MAAM,eAAA,CAAgB,CAAA,EACtD,ECXWC,EAAsB,IAClCpB,EAAAA,KAACqB,EAAA,CACA,SAAA,CAAApB,EAAAA,IAAC,OAAI,UAAU,0BACd,eAACqB,EAAA,CAAe,GAAG,QAAQ,CAAA,CAC5B,EACArB,EAAAA,IAACsB,GAAgB,SAAA,mCAAA,CAAiC,EAClDtB,EAAAA,IAACuB,GAAsB,SAAA,gGAAA,CAGvB,QACCC,EAAA,CACA,SAAAxB,EAAAA,IAACkB,EAAA,CAAS,GAAG,kBAAkB,CAAA,CAChC,CAAA,EACD,ECNYO,EAAgB,CAAC,CAC7B,QAAAxC,EACA,eAAAC,EACA,cAAAwC,EACA,eAAAC,CACD,IAA0B,CACzB,KAAM,CAACvC,EAAaC,CAAc,EAAIuC,EACrC,uBACA,MAAA,EAGKC,EAAYjC,EAAAA,QAAQ,IAClBR,IAAgB,OACpB,uDACA,cACD,CAACA,CAAW,CAAC,EAEV0C,EAAwBlC,EAAAA,QAC7B,IAEC8B,EAAc,OAAO,CAACK,EAAKC,KACrBD,EAAI,KAAME,GAAMA,EAAE,MAAQD,EAAS,GAAG,GAC1CD,EAAI,KAAKC,CAAQ,EAEXD,GACL,CAAA,CAAgB,EACpB,CAACL,CAAa,CAAA,EAGf,OACC3B,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAACc,EAAA,EAAgB,EACjBd,EAAAA,IAAChB,EAAA,CACA,QAAAC,EACA,eAAAC,EACA,WAAYyC,EACZ,eAAAtC,EACA,YAAAD,CAAA,CAAA,EAGA0C,EAAsB,SAAW,EACjC9B,EAAAA,IAACmB,IAAoB,EAErBnB,MAAC,OAAI,UAAW6B,EACd,WAAsB,IAAKG,GAC3BhC,MAACkC,EAAA,CAA+B,SAAAF,GAAbA,EAAS,EAAwB,CACpD,CAAA,CACF,CAAA,EAEF,CAEF,ECvBMG,EACLC,IACsB,CACtBC,UAAW,CACVC,SAAU,OACVC,KAAM,CACLC,KAAMJ,GAAQG,MAAQH,GAAQG,OAAS,MAAQ,CAACH,EAAOG,IAAI,EAAIE,MAAAA,EAEhEC,IAAK,CACJC,MAAOP,GAAQQ,MAAQ,EAAA,CACxB,EAEDC,KAAM,eACNC,OAAQ,CACT,GAiBMC,EAAYA,IAAM,CACvB,MAAMX,EAASY,EAAMC,UAAAA,EACfC,EAAWF,EAAMG,YAAAA,EAEjBlE,EAAUW,EAAAA,QACf,IAAM,CACL,CAAEwD,GAAI,OAAQ3C,MAAO,OAAQjB,MAAO4C,EAAOG,MAAQ,KAAA,EACnD,CAAEa,GAAI,OAAQ3C,MAAO,OAAQjB,MAAO4C,EAAOQ,IAAAA,CAAM,EAElD,CAACR,EAAOG,KAAMH,EAAOQ,IAAI,CAC1B,EAEM1D,EAAiBmE,EACtB9D,EAAAA,YACE+D,GAA6B,CACxBA,GACAJ,EAAS,CACbK,GAAI,IACJnB,OAAQA,IACPkB,EACE7D,OAAQA,GAAWA,EAAOD,KAAK,EAC/BgE,OACA,CAACC,EAAMC,KACDA,EAAKlE,QACViE,EAAKC,EAAKN,EAAE,EAAIM,EAAKlE,OACdiE,GAER,CAAA,CACD,EACFE,QAAS,EAAA,CACT,CACF,EACA,CAACT,CAAQ,CACV,EACA,GACD,EAEA,MAAO,CAAEjE,QAAAA,EAASC,eAAAA,CAAAA,CACnB,EAEA,SAAS0E,IAAiB,CACzB,MAAMxB,EAASY,EAAMC,UAAAA,EACf,CAAEhE,QAAAA,EAASC,eAAAA,CAAAA,EAAmB6D,EAAAA,EAE9B,CAAC,CAAEc,KAAMlC,CAAAA,EAAkB,CAAEkC,KAAMnC,CAAAA,CAAe,EACvDoC,EAAmB,CAClBC,QAAS,CACRC,EAAyB7B,EAAgBC,CAAM,CAAC,EAChD6B,EAAwB9B,EAAgBC,CAAM,CAAC,CAAC,CAAA,CAEjD,EAEF,OACCpC,EAAAA,IAACyB,EAAA,CACA,QAAAxC,EACA,eAAAC,EACA,eAAAyC,EACA,cAAAD,EAA6B,CAGhC"}
@@ -1,2 +1,2 @@
1
- import{j as s,L as r,p as n}from"./vendor-tanstack-CLpbOGYv.js";import{E as l,t as m,v as c,w as d,x,q as p,I as u,D as j,br as g,al as h,C as f,B as A,g as y,h as b,bs as D}from"./index-BZqccBpn.js";import{D as N}from"./delete-confirmation-dialog-D18TITKv.js";import{u as v,A as S,a as E,b as B,c as C,d as L}from"./use-delete-automation-confirmation-dialog-DnRkM1Cj.js";import{A as k}from"./automations-header-CdJSlWw8.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CP6hQtRc.js";import"./vendor-recharts-BOcghvr2.js";import"./vendor-forms-mroZAMaw.js";import"./vendor-date-Bxa7CHB1.js";import"./work-queue-icon-text-DnQAtUi_.js";import"./index-faXvGo5k.js";import"./dropdown-menu-g64QiYKu.js";import"./use-delete-confirmation-dialog-Bka9YDdO.js";const I=()=>s.jsxs(l,{children:[s.jsx(m,{id:"Bot"}),s.jsx(c,{children:"Create an automation to get started"}),s.jsx(d,{children:"Automations bring reactivity to your data stack and let you configure triggers and actions based on events."}),s.jsxs(x,{children:[s.jsx(r,{to:"/automations/create",children:s.jsxs(p,{children:["Add Automation ",s.jsx(u,{id:"Plus",className:"size-4 ml-2"})]})}),s.jsx(j,{id:"automations-guide"})]})]}),T=()=>{const[e,i]=v(),{data:a}=n(g()),o=t=>i(t);return s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex flex-col gap-4",children:[s.jsx(k,{}),a.length===0?s.jsx(I,{}):s.jsxs("div",{className:"flex flex-col gap-4",children:[s.jsxs(h,{variant:"bodySmall",className:"text-muted-foreground",children:[a.length," ",`${a.length===1?"automation":"automations"}`]}),s.jsx("ul",{className:"flex flex-col gap-2",children:a.map(t=>s.jsx("li",{"aria-label":`automation item ${t.name}`,children:s.jsx($,{automation:t,onDelete:()=>o(t)})},t.id))})]})]}),s.jsx(N,{...e})]})},$=({automation:e,onDelete:i})=>s.jsxs(f,{className:"p-4 pt-5 flex flex-col gap-6",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx(w,{automation:e}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(S,{automation:e}),s.jsx(E,{id:e.id,onDelete:i})]})]}),s.jsxs("div",{className:"flex flex-col gap-4",children:[e.description&&s.jsx(B,{automation:e}),s.jsx(C,{automation:e}),s.jsx(L,{automation:e})]})]}),w=({automation:e})=>s.jsx(A,{children:s.jsx(y,{children:s.jsx(b,{className:"text-xl",children:s.jsx(D,{to:"/automations/automation/$id",params:{id:e.id},className:"text-lg",children:e.name})})})}),W=T;export{W as component};
2
- //# sourceMappingURL=index-KlV75baW.js.map
1
+ import{j as s,L as r,s as n}from"./vendor-tanstack-CWDKYA_B.js";import{E as l,t as m,v as c,w as d,x,q as p,I as u,D as j,br as g,al as h,C as f,B as A,g as y,h as b,bs as D}from"./index-DLuXqHi9.js";import{D as N}from"./delete-confirmation-dialog-DCmC1ZTD.js";import{u as v,A as S,a as E,b as B,c as C,d as L}from"./use-delete-automation-confirmation-dialog-CRGV6wvn.js";import{A as k}from"./automations-header-H_FW9LY7.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-DRMjKWJW.js";import"./vendor-recharts-BGjDGXVf.js";import"./vendor-forms-D-iybWES.js";import"./vendor-date-CRz8gtWZ.js";import"./work-queue-icon-text-4iEAtZOh.js";import"./index-BmdTLblr.js";import"./dropdown-menu-Bhox1zoa.js";import"./use-delete-confirmation-dialog-C5d6hPL-.js";const I=()=>s.jsxs(l,{children:[s.jsx(m,{id:"Bot"}),s.jsx(c,{children:"Create an automation to get started"}),s.jsx(d,{children:"Automations bring reactivity to your data stack and let you configure triggers and actions based on events."}),s.jsxs(x,{children:[s.jsx(r,{to:"/automations/create",children:s.jsxs(p,{children:["Add Automation ",s.jsx(u,{id:"Plus",className:"size-4 ml-2"})]})}),s.jsx(j,{id:"automations-guide"})]})]}),T=()=>{const[e,i]=v(),{data:a}=n(g()),o=t=>i(t);return s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex flex-col gap-4",children:[s.jsx(k,{}),a.length===0?s.jsx(I,{}):s.jsxs("div",{className:"flex flex-col gap-4",children:[s.jsxs(h,{variant:"bodySmall",className:"text-muted-foreground",children:[a.length," ",`${a.length===1?"automation":"automations"}`]}),s.jsx("ul",{className:"flex flex-col gap-2",children:a.map(t=>s.jsx("li",{"aria-label":`automation item ${t.name}`,children:s.jsx($,{automation:t,onDelete:()=>o(t)})},t.id))})]})]}),s.jsx(N,{...e})]})},$=({automation:e,onDelete:i})=>s.jsxs(f,{className:"p-4 pt-5 flex flex-col gap-6",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx(w,{automation:e}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(S,{automation:e}),s.jsx(E,{id:e.id,onDelete:i})]})]}),s.jsxs("div",{className:"flex flex-col gap-4",children:[e.description&&s.jsx(B,{automation:e}),s.jsx(C,{automation:e}),s.jsx(L,{automation:e})]})]}),w=({automation:e})=>s.jsx(A,{children:s.jsx(y,{children:s.jsx(b,{className:"text-xl",children:s.jsx(D,{to:"/automations/automation/$id",params:{id:e.id},className:"text-lg",children:e.name})})})}),W=T;export{W as component};
2
+ //# sourceMappingURL=index-5fQrQZ3K.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-KlV75baW.js","sources":["../../src/components/automations/automations-empty-state/automations-empty-state.tsx","../../src/components/automations/automations-page.tsx","../../src/routes/automations/index.tsx?tsr-split=component"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const AutomationsEmptyState = () => {\n\treturn (\n\t\t<EmptyState>\n\t\t\t<EmptyStateIcon id=\"Bot\" />\n\t\t\t<EmptyStateTitle>Create an automation to get started</EmptyStateTitle>\n\t\t\t<EmptyStateDescription>\n\t\t\t\tAutomations bring reactivity to your data stack and let you configure\n\t\t\t\ttriggers and actions based on events.\n\t\t\t</EmptyStateDescription>\n\t\t\t<EmptyStateActions>\n\t\t\t\t<Link to=\"/automations/create\">\n\t\t\t\t\t<Button>\n\t\t\t\t\t\tAdd Automation <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</Link>\n\t\t\t\t<DocsLink id=\"automations-guide\" />\n\t\t\t</EmptyStateActions>\n\t\t</EmptyState>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { type Automation, buildListAutomationsQuery } from \"@/api/automations\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Card } from \"@/components/ui/card\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { Typography } from \"../ui/typography\";\nimport {\n\tAutomationActions,\n\tAutomationDescription,\n\tAutomationTrigger,\n} from \"./automation-details\";\nimport { AutomationEnableToggle } from \"./automation-enable-toggle\";\nimport { AutomationsActionsMenu } from \"./automations-actions-menu\";\nimport { AutomationsEmptyState } from \"./automations-empty-state\";\nimport { AutomationsHeader } from \"./automations-header\";\nimport { useDeleteAutomationConfirmationDialog } from \"./use-delete-automation-confirmation-dialog\";\n\nexport const AutomationsPage = () => {\n\tconst [dialogState, confirmDelete] = useDeleteAutomationConfirmationDialog();\n\tconst { data } = useSuspenseQuery(buildListAutomationsQuery());\n\n\tconst handleDelete = (automation: Automation) => confirmDelete(automation);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<AutomationsHeader />\n\t\t\t\t{data.length === 0 ? (\n\t\t\t\t\t<AutomationsEmptyState />\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{data.length}{\" \"}\n\t\t\t\t\t\t\t{`${data.length === 1 ? \"automation\" : \"automations\"}`}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t{data.map((automation) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={automation.id}\n\t\t\t\t\t\t\t\t\taria-label={`automation item ${automation.name}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<AutomationCardDetails\n\t\t\t\t\t\t\t\t\t\tautomation={automation}\n\t\t\t\t\t\t\t\t\t\tonDelete={() => handleDelete(automation)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n\ntype AutomationCardDetailsProps = {\n\tautomation: Automation;\n\tonDelete: () => void;\n};\nconst AutomationCardDetails = ({\n\tautomation,\n\tonDelete,\n}: AutomationCardDetailsProps) => {\n\treturn (\n\t\t<Card className=\"p-4 pt-5 flex flex-col gap-6\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<NavHeader automation={automation} />\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<AutomationEnableToggle automation={automation} />\n\t\t\t\t\t<AutomationsActionsMenu id={automation.id} onDelete={onDelete} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t{automation.description && (\n\t\t\t\t\t<AutomationDescription automation={automation} />\n\t\t\t\t)}\n\t\t\t\t<AutomationTrigger automation={automation} />\n\t\t\t\t<AutomationActions automation={automation} />\n\t\t\t</div>\n\t\t</Card>\n\t);\n};\n\ntype NavHeaderProps = {\n\tautomation: Automation;\n};\n\nconst NavHeader = ({ automation }: NavHeaderProps) => {\n\treturn (\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\tto=\"/automations/automation/$id\"\n\t\t\t\t\t\tparams={{ id: automation.id }}\n\t\t\t\t\t\tclassName=\"text-lg\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{automation.name}\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { buildListAutomationsQuery } from \"@/api/automations\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { AutomationsHeader } from \"@/components/automations/automations-header\";\nimport { AutomationsPage } from \"@/components/automations/automations-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nfunction AutomationsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load automations\");\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<AutomationsHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\n// nb: Currently there is no filtering or search params used on this page\nexport const Route = createFileRoute(\"/automations/\")({\n\tcomponent: AutomationsPage,\n\terrorComponent: AutomationsErrorComponent,\n\tloader: ({ context }) =>\n\t\tcontext.queryClient.ensureQueryData(buildListAutomationsQuery()),\n\twrapInSuspense: true,\n});\n"],"names":["AutomationsEmptyState","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","Link","jsxs","Button","Icon","DocsLink","AutomationsPage","dialogState","confirmDelete","useDeleteAutomationConfirmationDialog","data","useSuspenseQuery","buildListAutomationsQuery","handleDelete","automation","Fragment","AutomationsHeader","Typography","AutomationCardDetails","DeleteConfirmationDialog","onDelete","Card","NavHeader","AutomationEnableToggle","AutomationsActionsMenu","AutomationDescription","AutomationTrigger","AutomationActions","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","SplitComponent"],"mappings":"0vBAYO,MAAMA,EAAwB,WAElCC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAe,GAAG,KAAA,CAAM,EACzBD,EAAAA,IAACE,GAAgB,SAAA,qCAAA,CAAmC,EACpDF,EAAAA,IAACG,GAAsB,SAAA,6GAAA,CAGvB,SACCC,EAAA,CACA,SAAA,CAAAJ,MAACK,EAAA,CAAK,GAAG,sBACR,SAAAC,EAAAA,KAACC,EAAA,CAAO,SAAA,CAAA,kBACQP,EAAAA,IAACQ,EAAA,CAAK,GAAG,OAAO,UAAU,aAAA,CAAc,CAAA,CAAA,CACxD,CAAA,CACD,EACAR,EAAAA,IAACS,EAAA,CAAS,GAAG,mBAAA,CAAoB,CAAA,CAAA,CAClC,CAAA,EACD,ECPWC,EAAkB,IAAM,CACpC,KAAM,CAACC,EAAaC,CAAa,EAAIC,EAAA,EAC/B,CAAE,KAAAC,CAAA,EAASC,EAAiBC,GAA2B,EAEvDC,EAAgBC,GAA2BN,EAAcM,CAAU,EAEzE,OACCZ,EAAAA,KAAAa,WAAA,CACC,SAAA,CAAAb,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAN,EAAAA,IAACoB,EAAA,EAAkB,EAClBN,EAAK,SAAW,EAChBd,EAAAA,IAACF,IAAsB,EAEvBQ,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAA,EAAAA,KAACe,EAAA,CAAW,QAAQ,YAAY,UAAU,wBACxC,SAAA,CAAAP,EAAK,OAAQ,IACb,GAAGA,EAAK,SAAW,EAAI,aAAe,aAAa,EAAA,EACrD,QACC,KAAA,CAAG,UAAU,sBACZ,SAAAA,EAAK,IAAKI,GACVlB,EAAAA,IAAC,KAAA,CAEA,aAAY,mBAAmBkB,EAAW,IAAI,GAE9C,SAAAlB,EAAAA,IAACsB,EAAA,CACA,WAAAJ,EACA,SAAU,IAAMD,EAAaC,CAAU,CAAA,CAAA,CACxC,EANKA,EAAW,EAAA,CAQjB,CAAA,CACF,CAAA,CAAA,CACD,CAAA,EAEF,EACAlB,MAACuB,EAAA,CAA0B,GAAGZ,CAAA,CAAa,CAAA,EAC5C,CAEF,EAMMW,EAAwB,CAAC,CAC9B,WAAAJ,EACA,SAAAM,CACD,IAEElB,EAAAA,KAACmB,EAAA,CAAK,UAAU,+BACf,SAAA,CAAAnB,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAN,MAAC0B,GAAU,WAAAR,EAAwB,EACnCZ,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAN,MAAC2B,GAAuB,WAAAT,EAAwB,EAChDlB,EAAAA,IAAC4B,EAAA,CAAuB,GAAIV,EAAW,GAAI,SAAAM,CAAA,CAAoB,CAAA,CAAA,CAChE,CAAA,EACD,EACAlB,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAY,EAAW,aACXlB,EAAAA,IAAC6B,EAAA,CAAsB,WAAAX,CAAA,CAAwB,EAEhDlB,MAAC8B,GAAkB,WAAAZ,EAAwB,EAC3ClB,MAAC+B,GAAkB,WAAAb,CAAA,CAAwB,CAAA,CAAA,CAC5C,CAAA,EACD,EAQIQ,EAAY,CAAC,CAAE,WAAAR,WAElBc,EAAA,CACA,SAAAhC,EAAAA,IAACiC,GACA,SAAAjC,EAAAA,IAACkC,EAAA,CAAe,UAAU,UACzB,SAAAlC,EAAAA,IAACmC,EAAA,CACA,GAAG,8BACH,OAAQ,CAAE,GAAIjB,EAAW,EAAA,EACzB,UAAU,UAET,SAAAA,EAAW,IAAA,CAAA,CACb,CACD,EACD,EACD,EC/EFkB,EAvBS1B"}
1
+ {"version":3,"file":"index-5fQrQZ3K.js","sources":["../../src/components/automations/automations-empty-state/automations-empty-state.tsx","../../src/components/automations/automations-page.tsx","../../src/routes/automations/index.tsx?tsr-split=component"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const AutomationsEmptyState = () => {\n\treturn (\n\t\t<EmptyState>\n\t\t\t<EmptyStateIcon id=\"Bot\" />\n\t\t\t<EmptyStateTitle>Create an automation to get started</EmptyStateTitle>\n\t\t\t<EmptyStateDescription>\n\t\t\t\tAutomations bring reactivity to your data stack and let you configure\n\t\t\t\ttriggers and actions based on events.\n\t\t\t</EmptyStateDescription>\n\t\t\t<EmptyStateActions>\n\t\t\t\t<Link to=\"/automations/create\">\n\t\t\t\t\t<Button>\n\t\t\t\t\t\tAdd Automation <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</Link>\n\t\t\t\t<DocsLink id=\"automations-guide\" />\n\t\t\t</EmptyStateActions>\n\t\t</EmptyState>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { type Automation, buildListAutomationsQuery } from \"@/api/automations\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Card } from \"@/components/ui/card\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { Typography } from \"../ui/typography\";\nimport {\n\tAutomationActions,\n\tAutomationDescription,\n\tAutomationTrigger,\n} from \"./automation-details\";\nimport { AutomationEnableToggle } from \"./automation-enable-toggle\";\nimport { AutomationsActionsMenu } from \"./automations-actions-menu\";\nimport { AutomationsEmptyState } from \"./automations-empty-state\";\nimport { AutomationsHeader } from \"./automations-header\";\nimport { useDeleteAutomationConfirmationDialog } from \"./use-delete-automation-confirmation-dialog\";\n\nexport const AutomationsPage = () => {\n\tconst [dialogState, confirmDelete] = useDeleteAutomationConfirmationDialog();\n\tconst { data } = useSuspenseQuery(buildListAutomationsQuery());\n\n\tconst handleDelete = (automation: Automation) => confirmDelete(automation);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<AutomationsHeader />\n\t\t\t\t{data.length === 0 ? (\n\t\t\t\t\t<AutomationsEmptyState />\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{data.length}{\" \"}\n\t\t\t\t\t\t\t{`${data.length === 1 ? \"automation\" : \"automations\"}`}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t{data.map((automation) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={automation.id}\n\t\t\t\t\t\t\t\t\taria-label={`automation item ${automation.name}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<AutomationCardDetails\n\t\t\t\t\t\t\t\t\t\tautomation={automation}\n\t\t\t\t\t\t\t\t\t\tonDelete={() => handleDelete(automation)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n\ntype AutomationCardDetailsProps = {\n\tautomation: Automation;\n\tonDelete: () => void;\n};\nconst AutomationCardDetails = ({\n\tautomation,\n\tonDelete,\n}: AutomationCardDetailsProps) => {\n\treturn (\n\t\t<Card className=\"p-4 pt-5 flex flex-col gap-6\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<NavHeader automation={automation} />\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<AutomationEnableToggle automation={automation} />\n\t\t\t\t\t<AutomationsActionsMenu id={automation.id} onDelete={onDelete} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t{automation.description && (\n\t\t\t\t\t<AutomationDescription automation={automation} />\n\t\t\t\t)}\n\t\t\t\t<AutomationTrigger automation={automation} />\n\t\t\t\t<AutomationActions automation={automation} />\n\t\t\t</div>\n\t\t</Card>\n\t);\n};\n\ntype NavHeaderProps = {\n\tautomation: Automation;\n};\n\nconst NavHeader = ({ automation }: NavHeaderProps) => {\n\treturn (\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\tto=\"/automations/automation/$id\"\n\t\t\t\t\t\tparams={{ id: automation.id }}\n\t\t\t\t\t\tclassName=\"text-lg\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{automation.name}\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { buildListAutomationsQuery } from \"@/api/automations\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { AutomationsHeader } from \"@/components/automations/automations-header\";\nimport { AutomationsPage } from \"@/components/automations/automations-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nfunction AutomationsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load automations\");\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<AutomationsHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\n// nb: Currently there is no filtering or search params used on this page\nexport const Route = createFileRoute(\"/automations/\")({\n\tcomponent: AutomationsPage,\n\terrorComponent: AutomationsErrorComponent,\n\tloader: ({ context }) =>\n\t\tcontext.queryClient.ensureQueryData(buildListAutomationsQuery()),\n\twrapInSuspense: true,\n});\n"],"names":["AutomationsEmptyState","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","Link","jsxs","Button","Icon","DocsLink","AutomationsPage","dialogState","confirmDelete","useDeleteAutomationConfirmationDialog","data","useSuspenseQuery","buildListAutomationsQuery","handleDelete","automation","Fragment","AutomationsHeader","Typography","AutomationCardDetails","DeleteConfirmationDialog","onDelete","Card","NavHeader","AutomationEnableToggle","AutomationsActionsMenu","AutomationDescription","AutomationTrigger","AutomationActions","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","SplitComponent"],"mappings":"0vBAYO,MAAMA,EAAwB,WAElCC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAe,GAAG,KAAA,CAAM,EACzBD,EAAAA,IAACE,GAAgB,SAAA,qCAAA,CAAmC,EACpDF,EAAAA,IAACG,GAAsB,SAAA,6GAAA,CAGvB,SACCC,EAAA,CACA,SAAA,CAAAJ,MAACK,EAAA,CAAK,GAAG,sBACR,SAAAC,EAAAA,KAACC,EAAA,CAAO,SAAA,CAAA,kBACQP,EAAAA,IAACQ,EAAA,CAAK,GAAG,OAAO,UAAU,aAAA,CAAc,CAAA,CAAA,CACxD,CAAA,CACD,EACAR,EAAAA,IAACS,EAAA,CAAS,GAAG,mBAAA,CAAoB,CAAA,CAAA,CAClC,CAAA,EACD,ECPWC,EAAkB,IAAM,CACpC,KAAM,CAACC,EAAaC,CAAa,EAAIC,EAAA,EAC/B,CAAE,KAAAC,CAAA,EAASC,EAAiBC,GAA2B,EAEvDC,EAAgBC,GAA2BN,EAAcM,CAAU,EAEzE,OACCZ,EAAAA,KAAAa,WAAA,CACC,SAAA,CAAAb,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAN,EAAAA,IAACoB,EAAA,EAAkB,EAClBN,EAAK,SAAW,EAChBd,EAAAA,IAACF,IAAsB,EAEvBQ,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAA,EAAAA,KAACe,EAAA,CAAW,QAAQ,YAAY,UAAU,wBACxC,SAAA,CAAAP,EAAK,OAAQ,IACb,GAAGA,EAAK,SAAW,EAAI,aAAe,aAAa,EAAA,EACrD,QACC,KAAA,CAAG,UAAU,sBACZ,SAAAA,EAAK,IAAKI,GACVlB,EAAAA,IAAC,KAAA,CAEA,aAAY,mBAAmBkB,EAAW,IAAI,GAE9C,SAAAlB,EAAAA,IAACsB,EAAA,CACA,WAAAJ,EACA,SAAU,IAAMD,EAAaC,CAAU,CAAA,CAAA,CACxC,EANKA,EAAW,EAAA,CAQjB,CAAA,CACF,CAAA,CAAA,CACD,CAAA,EAEF,EACAlB,MAACuB,EAAA,CAA0B,GAAGZ,CAAA,CAAa,CAAA,EAC5C,CAEF,EAMMW,EAAwB,CAAC,CAC9B,WAAAJ,EACA,SAAAM,CACD,IAEElB,EAAAA,KAACmB,EAAA,CAAK,UAAU,+BACf,SAAA,CAAAnB,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAN,MAAC0B,GAAU,WAAAR,EAAwB,EACnCZ,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAN,MAAC2B,GAAuB,WAAAT,EAAwB,EAChDlB,EAAAA,IAAC4B,EAAA,CAAuB,GAAIV,EAAW,GAAI,SAAAM,CAAA,CAAoB,CAAA,CAAA,CAChE,CAAA,EACD,EACAlB,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAY,EAAW,aACXlB,EAAAA,IAAC6B,EAAA,CAAsB,WAAAX,CAAA,CAAwB,EAEhDlB,MAAC8B,GAAkB,WAAAZ,EAAwB,EAC3ClB,MAAC+B,GAAkB,WAAAb,CAAA,CAAwB,CAAA,CAAA,CAC5C,CAAA,EACD,EAQIQ,EAAY,CAAC,CAAE,WAAAR,WAElBc,EAAA,CACA,SAAAhC,EAAAA,IAACiC,GACA,SAAAjC,EAAAA,IAACkC,EAAA,CAAe,UAAU,UACzB,SAAAlC,EAAAA,IAACmC,EAAA,CACA,GAAG,8BACH,OAAQ,CAAE,GAAIjB,EAAW,EAAA,EACzB,UAAU,UAET,SAAAA,EAAW,IAAA,CAAA,CACb,CACD,EACD,EACD,EC/EFkB,EAvBS1B"}
@@ -0,0 +1,2 @@
1
+ import{j as o}from"./vendor-tanstack-CWDKYA_B.js";import{s}from"./index-DLuXqHi9.js";import{R as i}from"./route-error-state-DzKu_Iw_.js";import{W as m}from"./header-C5liWcfp.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-DRMjKWJW.js";import"./vendor-recharts-BGjDGXVf.js";import"./vendor-forms-D-iybWES.js";import"./vendor-date-CRz8gtWZ.js";function E({error:e,reset:t}){const r=s(e,"Failed to load work pools");if(r.type!=="server-error"&&r.type!=="client-error")throw e;return o.jsxs("div",{className:"flex flex-col gap-4",children:[o.jsx(m,{}),o.jsx(i,{error:r,onRetry:t})]})}export{E as errorComponent};
2
+ //# sourceMappingURL=index-7bWZ2Znt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CqvGvZOq.js","sources":["../../src/routes/work-pools/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useMemo, useState } from \"react\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport {\n\tbuildCountWorkPoolsQuery,\n\tbuildFilterWorkPoolsQuery,\n} from \"@/api/work-pools\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\nimport { WorkPoolsEmptyState } from \"@/components/work-pools/empty-state\";\nimport { WorkPoolsPageHeader } from \"@/components/work-pools/header\";\nimport { WorkPoolCard } from \"@/components/work-pools/work-pool-card/work-pool-card\";\nimport { pluralize } from \"@/utils\";\n\nfunction WorkPoolsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load work pools\");\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<WorkPoolsPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/work-pools/\")({\n\tcomponent: RouteComponent,\n\terrorComponent: WorkPoolsErrorComponent,\n\tloader: ({ context }) => {\n\t\tvoid context.queryClient.ensureQueryData(buildCountWorkPoolsQuery());\n\t\tvoid context.queryClient.ensureQueryData(\n\t\t\tbuildFilterWorkPoolsQuery({\n\t\t\t\tlimit: 200,\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst [searchTerm, setSearchTerm] = useState(\"\");\n\n\tconst { data: workPoolCount = 0 } = useSuspenseQuery(\n\t\tbuildCountWorkPoolsQuery(),\n\t);\n\n\tconst { data: workPools = [] } = useSuspenseQuery(\n\t\tbuildFilterWorkPoolsQuery({\n\t\t\tlimit: 200,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools.filter((workPool) =>\n\t\t\t[\n\t\t\t\tworkPool.name,\n\t\t\t\tworkPool.description,\n\t\t\t\tworkPool.type,\n\t\t\t\tJSON.stringify(workPool.base_job_template),\n\t\t\t\tworkPool.id,\n\t\t\t\tworkPool.default_queue_id,\n\t\t\t\tworkPool.status,\n\t\t\t]\n\t\t\t\t.join(\" \")\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(searchTerm.toLowerCase()),\n\t\t);\n\t}, [workPools, searchTerm]);\n\n\tconst handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearchTerm(event.target.value);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<WorkPoolsPageHeader />\n\t\t\t{workPoolCount < 1 ? (\n\t\t\t\t<WorkPoolsEmptyState />\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex items-end justify-between\">\n\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{workPoolCount} {pluralize(workPoolCount, \"work pool\")}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\tplaceholder=\"Search work pools...\"\n\t\t\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t{filteredWorkPools.map((workPool) => (\n\t\t\t\t\t\t\t<WorkPoolCard key={workPool.id} workPool={workPool} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["WorkPoolsErrorComponent","error","reset","serverError","categorizeError","type","jsxs","jsx","WorkPoolsPageHeader","RouteErrorState"],"mappings":"mWAgBA,SAASA,EAAwB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACvE,MAAMC,EAAcC,EAAgBH,EAAO,2BAA2B,EAItE,GACCE,EAAYE,OAAS,gBACrBF,EAAYE,OAAS,eAErB,MAAMJ,EAGP,OACCK,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAmB,EACpBD,EAAAA,IAACE,EAAA,CAAgB,MAAON,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
1
+ {"version":3,"file":"index-7bWZ2Znt.js","sources":["../../src/routes/work-pools/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { useMemo, useState } from \"react\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport {\n\tbuildCountWorkPoolsQuery,\n\tbuildFilterWorkPoolsQuery,\n} from \"@/api/work-pools\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\nimport { WorkPoolsEmptyState } from \"@/components/work-pools/empty-state\";\nimport { WorkPoolsPageHeader } from \"@/components/work-pools/header\";\nimport { WorkPoolCard } from \"@/components/work-pools/work-pool-card/work-pool-card\";\nimport { pluralize } from \"@/utils\";\n\nfunction WorkPoolsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load work pools\");\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<WorkPoolsPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/work-pools/\")({\n\tcomponent: RouteComponent,\n\terrorComponent: WorkPoolsErrorComponent,\n\tloader: ({ context }) => {\n\t\tvoid context.queryClient.ensureQueryData(buildCountWorkPoolsQuery());\n\t\tvoid context.queryClient.ensureQueryData(\n\t\t\tbuildFilterWorkPoolsQuery({\n\t\t\t\tlimit: 200,\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst [searchTerm, setSearchTerm] = useState(\"\");\n\n\tconst { data: workPoolCount = 0 } = useSuspenseQuery(\n\t\tbuildCountWorkPoolsQuery(),\n\t);\n\n\tconst { data: workPools = [] } = useSuspenseQuery(\n\t\tbuildFilterWorkPoolsQuery({\n\t\t\tlimit: 200,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools.filter((workPool) =>\n\t\t\t[\n\t\t\t\tworkPool.name,\n\t\t\t\tworkPool.description,\n\t\t\t\tworkPool.type,\n\t\t\t\tJSON.stringify(workPool.base_job_template),\n\t\t\t\tworkPool.id,\n\t\t\t\tworkPool.default_queue_id,\n\t\t\t\tworkPool.status,\n\t\t\t]\n\t\t\t\t.join(\" \")\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(searchTerm.toLowerCase()),\n\t\t);\n\t}, [workPools, searchTerm]);\n\n\tconst handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearchTerm(event.target.value);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<WorkPoolsPageHeader />\n\t\t\t{workPoolCount < 1 ? (\n\t\t\t\t<WorkPoolsEmptyState />\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex items-end justify-between\">\n\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{workPoolCount} {pluralize(workPoolCount, \"work pool\")}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\tplaceholder=\"Search work pools...\"\n\t\t\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t{filteredWorkPools.map((workPool) => (\n\t\t\t\t\t\t\t<WorkPoolCard key={workPool.id} workPool={workPool} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["WorkPoolsErrorComponent","error","reset","serverError","categorizeError","type","jsxs","jsx","WorkPoolsPageHeader","RouteErrorState"],"mappings":"mWAgBA,SAASA,EAAwB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACvE,MAAMC,EAAcC,EAAgBH,EAAO,2BAA2B,EAItE,GACCE,EAAYE,OAAS,gBACrBF,EAAYE,OAAS,eAErB,MAAMJ,EAGP,OACCK,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAmB,EACpBD,EAAAA,IAACE,EAAA,CAAgB,MAAON,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
@@ -1,2 +1,2 @@
1
- import{j as e,L as C,s as y,r as m,C as z,D as U,m as q,p as A}from"./vendor-tanstack-CLpbOGYv.js";import{aM as W,aN as _,aO as B,aP as P,aQ as Q,N as O,aR as Y,aS as L,q as H,I as V,y as Z,ak as E,O as G,S as J,a as X,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,aT as h,aU as F,aV as D}from"./index-BZqccBpn.js";import{D as me}from"./data-table-Bfa8_ZJd.js";import{T as pe}from"./tags-input-CDvuqe9B.js";import{D as ge,a as fe,b as he,c as xe,d as R,e as we}from"./dropdown-menu-g64QiYKu.js";import{Y as ye}from"./vendor-date-Bxa7CHB1.js";import{o as je,e as Se,a as _e,n as I,s as M}from"./vendor-forms-mroZAMaw.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CP6hQtRc.js";import"./vendor-recharts-BOcghvr2.js";import"./table-CJS-5Aky.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&&W(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}=L();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(V,{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(Y,{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}=L(),[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=z({columns:Te,data:t,getCoreRowModel:U(),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(V,{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(G,{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(J,{value:s,onValueChange:g,children:[e.jsx(X,{"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 Ge(){const t=h.useSearch(),a=q(),[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{Ge as component};
2
- //# sourceMappingURL=index-Chtop8D8.js.map
1
+ import{j as e,L as C,u as y,r as m,C as z,D as U,n as q,s as A}from"./vendor-tanstack-CWDKYA_B.js";import{aM as W,aN as _,aO as B,aP as P,aQ as Q,N as O,aR as Y,aS as L,q as H,I as V,y as Z,ak as E,O as G,S as J,a as X,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,aT as h,aU as F,aV as D}from"./index-DLuXqHi9.js";import{D as me}from"./data-table-C1eRvlXV.js";import{T as pe}from"./tags-input-BdNYl8nS.js";import{D as ge,a as fe,b as he,c as xe,d as R,e as we}from"./dropdown-menu-Bhox1zoa.js";import{Y as ye}from"./vendor-date-CRz8gtWZ.js";import{o as je,e as Se,a as _e,n as I,s as M}from"./vendor-forms-D-iybWES.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-DRMjKWJW.js";import"./vendor-recharts-BGjDGXVf.js";import"./table-CrPymfJD.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&&W(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}=L();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(V,{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(Y,{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}=L(),[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=z({columns:Te,data:t,getCoreRowModel:U(),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(V,{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(G,{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(J,{value:s,onValueChange:g,children:[e.jsx(X,{"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 Ge(){const t=h.useSearch(),a=q(),[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{Ge as component};
2
+ //# sourceMappingURL=index-BOVwKiXn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-Chtop8D8.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 { 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});\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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"}
1
+ {"version":3,"file":"index-BOVwKiXn.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 { 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});\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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"}
@@ -1,2 +1,2 @@
1
- import{j as e,L as p,r as i,p as m}from"./vendor-tanstack-CLpbOGYv.js";import{E as g,t as C,v as f,w as y,x as N,q as x,I as u,D as k,y as o,W,A as S,F as v,G as P,H as E,J as D,C as b,m as I,n as T,o as _,K as L,M as A,N as M,O}from"./index-BZqccBpn.js";import{W as R}from"./header-DijI5Lcu.js";import{S as z}from"./index-faXvGo5k.js";import{D as w,a as $,b as F,c as B,d}from"./dropdown-menu-g64QiYKu.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CP6hQtRc.js";import"./vendor-recharts-BOcghvr2.js";import"./vendor-forms-mroZAMaw.js";import"./vendor-date-Bxa7CHB1.js";const K=()=>e.jsxs(g,{children:[e.jsx(C,{id:"Cpu"}),e.jsx(f,{children:"Add a work pool to get started"}),e.jsx(y,{children:"Work pools allow you to prioritize and manage deployments and control the infrastructure they run on."}),e.jsxs(N,{children:[e.jsx(p,{to:"/work-pools/create",children:e.jsxs(x,{children:["Add Work Pool ",e.jsx(u,{id:"Plus",className:"size-4 ml-2"})]})}),e.jsx(k,{id:"work-pools-guide"})]})]}),H=({workPool:s,onDelete:a})=>{const n=r=>{navigator.clipboard.writeText(r),o.success("ID copied")};return e.jsxs(w,{children:[e.jsx($,{asChild:!0,children:e.jsxs(x,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(u,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(F,{align:"end",children:[e.jsx(B,{children:"Actions"}),e.jsx(d,{onClick:()=>n(s.id),children:"Copy ID"}),e.jsx(p,{to:"/work-pools/work-pool/$workPoolName/edit",params:{workPoolName:s.name},children:e.jsx(d,{children:"Edit"})}),e.jsx(d,{onClick:a,children:"Delete"})]})]})},Q=({workPoolName:s})=>e.jsx(W,{workPoolName:s}),U=({workPool:s})=>{const[a,n]=i.useState(s.status==="PAUSED"),{pauseWorkPool:r,isPending:c}=S(),{resumeWorkPool:l,isPending:t}=v(),j=i.useMemo(()=>c||t,[c,t]),h=()=>{a?l(s.name,{onSuccess:()=>{n(!1),o.success(`${s.name} resumed`)},onError:()=>{o.error(`Failed to resume ${s.name}`)}}):r(s.name,{onSuccess:()=>{n(!0),o.success(`${s.name} paused`)},onError:()=>{o.error(`Failed to pause ${s.name}`)}})};return e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:a?"Paused":"Active"}),e.jsx(P,{checked:!a,onCheckedChange:h,disabled:j,"aria-label":a?"Resume work pool":"Pause work pool"})]})},q={process:"Process",ecs:"ECS","azure-container-instance":"Azure Container Instance",docker:"Docker","cloud-run":"Cloud Run","cloud-run-v2":"Cloud Run v2","vertex-ai":"Vertex AI",kubernetes:"Kubernetes"},J={process:"Cpu",ecs:"Cpu","azure-container-instance":"Cpu",docker:"Cpu","cloud-run":"Cpu","cloud-run-v2":"Cpu","vertex-ai":"Cpu",kubernetes:"Cpu"},V=s=>q[s]??s,Y=s=>J[s]??"Cpu",G=({type:s})=>e.jsxs(E,{children:[e.jsx(u,{id:Y(s)}),V(s)]}),X=({workPool:s})=>{const{deleteWorkPool:a}=D(),n=()=>{a(s.name,{onSuccess:()=>{o.success(`${s.name} deleted`)},onError:r=>{o.error(`Failed to delete work pool: ${r instanceof Error?r.message:"Unknown error"}`)}})};return e.jsxs(b,{className:"gap-2",children:[e.jsxs(I,{className:"flex flex-row items-center justify-between",children:[e.jsxs(T,{className:"flex items-center gap-2",children:[e.jsx(Q,{workPoolName:s.name}),s.status&&e.jsx(z,{status:s.status})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(U,{workPool:s}),e.jsx(H,{workPool:s,onDelete:n})]})]}),e.jsxs(_,{className:"flex flex-col gap-1",children:[e.jsx("div",{className:"flex items-center gap-1",children:e.jsx(G,{type:s.type})}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["Concurrency:"," ",e.jsx("span",{className:"text-foreground",children:s.concurrency_limit?s.concurrency_limit:"Unlimited"})]})]})]})};function le(){const[s,a]=i.useState(""),{data:n=0}=m(L()),{data:r=[]}=m(A({limit:200,offset:0})),c=i.useMemo(()=>r.filter(t=>[t.name,t.description,t.type,JSON.stringify(t.base_job_template),t.id,t.default_queue_id,t.status].join(" ").toLowerCase().includes(s.toLowerCase())),[r,s]),l=t=>{a(t.target.value)};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(R,{}),n<1?e.jsx(K,{}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-end justify-between",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:[n," ",M(n,"work pool")]}),e.jsx("div",{className:"flex gap-2",children:e.jsx(O,{placeholder:"Search work pools...",value:s,onChange:l})})]}),e.jsx("div",{className:"flex flex-col gap-4",children:c.map(t=>e.jsx(X,{workPool:t},t.id))})]})]})}export{le as component};
2
- //# sourceMappingURL=index-BZ9TDxSy.js.map
1
+ import{j as e,L as p,r as i,s as m}from"./vendor-tanstack-CWDKYA_B.js";import{E as g,t as C,v as f,w as y,x as N,q as x,I as u,D as k,y as o,W,A as S,F as v,G as P,H as E,J as D,C as b,m as I,n as T,o as _,K as L,M as A,N as M,O}from"./index-DLuXqHi9.js";import{W as R}from"./header-C5liWcfp.js";import{S as z}from"./index-BmdTLblr.js";import{D as w,a as $,b as F,c as B,d}from"./dropdown-menu-Bhox1zoa.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-DRMjKWJW.js";import"./vendor-recharts-BGjDGXVf.js";import"./vendor-forms-D-iybWES.js";import"./vendor-date-CRz8gtWZ.js";const K=()=>e.jsxs(g,{children:[e.jsx(C,{id:"Cpu"}),e.jsx(f,{children:"Add a work pool to get started"}),e.jsx(y,{children:"Work pools allow you to prioritize and manage deployments and control the infrastructure they run on."}),e.jsxs(N,{children:[e.jsx(p,{to:"/work-pools/create",children:e.jsxs(x,{children:["Add Work Pool ",e.jsx(u,{id:"Plus",className:"size-4 ml-2"})]})}),e.jsx(k,{id:"work-pools-guide"})]})]}),H=({workPool:s,onDelete:a})=>{const n=r=>{navigator.clipboard.writeText(r),o.success("ID copied")};return e.jsxs(w,{children:[e.jsx($,{asChild:!0,children:e.jsxs(x,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(u,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(F,{align:"end",children:[e.jsx(B,{children:"Actions"}),e.jsx(d,{onClick:()=>n(s.id),children:"Copy ID"}),e.jsx(p,{to:"/work-pools/work-pool/$workPoolName/edit",params:{workPoolName:s.name},children:e.jsx(d,{children:"Edit"})}),e.jsx(d,{onClick:a,children:"Delete"})]})]})},Q=({workPoolName:s})=>e.jsx(W,{workPoolName:s}),U=({workPool:s})=>{const[a,n]=i.useState(s.status==="PAUSED"),{pauseWorkPool:r,isPending:c}=S(),{resumeWorkPool:l,isPending:t}=v(),j=i.useMemo(()=>c||t,[c,t]),h=()=>{a?l(s.name,{onSuccess:()=>{n(!1),o.success(`${s.name} resumed`)},onError:()=>{o.error(`Failed to resume ${s.name}`)}}):r(s.name,{onSuccess:()=>{n(!0),o.success(`${s.name} paused`)},onError:()=>{o.error(`Failed to pause ${s.name}`)}})};return e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:a?"Paused":"Active"}),e.jsx(P,{checked:!a,onCheckedChange:h,disabled:j,"aria-label":a?"Resume work pool":"Pause work pool"})]})},q={process:"Process",ecs:"ECS","azure-container-instance":"Azure Container Instance",docker:"Docker","cloud-run":"Cloud Run","cloud-run-v2":"Cloud Run v2","vertex-ai":"Vertex AI",kubernetes:"Kubernetes"},J={process:"Cpu",ecs:"Cpu","azure-container-instance":"Cpu",docker:"Cpu","cloud-run":"Cpu","cloud-run-v2":"Cpu","vertex-ai":"Cpu",kubernetes:"Cpu"},V=s=>q[s]??s,Y=s=>J[s]??"Cpu",G=({type:s})=>e.jsxs(E,{children:[e.jsx(u,{id:Y(s)}),V(s)]}),X=({workPool:s})=>{const{deleteWorkPool:a}=D(),n=()=>{a(s.name,{onSuccess:()=>{o.success(`${s.name} deleted`)},onError:r=>{o.error(`Failed to delete work pool: ${r instanceof Error?r.message:"Unknown error"}`)}})};return e.jsxs(b,{className:"gap-2",children:[e.jsxs(I,{className:"flex flex-row items-center justify-between",children:[e.jsxs(T,{className:"flex items-center gap-2",children:[e.jsx(Q,{workPoolName:s.name}),s.status&&e.jsx(z,{status:s.status})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(U,{workPool:s}),e.jsx(H,{workPool:s,onDelete:n})]})]}),e.jsxs(_,{className:"flex flex-col gap-1",children:[e.jsx("div",{className:"flex items-center gap-1",children:e.jsx(G,{type:s.type})}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:["Concurrency:"," ",e.jsx("span",{className:"text-foreground",children:s.concurrency_limit?s.concurrency_limit:"Unlimited"})]})]})]})};function le(){const[s,a]=i.useState(""),{data:n=0}=m(L()),{data:r=[]}=m(A({limit:200,offset:0})),c=i.useMemo(()=>r.filter(t=>[t.name,t.description,t.type,JSON.stringify(t.base_job_template),t.id,t.default_queue_id,t.status].join(" ").toLowerCase().includes(s.toLowerCase())),[r,s]),l=t=>{a(t.target.value)};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(R,{}),n<1?e.jsx(K,{}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-end justify-between",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:[n," ",M(n,"work pool")]}),e.jsx("div",{className:"flex gap-2",children:e.jsx(O,{placeholder:"Search work pools...",value:s,onChange:l})})]}),e.jsx("div",{className:"flex flex-col gap-4",children:c.map(t=>e.jsx(X,{workPool:t},t.id))})]})]})}export{le as component};
2
+ //# sourceMappingURL=index-BPmw935P.js.map