prefect 3.6.14.dev7__py3-none-any.whl → 3.6.16.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/__init__.py +20 -0
- prefect/_build_info.py +3 -3
- prefect/_internal/analytics/__init__.py +80 -0
- prefect/_internal/analytics/_config.py +2 -0
- prefect/_internal/analytics/ci_detection.py +39 -0
- prefect/_internal/analytics/client.py +132 -0
- prefect/_internal/analytics/device_id.py +55 -0
- prefect/_internal/analytics/emit.py +90 -0
- prefect/_internal/analytics/enabled.py +33 -0
- prefect/_internal/analytics/events.py +14 -0
- prefect/_internal/analytics/milestones.py +177 -0
- prefect/_internal/analytics/notice.py +60 -0
- prefect/_internal/analytics/service.py +238 -0
- prefect/analytics/__init__.py +67 -0
- prefect/deployments/runner.py +20 -0
- prefect/events/clients.py +40 -21
- prefect/flow_engine.py +16 -0
- prefect/flows.py +8 -0
- prefect/server/api/concurrency_limits_v2.py +5 -3
- prefect/server/ui-v2/assets/{artifact-card-9Cw_dMVb.js → artifact-card-BclosG8t.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-9Cw_dMVb.js.map → artifact-card-BclosG8t.js.map} +1 -1
- prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js +2 -0
- prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js.map +1 -0
- prefect/server/ui-v2/assets/{automation-wizard-D7nVgckT.js → automation-wizard-Bmgt6nn8.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-D7nVgckT.js.map → automation-wizard-Bmgt6nn8.js.map} +1 -1
- prefect/server/ui-v2/assets/automation._id-Ccke3KJz.js +2 -0
- prefect/server/ui-v2/assets/{automation._id-BhEFaDc6.js.map → automation._id-Ccke3KJz.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-CffnUlbj.js → automation_._id.edit-BlKPUTVf.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-CffnUlbj.js.map → automation_._id.edit-BlKPUTVf.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-qb94agIp.js → automations-header-Df2zw3SC.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-qb94agIp.js.map → automations-header-Df2zw3SC.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-DdDSFAJa.js → base-job-template-form-section-oZD6U-RW.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-DdDSFAJa.js.map → base-job-template-form-section-oZD6U-RW.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-2rIqbqoZ.js → block-type-details-CYrdaLot.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-2rIqbqoZ.js.map → block-type-details-CYrdaLot.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js +2 -0
- prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js.map +1 -0
- prefect/server/ui-v2/assets/{block._id-OeCbdPeL.js → block._id-CBgHrpTP.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-OeCbdPeL.js.map → block._id-CBgHrpTP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-CD22VllN.js → block_._id.edit-CW-kdi4O.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-CD22VllN.js.map → block_._id.edit-CW-kdi4O.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-Dj7lYV7b.js → catalog-Brh0kn1I.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-Dj7lYV7b.js.map → catalog-Brh0kn1I.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog_._slug-MCgzguIZ.js +2 -0
- prefect/server/ui-v2/assets/{catalog_._slug-NLgWS8vG.js.map → catalog_._slug-MCgzguIZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-D0vc1Piy.js → catalog_._slug_.create-DBaeHi9Q.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-D0vc1Piy.js.map → catalog_._slug_.create-DBaeHi9Q.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-Dgk2Qvjj.js → collapsible-B_NJS0uJ.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-Dgk2Qvjj.js.map → collapsible-B_NJS0uJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-BZiyM0NT.js → concurrency-limit._id-qzNUQzQa.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-BZiyM0NT.js.map → concurrency-limit._id-qzNUQzQa.js.map} +1 -1
- prefect/server/ui-v2/assets/create-BwXG6EIb.js +2 -0
- prefect/server/ui-v2/assets/{create-1j1-8yhV.js.map → create-BwXG6EIb.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-H21iiYVl.js → create-MoiIE9Ms.js} +2 -2
- prefect/server/ui-v2/assets/{create-H21iiYVl.js.map → create-MoiIE9Ms.js.map} +1 -1
- prefect/server/ui-v2/assets/data-table-CPkppyg6.js +2 -0
- prefect/server/ui-v2/assets/data-table-CPkppyg6.js.map +1 -0
- prefect/server/ui-v2/assets/delete-confirmation-dialog-CwDK_2QS.js +2 -0
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-B9-8JHV7.js.map → delete-confirmation-dialog-CwDK_2QS.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-DlD2GSJB.js → deployment-action-header-Vp9YsCJO.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-DlD2GSJB.js.map → deployment-action-header-Vp9YsCJO.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-CFcOIeIi.js → deployment-form-CJcg_6DJ.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-CFcOIeIi.js.map → deployment-form-CJcg_6DJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-DN2Oa0r1.js → deployment-links-CIkJIuHh.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-DN2Oa0r1.js.map → deployment-links-CIkJIuHh.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment._id-C6XrGMp_.js +2 -0
- prefect/server/ui-v2/assets/{deployment._id-C8NPwIIQ.js.map → deployment._id-C6XrGMp_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-DsVQUPNp.js → deployment._id-CWgTYmTG.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-DsVQUPNp.js.map → deployment._id-CWgTYmTG.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-Bg0s0ZJn.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-4uYFgdPg.js.map → deployment_._id.duplicate-Bg0s0ZJn.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CnoB0UeG.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-Z859_W76.js.map → deployment_._id.edit-CnoB0UeG.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-MW5q2SRM.js → deployment_._id.run-BqPK6rTB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-MW5q2SRM.js.map → deployment_._id.run-BqPK6rTB.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-DF4QR3Cp.js → dropdown-menu-D7Gwbd15.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-DF4QR3Cp.js.map → dropdown-menu-D7Gwbd15.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-DR3zL_k_.js → event-resource-display-CDRgVKd4.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-DR3zL_k_.js.map → event-resource-display-CDRgVKd4.js.map} +1 -1
- prefect/server/ui-v2/assets/event._eventDate._eventId-C73GMDkK.js +2 -0
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DfU7SalU.js.map → event._eventDate._eventId-C73GMDkK.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-ckiE3mA9.js +2 -0
- prefect/server/ui-v2/assets/{flow-run-graph-Bf9t75GK.js.map → flow-run-graph-ckiE3mA9.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-RL0qeSLl.js → flow-run._id-BukrNCAq.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-RL0qeSLl.js.map → flow-run._id-BukrNCAq.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-DTsj_xO3.js → flow-run._id-CtI5VZ2M.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-DTsj_xO3.js.map → flow-run._id-CtI5VZ2M.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-s1UJuakA.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-s1UJuakA.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bfelp8UO.js → flow-runs-pagination-SLbYtvaR.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bfelp8UO.js.map → flow-runs-pagination-SLbYtvaR.js.map} +1 -1
- prefect/server/ui-v2/assets/flow._id-CZ5P0v4N.js +2 -0
- prefect/server/ui-v2/assets/{flow._id-DuQ5AUjj.js.map → flow._id-CZ5P0v4N.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-DHWphysD.js → form-mws4law8.js} +2 -2
- prefect/server/ui-v2/assets/{form-DHWphysD.js.map → form-mws4law8.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-BK_NuSng.js → header-Bes1LmY7.js} +2 -2
- prefect/server/ui-v2/assets/{header-BK_NuSng.js.map → header-Bes1LmY7.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-nu-ZKuen.js → header-Bj_zBR-a.js} +2 -2
- prefect/server/ui-v2/assets/{header-nu-ZKuen.js.map → header-Bj_zBR-a.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-B9SuuoZx.js → header-CPxTHSvz.js} +2 -2
- prefect/server/ui-v2/assets/{header-B9SuuoZx.js.map → header-CPxTHSvz.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-_0OOjqn5.js → index-B8vo2Lrg.js} +5 -5
- prefect/server/ui-v2/assets/{index-_0OOjqn5.js.map → index-B8vo2Lrg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DsK1RlS9.js → index-BBeh-3Nh.js} +2 -2
- prefect/server/ui-v2/assets/{index-DsK1RlS9.js.map → index-BBeh-3Nh.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BLnEvHia.js +2 -0
- prefect/server/ui-v2/assets/{index-Dl_iSX0z.js.map → index-BLnEvHia.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BpKoubXu.js +2 -0
- prefect/server/ui-v2/assets/index-BpKoubXu.js.map +1 -0
- prefect/server/ui-v2/assets/index-By6YGqR3.js +2 -0
- prefect/server/ui-v2/assets/index-By6YGqR3.js.map +1 -0
- prefect/server/ui-v2/assets/index-CEi3BlKI.js +2 -0
- prefect/server/ui-v2/assets/index-CEi3BlKI.js.map +1 -0
- prefect/server/ui-v2/assets/{index-BPXdHXTb.js → index-CS-zxv7Z.js} +2 -2
- prefect/server/ui-v2/assets/{index-BPXdHXTb.js.map → index-CS-zxv7Z.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CPFMHkRh.js → index-CToHKh4q.js} +2 -2
- prefect/server/ui-v2/assets/{index-CPFMHkRh.js.map → index-CToHKh4q.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DSBmxhwG.js → index-CUVvZndW.js} +2 -2
- prefect/server/ui-v2/assets/{index-DSBmxhwG.js.map → index-CUVvZndW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-mj9GNKt7.js → index-CYVn-I3i.js} +2 -2
- prefect/server/ui-v2/assets/{index-mj9GNKt7.js.map → index-CYVn-I3i.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DFS5GNpT.js → index-Cun0JN4t.js} +2 -2
- prefect/server/ui-v2/assets/{index-DFS5GNpT.js.map → index-Cun0JN4t.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DcMpyvW7.js → index-D6ynV6U7.js} +2 -2
- prefect/server/ui-v2/assets/{index-DcMpyvW7.js.map → index-D6ynV6U7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DVsNA4UN.js → index-DdNUJLRW.js} +2 -2
- prefect/server/ui-v2/assets/{index-DVsNA4UN.js.map → index-DdNUJLRW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-vRbn9rG4.js → index-DlHOXQhu.js} +2 -2
- prefect/server/ui-v2/assets/{index-vRbn9rG4.js.map → index-DlHOXQhu.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Cj5ihRiw.js → index-DyVw8YE8.js} +2 -2
- prefect/server/ui-v2/assets/{index-Cj5ihRiw.js.map → index-DyVw8YE8.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DNuhJlQK.js → index-DzRz7D2P.js} +2 -2
- prefect/server/ui-v2/assets/{index-DNuhJlQK.js.map → index-DzRz7D2P.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DtrQRjt_.js → index-DzUcVNZg.js} +2 -2
- prefect/server/ui-v2/assets/{index-DtrQRjt_.js.map → index-DzUcVNZg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BCR-yD58.js → index-IBvMMs6S.js} +2 -2
- prefect/server/ui-v2/assets/{index-BCR-yD58.js.map → index-IBvMMs6S.js.map} +1 -1
- prefect/server/ui-v2/assets/index-_kpA__te.js +2 -0
- prefect/server/ui-v2/assets/{index-DWGx9irM.js.map → index-_kpA__te.js.map} +1 -1
- prefect/server/ui-v2/assets/index-m9O-nIOl.css +1 -0
- prefect/server/ui-v2/assets/{index-C0MMjoUe.js → index-wOvyf10b.js} +2 -2
- prefect/server/ui-v2/assets/{index-C0MMjoUe.js.map → index-wOvyf10b.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-CMZiW5M2.js → json-input-Ce-HlRqa.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-CMZiW5M2.js.map → json-input-Ce-HlRqa.js.map} +1 -1
- prefect/server/ui-v2/assets/key-value-XHEZOtZX.js +2 -0
- prefect/server/ui-v2/assets/key-value-XHEZOtZX.js.map +1 -0
- prefect/server/ui-v2/assets/{key._key-CdonPtNh.js → key._key-LpsMf3zD.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-CdonPtNh.js.map → key._key-LpsMf3zD.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-CKcd9ksG.js → lazy-markdown-1Hz0xzca.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-CKcd9ksG.js.map → lazy-markdown-1Hz0xzca.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-Dnd-tV90.js → login-D5uepl9L.js} +2 -2
- prefect/server/ui-v2/assets/{login-Dnd-tV90.js.map → login-D5uepl9L.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-D6rfyTa_.js → markdown-input-CG6M9zD0.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-D6rfyTa_.js.map → markdown-input-CG6M9zD0.js.map} +1 -1
- prefect/server/ui-v2/assets/python-example-snippet-DRHcUlCX.js +3 -0
- prefect/server/ui-v2/assets/{python-example-snippet-eWuRXCxE.js.map → python-example-snippet-DRHcUlCX.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-itfwkkBT.js → python-input-BsUS8fw1.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-itfwkkBT.js.map → python-input-BsUS8fw1.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-DeN-_krn.js → radio-group-BUsmwdrt.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-DeN-_krn.js.map → radio-group-BUsmwdrt.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-tYzhKCqH.js → route-error-state-BFBpiIhD.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-tYzhKCqH.js.map → route-error-state-BFBpiIhD.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-DDUzvjpL.js → schema-form-BwTmkvJk.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-DDUzvjpL.js.map → schema-form-BwTmkvJk.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DrpJmvST.js → schema-form-input-string-format-datetime-nrb3g-JJ.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DrpJmvST.js.map → schema-form-input-string-format-datetime-nrb3g-JJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-OdrJDFrk.js → settings-CUBtK5aW.js} +2 -2
- prefect/server/ui-v2/assets/{settings-OdrJDFrk.js.map → settings-CUBtK5aW.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-DaBGDmua.js → sort-filter-Cv8zAXMp.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-DaBGDmua.js.map → sort-filter-Cv8zAXMp.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-4GUC4YOD.js → table-BBNGfPra.js} +2 -2
- prefect/server/ui-v2/assets/{table-4GUC4YOD.js.map → table-BBNGfPra.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-BvH9UY8h.js → tags-input-DHrnkwjQ.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-BvH9UY8h.js.map → tags-input-DHrnkwjQ.js.map} +1 -1
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js +2 -0
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CLZz3kwW.js.map → task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-DgXFfCuq.js → task-run._id-BY58gqs2.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-DgXFfCuq.js.map → task-run._id-BY58gqs2.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-DHHzTQ9d.js → task-run._id-u73Jxfqw.js} +3 -3
- prefect/server/ui-v2/assets/{task-run._id-DHHzTQ9d.js.map → task-run._id-u73Jxfqw.js.map} +1 -1
- prefect/server/ui-v2/assets/task-runs-pagination-DUy3147A.js +2 -0
- prefect/server/ui-v2/assets/{task-runs-pagination-fR9zqj38.js.map → task-runs-pagination-DUy3147A.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-DL9UCBaB.js → textarea-DUhh6-kq.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-DL9UCBaB.js.map → textarea-DUhh6-kq.js.map} +1 -1
- prefect/server/ui-v2/assets/timezone-select-D4Q6VBtD.js +2 -0
- prefect/server/ui-v2/assets/{timezone-select-qBEoPcyO.js.map → timezone-select-D4Q6VBtD.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-Cf-ZSSDP.js → toggle-group-7WUJn2Tx.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-Cf-ZSSDP.js.map → toggle-group-7WUJn2Tx.js.map} +1 -1
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-D4AD5Ndf.js +2 -0
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DRX9Kvie.js.map → use-delete-automation-confirmation-dialog-D4AD5Ndf.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CogrfdiO.js → use-delete-block-document-confirmation-dialog-DnwWEGUY.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CogrfdiO.js.map → use-delete-block-document-confirmation-dialog-DnwWEGUY.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-CdMKKvm5.js → use-flow-runs-selected-rows-C-tehPRB.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-CdMKKvm5.js.map → use-flow-runs-selected-rows-C-tehPRB.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-Be1qg-IF.js → use-get-artifacts-flow-task-runs-DRWRrmrb.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-Be1qg-IF.js.map → use-get-artifacts-flow-task-runs-DRWRrmrb.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-DXDfXpvs.js → use-quick-run-B4Xj-YQQ.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-DXDfXpvs.js.map → use-quick-run-B4Xj-YQQ.js.map} +1 -1
- prefect/server/ui-v2/assets/use-state-favicon-au2TZdMV.js +2 -0
- prefect/server/ui-v2/assets/{use-state-favicon-Dhkg1tqx.js.map → use-state-favicon-au2TZdMV.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-jTTsXpho.js → use-stepper-DyIb3vlq.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-jTTsXpho.js.map → use-stepper-DyIb3vlq.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-CgJi7g2F.js → utilities-D9Y2wo66.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-CgJi7g2F.js.map → utilities-D9Y2wo66.js.map} +1 -1
- prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js +34 -0
- prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js.map +1 -0
- prefect/server/ui-v2/assets/{work-pool-filter-DLkRAAHz.js → work-pool-filter-CSOATj2D.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-DLkRAAHz.js.map → work-pool-filter-CSOATj2D.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-Dh7B1zMo.js +2 -0
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-BFodtXQe.js.map → work-pool-queue-toggle-Dh7B1zMo.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool._workPoolName-B_NFWXKS.js +2 -0
- prefect/server/ui-v2/assets/{work-pool._workPoolName-Bjh_bO5G.js.map → work-pool._workPoolName-B_NFWXKS.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-B-gnp5dc.js → work-pool_._workPoolName.edit-Cyzn8g-S.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-B-gnp5dc.js.map → work-pool_._workPoolName.edit-Cyzn8g-S.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js.map → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-BK_qfkJJ.js → work-queue-icon-text-BOpcJ8YU.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-BK_qfkJJ.js.map → work-queue-icon-text-BOpcJ8YU.js.map} +1 -1
- prefect/server/ui-v2/index.html +3 -3
- prefect/testing/fixtures.py +14 -13
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/METADATA +3 -2
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/RECORD +225 -211
- prefect/server/ui-v2/assets/artifact._id-zuZ8P2RD.js +0 -2
- prefect/server/ui-v2/assets/artifact._id-zuZ8P2RD.js.map +0 -1
- prefect/server/ui-v2/assets/automation._id-BhEFaDc6.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-DV1pSkV0.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-DV1pSkV0.js.map +0 -1
- prefect/server/ui-v2/assets/catalog_._slug-NLgWS8vG.js +0 -2
- prefect/server/ui-v2/assets/create-1j1-8yhV.js +0 -2
- prefect/server/ui-v2/assets/data-table-DHlbTUL7.js +0 -2
- prefect/server/ui-v2/assets/data-table-DHlbTUL7.js.map +0 -1
- prefect/server/ui-v2/assets/delete-confirmation-dialog-B9-8JHV7.js +0 -2
- prefect/server/ui-v2/assets/deployment._id-C8NPwIIQ.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-4uYFgdPg.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-Z859_W76.js +0 -2
- prefect/server/ui-v2/assets/event._eventDate._eventId-DfU7SalU.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-Bf9t75GK.js +0 -2
- prefect/server/ui-v2/assets/flow-run._id-33WKPXsZ.js +0 -4
- prefect/server/ui-v2/assets/flow-run._id-33WKPXsZ.js.map +0 -1
- prefect/server/ui-v2/assets/flow._id-DuQ5AUjj.js +0 -2
- prefect/server/ui-v2/assets/index-BqwU5GSv.js +0 -2
- prefect/server/ui-v2/assets/index-BqwU5GSv.js.map +0 -1
- prefect/server/ui-v2/assets/index-Br7MUvka.css +0 -1
- prefect/server/ui-v2/assets/index-CYjH7t93.js +0 -2
- prefect/server/ui-v2/assets/index-CYjH7t93.js.map +0 -1
- prefect/server/ui-v2/assets/index-CqUa3fbN.js +0 -2
- prefect/server/ui-v2/assets/index-CqUa3fbN.js.map +0 -1
- prefect/server/ui-v2/assets/index-DWGx9irM.js +0 -2
- prefect/server/ui-v2/assets/index-Dl_iSX0z.js +0 -2
- prefect/server/ui-v2/assets/python-example-snippet-eWuRXCxE.js +0 -3
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CLZz3kwW.js +0 -2
- prefect/server/ui-v2/assets/task-runs-pagination-fR9zqj38.js +0 -2
- prefect/server/ui-v2/assets/timezone-select-qBEoPcyO.js +0 -2
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DRX9Kvie.js +0 -2
- prefect/server/ui-v2/assets/use-state-favicon-Dhkg1tqx.js +0 -2
- prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js +0 -34
- prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js.map +0 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-BFodtXQe.js +0 -2
- prefect/server/ui-v2/assets/work-pool._workPoolName-Bjh_bO5G.js +0 -2
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/WHEEL +0 -0
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["STUCK_STATES","TERMINAL_STATES","isStuckState","stateType","isRunningState","isPausedState","isTerminalState","FlowRunGraphLazy","lazy","mod","FlowRunGraph","props","jsx","Suspense","Skeleton","ErrorBoundary","Component","error","fallback","TabErrorState","onRetry","isRetrying","jsxs","AlertCircle","Button","RefreshCw","cn","FlowRunArtifacts","flowRun","view","setView","useState","artifacts","useSuspenseQuery","buildListArtifactsQuery","Card","CardContent","ToggleGroup","value","ToggleGroupItem","LayoutGrid","Rows3","artifact","ArtifactCard","KeyValue","label","copyable","copyValue","handleCopy","textToCopy","toast","Icon","FlowRunDetails","FormattedDate","TagBadgeGroup","Fragment","CancelFlowRunDialog","open","onOpenChange","cancelSubFlows","setCancelSubFlows","setFlowRunState","isPending","useSetFlowRunState","subFlowRuns","useQuery","buildFilterFlowRunsQuery","hasSubFlows","cancelSubFlowRuns","errors","subFlow","handleCancel","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","StateBadge","Checkbox","checked","Label","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","e","PauseFlowRunDialog","timeout","setTimeout","handlePause","pauseTimeout","isValidTimeout","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","secondsToApproximateString","DialogFooter","ResumeFlowRunDialog","runInputKeyset","ResumeDialogSkeleton","ResumeDialogWithInput","ResumeDialogSimple","resumeFlowRun","useResumeFlowRun","handleResume","keyset","values","setValues","validateForm","useSchemaForm","schema","buildGetFlowRunInputQuery","data","description","useEffect","LazyMarkdown","LazySchemaForm","RetryFlowRunDialog","handleRetry","FlowRunHeader","onDeleteClick","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","isCancelOpen","setIsCancelOpen","isPauseOpen","setIsPauseOpen","isResumeOpen","setIsResumeOpen","isRetryOpen","setIsRetryOpen","isChangingState","canChangeState","canCancel","canPause","canResume","canRetry","handleChangeState","newState","deployment","buildDeploymentDetailsQuery","taskRunCount","buildCountTaskRunsQuery","parentFlowRuns","parentFlowRun","formatTaskRunCount","count","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","Badge","formatDate","FlowIconText","Link","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DeleteConfirmationDialog","ChangeStateDialog","FlowRunLogsDownloadButton","isDownloading","setIsDownloading","handleDownload","response","getQueryService","url","link","filename","Tooltip","TooltipTrigger","TooltipContent","FlowRunLogs","virtualize","levelFilter","setLevelFilter","sortOrder","setSortOrder","queryOptions","useMemo","buildInfiniteFilterLogsQuery","logs","hasNextPage","fetchNextPage","isFetchingNextPage","useSuspenseInfiniteQuery","noLogs","message","LogLevelFilter","LogSortOrder","RunLogs","LEVEL_FILTER_OPTIONS","Select","SelectTrigger","option","SelectContent","SelectItem","SelectValue","FlowRunSubflows","parentFlowRunId","queryClient","useQueryClient","search","setSearch","stateFilter","setStateFilter","sort","setSort","pagination","setPagination","debouncedSearch","useDebounce","countFilter","countData","buildCountFlowRunsQuery","paginateFilter","paginatedData","buildPaginateFlowRunsQuery","flowIds","flows","buildListFlowsQuery","flowRunsWithFlows","flowMap","flow","handleSearchChange","prev","handleStateFilterChange","newFilters","handleSortChange","newSort","handleClearFilters","handlePrefetchPage","page","hasFilters","Typography","SearchInput","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","MAX_FILTERS_DISPLAYED","TaskRunStateFilter","selectedFilters","onSelectFilter","className","setOpen","isAllButScheduled","flowRunStatesNoScheduleSet","FLOW_RUN_STATES_NO_SCHEDULED","filter","handleSelectAllExceptScheduled","handleSelectAllRunState","handleSelectFilter","updatedFilters","renderSelectedTags","selected","visible","extraCount","FLOW_RUN_STATES_MAP","filterKey","FlowRunTaskRuns","flowRunId","tagsFilter","setTagsFilter","buildPaginateTaskRunsQuery","handleTagsFilterChange","tags","newTags","stateSummary","stateCounts","taskRun","stateName","name","TagsInput","TaskRunsSortFilter","TaskRunsList","TaskRunsPagination","FlowRunDetailsPage","id","tab","onTabChange","refetchInterval","setRefetchInterval","fullscreen","setFullscreen","buildGetFlowRunDetailsQuery","deleteFlowRun","useDeleteFlowRun","navigate","useRouter","useStateFavicon","onDeleteRunClicked","retryLogs","useCallback","logsQueryKeyFactory","retryTaskRuns","taskRunsQueryKeyFactory","retrySubflows","flowRunsQueryKeyFactory","retryArtifacts","artifactsQueryKeyFactory","TabsLayout","LogsSkeleton","TaskRunsSkeleton","SubflowsSkeleton","ArtifactsSkeleton","DetailsSkeleton","LazyJsonInput","currentTab","logsContent","taskRunsContent","subflowRunsContent","artifactsContent","detailsContent","parametersContent","jobVariablesContent","Tabs","TabsList","TabsTrigger","TabsContent","z","default","catch","RouteComponent","Route","useParams","useSearch","useNavigate","to"],"ignoreList":[],"sources":["../../src/api/flow-runs/state-utilities.ts","../../src/components/flow-runs/flow-run-graph/index.tsx","../../src/components/ui/error-boundary.tsx","../../src/components/ui/tab-error-state.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-artifacts.tsx","../../src/components/ui/key-value.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-details.tsx","../../src/components/flow-runs/flow-run-actions/cancel-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/pause-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/resume-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/retry-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-header.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-logs-download-button.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-logs.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-subflows.tsx","../../src/components/task-runs/task-run-state-filter.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-task-runs.tsx","../../src/components/flow-runs/flow-run-details-page/index.tsx","../../src/routes/runs/flow-run.$id.tsx?tsr-split=component"],"sourcesContent":["import type { components } from \"@/api/prefect\";\n\ntype StateType = components[\"schemas\"][\"StateType\"];\n\n/**\n * States that can be cancelled - flow runs that are \"stuck\" or in-progress\n */\nexport const STUCK_STATES: StateType[] = [\n\t\"RUNNING\",\n\t\"SCHEDULED\",\n\t\"PENDING\",\n\t\"PAUSED\",\n];\n\n/**\n * States that are terminal - flow runs that have completed execution\n */\nexport const TERMINAL_STATES: StateType[] = [\n\t\"COMPLETED\",\n\t\"FAILED\",\n\t\"CANCELLED\",\n\t\"CRASHED\",\n];\n\n/**\n * Check if a flow run can be cancelled (is in a stuck/cancellable state)\n */\nexport function isStuckState(stateType: StateType | null | undefined): boolean {\n\treturn stateType != null && STUCK_STATES.includes(stateType);\n}\n\n/**\n * Check if a flow run can be paused (is currently running)\n */\nexport function isRunningState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"RUNNING\";\n}\n\n/**\n * Check if a flow run can be resumed (is currently paused)\n */\nexport function isPausedState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"PAUSED\";\n}\n\n/**\n * Check if a flow run is in a terminal state\n */\nexport function isTerminalState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType != null && TERMINAL_STATES.includes(stateType);\n}\n","import type { GraphItemSelection, ViewportDateRange } from \"@prefecthq/graphs\";\nimport type { CSSProperties } from \"react\";\nimport { lazy, Suspense } from \"react\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\nconst FlowRunGraphLazy = lazy(() =>\n\timport(\"./flow-run-graph\").then((mod) => ({ default: mod.FlowRunGraph })),\n);\n\ntype FlowRunGraphProps = {\n\tflowRunId: string;\n\tstateType?: string;\n\tviewport?: ViewportDateRange;\n\tonViewportChange?: (viewport: ViewportDateRange) => void;\n\tselected?: GraphItemSelection;\n\tonSelectedChange?: (selected: GraphItemSelection | undefined) => void;\n\tfullscreen?: boolean;\n\tonFullscreenChange?: (fullscreen: boolean) => void;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n};\n\nexport function FlowRunGraph(props: FlowRunGraphProps) {\n\treturn (\n\t\t<Suspense fallback={<Skeleton className=\"h-[500px] w-full\" />}>\n\t\t\t<FlowRunGraphLazy {...props} />\n\t\t</Suspense>\n\t);\n}\n\nexport type { GraphItemSelection, ViewportDateRange } from \"@prefecthq/graphs\";\n","import { Component, type ReactNode } from \"react\";\n\ntype ErrorBoundaryProps = {\n\tchildren: ReactNode;\n\tfallback: ReactNode | ((error: Error) => ReactNode);\n};\n\ntype ErrorBoundaryState = {\n\thasError: boolean;\n\terror: Error | null;\n};\n\nexport class ErrorBoundary extends Component<\n\tErrorBoundaryProps,\n\tErrorBoundaryState\n> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): ErrorBoundaryState {\n\t\treturn { hasError: true, error };\n\t}\n\n\trender() {\n\t\tif (this.state.hasError) {\n\t\t\tconst { fallback } = this.props;\n\t\t\tif (typeof fallback === \"function\") {\n\t\t\t\treturn fallback(this.state.error ?? new Error(\"Unknown error\"));\n\t\t\t}\n\t\t\treturn fallback;\n\t\t}\n\t\treturn this.props.children;\n\t}\n}\n","import { AlertCircle, RefreshCw } from \"lucide-react\";\nimport type { ServerError } from \"@/api/error-utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/utils\";\n\ntype TabErrorStateProps = {\n\terror: ServerError;\n\tonRetry?: () => void;\n\tisRetrying?: boolean;\n};\n\nexport function TabErrorState({\n\terror,\n\tonRetry,\n\tisRetrying,\n}: TabErrorStateProps) {\n\treturn (\n\t\t<div className=\"flex flex-col items-center justify-center py-8 text-center\">\n\t\t\t<div className=\"rounded-full bg-destructive/10 p-2 mb-3\">\n\t\t\t\t<AlertCircle className=\"size-6 text-destructive\" />\n\t\t\t</div>\n\t\t\t<div className=\"space-y-1 mb-4\">\n\t\t\t\t<p className=\"font-medium\">{error.message}</p>\n\t\t\t\t{error.details && (\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground max-w-sm\">\n\t\t\t\t\t\t{error.details}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{onRetry && (\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\tdisabled={isRetrying}\n\t\t\t\t\tclassName=\"gap-2\"\n\t\t\t\t>\n\t\t\t\t\t<RefreshCw className={cn(\"size-3\", isRetrying && \"animate-spin\")} />\n\t\t\t\t\t{isRetrying ? \"Retrying...\" : \"Retry\"}\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { LayoutGrid, Rows3 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport { ArtifactCard } from \"@/components/artifacts/artifact-card\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/utils\";\n\ntype FlowRunArtifactsProps = {\n\tflowRun: FlowRun;\n};\n\nexport const FlowRunArtifacts = ({ flowRun }: FlowRunArtifactsProps) => {\n\tconst [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: {\n\t\t\t\t\tany_: [flowRun.id],\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"ID_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\tif (artifacts.length === 0) {\n\t\treturn (\n\t\t\t<Card>\n\t\t\t\t<CardContent className=\"text-center\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis flow run did not produce any artifacts; for more information on\n\t\t\t\t\t\tcreating artifacts, see the{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://docs.prefect.io/v3/develop/artifacts\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-blue-500\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tvalue={view}\n\t\t\t\t\tonValueChange={(value) => setView(value as \"grid\" | \"list\")}\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"grid\" aria-label=\"Grid view\">\n\t\t\t\t\t\t<LayoutGrid className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"list\" aria-label=\"List view\">\n\t\t\t\t\t\t<Rows3 className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid\",\n\t\t\t\t\tview === \"grid\"\n\t\t\t\t\t\t? \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\"\n\t\t\t\t\t\t: \"grid-cols-1\",\n\t\t\t\t\t\"gap-4\",\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"flow-run-artifacts-grid\"\n\t\t\t>\n\t\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t\t<ArtifactCard\n\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tcompact={view === \"list\"}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { toast } from \"sonner\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype KeyValueProps = {\n\tlabel: string;\n\tvalue: React.ReactNode;\n\tcopyable?: boolean;\n\tcopyValue?: string;\n};\n\nexport function KeyValue({ label, value, copyable, copyValue }: KeyValueProps) {\n\tconst handleCopy = () => {\n\t\tconst textToCopy = copyValue ?? (typeof value === \"string\" ? value : \"\");\n\t\tvoid navigator.clipboard.writeText(textToCopy);\n\t\ttoast.success(`${label} copied`);\n\t};\n\n\treturn (\n\t\t<dl className=\"flex flex-col gap-1\">\n\t\t\t<dt className=\"text-muted-foreground text-sm\">{label}</dt>\n\t\t\t<dd className=\"text-sm flex items-center gap-2\">\n\t\t\t\t{value}\n\t\t\t\t{copyable && (\n\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={handleCopy}>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</dd>\n\t\t</dl>\n\t);\n}\n","import type { FlowRun } from \"@/api/flow-runs\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\n\ntype FlowRunDetailsProps = {\n\tflowRun: FlowRun | null | undefined;\n};\n\nexport function FlowRunDetails({ flowRun }: FlowRunDetailsProps) {\n\tif (!flowRun) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 bg-gray-100 p-4 rounded-md\">\n\t\t\t\t<span className=\"text-gray-500\">No flow run details available</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<KeyValue label=\"Run Count\" value={flowRun.run_count} />\n\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Created\"\n\t\t\t\tvalue={<FormattedDate date={flowRun.created} />}\n\t\t\t/>\n\n\t\t\t{flowRun.created_by?.display_value && (\n\t\t\t\t<KeyValue label=\"Created By\" value={flowRun.created_by.display_value} />\n\t\t\t)}\n\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\tvalue={<FormattedDate date={flowRun.updated} />}\n\t\t\t/>\n\n\t\t\t{flowRun.idempotency_key && (\n\t\t\t\t<KeyValue label=\"Idempotency Key\" value={flowRun.idempotency_key} />\n\t\t\t)}\n\n\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t<KeyValue label=\"Tags\" value={<TagBadgeGroup tags={flowRun.tags} />} />\n\t\t\t)}\n\n\t\t\t<KeyValue label=\"Flow Run ID\" value={flowRun.id} copyable />\n\n\t\t\t{flowRun.state?.message && (\n\t\t\t\t<KeyValue label=\"State Message\" value={flowRun.state.message} />\n\t\t\t)}\n\n\t\t\t{flowRun.flow_version && (\n\t\t\t\t<KeyValue label=\"Flow Version\" value={flowRun.flow_version} />\n\t\t\t)}\n\n\t\t\t{flowRun.empirical_policy?.retries != null && (\n\t\t\t\t<>\n\t\t\t\t\t<KeyValue label=\"Retries\" value={flowRun.empirical_policy.retries} />\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"Retry Delay\"\n\t\t\t\t\t\tvalue={flowRun.empirical_policy.retry_delay}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype CancelFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const CancelFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: CancelFlowRunDialogProps) => {\n\tconst [cancelSubFlows, setCancelSubFlows] = useState(false);\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst { data: subFlowRuns = [] } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: { operator: \"and_\", any_: [flowRun.id] },\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttype: { any_: [\"RUNNING\", \"SCHEDULED\", \"PENDING\", \"PAUSED\"] },\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t\tenabled: open,\n\t});\n\n\tconst hasSubFlows = subFlowRuns.length > 0;\n\n\tconst cancelSubFlowRuns = (errors: string[]) => {\n\t\tfor (const subFlow of subFlowRuns) {\n\t\t\tsetFlowRunState(\n\t\t\t\t{\n\t\t\t\t\tid: subFlow.id,\n\t\t\t\t\tstate: { type: \"CANCELLING\", name: \"Cancelling\" },\n\t\t\t\t\tforce: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\terrors.push(subFlow.name ?? subFlow.id);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleCancel = () => {\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: \"CANCELLING\",\n\t\t\t\t\tname: \"Cancelling\",\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tif (cancelSubFlows && subFlowRuns.length > 0) {\n\t\t\t\t\t\tconst errors: string[] = [];\n\t\t\t\t\t\tcancelSubFlowRuns(errors);\n\t\t\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\t\t`Failed to cancel some sub-flows: ${errors.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttoast.success(\n\t\t\t\t\t\t\t\t`Flow run and ${subFlowRuns.length} sub-flow${subFlowRuns.length === 1 ? \"\" : \"s\"} cancelled`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttoast.success(\"Flow run cancelled\");\n\t\t\t\t\t}\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to cancel flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Cancel Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tAre you sure you want to cancel{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"CANCELLING\" name=\"Cancelling\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t{hasSubFlows && (\n\t\t\t\t\t<div className=\"flex items-center space-x-2 py-2\">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tid=\"cancel-subflows\"\n\t\t\t\t\t\t\tchecked={cancelSubFlows}\n\t\t\t\t\t\t\tonCheckedChange={(checked) => setCancelSubFlows(checked === true)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Label htmlFor=\"cancel-subflows\" className=\"text-sm cursor-pointer\">\n\t\t\t\t\t\t\tAlso cancel {subFlowRuns.length} sub-flow run\n\t\t\t\t\t\t\t{subFlowRuns.length === 1 ? \"\" : \"s\"}\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid handleCancel();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Cancelling...\" : \"Cancel Flow Run\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { secondsToApproximateString } from \"@/utils\";\n\ntype PauseFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const PauseFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: PauseFlowRunDialogProps) => {\n\tconst [timeout, setTimeout] = useState(300); // 5 minutes default\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handlePause = () => {\n\t\tconst pauseTimeout = new Date(Date.now() + timeout * 1000).toISOString();\n\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: \"PAUSED\",\n\t\t\t\t\tname: \"Suspended\",\n\t\t\t\t\tstate_details: {\n\t\t\t\t\t\tpause_timeout: pauseTimeout,\n\t\t\t\t\t\tpause_reschedule: true,\n\t\t\t\t\t\tdeferred: false,\n\t\t\t\t\t\tuntrackable_result: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run paused\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to pause flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst isValidTimeout = timeout >= 5;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Pause Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tPause <span className=\"font-medium\">{flowRun.name}</span> for a\n\t\t\t\t\t\t\t\tspecified duration. The flow will automatically resume after the\n\t\t\t\t\t\t\t\ttimeout.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"PAUSED\" name=\"Suspended\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<div className=\"space-y-2 py-4\">\n\t\t\t\t\t<Label htmlFor=\"timeout\">Timeout (seconds)</Label>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tid=\"timeout\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin={5}\n\t\t\t\t\t\tvalue={timeout}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tsetTimeout(Number.parseInt(e.target.value, 10) || 5)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\tWill pause for {secondsToApproximateString(timeout)}. Minimum 5\n\t\t\t\t\t\tseconds.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handlePause}\n\t\t\t\t\t\tdisabled={isPending || !isValidTimeout}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tPause Flow Run\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Suspense, useEffect } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetFlowRunInputQuery,\n\ttype FlowRun,\n\tuseResumeFlowRun,\n} from \"@/api/flow-runs\";\nimport {\n\tLazySchemaForm,\n\ttype PrefectSchemaObject,\n\tuseSchemaForm,\n} from \"@/components/schemas\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype ResumeFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const ResumeFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\t// Check if this flow run requires input on resume\n\tconst runInputKeyset = flowRun.state?.state_details?.run_input_keyset as\n\t\t| Record<string, string>\n\t\t| undefined;\n\tconst requiresInput = runInputKeyset && runInputKeyset.schema;\n\n\tif (requiresInput) {\n\t\treturn (\n\t\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t\t<DialogContent className=\"max-w-2xl max-h-[80vh] overflow-y-auto\">\n\t\t\t\t\t<Suspense fallback={<ResumeDialogSkeleton />}>\n\t\t\t\t\t\t<ResumeDialogWithInput\n\t\t\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\t\t\tkeyset={runInputKeyset}\n\t\t\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ResumeDialogSimple\n\t\t\tflowRun={flowRun}\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t/>\n\t);\n};\n\n/**\n * Simple resume dialog for flows that don't require input\n */\nconst ResumeDialogSimple = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\n\tconst handleResume = () => {\n\t\tresumeFlowRun(\n\t\t\t{ id: flowRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tResume the paused flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handleResume}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tResume\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n\n/**\n * Resume dialog with schema-based input form\n */\ntype ResumeDialogWithInputProps = {\n\tflowRun: FlowRun;\n\tkeyset: Record<string, string>;\n\tonOpenChange: (open: boolean) => void;\n};\n\nconst ResumeDialogWithInput = ({\n\tflowRun,\n\tkeyset,\n\tonOpenChange,\n}: ResumeDialogWithInputProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\tconst { values, setValues, errors, validateForm } = useSchemaForm();\n\n\t// Fetch schema and description\n\tconst { data: schema } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.schema),\n\t\tselect: (data) => data as PrefectSchemaObject | undefined,\n\t});\n\n\tconst { data: description } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.description ?? \"\"),\n\t\tenabled: Boolean(keyset.description),\n\t\tselect: (data) => data as string | undefined,\n\t});\n\n\t// Reset form when dialog opens\n\tuseEffect(() => {\n\t\tsetValues({});\n\t}, [setValues]);\n\n\tconst handleResume = async () => {\n\t\tif (!schema) return;\n\n\t\ttry {\n\t\t\t// Validate the form before submitting\n\t\t\tawait validateForm({ schema: values });\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresumeFlowRun(\n\t\t\t\t{ id: flowRun.id, runInput: values },\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t} catch {\n\t\t\ttoast.error(\"Failed to validate input\");\n\t\t}\n\t};\n\n\tif (!schema) {\n\t\treturn <ResumeDialogSkeleton />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<DialogHeader>\n\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tProvide input to resume{\" \"}\n\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</DialogDescription>\n\t\t\t</DialogHeader>\n\n\t\t\t{description && (\n\t\t\t\t<div className=\"prose prose-sm dark:prose-invert max-w-none py-2 px-3 bg-muted/50 rounded-md\">\n\t\t\t\t\t<LazyMarkdown>{description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"py-4\">\n\t\t\t\t<LazySchemaForm\n\t\t\t\t\tschema={schema}\n\t\t\t\t\tvalues={values}\n\t\t\t\t\tonValuesChange={setValues}\n\t\t\t\t\terrors={errors}\n\t\t\t\t\tkinds={[\"json\"]}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<DialogFooter>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => void handleResume()}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\tloading={isPending}\n\t\t\t\t>\n\t\t\t\t\tResume\n\t\t\t\t</Button>\n\t\t\t</DialogFooter>\n\t\t</>\n\t);\n};\n\nconst ResumeDialogSkeleton = () => (\n\t<div className=\"flex flex-col gap-4\">\n\t\t<Skeleton className=\"h-6 w-48\" />\n\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t<div className=\"flex justify-end gap-2\">\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t</div>\n\t</div>\n);\n","import { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype RetryFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const RetryFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: RetryFlowRunDialogProps) => {\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handleRetry = () => {\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: \"SCHEDULED\",\n\t\t\t\t\tname: \"AwaitingRetry\",\n\t\t\t\t\tmessage: \"Retry from the UI\",\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run scheduled for retry\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to retry flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Retry Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tRetry the flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"SCHEDULED\" name=\"AwaitingRetry\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tTask runs with persisted results will use cached values. Task\n\t\t\t\t\t\t\t\truns without persisted results will be re-executed.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleRetry();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Retrying...\" : \"Retry\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tisPausedState,\n\tisRunningState,\n\tisStuckState,\n\tisTerminalState,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\nimport {\n\tCancelFlowRunDialog,\n\tPauseFlowRunDialog,\n\tResumeFlowRunDialog,\n\tRetryFlowRunDialog,\n} from \"@/components/flow-runs/flow-run-actions\";\nimport { FlowIconText } from \"@/components/flows/flow-icon-text\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tChangeStateDialog,\n\tuseChangeStateDialog,\n} from \"@/components/ui/change-state-dialog\";\nimport {\n\tDeleteConfirmationDialog,\n\tuseDeleteConfirmationDialog,\n} from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { formatDate, secondsToApproximateString } from \"@/utils\";\n\ntype FlowRunHeaderProps = {\n\tflowRun: FlowRun;\n\tonDeleteClick: () => void;\n};\n\nexport function FlowRunHeader({ flowRun, onDeleteClick }: FlowRunHeaderProps) {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\tconst {\n\t\topen: isChangeStateOpen,\n\t\tonOpenChange: setChangeStateOpen,\n\t\topenDialog: openChangeState,\n\t} = useChangeStateDialog();\n\tconst [isCancelOpen, setIsCancelOpen] = useState(false);\n\tconst [isPauseOpen, setIsPauseOpen] = useState(false);\n\tconst [isResumeOpen, setIsResumeOpen] = useState(false);\n\tconst [isRetryOpen, setIsRetryOpen] = useState(false);\n\tconst { setFlowRunState, isPending: isChangingState } = useSetFlowRunState();\n\n\tconst canChangeState =\n\t\tflowRun.state_type &&\n\t\t[\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"].includes(\n\t\t\tflowRun.state_type,\n\t\t);\n\n\tconst canCancel = isStuckState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canPause = isRunningState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canResume = isPausedState(flowRun.state_type);\n\tconst canRetry = isTerminalState(flowRun.state_type) && flowRun.deployment_id;\n\n\tconst handleChangeState = (newState: { type: string; message?: string }) => {\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: newState.type as\n\t\t\t\t\t\t| \"COMPLETED\"\n\t\t\t\t\t\t| \"FAILED\"\n\t\t\t\t\t\t| \"CANCELLED\"\n\t\t\t\t\t\t| \"CRASHED\",\n\t\t\t\t\tname: newState.type.charAt(0) + newState.type.slice(1).toLowerCase(),\n\t\t\t\t\tmessage: newState.message,\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run state changed\");\n\t\t\t\t\tsetChangeStateOpen(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to change state\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst { data: deployment } = useQuery({\n\t\t...buildDeploymentDetailsQuery(flowRun.deployment_id ?? \"\"),\n\t\tenabled: !!flowRun.deployment_id,\n\t});\n\n\tconst { data: taskRunCount } = useQuery({\n\t\t...buildCountTaskRunsQuery({\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRun.id], is_null_: false },\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst { data: parentFlowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: [flowRun.parent_task_run_id ?? \"\"] },\n\t\t\t},\n\t\t}),\n\t\tenabled: !!flowRun.parent_task_run_id,\n\t});\n\tconst parentFlowRun = parentFlowRuns?.[0];\n\n\tconst formatTaskRunCount = (count: number | undefined) => {\n\t\tif (count === undefined) return \"...\";\n\t\tif (count === 0) return \"None\";\n\t\treturn `${count} Task run${count === 1 ? \"\" : \"s\"}`;\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t{/* Row 1 - Breadcrumb */}\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbLink to=\"/runs\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\t\tRuns\n\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t\t\t<BreadcrumbPage className=\"font-semibold\">\n\t\t\t\t\t\t\t\t{flowRun.name}\n\t\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t\t{flowRun.work_pool_name && (\n\t\t\t\t\t\t\t\t<Badge variant=\"outline\" className=\"ml-2\">\n\t\t\t\t\t\t\t\t\t{flowRun.work_pool_name}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t\t\t\t\t<div className=\"ml-2\">\n\t\t\t\t\t\t\t\t\t<TagBadgeGroup tags={flowRun.tags} maxTagsDisplayed={3} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\n\t\t\t\t{/* Row 2 - Meta */}\n\t\t\t\t<div className=\"flex items-center gap-4 text-sm text-muted-foreground\">\n\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t<StateBadge type={flowRun.state_type} name={flowRun.state_name} />\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.start_time && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span>{formatDate(flowRun.start_time, \"dateTimeNumeric\")}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"size-4\" />\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{secondsToApproximateString(flowRun.total_run_time ?? 0)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`flex items-center gap-1 ${taskRunCount === 0 ? \"text-muted-foreground/60\" : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"ListTodo\" className=\"size-4\" />\n\t\t\t\t\t\t<span>{formatTaskRunCount(taskRunCount)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Row 3 - Relationships */}\n\t\t\t\t<div className=\"flex items-center gap-4 text-sm flex-wrap\">\n\t\t\t\t\t{flowRun.flow_id && <FlowIconText flowId={flowRun.flow_id} />}\n\t\t\t\t\t{flowRun.deployment_id && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/deployments/deployment/$id\"\n\t\t\t\t\t\t\tparams={{ id: flowRun.deployment_id }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Rocket\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Deployment</span>\n\t\t\t\t\t\t\t<span>{deployment?.name ?? \"...\"}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.work_pool_name && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName\"\n\t\t\t\t\t\t\tparams={{ workPoolName: flowRun.work_pool_name }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Server\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Work Pool</span>\n\t\t\t\t\t\t\t<span>{flowRun.work_pool_name}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.work_pool_name && flowRun.work_queue_name && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName\"\n\t\t\t\t\t\t\tparams={{ workPoolName: flowRun.work_pool_name }}\n\t\t\t\t\t\t\tsearch={{ tab: \"Work Queues\" }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"ListOrdered\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Work Queue</span>\n\t\t\t\t\t\t\t<span>{flowRun.work_queue_name}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{parentFlowRun && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: parentFlowRun.id }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Workflow\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Parent Run</span>\n\t\t\t\t\t\t\t<span>{parentFlowRun.name ?? \"...\"}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"p-2\">\n\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent>\n\t\t\t\t\t{canCancel && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsCancelOpen(true)}>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canPause && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsPauseOpen(true)}>\n\t\t\t\t\t\t\tPause\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canResume && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsResumeOpen(true)}>\n\t\t\t\t\t\t\tResume\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canRetry && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsRetryOpen(true)}>\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canChangeState && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={openChangeState}>\n\t\t\t\t\t\t\tChange state\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{(canCancel ||\n\t\t\t\t\t\tcanPause ||\n\t\t\t\t\t\tcanResume ||\n\t\t\t\t\t\tcanRetry ||\n\t\t\t\t\t\tcanChangeState) && <DropdownMenuSeparator />}\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(flowRun.id);\n\t\t\t\t\t\t\ttoast.success(\"Copied flow run ID to clipboard\");\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<DropdownMenuItem\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tconfirmDelete({\n\t\t\t\t\t\t\t\ttitle: \"Delete Flow Run\",\n\t\t\t\t\t\t\t\tdescription: `Are you sure you want to delete flow run ${flowRun.name}?`,\n\t\t\t\t\t\t\t\tonConfirm: onDeleteClick,\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\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t\t<ChangeStateDialog\n\t\t\t\topen={isChangeStateOpen}\n\t\t\t\tonOpenChange={setChangeStateOpen}\n\t\t\t\tcurrentState={\n\t\t\t\t\tflowRun.state\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: flowRun.state.type,\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\tflowRun.state.name ??\n\t\t\t\t\t\t\t\t\tflowRun.state.type.charAt(0) +\n\t\t\t\t\t\t\t\t\t\tflowRun.state.type.slice(1).toLowerCase(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel=\"Flow Run\"\n\t\t\t\tonConfirm={handleChangeState}\n\t\t\t\tisLoading={isChangingState}\n\t\t\t/>\n\t\t\t<CancelFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isCancelOpen}\n\t\t\t\tonOpenChange={setIsCancelOpen}\n\t\t\t/>\n\t\t\t<PauseFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isPauseOpen}\n\t\t\t\tonOpenChange={setIsPauseOpen}\n\t\t\t/>\n\t\t\t<ResumeFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isResumeOpen}\n\t\t\t\tonOpenChange={setIsResumeOpen}\n\t\t\t/>\n\t\t\t<RetryFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isRetryOpen}\n\t\t\t\tonOpenChange={setIsRetryOpen}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { components } from \"@/api/prefect\";\nimport { getQueryService } from \"@/api/service\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ntype FlowRunLogsDownloadButtonProps = {\n\tflowRun: components[\"schemas\"][\"FlowRunResponse\"];\n};\n\nexport function FlowRunLogsDownloadButton({\n\tflowRun,\n}: FlowRunLogsDownloadButtonProps) {\n\tconst [isDownloading, setIsDownloading] = useState(false);\n\n\tconst handleDownload = async () => {\n\t\tsetIsDownloading(true);\n\t\ttry {\n\t\t\tconst service = await getQueryService();\n\t\t\tconst response = await service.GET(\"/flow_runs/{id}/logs/download\", {\n\t\t\t\tparams: { path: { id: flowRun.id } },\n\t\t\t\tparseAs: \"blob\",\n\t\t\t});\n\n\t\t\tif (!response.data) {\n\t\t\t\tthrow new Error(\"No data received from server\");\n\t\t\t}\n\n\t\t\tconst url = URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tconst filename = flowRun.name ?? \"logs\";\n\n\t\t\tlink.href = url;\n\t\t\tlink.setAttribute(\"download\", `${filename}.csv`);\n\t\t\tlink.click();\n\n\t\t\tURL.revokeObjectURL(url);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\ttoast.error(\"Failed to download logs\");\n\t\t} finally {\n\t\t\tsetIsDownloading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={() => void handleDownload()}\n\t\t\t\t\tdisabled={isDownloading}\n\t\t\t\t\taria-label=\"Download logs\"\n\t\t\t\t>\n\t\t\t\t\t{isDownloading ? (\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Icon id=\"Download\" className=\"size-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>Download all logs as CSV</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n","import { useSuspenseInfiniteQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport type { components } from \"@/api/prefect\";\nimport { RunLogs } from \"@/components/ui/run-logs\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { FlowRunLogsDownloadButton } from \"./flow-run-logs-download-button\";\n\ntype FlowRunLogsProps = {\n\tflowRun: components[\"schemas\"][\"FlowRunResponse\"];\n\tvirtualize?: boolean;\n};\n\nexport const FlowRunLogs = ({\n\tflowRun,\n\tvirtualize = true,\n}: FlowRunLogsProps) => {\n\tconst [levelFilter, setLevelFilter] = useState<number>(0);\n\tconst [sortOrder, setSortOrder] = useState<\n\t\t\"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\"\n\t>(\"TIMESTAMP_ASC\");\n\n\tconst queryOptions = useMemo(\n\t\t() => ({\n\t\t\t...buildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: sortOrder,\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: { ge_: levelFilter },\n\t\t\t\t\tflow_run_id: { any_: [flowRun.id] },\n\t\t\t\t},\n\t\t\t}),\n\t\t\trefetchInterval:\n\t\t\t\tflowRun.state_type === \"RUNNING\" ? 5000 : (false as const),\n\t\t}),\n\t\t[levelFilter, sortOrder, flowRun.id, flowRun.state_type],\n\t);\n\n\tconst {\n\t\tdata: logs,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSuspenseInfiniteQuery(queryOptions);\n\n\tconst noLogs = logs.pages.length === 1 && logs.pages[0].length === 0;\n\tlet message = \"This run did not produce any logs.\";\n\tif (noLogs) {\n\t\tif (levelFilter > 0) {\n\t\t\tmessage = \"No logs match your filter criteria\";\n\t\t} else if (\n\t\t\tflowRun.state_type === \"SCHEDULED\" &&\n\t\t\tflowRun.state_name === \"Scheduled\"\n\t\t) {\n\t\t\tmessage = \"Run has not yet started. Check back soon for logs.\";\n\t\t} else if (flowRun.state_type === \"RUNNING\") {\n\t\t\tmessage = \"Waiting for logs...\";\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<LogLevelFilter\n\t\t\t\t\tlevelFilter={levelFilter}\n\t\t\t\t\tsetLevelFilter={setLevelFilter}\n\t\t\t\t/>\n\t\t\t\t<LogSortOrder sortOrder={sortOrder} setSortOrder={setSortOrder} />\n\t\t\t\t<FlowRunLogsDownloadButton flowRun={flowRun} />\n\t\t\t</div>\n\t\t\t{noLogs ? (\n\t\t\t\t<div className=\"flex flex-col gap-2 text-center bg-muted p-2 rounded-md\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">{message}</span>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"rounded-md\">\n\t\t\t\t\t<RunLogs\n\t\t\t\t\t\tlogs={logs.pages.flat()}\n\t\t\t\t\t\tonBottomReached={() => {\n\t\t\t\t\t\t\tif (hasNextPage && !isFetchingNextPage) {\n\t\t\t\t\t\t\t\tfetchNextPage().catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"max-h-[85vh]\"\n\t\t\t\t\t\tvirtualize={virtualize}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst LEVEL_FILTER_OPTIONS = [\n\t{ label: \"All\", value: 0 },\n\t{ label: \"Critical only\", value: 50 },\n\t{ label: \"Error and above\", value: 40 },\n\t{ label: \"Warning and above\", value: 30 },\n\t{ label: \"Info and above\", value: 20 },\n\t{ label: \"Debug and above\", value: 10 },\n] as const;\n\nconst LogLevelFilter = ({\n\tlevelFilter,\n\tsetLevelFilter,\n}: {\n\tlevelFilter: number;\n\tsetLevelFilter: (level: number) => void;\n}) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={levelFilter.toString()}\n\t\t\tonValueChange={(value) => setLevelFilter(Number(value))}\n\t\t>\n\t\t\t<SelectTrigger aria-label=\"log level filter\">\n\t\t\t\t<span>\n\t\t\t\t\t{`Level:\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tLEVEL_FILTER_OPTIONS.find(\n\t\t\t\t\t\t\t\t\t(option) => option.value === levelFilter,\n\t\t\t\t\t\t\t\t)?.label\n\t\t\t\t\t\t\t}`}\n\t\t\t\t</span>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{LEVEL_FILTER_OPTIONS.map((option) => (\n\t\t\t\t\t<SelectItem key={option.value} value={option.value.toString()}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nconst LogSortOrder = ({\n\tsortOrder,\n\tsetSortOrder,\n}: {\n\tsortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\";\n\tsetSortOrder: (sortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\") => void;\n}) => (\n\t<Select\n\t\tvalue={sortOrder}\n\t\tonValueChange={(value) =>\n\t\t\tsetSortOrder(value as \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\")\n\t\t}\n\t>\n\t\t<SelectTrigger aria-label=\"log sort order\">\n\t\t\t<SelectValue placeholder=\"Sort log order\" />\n\t\t</SelectTrigger>\n\t\t<SelectContent>\n\t\t\t<SelectItem value=\"TIMESTAMP_ASC\">Oldest to newest</SelectItem>\n\t\t\t<SelectItem value=\"TIMESTAMP_DESC\">Newest to oldest</SelectItem>\n\t\t</SelectContent>\n\t</Select>\n);\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsCountFilter,\n\ttype FlowRunsPaginateFilter,\n\ttype FlowRunWithFlow,\n} from \"@/api/flow-runs\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport { FlowRunsList } from \"@/components/flow-runs/flow-runs-list\";\nimport { SortFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter\";\nimport type { SortFilters } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter.constants\";\nimport { StateFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filter\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport {\n\tFlowRunsPagination,\n\ttype PaginationState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { Typography } from \"@/components/ui/typography\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype FlowRunSubflowsProps = {\n\tparentFlowRunId: string;\n};\n\nexport const FlowRunSubflows = ({ parentFlowRunId }: FlowRunSubflowsProps) => {\n\tconst queryClient = useQueryClient();\n\tconst [search, setSearch] = useState(\"\");\n\tconst [stateFilter, setStateFilter] = useState<Set<FlowRunState>>(new Set());\n\tconst [sort, setSort] = useState<SortFilters>(\"START_TIME_DESC\");\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpage: 1,\n\t\tlimit: 10,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 300);\n\n\tconst countFilter: FlowRunsCountFilter = useMemo(() => {\n\t\treturn {\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tany_: [parentFlowRunId],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}, [parentFlowRunId]);\n\n\tconst { data: countData } = useSuspenseQuery(\n\t\tbuildCountFlowRunsQuery(countFilter, 30_000),\n\t);\n\n\tconst paginateFilter: FlowRunsPaginateFilter = useMemo(() => {\n\t\tconst baseFilter: FlowRunsPaginateFilter = {\n\t\t\tpage: pagination.page,\n\t\t\tlimit: pagination.limit,\n\t\t\tsort,\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tany_: [parentFlowRunId],\n\t\t\t\t},\n\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\tstate:\n\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t};\n\t\treturn baseFilter;\n\t}, [parentFlowRunId, pagination, sort, debouncedSearch, stateFilter]);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateFlowRunsQuery(paginateFilter, 30_000),\n\t);\n\n\tconst flowIds = useMemo(\n\t\t() => [\n\t\t\t...new Set(\n\t\t\t\t(paginatedData?.results ?? []).map((flowRun) => flowRun.flow_id),\n\t\t\t),\n\t\t],\n\t\t[paginatedData?.results],\n\t);\n\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: { any_: flowIds },\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst flowRunsWithFlows = useMemo(() => {\n\t\tif (!paginatedData?.results) return [];\n\t\tconst flowMap = new Map(flows?.map((flow: Flow) => [flow.id, flow]) ?? []);\n\t\treturn paginatedData.results\n\t\t\t.map((flowRun) => {\n\t\t\t\tconst flow = flowMap.get(flowRun.flow_id);\n\t\t\t\tif (!flow) return { ...flowRun, flow: undefined };\n\t\t\t\treturn {\n\t\t\t\t\t...flowRun,\n\t\t\t\t\tflow,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter((flowRun) => flowRun !== null) as FlowRunWithFlow[];\n\t}, [paginatedData?.results, flows]);\n\n\tconst handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearch(e.target.value);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleStateFilterChange = (newFilters: Set<FlowRunState>) => {\n\t\tsetStateFilter(newFilters);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleSortChange = (newSort: SortFilters) => {\n\t\tsetSort(newSort);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleClearFilters = () => {\n\t\tsetSearch(\"\");\n\t\tsetStateFilter(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handlePrefetchPage = (page: number) => {\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\t{\n\t\t\t\t\t...paginateFilter,\n\t\t\t\t\tpage,\n\t\t\t\t},\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst hasFilters = search || stateFilter.size > 0;\n\n\tif (countData === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center justify-center h-48 border rounded-lg bg-muted/50\">\n\t\t\t\t<Typography className=\"text-muted-foreground\">\n\t\t\t\t\tNo subflow runs found for this flow run.\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"grid grid-cols-12 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{countData} Subflow run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"xl:col-span-4 col-span-12 md:order-1 order-0\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\taria-label=\"Search by run name\"\n\t\t\t\t\t\tdebounceMs={300}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-3 md:col-span-6 col-span-12 md:order-2 order-1\">\n\t\t\t\t\t<StateFilter\n\t\t\t\t\t\tselectedFilters={stateFilter}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-3 order-3\">\n\t\t\t\t\t<SortFilter value={sort} onSelect={handleSortChange} />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<FlowRunsList\n\t\t\t\tflowRuns={flowRunsWithFlows}\n\t\t\t\tonClearFilters={hasFilters ? handleClearFilters : undefined}\n\t\t\t/>\n\n\t\t\t{paginatedData && paginatedData.pages > 0 && (\n\t\t\t\t<FlowRunsPagination\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonChangePagination={setPagination}\n\t\t\t\t\tcount={paginatedData.count}\n\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\tonPrefetchPage={handlePrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useMemo, useState } from \"react\";\nimport {\n\tFLOW_RUN_STATES_MAP,\n\tFLOW_RUN_STATES_NO_SCHEDULED,\n\ttype FlowRunState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { cn } from \"@/utils\";\n\nconst MAX_FILTERS_DISPLAYED = 2;\n\ntype TaskRunStateFilterProps = {\n\tselectedFilters: Set<string>;\n\tonSelectFilter: (filters: Set<string>) => void;\n\tclassName?: string;\n};\n\nexport const TaskRunStateFilter = ({\n\tselectedFilters,\n\tonSelectFilter,\n\tclassName,\n}: TaskRunStateFilterProps) => {\n\tconst [open, setOpen] = useState(false);\n\n\tconst isAllButScheduled = useMemo(() => {\n\t\tconst flowRunStatesNoScheduleSet = new Set<string>(\n\t\t\tFLOW_RUN_STATES_NO_SCHEDULED,\n\t\t);\n\t\tif (\n\t\t\tselectedFilters.has(\"Scheduled\") ||\n\t\t\tflowRunStatesNoScheduleSet.size !== selectedFilters.size\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Array.from(selectedFilters).every((filter) =>\n\t\t\tflowRunStatesNoScheduleSet.has(filter),\n\t\t);\n\t}, [selectedFilters]);\n\n\tconst handleSelectAllExceptScheduled = () => {\n\t\tonSelectFilter(new Set(FLOW_RUN_STATES_NO_SCHEDULED));\n\t};\n\n\tconst handleSelectAllRunState = () => {\n\t\tonSelectFilter(new Set());\n\t};\n\n\tconst handleSelectFilter = (filter: string) => {\n\t\tif (isAllButScheduled) {\n\t\t\tonSelectFilter(new Set([filter]));\n\t\t\treturn;\n\t\t}\n\t\tconst updatedFilters = new Set(selectedFilters);\n\t\tif (selectedFilters.has(filter)) {\n\t\t\tupdatedFilters.delete(filter);\n\t\t} else {\n\t\t\tupdatedFilters.add(filter);\n\t\t}\n\t\tonSelectFilter(updatedFilters);\n\t};\n\n\tconst renderSelectedTags = () => {\n\t\tif (selectedFilters.size === 0) {\n\t\t\treturn \"All run states\";\n\t\t}\n\t\tif (isAllButScheduled) {\n\t\t\treturn \"All except scheduled\";\n\t\t}\n\n\t\tconst selected = Array.from(selectedFilters);\n\t\tconst visible = selected.slice(0, MAX_FILTERS_DISPLAYED);\n\t\tconst extraCount = selected.length - MAX_FILTERS_DISPLAYED;\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t{visible.map((filter) => (\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tkey={filter}\n\t\t\t\t\t\t\tname={filter}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filter as FlowRunState]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<DropdownMenu open={open} onOpenChange={setOpen}>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tclassName={cn(\"justify-between w-full\", className)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"flex-1 min-w-0\">{renderSelectedTags()}</span>\n\t\t\t\t\t<Icon id=\"ChevronDown\" className=\"ml-2 size-4 shrink-0\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"max-h-96 overflow-x-hidden overflow-y-auto\">\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllExceptScheduled();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={isAllButScheduled} className=\"mr-2\" />\n\t\t\t\t\tAll except scheduled\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllRunState();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={selectedFilters.size === 0} className=\"mr-2\" />\n\t\t\t\t\tAll run states\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t{Object.keys(FLOW_RUN_STATES_MAP).map((filterKey) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\tkey={filterKey}\n\t\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleSelectFilter(filterKey);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\t\tclassName=\"mr-2\"\n\t\t\t\t\t\t\tchecked={!isAllButScheduled && selectedFilters.has(filterKey)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tname={filterKey}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filterKey as FlowRunState]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport type { ChangeEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildPaginateTaskRunsQuery,\n} from \"@/api/task-runs\";\nimport { TaskRunStateFilter } from \"@/components/task-runs/task-run-state-filter\";\nimport {\n\ttype TaskRunSortFilters,\n\tTaskRunsList,\n\tTaskRunsPagination,\n\tTaskRunsSortFilter,\n} from \"@/components/task-runs/task-runs-list\";\nimport type { PaginationState } from \"@/components/task-runs/task-runs-list/task-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { Typography } from \"@/components/ui/typography\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype FlowRunTaskRunsProps = {\n\tflowRunId: string;\n};\n\nexport const FlowRunTaskRuns = ({ flowRunId }: FlowRunTaskRunsProps) => {\n\tconst queryClient = useQueryClient();\n\tconst [search, setSearch] = useState(\"\");\n\tconst [stateFilter, setStateFilter] = useState<Set<string>>(new Set());\n\tconst [tagsFilter, setTagsFilter] = useState<Set<string>>(new Set());\n\tconst [sort, setSort] = useState<TaskRunSortFilters>(\n\t\t\"EXPECTED_START_TIME_DESC\",\n\t);\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpage: 1,\n\t\tlimit: 20,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 300);\n\n\tconst { data: countData } = useSuspenseQuery(\n\t\tbuildCountTaskRunsQuery(\n\t\t\t{\n\t\t\t\ttask_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t},\n\t\t\t},\n\t\t\t30_000,\n\t\t),\n\t);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateTaskRunsQuery(\n\t\t\t{\n\t\t\t\ttask_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\t\tstate:\n\t\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\ttags:\n\t\t\t\t\t\ttagsFilter.size > 0\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tall_: Array.from(tagsFilter),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t},\n\t\t\t\tsort,\n\t\t\t\tpage: pagination.page,\n\t\t\t\tlimit: pagination.limit,\n\t\t\t},\n\t\t\t30_000,\n\t\t),\n\t);\n\n\tconst handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearch(e.target.value);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleStateFilterChange = (newFilters: Set<string>) => {\n\t\tsetStateFilter(newFilters);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleSortChange = (newSort: TaskRunSortFilters) => {\n\t\tsetSort(newSort);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleTagsFilterChange = (\n\t\ttags: string[] | ChangeEvent<HTMLInputElement>,\n\t) => {\n\t\tconst newTags = Array.isArray(tags) ? tags : [];\n\t\tsetTagsFilter(new Set(newTags));\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleClearFilters = () => {\n\t\tsetSearch(\"\");\n\t\tsetStateFilter(new Set());\n\t\tsetTagsFilter(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handlePrefetchPage = (page: number) => {\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateTaskRunsQuery(\n\t\t\t\t{\n\t\t\t\t\ttask_runs: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\tany_: [flowRunId],\n\t\t\t\t\t\t\tis_null_: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\t\t\tstate:\n\t\t\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\ttags:\n\t\t\t\t\t\t\ttagsFilter.size > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tall_: Array.from(tagsFilter),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t\tsort,\n\t\t\t\t\tpage,\n\t\t\t\t\tlimit: pagination.limit,\n\t\t\t\t},\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst hasFilters = search || stateFilter.size > 0 || tagsFilter.size > 0;\n\n\t// Calculate state summary from paginated results\n\tconst stateSummary = useMemo(() => {\n\t\tif (!paginatedData?.results) return null;\n\t\tconst stateCounts = new Map<string, number>();\n\t\tfor (const taskRun of paginatedData.results) {\n\t\t\tconst stateName = String(taskRun.state?.name ?? \"Unknown\");\n\t\t\tstateCounts.set(stateName, (stateCounts.get(stateName) ?? 0) + 1);\n\t\t}\n\t\treturn Array.from(stateCounts.entries())\n\t\t\t.map(([name, count]) => `${count} ${name}`)\n\t\t\t.join(\", \");\n\t}, [paginatedData?.results]);\n\n\tif (countData === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center justify-center h-48 border rounded-lg bg-muted/50\">\n\t\t\t\t<Typography className=\"text-muted-foreground\">\n\t\t\t\t\tNo task runs found for this flow run.\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t{/* Mobile: controls on top, count/sort on bottom. Desktop: count | controls | sort */}\n\t\t\t<div className=\"grid grid-cols-12 items-center gap-2\">\n\t\t\t\t{/* Count - first column */}\n\t\t\t\t<div className=\"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-3\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{countData} Task run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</Typography>\n\t\t\t\t\t{stateSummary && (\n\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\tvariant=\"bodySmall\"\n\t\t\t\t\t\t\tclassName=\"text-muted-foreground text-xs capitalize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t({stateSummary})\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Controls - middle column */}\n\t\t\t\t<div className=\"xl:col-span-3 md:col-span-6 col-span-12 md:order-1 order-0\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\taria-label=\"Search by run name\"\n\t\t\t\t\t\tdebounceMs={300}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-2 md:col-span-6 col-span-12 md:order-2 order-1\">\n\t\t\t\t\t<TaskRunStateFilter\n\t\t\t\t\t\tselectedFilters={stateFilter}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-2 md:col-span-6 col-span-12 md:order-3 order-2\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tvalue={Array.from(tagsFilter)}\n\t\t\t\t\t\tonChange={handleTagsFilterChange}\n\t\t\t\t\t\tplaceholder=\"All tags\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{/* Sort - last column with left border on desktop */}\n\t\t\t\t<div className=\"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-4 order-4\">\n\t\t\t\t\t<TaskRunsSortFilter value={sort} onSelect={handleSortChange} />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<TaskRunsList\n\t\t\t\ttaskRuns={paginatedData?.results}\n\t\t\t\tonClearFilters={hasFilters ? handleClearFilters : undefined}\n\t\t\t/>\n\n\t\t\t{paginatedData && paginatedData.pages > 0 && (\n\t\t\t\t<TaskRunsPagination\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonChangePagination={setPagination}\n\t\t\t\t\tcount={paginatedData.count}\n\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\tonPrefetchPage={handlePrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQueryClient, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport { Suspense, useCallback, useEffect, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { queryKeyFactory as artifactsQueryKeyFactory } from \"@/api/artifacts\";\nimport {\n\tbuildGetFlowRunDetailsQuery,\n\ttype FlowRun,\n\tqueryKeyFactory as flowRunsQueryKeyFactory,\n\tuseDeleteFlowRun,\n} from \"@/api/flow-runs\";\nimport { queryKeyFactory as logsQueryKeyFactory } from \"@/api/logs\";\nimport { queryKeyFactory as taskRunsQueryKeyFactory } from \"@/api/task-runs\";\nimport { FlowRunGraph } from \"@/components/flow-runs/flow-run-graph\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ErrorBoundary } from \"@/components/ui/error-boundary\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { TabErrorState } from \"@/components/ui/tab-error-state\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { useStateFavicon } from \"@/hooks/use-state-favicon\";\nimport { FlowRunArtifacts } from \"./flow-run-artifacts\";\nimport { FlowRunDetails } from \"./flow-run-details\";\nimport { FlowRunHeader } from \"./flow-run-header\";\nimport { FlowRunLogs } from \"./flow-run-logs\";\nimport { FlowRunSubflows } from \"./flow-run-subflows\";\nimport { FlowRunTaskRuns } from \"./flow-run-task-runs\";\n\ntype FlowRunDetailsTabOptions =\n\t| \"Logs\"\n\t| \"TaskRuns\"\n\t| \"SubflowRuns\"\n\t| \"Artifacts\"\n\t| \"Details\"\n\t| \"Parameters\"\n\t| \"JobVariables\";\n\ntype FlowRunDetailsPageProps = {\n\tid: string;\n\ttab: FlowRunDetailsTabOptions;\n\tonTabChange: (tab: FlowRunDetailsTabOptions) => void;\n};\n\nexport const FlowRunDetailsPage = ({\n\tid,\n\ttab,\n\tonTabChange,\n}: FlowRunDetailsPageProps) => {\n\tconst [refetchInterval, setRefetchInterval] = useState<number | false>(false);\n\tconst [fullscreen, setFullscreen] = useState(false);\n\tconst queryClient = useQueryClient();\n\tconst { data: flowRun } = useSuspenseQuery({\n\t\t...buildGetFlowRunDetailsQuery(id),\n\t\trefetchInterval,\n\t});\n\tconst { deleteFlowRun } = useDeleteFlowRun();\n\tconst { navigate } = useRouter();\n\tconst isPending = flowRun.state_type === \"PENDING\";\n\n\t// Set favicon based on flow run state\n\tuseStateFavicon(flowRun?.state_type);\n\n\tuseEffect(() => {\n\t\tif (flowRun.state_type === \"RUNNING\" || flowRun.state_type === \"PENDING\") {\n\t\t\tsetRefetchInterval(5000);\n\t\t} else {\n\t\t\tsetRefetchInterval(false);\n\t\t}\n\t}, [flowRun]);\n\n\tconst onDeleteRunClicked = () => {\n\t\tdeleteFlowRun(flowRun.id, {\n\t\t\tonSuccess: () => {\n\t\t\t\tsetRefetchInterval(false);\n\t\t\t\ttoast.success(\"Flow run deleted\");\n\t\t\t\tvoid navigate({ to: \"/runs\", replace: true });\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while deleting flow run.\";\n\t\t\t\ttoast.error(message);\n\t\t\t},\n\t\t});\n\t};\n\n\tconst retryLogs = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: logsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retryTaskRuns = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: taskRunsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retrySubflows = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: flowRunsQueryKeyFactory.lists(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retryArtifacts = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: artifactsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<FlowRunHeader flowRun={flowRun} onDeleteClick={onDeleteRunClicked} />\n\t\t\t</div>\n\t\t\t{!isPending && (\n\t\t\t\t<Card className=\"py-0\">\n\t\t\t\t\t<CardContent className=\"p-0\">\n\t\t\t\t\t\t<FlowRunGraph\n\t\t\t\t\t\t\tflowRunId={flowRun.id}\n\t\t\t\t\t\t\tstateType={flowRun.state_type ?? undefined}\n\t\t\t\t\t\t\tfullscreen={fullscreen}\n\t\t\t\t\t\t\tonFullscreenChange={setFullscreen}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<TabsLayout\n\t\t\t\t\tcurrentTab={tab}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\tlogsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load logs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading log data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryLogs}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<LogsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunLogs flowRun={flowRun} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\ttaskRunsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load task runs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading task run data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryTaskRuns}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<TaskRunsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunTaskRuns flowRunId={id} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tsubflowRunsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load subflow runs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading subflow run data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retrySubflows}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<SubflowsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunSubflows parentFlowRunId={id} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tartifactsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load artifacts\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading artifact data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryArtifacts}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Suspense fallback={<ArtifactsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunArtifacts flowRun={flowRun} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tdetailsContent={\n\t\t\t\t\t\t<Suspense fallback={<DetailsSkeleton />}>\n\t\t\t\t\t\t\t<FlowRunDetails flowRun={flowRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\tparametersContent={\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\ttoast.success(\"Copied parameters to clipboard\");\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(flowRun.parameters ?? {}, null, 2),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-4 mr-2\" />\n\t\t\t\t\t\t\t\t\tCopy parameters\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<LazyJsonInput\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(flowRun.parameters ?? {}, null, 2)}\n\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\tjobVariablesContent={\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\ttoast.success(\"Copied job variables to clipboard\");\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(flowRun.job_variables ?? {}, null, 2),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-4 mr-2\" />\n\t\t\t\t\t\t\t\t\tCopy job variables\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<LazyJsonInput\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(flowRun.job_variables ?? {}, null, 2)}\n\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst TabsLayout = ({\n\tcurrentTab,\n\tonTabChange,\n\tflowRun,\n\tlogsContent,\n\ttaskRunsContent,\n\tsubflowRunsContent,\n\tartifactsContent,\n\tdetailsContent,\n\tparametersContent,\n\tjobVariablesContent,\n}: {\n\tcurrentTab: FlowRunDetailsTabOptions;\n\tonTabChange: (tab: FlowRunDetailsTabOptions) => void;\n\tflowRun: FlowRun;\n\tlogsContent: React.ReactNode;\n\ttaskRunsContent: React.ReactNode;\n\tsubflowRunsContent: React.ReactNode;\n\tartifactsContent: React.ReactNode;\n\tdetailsContent: React.ReactNode;\n\tparametersContent: React.ReactNode;\n\tjobVariablesContent: React.ReactNode;\n}) => {\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value) => onTabChange(value as FlowRunDetailsTabOptions)}\n\t\t>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger value=\"Details\">Details</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Logs\">Logs</TabsTrigger>\n\t\t\t\t{flowRun.state_type !== \"PENDING\" && (\n\t\t\t\t\t<TabsTrigger value=\"TaskRuns\">Task Runs</TabsTrigger>\n\t\t\t\t)}\n\t\t\t\t{flowRun.state_type !== \"PENDING\" && (\n\t\t\t\t\t<TabsTrigger value=\"SubflowRuns\">Subflow Runs</TabsTrigger>\n\t\t\t\t)}\n\t\t\t\t<TabsTrigger value=\"Artifacts\">Artifacts</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Parameters\">Parameters</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"JobVariables\">Job Variables</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Logs\">{logsContent}</TabsContent>\n\t\t\t<TabsContent value=\"TaskRuns\">{taskRunsContent}</TabsContent>\n\t\t\t<TabsContent value=\"SubflowRuns\">{subflowRunsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Artifacts\">{artifactsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Parameters\">{parametersContent}</TabsContent>\n\t\t\t<TabsContent value=\"JobVariables\">{jobVariablesContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n\nconst LogsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-25\" />\n\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t\t<Skeleton className=\"h-8 w-8\" /> {/* Download button placeholder */}\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-32\" />\n\t\t</div>\n\t);\n};\n\nconst TaskRunsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-2\">\n\t\t\t\t<Skeleton className=\"h-9 flex-1\" />\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<Skeleton className=\"h-9 w-48\" />\n\t\t\t\t\t<Skeleton className=\"h-9 w-40\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst ArtifactsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-12\" />\n\t\t\t</div>\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3\">\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst SubflowsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-2\">\n\t\t\t\t<Skeleton className=\"h-9 flex-1\" />\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<Skeleton className=\"h-9 w-48\" />\n\t\t\t\t\t<Skeleton className=\"h-9 w-40\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst DetailsSkeleton = () => {\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t<Skeleton className=\"h-5 w-12\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-16\" />\n\t\t\t\t<Skeleton className=\"h-5 w-32\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t<Skeleton className=\"h-5 w-32\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t<Skeleton className=\"h-5 w-64\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, notFound, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildGetFlowRunDetailsQuery } from \"@/api/flow-runs\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildPaginateTaskRunsQuery } from \"@/api/task-runs\";\nimport { FlowRunDetailsPage } from \"@/components/flow-runs/flow-run-details-page\";\nimport { FlowRunNotFound } from \"@/components/flow-runs/flow-run-not-found\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\n\t\t\t\"Logs\",\n\t\t\t\"TaskRuns\",\n\t\t\t\"SubflowRuns\",\n\t\t\t\"Artifacts\",\n\t\t\t\"Details\",\n\t\t\t\"Parameters\",\n\t\t\t\"JobVariables\",\n\t\t])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type FlowRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction FlowRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load flow run\");\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\">Flow Run</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(\"/runs/flow-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateTaskRunsQuery({\n\t\t\t\tpage: 1,\n\t\t\t\tsort: \"EXPECTED_START_TIME_DESC\",\n\t\t\t\tflow_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\ttry {\n\t\t\tawait queryClient.ensureQueryData(buildGetFlowRunDetailsQuery(params.id));\n\t\t} catch (error) {\n\t\t\t// Only treat \"not found\" errors as 404, rethrow other errors\n\t\t\tif (error instanceof Error && /not found/i.test(error.message)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/only-throw-error\n\t\t\t\tthrow notFound();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t},\n\twrapInSuspense: true,\n\terrorComponent: FlowRunErrorComponent,\n\tnotFoundComponent: FlowRunNotFound,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: FlowRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <FlowRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"file":"flow-run._id-33WKPXsZ.js"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as oe,j as e,r as o,t as z,C as Se,D as we,E as G,n as Ne}from"./vendor-tanstack-BcZfOOfy.js";import{aS as Re,y as H,bN as re,aN as ie,aR as ce,ak as V,q as E,I as de,cE as Fe,al as q,bO as Te,O as ue,S as ke,a as _e,b as Ae,c as Ee,e as Be,c4 as me,_ as Oe,$ as Pe,a0 as Me,a1 as Ie,a2 as Le,a3 as ze,bM as U,B as He,g as Qe,h as Y,bs as Ge,bB as We,bD as Ke,aD as O,cF as $e,cG as Ve,cH as qe,cI as Ue,cJ as Ye,cK as Ze,C as pe,m as he,n as ge,o as xe,aX as Je,aC as Xe,cL as es,cM as ss,b5 as as,aw as ts,ax as ns,ay as I,az as L,cN as m,ao as ls,be as os,aE as Z,aH as J,aL as rs}from"./index-_0OOjqn5.js";import{S as is}from"./sort-filter-DaBGDmua.js";import{S as cs,a as ds,F as us}from"./flow-runs-pagination-Bfelp8UO.js";import{u as ms,F as ps}from"./use-flow-runs-selected-rows-CdMKKvm5.js";import{D as hs}from"./delete-confirmation-dialog-B9-8JHV7.js";import{D as gs}from"./data-table-DHlbTUL7.js";import{T as xs}from"./tags-input-BvH9UY8h.js";import{D as fe,a as ye,b as je,d as Q,c as fs}from"./dropdown-menu-DF4QR3Cp.js";import{S as ys}from"./index-vRbn9rG4.js";import{S as js}from"./index-DSBmxhwG.js";import{s as bs,U as vs,_ as Cs}from"./vendor-date-wwuDAncJ.js";import{A as Ds,b as X}from"./vendor-recharts-BAN776s_.js";import{u as Ss}from"./use-page-title-DEH55Ovu.js";import{o as ws,e as P,a as ee,s as M,n as _,d as se}from"./vendor-forms-ClCIacbh.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./use-delete-confirmation-dialog-CUdii6Lo.js";import"./table-4GUC4YOD.js";import"./cronstrue-Bevg0uGw.js";import"./use-is-overflowing-CpSV4NPP.js";const Ns=({flow:s,open:a,onOpenChange:t,onDeleted:n})=>{const l=oe(),{deleteFlow:r,isPending:c}=Re(),d=()=>{r(s.id,{onSuccess:()=>{H.success("Flow deleted"),n?.(),l({to:"/flows"})},onError:()=>{H.error("Failed to delete flow")}})};return e.jsx(hs,{isOpen:a,title:"Delete Flow",description:`Are you sure you want to delete ${s.name}? This action cannot be undone.`,isLoading:c,loadingText:"Deleting...",onConfirm:d,onClose:()=>t(!1)})},ae=4,Rs=2,Fs=({deploymentId:s})=>{const[a,t]=o.useState(0),n=re(a,150),l=o.useCallback(u=>{if(!u)return;const p=()=>{const h=u.getBoundingClientRect().width;t(Math.floor(h/(ae+Rs)))};p();const x=new ResizeObserver(p);return x.observe(u),()=>{x.disconnect()}},[]),r=n||a,{data:c}=z(ie({deployments:{operator:"and_",id:{any_:[s]}},limit:Math.min(60,r||60),sort:"START_TIME_DESC",offset:0})),d=c?.map(u=>({...u}))??[];return e.jsx("div",{className:"w-full",ref:l,children:e.jsx(ce,{enrichedFlowRuns:d,startDate:bs(new Date,vs),endDate:new Date,barWidth:ae,numberOfBars:r,className:"h-8 w-full",chartId:`deployment-${s}`})})},Ts=[{id:"select",header:({table:s})=>e.jsx(V,{checked:s.getIsAllPageRowsSelected(),onCheckedChange:a=>s.toggleAllPageRowsSelected(!!a),"aria-label":"Select all"}),cell:({row:s})=>e.jsx(V,{checked:s.getIsSelected(),onCheckedChange:a=>s.toggleSelected(!!a),"aria-label":"Select row"}),enableSorting:!1,enableHiding:!1,maxSize:20,minSize:20},{accessorKey:"name",header:"Name",cell:({row:s})=>s.original.name},{accessorKey:"status",header:"Status",cell:({row:s})=>{const a=s.original.paused?"PAUSED":s.original.status??"NOT_READY";return e.jsx(js,{status:a})}},{accessorKey:"tags",header:"Tags",cell:({row:s})=>e.jsx("div",{className:"flex flex-wrap gap-1",children:s.original.tags?.map(a=>e.jsx("span",{className:"bg-gray-100 text-gray-800 text-xs font-medium px-2 py-0.5 rounded",children:a},a))})},{accessorKey:"schedules",header:"Schedules",cell:({row:s})=>{const a=s.original.schedules;return!a||a.length===0?null:e.jsx(ys,{schedules:a})},size:150},{accessorKey:"activity",header:"Activity",cell:({row:s})=>s.original.id?e.jsx(Fs,{deploymentId:s.original.id}):null},{id:"actions",cell:({row:s})=>s.original.id?e.jsxs(fe,{children:[e.jsx(ye,{asChild:!0,children:e.jsxs(E,{variant:"ghost",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(de,{id:"MoreHorizontal",className:"size-4"})]})}),e.jsx(je,{align:"end",children:e.jsx(Q,{onClick:()=>{navigator.clipboard.writeText(s.original.id)},children:"Copy ID"})})]}):null,minSize:30,maxSize:30}],ks=[{label:"Created",value:"CREATED_DESC"},{label:"A to Z",value:"NAME_ASC"},{label:"Z to A",value:"NAME_DESC"}],_s=({deployments:s,deploymentsCount:a,deploymentsPages:t,deploymentSearch:n,onDeploymentSearchChange:l,deploymentTags:r,onDeploymentTagsChange:c,deploymentSort:d,onDeploymentSortChange:u,deploymentPagination:p,onDeploymentPaginationChange:x})=>{const[h,y]=o.useState({}),[g,f]=o.useState(!1),{deleteDeployment:j}=Fe(),b=o.useCallback(i=>{const v={pageIndex:p.page-1,pageSize:p.limit},w=typeof i=="function"?i(v):i;x({page:w.pageIndex+1,limit:w.pageSize}),y({})},[p,x]),R=Se({data:s,columns:Ts,getCoreRowModel:we(),manualPagination:!0,pageCount:t,state:{rowSelection:h,pagination:{pageIndex:p.page-1,pageSize:p.limit}},onRowSelectionChange:y,onPaginationChange:b,getRowId:i=>i.id}),C=Object.keys(h).length,D=o.useCallback(()=>{const i=Object.keys(h);for(const v of i)j(v);y({}),f(!1)},[h,j]),S=o.useCallback(i=>{Array.isArray(i)&&c(i)},[c]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"grid grid-cols-12 items-center gap-2",children:[e.jsx("div",{className:"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-3",children:C>0?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(q,{variant:"bodySmall",className:"text-muted-foreground",children:[C," selected"]}),e.jsx(E,{variant:"ghost",size:"icon",className:"h-6 w-6 text-destructive hover:text-destructive",onClick:()=>f(!0),"aria-label":"Delete selected deployments",children:e.jsx(Te,{className:"h-4 w-4"})})]}):e.jsxs(q,{variant:"bodySmall",className:"text-muted-foreground",children:[a," Deployment",a!==1?"s":""]})}),e.jsx("div",{className:"xl:col-span-4 md:col-span-6 col-span-12 md:order-1 order-0",children:e.jsx(ue,{placeholder:"Search deployments...",value:n??"",onChange:i=>l(i.target.value),"aria-label":"Search deployments",debounceMs:300})}),e.jsx("div",{className:"xl:col-span-3 md:col-span-6 col-span-12 md:order-2 order-1",children:e.jsx(xs,{placeholder:"Filter by tags",value:r,onChange:S})}),e.jsx("div",{className:"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-3 order-2",children:e.jsxs(ke,{value:d,onValueChange:i=>u(i),children:[e.jsx(_e,{className:"w-full","aria-label":"Sort deployments",children:e.jsx(Ae,{placeholder:"Sort by"})}),e.jsx(Ee,{children:ks.map(i=>e.jsx(Be,{value:i.value,children:i.label},i.value))})]})})]}),e.jsx(me,{children:e.jsx("div",{className:"[&_[data-slot=table-container]]:overflow-visible",children:e.jsx(gs,{table:R})})}),e.jsx(Oe,{open:g,onOpenChange:f,children:e.jsxs(Pe,{children:[e.jsxs(Me,{children:[e.jsx(Ie,{children:"Delete Deployments"}),e.jsxs(Le,{children:["Are you sure you want to delete ",C," deployment",C!==1?"s":"","? This action cannot be undone."]})]}),e.jsxs(ze,{children:[e.jsx(E,{variant:"outline",onClick:()=>f(!1),children:"Cancel"}),e.jsx(E,{variant:"destructive",onClick:D,children:"Delete"})]})]})})]})},As=({flow:s})=>e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("dl",{className:"flex flex-col gap-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Flow ID"}),e.jsx("dd",{className:"text-sm font-medium leading-none font-mono",children:s.id})]}),e.jsxs("dl",{className:"flex flex-col gap-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Created"}),e.jsx("dd",{className:"text-sm font-medium leading-none font-mono",children:s.created?e.jsx(U,{date:s.created,format:"absolute"}):"N/A"})]}),e.jsxs("dl",{className:"flex flex-col gap-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Updated"}),e.jsx("dd",{className:"text-sm font-medium leading-none font-mono",children:s.updated?e.jsx(U,{date:s.updated,format:"absolute"}):"N/A"})]})]}),Es=({flow:s,onDelete:a})=>{const t=()=>{navigator.clipboard.writeText(s.id),H.success("ID copied")};return e.jsxs(fe,{children:[e.jsx(ye,{asChild:!0,children:e.jsxs(E,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(de,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(je,{align:"end",children:[e.jsx(fs,{children:"Actions"}),e.jsx(Q,{onClick:t,children:"Copy ID"}),e.jsx(Q,{variant:"destructive",onClick:a,children:"Delete"})]})]})};function Bs({flow:s,onDelete:a}){return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(He,{children:e.jsxs(Qe,{children:[e.jsx(Y,{children:e.jsx(Ge,{to:"/flows",className:"text-xl font-semibold",children:"Flows"})}),e.jsx(We,{}),e.jsx(Y,{className:"text-xl font-semibold",children:e.jsx(Ke,{children:s.name})})]})}),e.jsx(Es,{flow:s,onDelete:a})]})}const A=3e4,Os={completed:{label:"Completed",color:"hsl(142.1 76.2% 36.3%)"},failed:{label:"Failed",color:"hsl(0 84.2% 60.2%)"}},Ps=s=>{const a=[];let t=0,n=0;for(const l of s){let r=0,c=0;for(const d of l.states)d.state_type==="COMPLETED"?r+=d.count_runs:(d.state_type==="FAILED"||d.state_type==="CRASHED")&&(c+=d.count_runs);t+=r,n+=c,a.push({timestamp:l.interval_start,completed:t,failed:n})}return a};function Ms({flowId:s}){const[{data:a},{data:t},{data:n},{data:l},{data:r}]=G({queries:[O(Ve(s),A),O(qe(s),A),O(Ue(s),A),O(Ye(s),A),$e(Ze(s),A)]}),c=o.useMemo(()=>Ps(r),[r]),d=c.some(h=>h.failed>0),u=a-l,p=u>0?(t/u*100).toFixed(0):"0",x=u>0?(n/u*100).toFixed(1):"0";return e.jsxs(pe,{className:"flex-1 relative overflow-hidden pb-20",children:[e.jsx(he,{className:"pb-2",children:e.jsx(ge,{children:"Task Runs"})}),e.jsx(xe,{children:e.jsxs("div",{className:"grid gap-1",children:[e.jsx("div",{className:"inline-flex items-end gap-1 text-base",children:e.jsx("span",{className:"font-semibold",children:a})}),l>0&&e.jsxs("div",{className:"inline-flex items-end gap-1 text-sm",children:[e.jsx("span",{className:"font-semibold text-blue-600",children:l}),e.jsx("span",{className:"text-muted-foreground",children:"Running"})]}),e.jsxs("div",{className:"inline-flex items-end gap-1 text-sm",children:[e.jsx("span",{className:"font-semibold text-green-600",children:t}),e.jsx("span",{className:"text-muted-foreground",children:"Completed"}),e.jsxs("span",{className:"text-green-600",children:[p,"%"]})]}),n>0&&e.jsxs("div",{className:"inline-flex items-end gap-1 text-sm",children:[e.jsx("span",{className:"font-semibold text-red-600",children:n}),e.jsx("span",{className:"text-muted-foreground",children:"Failed"}),e.jsxs("span",{className:"text-red-600",children:[x,"%"]})]})]})}),e.jsx("div",{className:"absolute bottom-4 left-0 right-0 h-16",children:e.jsx(Je,{config:Os,className:"h-full w-full",children:e.jsxs(Ds,{data:c,margin:{top:0,right:0,bottom:0,left:0},children:[e.jsxs("defs",{children:[e.jsxs("linearGradient",{id:"completedGradientFlow",x1:"0",y1:"1",x2:"0",y2:"0",children:[e.jsx("stop",{offset:"0%",stopColor:"var(--color-completed)",stopOpacity:0}),e.jsx("stop",{offset:"100%",stopColor:"var(--color-completed)",stopOpacity:.3})]}),e.jsxs("linearGradient",{id:"failedGradientFlow",x1:"0",y1:"1",x2:"0",y2:"0",children:[e.jsx("stop",{offset:"0%",stopColor:"var(--color-failed)",stopOpacity:0}),e.jsx("stop",{offset:"100%",stopColor:"var(--color-failed)",stopOpacity:.3})]})]}),d&&e.jsx(X,{type:"monotone",dataKey:"failed",stroke:"var(--color-failed)",strokeWidth:2,activeDot:!1,fill:"url(#failedGradientFlow)",dot:!1,isAnimationActive:!1}),e.jsx(X,{type:"monotone",dataKey:"completed",stroke:"var(--color-completed)",strokeWidth:2,activeDot:!1,fill:"url(#completedGradientFlow)",dot:!1,isAnimationActive:!1})]})})})]})}const te=8,Is=4,ne=3e4;function Ls({flowId:s,flow:a}){const[t,n]=o.useState(0),l=re(t,150),r=o.useCallback(g=>{if(!g)return;const f=()=>{const b=g.getBoundingClientRect().width;n(Math.floor(b/(te+Is)))};f();const j=new ResizeObserver(f);return j.observe(g),()=>j.disconnect()},[]),c=l||t,d=60,[{data:u},{data:p}]=G({queries:[ie(es(s,d),ne),Xe(ss(s),ne)]}),x=o.useMemo(()=>u.map(g=>({...g,flow:a})),[u,a]),{startDate:h,endDate:y}=o.useMemo(()=>{const g=new Date;return{startDate:Cs(g),endDate:g}},[]);return e.jsxs(pe,{className:"flex-1",children:[e.jsxs(he,{className:"flex flex-row items-center justify-between pb-2",children:[e.jsx(ge,{children:"Flow Runs"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[p," total"]})]}),e.jsx(xe,{children:e.jsx("div",{className:"h-24",ref:r,children:c===0?e.jsx(as,{className:"h-full w-full"}):e.jsx(me,{children:e.jsx(ce,{enrichedFlowRuns:x,startDate:h,endDate:y,numberOfBars:c,barWidth:te,className:"h-full w-full"})})})})]})}function zs({flowId:s,flow:a}){return e.jsxs("div",{className:"grid gap-5 md:grid-cols-[2fr_1fr]",children:[e.jsx(Ls,{flowId:s,flow:a}),e.jsx(Ms,{flowId:s})]})}function Hs({flow:s,flowRuns:a,flowRunsCount:t,flowRunsPages:n,deployments:l,deploymentsCount:r,deploymentsPages:c,tab:d="runs",pagination:u,onPaginationChange:p,onPrefetchPage:x,sort:h,onSortChange:y,flowRunSearch:g,onFlowRunSearchChange:f,selectedStates:j,onSelectFilter:b,deploymentSearch:R,onDeploymentSearchChange:C,deploymentTags:D,onDeploymentTagsChange:S,deploymentSort:i,onDeploymentSortChange:v,deploymentPagination:w,onDeploymentPaginationChange:N}){const F=oe(),[W,T]=o.useState(!1),[B,be,{onSelectRow:ve,clearSet:K}]=ms(),$=a.map(k=>({...k,flow:s})),Ce=o.useCallback(()=>{f(""),b(new Set),K()},[f,b,K]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"container mx-auto flex flex-col gap-4",children:[e.jsx(Bs,{flow:s,onDelete:()=>T(!0)}),e.jsx(zs,{flowId:s.id,flow:s}),e.jsxs(ts,{value:d,onValueChange:k=>{F({to:".",search:De=>({...De,tab:k})})},children:[e.jsxs(ns,{children:[e.jsx(I,{value:"runs",children:"Runs"}),e.jsx(I,{value:"deployments",children:"Deployments"}),e.jsx(I,{value:"details",children:"Details"})]}),e.jsxs(L,{value:"runs",className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(ps,{count:t,results:$,selectedRows:B,setSelectedRows:be}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(ue,{placeholder:"Search by run name",value:g??"",onChange:k=>f(k.target.value),className:"w-64"}),e.jsx(cs,{selectedFilters:j,onSelectFilter:b}),e.jsx(is,{value:h,onSelect:y})]})]}),e.jsx(ds,{flowRuns:$,selectedRows:B,onSelect:ve,onClearFilters:Ce}),e.jsx(us,{count:t,pages:n,pagination:u,onChangePagination:p,onPrefetchPage:x})]}),e.jsx(L,{value:"deployments",children:e.jsx(_s,{deployments:l,deploymentsCount:r,deploymentsPages:c,deploymentSearch:R,onDeploymentSearchChange:C,deploymentTags:D,onDeploymentTagsChange:S,deploymentSort:i,onDeploymentSortChange:v,deploymentPagination:w,onDeploymentPaginationChange:N})}),e.jsx(L,{value:"details",children:e.jsx(As,{flow:s})})]})]}),e.jsx(Ns,{flow:s,open:W,onOpenChange:T})]})}ws({tab:P(["runs","deployments","details"]).optional().default("runs"),"runs.page":_().int().positive().optional().default(1),"runs.limit":_().int().positive().max(100).optional().default(10),"runs.sort":P(rs).optional().default("START_TIME_DESC"),"runs.flowRuns.nameLike":M().optional().default(""),"runs.flowRuns.state.name":ee(M()).optional(),type:P(["span","range"]).optional(),seconds:_().int().positive().optional(),startDateTime:se().optional(),endDateTime:se().optional(),"deployments.page":_().int().positive().optional().default(1),"deployments.limit":_().int().positive().optional().default(10),"deployments.nameLike":M().optional(),"deployments.tags":ee(M()).optional(),"deployments.sort":P(["CREATED_DESC","UPDATED_DESC","NAME_ASC","NAME_DESC"]).optional().default("NAME_ASC")}).optional().default({});const le=(s,a)=>{const t=s["runs.flowRuns.nameLike"],n=s["runs.flowRuns.state.name"]??[],r=t||n.length>0?{operator:"and_",...t&&{name:{like_:t}},...n.length>0&&{state:{operator:"and_",name:{any_:n}}}}:void 0;return{page:s["runs.page"],limit:s["runs.limit"],sort:s["runs.sort"],flow_runs:r,flows:{operator:"and_",id:{any_:[a]}}}},Qs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useMemo(()=>({page:s["runs.page"],limit:s["runs.limit"]}),[s["runs.page"],s["runs.limit"]]),n=o.useCallback(l=>{a({to:".",search:r=>({...r,"runs.page":l.page,"runs.limit":l.limit}),replace:!0})},[a]);return[t,n]},Gs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"runs.sort":n,"runs.page":1}),replace:!0})},[a]);return[s["runs.sort"],t]},Ws=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"runs.flowRuns.nameLike":n,"runs.page":1}),replace:!0})},[a]);return[s["runs.flowRuns.nameLike"],t]},Ks=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useMemo(()=>new Set(s["runs.flowRuns.state.name"]||[]),[s["runs.flowRuns.state.name"]]),n=o.useCallback(l=>{a({to:".",search:r=>({...r,"runs.flowRuns.state.name":Array.from(l),"runs.page":1}),replace:!0})},[a]);return{selectedStates:t,onSelectFilter:n}},$s=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"deployments.nameLike":n||void 0,"deployments.page":1}),replace:!0})},[a]);return[s["deployments.nameLike"],t]},Vs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"deployments.tags":n.length>0?n:void 0,"deployments.page":1}),replace:!0})},[a]);return[s["deployments.tags"]??[],t]},qs=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useCallback(n=>{a({to:".",search:l=>({...l,"deployments.sort":n,"deployments.page":1}),replace:!0})},[a]);return[s["deployments.sort"],t]},Us=()=>{const s=m.useSearch(),a=m.useNavigate(),t=o.useMemo(()=>({page:s["deployments.page"],limit:s["deployments.limit"]}),[s["deployments.page"],s["deployments.limit"]]),n=o.useCallback(l=>{a({to:".",search:r=>({...r,"deployments.page":l.page,"deployments.limit":l.limit}),replace:!0})},[a]);return[t,n]},fa=()=>{const s=Ne(),{id:a}=m.useParams(),t=m.useSearch(),[n,l]=Qs(),[r,c]=Gs(),[d,u]=Ws(),{selectedStates:p,onSelectFilter:x}=Ks(),[h,y]=$s(),[g,f]=Vs(),[j,b]=qs(),[R,C]=Us(),[{data:D}]=G({queries:[ls(a)]}),{data:S}=z(os({sort:t["deployments.sort"],page:t["deployments.page"],limit:t["deployments.limit"],flows:{operator:"and_",id:{any_:[a]}},deployments:{operator:"and_",flow_or_deployment_name:{like_:t["deployments.nameLike"]},tags:{operator:"and_",all_:t["deployments.tags"]||[]}}}));Ss(D?.name?`Flow: ${D.name}`:"Flow");const{data:i}=z(Z(le(t,a),3e4)),v=i?.results??[];o.useEffect(()=>{const N=v.map(F=>F.id);N.length>0&&s.prefetchQuery(J(N))},[s,v]);const w=o.useCallback(N=>{const F=le({...t,"runs.page":N},a);(async()=>{const T=(await s.ensureQueryData(Z(F,3e4)))?.results?.map(B=>B.id)??[];T.length>0&&s.prefetchQuery(J(T))})()},[s,t,a]);return e.jsx(Hs,{flow:D,flowRuns:v,flowRunsCount:i?.count??0,flowRunsPages:i?.pages??0,deployments:S?.results??[],deploymentsCount:S?.count??0,deploymentsPages:S?.pages??0,tab:t.tab,pagination:n,onPaginationChange:l,onPrefetchPage:w,sort:r,onSortChange:c,flowRunSearch:d,onFlowRunSearchChange:u,selectedStates:p,onSelectFilter:x,deploymentSearch:h,onDeploymentSearchChange:y,deploymentTags:g,onDeploymentTagsChange:f,deploymentSort:j,onDeploymentSortChange:b,deploymentPagination:R,onDeploymentPaginationChange:C})};export{fa as component};
|
|
2
|
-
//# sourceMappingURL=flow._id-DuQ5AUjj.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,L as p,r as i,s as m}from"./vendor-tanstack-BcZfOOfy.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-_0OOjqn5.js";import{W as R}from"./header-nu-ZKuen.js";import{S as z}from"./index-DSBmxhwG.js";import{D as w,a as $,b as F,c as B,d}from"./dropdown-menu-DF4QR3Cp.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BAN776s_.js";import"./vendor-forms-ClCIacbh.js";import"./vendor-date-wwuDAncJ.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-BqwU5GSv.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BqwU5GSv.js","sources":["../../src/components/work-pools/empty-state.tsx","../../src/components/work-pools/work-pool-card/components/work-pool-context-menu.tsx","../../src/components/work-pools/work-pool-card/components/work-pool-name.tsx","../../src/components/work-pools/work-pool-card/components/work-pool-pause-resume-toggle.tsx","../../src/components/work-pools/work-pool-card/components/work-pool-type-badge.tsx","../../src/components/work-pools/work-pool-card/work-pool-card.tsx","../../src/routes/work-pools/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 WorkPoolsEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Cpu\" />\n\t\t<EmptyStateTitle>Add a work pool to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tWork pools allow you to prioritize and manage deployments and control the\n\t\t\tinfrastructure they run on.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Link to=\"/work-pools/create\">\n\t\t\t\t<Button>\n\t\t\t\t\tAdd Work Pool <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t\t</Button>\n\t\t\t</Link>\n\t\t\t<DocsLink id=\"work-pools-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport type WorkPoolContextMenuProps = {\n\tworkPool: WorkPool;\n\tonDelete: () => void;\n};\n\nexport const WorkPoolContextMenu = ({\n\tworkPool,\n\tonDelete,\n}: WorkPoolContextMenuProps) => {\n\tconst handleCopyId = (id: string) => {\n\t\tvoid navigator.clipboard.writeText(id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={() => handleCopyId(workPool.id)}>\n\t\t\t\t\tCopy ID\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<Link\n\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName/edit\"\n\t\t\t\t\tparams={{ workPoolName: workPool.name }}\n\t\t\t\t>\n\t\t\t\t\t<DropdownMenuItem>Edit</DropdownMenuItem>\n\t\t\t\t</Link>\n\t\t\t\t<DropdownMenuItem onClick={onDelete}>Delete</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import { WorkPoolIconText } from \"@/components/work-pools/work-pool-icon-text\";\n\ntype WorkPoolNameProps = {\n\tworkPoolName: string;\n};\n\nexport const WorkPoolName = ({ workPoolName }: WorkPoolNameProps) => {\n\treturn <WorkPoolIconText workPoolName={workPoolName} />;\n};\n","import { useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { usePauseWorkPool, useResumeWorkPool } from \"@/api/work-pools\";\nimport { Switch } from \"@/components/ui/switch\";\nexport type WorkPoolPauseResumeToggleParams = {\n\tworkPool: WorkPool;\n};\n\nexport const WorkPoolPauseResumeToggle = ({\n\tworkPool,\n}: WorkPoolPauseResumeToggleParams) => {\n\tconst [isPaused, setIsPaused] = useState(workPool.status === \"PAUSED\");\n\n\tconst { pauseWorkPool, isPending: isPausing } = usePauseWorkPool();\n\tconst { resumeWorkPool, isPending: isResuming } = useResumeWorkPool();\n\n\tconst disabled = useMemo(() => {\n\t\treturn isPausing || isResuming;\n\t}, [isPausing, isResuming]);\n\n\tconst handleTogglePause = () => {\n\t\tif (isPaused) {\n\t\t\tresumeWorkPool(workPool.name, {\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tsetIsPaused(false);\n\t\t\t\t\ttoast.success(`${workPool.name} resumed`);\n\t\t\t\t},\n\t\t\t\tonError: () => {\n\t\t\t\t\ttoast.error(`Failed to resume ${workPool.name}`);\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tpauseWorkPool(workPool.name, {\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tsetIsPaused(true);\n\t\t\t\t\ttoast.success(`${workPool.name} paused`);\n\t\t\t\t},\n\t\t\t\tonError: () => {\n\t\t\t\t\ttoast.error(`Failed to pause ${workPool.name}`);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t};\n\n\treturn (\n\t\t<span className=\"flex items-center gap-2\">\n\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t{isPaused ? \"Paused\" : \"Active\"}\n\t\t\t</span>\n\t\t\t<Switch\n\t\t\t\tchecked={!isPaused}\n\t\t\t\tonCheckedChange={handleTogglePause}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label={isPaused ? \"Resume work pool\" : \"Pause work pool\"}\n\t\t\t/>\n\t\t</span>\n\t);\n};\n","import type { WorkPool } from \"@/api/work-pools\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Icon, type IconId } from \"@/components/ui/icons\";\n\ntype WorkPoolTypeBadgeProps = {\n\ttype: WorkPool[\"type\"];\n};\n\nconst WORK_POOL_TYPE_LABELS: Record<WorkPool[\"type\"], string> = {\n\tprocess: \"Process\",\n\tecs: \"ECS\",\n\t\"azure-container-instance\": \"Azure Container Instance\",\n\tdocker: \"Docker\",\n\t\"cloud-run\": \"Cloud Run\",\n\t\"cloud-run-v2\": \"Cloud Run v2\",\n\t\"vertex-ai\": \"Vertex AI\",\n\tkubernetes: \"Kubernetes\",\n} as const;\n\nconst WORK_POOL_TYPE_ICONS: Record<WorkPool[\"type\"], IconId> = {\n\tprocess: \"Cpu\",\n\tecs: \"Cpu\",\n\t\"azure-container-instance\": \"Cpu\",\n\tdocker: \"Cpu\",\n\t\"cloud-run\": \"Cpu\",\n\t\"cloud-run-v2\": \"Cpu\",\n\t\"vertex-ai\": \"Cpu\",\n\tkubernetes: \"Cpu\",\n} as const;\n\nconst getWorkPoolTypeLabel = (type: WorkPool[\"type\"]) => {\n\treturn WORK_POOL_TYPE_LABELS[type] ?? type;\n};\n\nconst getWorkPoolTypeIcon = (type: WorkPool[\"type\"]) => {\n\treturn WORK_POOL_TYPE_ICONS[type] ?? \"Cpu\";\n};\n\nexport const WorkPoolTypeBadge = ({ type }: WorkPoolTypeBadgeProps) => {\n\treturn (\n\t\t<Badge>\n\t\t\t<Icon id={getWorkPoolTypeIcon(type)} />\n\t\t\t{getWorkPoolTypeLabel(type)}\n\t\t</Badge>\n\t);\n};\n","import { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { useDeleteWorkPool } from \"@/api/work-pools\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { WorkPoolContextMenu } from \"./components/work-pool-context-menu\";\nimport { WorkPoolName } from \"./components/work-pool-name\";\nimport { WorkPoolPauseResumeToggle } from \"./components/work-pool-pause-resume-toggle\";\nimport { WorkPoolTypeBadge } from \"./components/work-pool-type-badge\";\n\ntype WorkPoolCardProps = {\n\tworkPool: WorkPool;\n};\n\nexport const WorkPoolCard = ({ workPool }: WorkPoolCardProps) => {\n\tconst { deleteWorkPool } = useDeleteWorkPool();\n\n\tconst handleDelete = () => {\n\t\tdeleteWorkPool(workPool.name, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(`${workPool.name} deleted`);\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\ttoast.error(\n\t\t\t\t\t`Failed to delete work pool: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t};\n\treturn (\n\t\t<Card className=\"gap-2\">\n\t\t\t<CardHeader className=\"flex flex-row items-center justify-between\">\n\t\t\t\t<CardTitle className=\"flex items-center gap-2\">\n\t\t\t\t\t<WorkPoolName workPoolName={workPool.name} />\n\t\t\t\t\t{workPool.status && <StatusBadge status={workPool.status} />}\n\t\t\t\t</CardTitle>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<WorkPoolPauseResumeToggle workPool={workPool} />\n\t\t\t\t\t<WorkPoolContextMenu workPool={workPool} onDelete={handleDelete} />\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent className=\"flex flex-col gap-1\">\n\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t<WorkPoolTypeBadge type={workPool.type} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\tConcurrency:{\" \"}\n\t\t\t\t\t<span className=\"text-foreground\">\n\t\t\t\t\t\t{workPool.concurrency_limit\n\t\t\t\t\t\t\t? workPool.concurrency_limit\n\t\t\t\t\t\t\t: \"Unlimited\"}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n};\n","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":["WorkPoolsEmptyState","jsxs","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","Link","Button","Icon","DocsLink","WorkPoolContextMenu","workPool","onDelete","handleCopyId","id","toast","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","WorkPoolName","workPoolName","WorkPoolIconText","WorkPoolPauseResumeToggle","isPaused","setIsPaused","useState","pauseWorkPool","isPausing","usePauseWorkPool","resumeWorkPool","isResuming","useResumeWorkPool","disabled","useMemo","handleTogglePause","Switch","WORK_POOL_TYPE_LABELS","WORK_POOL_TYPE_ICONS","getWorkPoolTypeLabel","type","getWorkPoolTypeIcon","WorkPoolTypeBadge","Badge","WorkPoolCard","deleteWorkPool","useDeleteWorkPool","handleDelete","error","Card","CardHeader","CardTitle","StatusBadge","CardContent","RouteComponent","searchTerm","setSearchTerm","data","workPoolCount","useSuspenseQuery","buildCountWorkPoolsQuery","workPools","buildFilterWorkPoolsQuery","limit","offset","filteredWorkPools","filter","name","description","JSON","stringify","base_job_template","default_queue_id","status","join","toLowerCase","includes","handleSearchChange","event","target","value","WorkPoolsPageHeader","Fragment","pluralize","SearchInput","map"],"mappings":"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"}
|