prefect 3.6.14.dev7__py3-none-any.whl → 3.6.15__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/_build_info.py +3 -3
- prefect/events/clients.py +40 -21
- prefect/server/api/concurrency_limits_v2.py +5 -3
- prefect/server/ui-v2/assets/{artifact-card-9Cw_dMVb.js → artifact-card-BBzQR-Cj.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-9Cw_dMVb.js.map → artifact-card-BBzQR-Cj.js.map} +1 -1
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js +2 -0
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js.map +1 -0
- prefect/server/ui-v2/assets/{automation-wizard-D7nVgckT.js → automation-wizard-EYSfXlQ7.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-D7nVgckT.js.map → automation-wizard-EYSfXlQ7.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation._id-BhEFaDc6.js → automation._id-Dn7jABys.js} +2 -2
- prefect/server/ui-v2/assets/{automation._id-BhEFaDc6.js.map → automation._id-Dn7jABys.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-CffnUlbj.js → automation_._id.edit-COrqswD3.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-CffnUlbj.js.map → automation_._id.edit-COrqswD3.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-qb94agIp.js → automations-header-DN_dmMXW.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-qb94agIp.js.map → automations-header-DN_dmMXW.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-DdDSFAJa.js → base-job-template-form-section-De2ACYbw.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-DdDSFAJa.js.map → base-job-template-form-section-De2ACYbw.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-2rIqbqoZ.js → block-type-details-Cklc7TkK.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-2rIqbqoZ.js.map → block-type-details-Cklc7TkK.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-logo-DV1pSkV0.js → block-type-logo-Cbpfxded.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-logo-DV1pSkV0.js.map → block-type-logo-Cbpfxded.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-OeCbdPeL.js → block._id-tuz1Bcj2.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-OeCbdPeL.js.map → block._id-tuz1Bcj2.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-CD22VllN.js → block_._id.edit-CFEYhF5R.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-CD22VllN.js.map → block_._id.edit-CFEYhF5R.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-Dj7lYV7b.js → catalog-CCPRo7nY.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-Dj7lYV7b.js.map → catalog-CCPRo7nY.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug-NLgWS8vG.js → catalog_._slug-Bl2J2oI3.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug-NLgWS8vG.js.map → catalog_._slug-Bl2J2oI3.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-D0vc1Piy.js → catalog_._slug_.create-9UD_SxDN.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-D0vc1Piy.js.map → catalog_._slug_.create-9UD_SxDN.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-Dgk2Qvjj.js → collapsible-BVQTBG_U.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-Dgk2Qvjj.js.map → collapsible-BVQTBG_U.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-BZiyM0NT.js → concurrency-limit._id-CsgRxA0a.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-BZiyM0NT.js.map → concurrency-limit._id-CsgRxA0a.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-H21iiYVl.js → create-BycfZHGQ.js} +2 -2
- prefect/server/ui-v2/assets/{create-H21iiYVl.js.map → create-BycfZHGQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-1j1-8yhV.js → create-D--LHaji.js} +2 -2
- prefect/server/ui-v2/assets/{create-1j1-8yhV.js.map → create-D--LHaji.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-DHlbTUL7.js → data-table-rlbkLcrY.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-DHlbTUL7.js.map → data-table-rlbkLcrY.js.map} +1 -1
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-B9-8JHV7.js → delete-confirmation-dialog-DHkm2p8m.js} +2 -2
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-B9-8JHV7.js.map → delete-confirmation-dialog-DHkm2p8m.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-DlD2GSJB.js → deployment-action-header-D5GOooPm.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-DlD2GSJB.js.map → deployment-action-header-D5GOooPm.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-CFcOIeIi.js → deployment-form-wfg6HeAJ.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-CFcOIeIi.js.map → deployment-form-wfg6HeAJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-DN2Oa0r1.js → deployment-links-6iugOgDh.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-DN2Oa0r1.js.map → deployment-links-6iugOgDh.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-C8NPwIIQ.js → deployment._id-Ci9zge5n.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-C8NPwIIQ.js.map → deployment._id-Ci9zge5n.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-DsVQUPNp.js → deployment._id-whsGcHdu.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-DsVQUPNp.js.map → deployment._id-whsGcHdu.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-D9ZWkh8H.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-4uYFgdPg.js.map → deployment_._id.duplicate-D9ZWkh8H.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CS7sObzC.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-Z859_W76.js.map → deployment_._id.edit-CS7sObzC.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-MW5q2SRM.js → deployment_._id.run-g7SZuDFi.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-MW5q2SRM.js.map → deployment_._id.run-g7SZuDFi.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-DF4QR3Cp.js → dropdown-menu-0atiOSFo.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-DF4QR3Cp.js.map → dropdown-menu-0atiOSFo.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-DR3zL_k_.js → event-resource-display-DHiAb1Up.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-DR3zL_k_.js.map → event-resource-display-DHiAb1Up.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DfU7SalU.js → event._eventDate._eventId-D7Twzb22.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DfU7SalU.js.map → event._eventDate._eventId-D7Twzb22.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-BhzuSJLm.js +2 -0
- prefect/server/ui-v2/assets/{flow-run-graph-Bf9t75GK.js.map → flow-run-graph-BhzuSJLm.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-RL0qeSLl.js → flow-run._id-CqpH6bvx.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-RL0qeSLl.js.map → flow-run._id-CqpH6bvx.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-run._id-DTsj_xO3.js → flow-run._id-lIIQBD7H.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-DTsj_xO3.js.map → flow-run._id-lIIQBD7H.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bfelp8UO.js → flow-runs-pagination-BATUweRV.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bfelp8UO.js.map → flow-runs-pagination-BATUweRV.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow._id-DuQ5AUjj.js → flow._id-BdQGWPKP.js} +2 -2
- prefect/server/ui-v2/assets/{flow._id-DuQ5AUjj.js.map → flow._id-BdQGWPKP.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-DHWphysD.js → form-DLrbC7rV.js} +2 -2
- prefect/server/ui-v2/assets/{form-DHWphysD.js.map → form-DLrbC7rV.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-BK_NuSng.js → header-BTAWyeXv.js} +2 -2
- prefect/server/ui-v2/assets/{header-BK_NuSng.js.map → header-BTAWyeXv.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-nu-ZKuen.js → header-ChFAx5uR.js} +2 -2
- prefect/server/ui-v2/assets/{header-nu-ZKuen.js.map → header-ChFAx5uR.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-B9SuuoZx.js → header-CyQqOj1w.js} +2 -2
- prefect/server/ui-v2/assets/{header-B9SuuoZx.js.map → header-CyQqOj1w.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Dl_iSX0z.js → index-7i4X9TeK.js} +2 -2
- prefect/server/ui-v2/assets/{index-Dl_iSX0z.js.map → index-7i4X9TeK.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BPXdHXTb.js → index-BaWDC4da.js} +2 -2
- prefect/server/ui-v2/assets/{index-BPXdHXTb.js.map → index-BaWDC4da.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CqUa3fbN.js → index-BkiGTHwU.js} +2 -2
- prefect/server/ui-v2/assets/{index-CqUa3fbN.js.map → index-BkiGTHwU.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DNuhJlQK.js → index-Btb_-PDp.js} +2 -2
- prefect/server/ui-v2/assets/{index-DNuhJlQK.js.map → index-Btb_-PDp.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DcMpyvW7.js → index-BwCLKpNb.js} +2 -2
- prefect/server/ui-v2/assets/{index-DcMpyvW7.js.map → index-BwCLKpNb.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DVsNA4UN.js → index-CHf6xi9j.js} +2 -2
- prefect/server/ui-v2/assets/{index-DVsNA4UN.js.map → index-CHf6xi9j.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DSBmxhwG.js → index-CKGj5lSu.js} +2 -2
- prefect/server/ui-v2/assets/{index-DSBmxhwG.js.map → index-CKGj5lSu.js.map} +1 -1
- prefect/server/ui-v2/assets/index-COouj_0-.css +1 -0
- prefect/server/ui-v2/assets/{index-vRbn9rG4.js → index-CQnWiUE5.js} +2 -2
- prefect/server/ui-v2/assets/{index-vRbn9rG4.js.map → index-CQnWiUE5.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DWGx9irM.js → index-CiSFHkhI.js} +2 -2
- prefect/server/ui-v2/assets/{index-DWGx9irM.js.map → index-CiSFHkhI.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DFS5GNpT.js → index-CnlN-VC_.js} +2 -2
- prefect/server/ui-v2/assets/{index-DFS5GNpT.js.map → index-CnlN-VC_.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-mj9GNKt7.js → index-CxUfZRkN.js} +2 -2
- prefect/server/ui-v2/assets/{index-mj9GNKt7.js.map → index-CxUfZRkN.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DsK1RlS9.js → index-D5RT-SAp.js} +2 -2
- prefect/server/ui-v2/assets/{index-DsK1RlS9.js.map → index-D5RT-SAp.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BqwU5GSv.js → index-DATPYZfT.js} +2 -2
- prefect/server/ui-v2/assets/{index-BqwU5GSv.js.map → index-DATPYZfT.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BCR-yD58.js → index-DNh9ZBy4.js} +2 -2
- prefect/server/ui-v2/assets/{index-BCR-yD58.js.map → index-DNh9ZBy4.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DtrQRjt_.js → index-DQGif3jm.js} +2 -2
- prefect/server/ui-v2/assets/{index-DtrQRjt_.js.map → index-DQGif3jm.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Cj5ihRiw.js → index-Eqdr6Ff7.js} +2 -2
- prefect/server/ui-v2/assets/{index-Cj5ihRiw.js.map → index-Eqdr6Ff7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CYjH7t93.js → index-VH4TnZ4e.js} +2 -2
- prefect/server/ui-v2/assets/{index-CYjH7t93.js.map → index-VH4TnZ4e.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CPFMHkRh.js → index-kP_I5Qfd.js} +2 -2
- prefect/server/ui-v2/assets/{index-CPFMHkRh.js.map → index-kP_I5Qfd.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-C0MMjoUe.js → index-lyQav_XM.js} +2 -2
- prefect/server/ui-v2/assets/{index-C0MMjoUe.js.map → index-lyQav_XM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-_0OOjqn5.js → index-m48E4KcG.js} +4 -4
- prefect/server/ui-v2/assets/{index-_0OOjqn5.js.map → index-m48E4KcG.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-CMZiW5M2.js → json-input-Ba-BeBcw.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-CMZiW5M2.js.map → json-input-Ba-BeBcw.js.map} +1 -1
- prefect/server/ui-v2/assets/key-value-DkSKn6jE.js +2 -0
- prefect/server/ui-v2/assets/key-value-DkSKn6jE.js.map +1 -0
- prefect/server/ui-v2/assets/{key._key-CdonPtNh.js → key._key-Cjx57ymg.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-CdonPtNh.js.map → key._key-Cjx57ymg.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-CKcd9ksG.js → lazy-markdown-Du2Xu3Yp.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-CKcd9ksG.js.map → lazy-markdown-Du2Xu3Yp.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-Dnd-tV90.js → login-DxMF9Jvj.js} +2 -2
- prefect/server/ui-v2/assets/{login-Dnd-tV90.js.map → login-DxMF9Jvj.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-D6rfyTa_.js → markdown-input-DPi8zyRr.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-D6rfyTa_.js.map → markdown-input-DPi8zyRr.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-example-snippet-eWuRXCxE.js → python-example-snippet-DfCFYPN_.js} +3 -3
- prefect/server/ui-v2/assets/{python-example-snippet-eWuRXCxE.js.map → python-example-snippet-DfCFYPN_.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-itfwkkBT.js → python-input-mr6GD840.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-itfwkkBT.js.map → python-input-mr6GD840.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-DeN-_krn.js → radio-group-Co3cN0Kv.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-DeN-_krn.js.map → radio-group-Co3cN0Kv.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-tYzhKCqH.js → route-error-state-DnBaNT2T.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-tYzhKCqH.js.map → route-error-state-DnBaNT2T.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-DDUzvjpL.js → schema-form-CWDHSME9.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-DDUzvjpL.js.map → schema-form-CWDHSME9.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DrpJmvST.js → schema-form-input-string-format-datetime-BSWlW_aQ.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DrpJmvST.js.map → schema-form-input-string-format-datetime-BSWlW_aQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-OdrJDFrk.js → settings-DU5y6tJE.js} +2 -2
- prefect/server/ui-v2/assets/{settings-OdrJDFrk.js.map → settings-DU5y6tJE.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-DaBGDmua.js → sort-filter-DpuWNkQo.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-DaBGDmua.js.map → sort-filter-DpuWNkQo.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-4GUC4YOD.js → table-bBL6C0ZK.js} +2 -2
- prefect/server/ui-v2/assets/{table-4GUC4YOD.js.map → table-bBL6C0ZK.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-BvH9UY8h.js → tags-input-BLPMVWpZ.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-BvH9UY8h.js.map → tags-input-BLPMVWpZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CLZz3kwW.js → task-run-concurrency-limits-reset-dialog-S69sih55.js} +2 -2
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CLZz3kwW.js.map → task-run-concurrency-limits-reset-dialog-S69sih55.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-DHHzTQ9d.js → task-run._id-B_tIDm4K.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-DHHzTQ9d.js.map → task-run._id-B_tIDm4K.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-DgXFfCuq.js → task-run._id-Dl3Azs8t.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-DgXFfCuq.js.map → task-run._id-Dl3Azs8t.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-runs-pagination-fR9zqj38.js → task-runs-pagination-VdR-LO4r.js} +2 -2
- prefect/server/ui-v2/assets/{task-runs-pagination-fR9zqj38.js.map → task-runs-pagination-VdR-LO4r.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-DL9UCBaB.js → textarea-B3_TtPRi.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-DL9UCBaB.js.map → textarea-B3_TtPRi.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-qBEoPcyO.js → timezone-select-BuPYznge.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-qBEoPcyO.js.map → timezone-select-BuPYznge.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-Cf-ZSSDP.js → toggle-group-Cn07UIim.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-Cf-ZSSDP.js.map → toggle-group-Cn07UIim.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DRX9Kvie.js → use-delete-automation-confirmation-dialog-DpdsLH4t.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DRX9Kvie.js.map → use-delete-automation-confirmation-dialog-DpdsLH4t.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CogrfdiO.js → use-delete-block-document-confirmation-dialog-Cq5nGhzr.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CogrfdiO.js.map → use-delete-block-document-confirmation-dialog-Cq5nGhzr.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-CdMKKvm5.js → use-flow-runs-selected-rows-DmQSWBTu.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-CdMKKvm5.js.map → use-flow-runs-selected-rows-DmQSWBTu.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-Be1qg-IF.js → use-get-artifacts-flow-task-runs-DTwcWiqW.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-Be1qg-IF.js.map → use-get-artifacts-flow-task-runs-DTwcWiqW.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-DXDfXpvs.js → use-quick-run-CPempwLh.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-DXDfXpvs.js.map → use-quick-run-CPempwLh.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-state-favicon-Dhkg1tqx.js → use-state-favicon-M09DmrNy.js} +2 -2
- prefect/server/ui-v2/assets/{use-state-favicon-Dhkg1tqx.js.map → use-state-favicon-M09DmrNy.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-jTTsXpho.js → use-stepper-CDucnvzp.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-jTTsXpho.js.map → use-stepper-CDucnvzp.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-CgJi7g2F.js → utilities-BRCNRcQl.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-CgJi7g2F.js.map → utilities-BRCNRcQl.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-filter-DLkRAAHz.js → work-pool-filter-C2tpSS-w.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-DLkRAAHz.js.map → work-pool-filter-C2tpSS-w.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-BFodtXQe.js → work-pool-queue-toggle-BQ9b-Wxy.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-BFodtXQe.js.map → work-pool-queue-toggle-BQ9b-Wxy.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-Bjh_bO5G.js → work-pool._workPoolName-C_LiL3SE.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-Bjh_bO5G.js.map → work-pool._workPoolName-C_LiL3SE.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-B-gnp5dc.js → work-pool_._workPoolName.edit-DBHlrVVx.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-B-gnp5dc.js.map → work-pool_._workPoolName.edit-DBHlrVVx.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js → work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js.map → work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-BK_qfkJJ.js → work-queue-icon-text-D4BWBVDN.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-BK_qfkJJ.js.map → work-queue-icon-text-D4BWBVDN.js.map} +1 -1
- prefect/server/ui-v2/index.html +2 -2
- prefect/testing/fixtures.py +14 -13
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.15.dist-info}/METADATA +2 -2
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.15.dist-info}/RECORD +207 -205
- 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/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/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/index-Br7MUvka.css +0 -1
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.15.dist-info}/WHEEL +0 -0
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.15.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.15.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-C0MMjoUe.js","sources":["../../src/components/flows/cells.tsx","../../src/components/flows/columns.tsx","../../src/components/flows/data-table.tsx","../../src/components/flows/empty-state/flows-empty-state.tsx","../../src/components/flows/flows-page-header.tsx","../../src/components/flows/flows-page.tsx","../../src/routes/flows/index.tsx?tsr-split=component"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { subWeeks } from \"date-fns\";\nimport { useMemo } from \"react\";\nimport { toast } from \"sonner\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport {\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildNextRunsByFlowQuery,\n\tuseDeleteFlowById,\n} from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateIcon } from \"@/components/ui/state-badge\";\nimport { pluralize } from \"@/utils\";\nimport { formatDate } from \"@/utils/date\";\n\ntype Flow = components[\"schemas\"][\"Flow\"];\n\nexport const FlowName = ({ row }: { row: { original: Flow } }) => {\n\tif (!row.original.id) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-col pl-4\">\n\t\t\t<Link\n\t\t\t\tto=\"/flows/flow/$id\"\n\t\t\t\tparams={{ id: row.original.id }}\n\t\t\t\tclassName=\"text-sm font-medium truncate\"\n\t\t\t\ttitle={row.original.name}\n\t\t\t>\n\t\t\t\t{row.original.name}\n\t\t\t</Link>\n\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\tCreated{\" \"}\n\t\t\t\t{row.original?.created && formatDate(row.original.created, \"dateTime\")}\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n\nexport const FlowLastRun = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: flowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflows: { operator: \"and_\", id: { any_: [flowId ?? \"\"] } },\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tstart_time: { is_null_: false },\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t}),\n\t\tenabled: !!flowId,\n\t});\n\n\tconst lastRun = flowRuns?.[0];\n\tif (!flowId || !lastRun) return null;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-1\">\n\t\t\t{lastRun.state_type && (\n\t\t\t\t<StateIcon\n\t\t\t\t\ttype={lastRun.state_type}\n\t\t\t\t\tname={lastRun.state_name ?? undefined}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<Link to=\"/runs/flow-run/$id\" params={{ id: lastRun.id ?? \"\" }}>\n\t\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t\t{lastRun.name}\n\t\t\t\t</span>\n\t\t\t</Link>\n\t\t</div>\n\t);\n};\n\nexport const FlowNextRun = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: nextRunsMap } = useQuery(\n\t\tbuildNextRunsByFlowQuery(flowId ? [flowId] : [], { enabled: !!flowId }),\n\t);\n\n\tconst nextRun = flowId ? nextRunsMap?.[flowId] : null;\n\tif (!flowId || !nextRun) return null;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-1\">\n\t\t\t{nextRun.state_type && (\n\t\t\t\t<StateIcon type={nextRun.state_type} name={nextRun.state_name} />\n\t\t\t)}\n\t\t\t<Link to=\"/runs/flow-run/$id\" params={{ id: nextRun.id ?? \"\" }}>\n\t\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t\t{nextRun.name}\n\t\t\t\t</span>\n\t\t\t</Link>\n\t\t</div>\n\t);\n};\n\nexport const FlowDeploymentCount = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: countsMap } = useQuery(\n\t\tbuildDeploymentsCountByFlowQuery(flowId ? [flowId] : [], {\n\t\t\tenabled: !!flowId,\n\t\t}),\n\t);\n\tif (!flowId) return null;\n\n\tconst count = countsMap?.[flowId] ?? 0;\n\n\tif (count === 0) {\n\t\treturn <span className=\"text-sm text-muted-foreground\">None</span>;\n\t}\n\n\treturn (\n\t\t<Link\n\t\t\tto=\"/flows/flow/$id\"\n\t\t\tparams={{ id: flowId }}\n\t\t\tsearch={{ tab: \"deployments\" }}\n\t\t>\n\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t{count} {pluralize(count, \"Deployment\")}\n\t\t\t</span>\n\t\t</Link>\n\t);\n};\n\nexport const FlowActionMenu = ({ row }: { row: { original: Flow } }) => {\n\tconst id = row.original.id;\n\n\tconst { deleteFlow } = useDeleteFlowById();\n\n\tif (!id) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"flex justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"ghost\" className=\"h-8 w-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t<DropdownMenuItem onClick={() => deleteFlow(id)}>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>Automate</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nconst NUMBER_OF_ACTIVITY_BARS = 16;\n\nexport const FlowActivity = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\n\tconst { startDate, endDate } = useMemo((): {\n\t\tstartDate: Date;\n\t\tendDate: Date;\n\t} => {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\tstartDate: subWeeks(now, 1),\n\t\t\tendDate: now,\n\t\t};\n\t}, []);\n\n\tconst { data: flowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflows: { operator: \"and_\", id: { any_: [flowId ?? \"\"] } },\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tstart_time: { is_null_: false },\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tlimit: NUMBER_OF_ACTIVITY_BARS,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t}),\n\t\tenabled: !!flowId,\n\t});\n\n\tif (!flowId) return null;\n\n\treturn (\n\t\t<FlowRunActivityBarChart\n\t\t\tchartId={`flow-activity-${flowId}`}\n\t\t\tenrichedFlowRuns={flowRuns ?? []}\n\t\t\tstartDate={startDate}\n\t\t\tendDate={endDate}\n\t\t\tnumberOfBars={NUMBER_OF_ACTIVITY_BARS}\n\t\t\tclassName=\"h-[24px] w-[140px]\"\n\t\t/>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { components } from \"@/api/prefect\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tFlowActionMenu,\n\tFlowActivity,\n\tFlowDeploymentCount,\n\tFlowLastRun,\n\tFlowName,\n\tFlowNextRun,\n} from \"./cells\";\n\ntype Flow = components[\"schemas\"][\"Flow\"];\n\nexport const columns: ColumnDef<Flow>[] = [\n\t{\n\t\tid: \"select\",\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\tonCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(!!value)}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t\tmaxSize: 10,\n\t},\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: () => <div className=\"pl-4\">Flow</div>,\n\t\tcell: FlowName,\n\t},\n\t{\n\t\taccessorKey: \"lastRuns\",\n\t\theader: \"Last Run\",\n\t\tcell: FlowLastRun,\n\t},\n\t{\n\t\taccessorKey: \"nextRuns\",\n\t\theader: \"Next Run\",\n\t\tcell: FlowNextRun,\n\t},\n\t{\n\t\taccessorKey: \"deployments\",\n\t\theader: \"Deployments\",\n\t\tcell: FlowDeploymentCount,\n\t},\n\t{\n\t\taccessorKey: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: FlowActivity,\n\t},\n\t{\n\t\tid: \"actions\",\n\t\tcell: FlowActionMenu,\n\t},\n];\n","import type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport type React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { type Flow, useDeleteFlowById } from \"@/api/flows\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { columns } from \"./columns\";\n\nconst FLOW_SORT_OPTIONS = [\n\t{ label: \"A to Z\", value: \"NAME_ASC\" },\n\t{ label: \"Z to A\", value: \"NAME_DESC\" },\n\t{ label: \"Created\", value: \"CREATED_DESC\" },\n] as const;\n\ntype FlowSortValue = \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\" | \"UPDATED_DESC\";\n\nexport default function FlowsTable({\n\tflows,\n\tcount,\n\tpageCount,\n\tsort,\n\tpagination,\n\tonPaginationChange,\n\tonSortChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tonPrefetchPage,\n}: {\n\tflows: Flow[];\n\tcount: number;\n\tpageCount: number;\n\tsort: FlowSortValue;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: FlowSortValue) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tonPrefetchPage?: (page: number) => void;\n}) {\n\tconst { deleteFlow } = useDeleteFlowById();\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\tconst nameSearchValue = (columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value ?? \"\") as string;\n\tconst tagsSearchValue = (columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value ?? []) as string[];\n\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : [];\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tcolumns: columns,\n\t\tdata: flows,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tpageCount,\n\t\tstate: {\n\t\t\trowSelection,\n\t\t\tpagination,\n\t\t},\n\t\tonRowSelectionChange: setRowSelection,\n\t\tonPaginationChange: handlePaginationChange,\n\t});\n\n\tconst handleDeleteRows = () => {\n\t\tconst selectedRows = Object.keys(rowSelection);\n\n\t\tconst idsToDelete = selectedRows.map((rowId) => flows[Number(rowId)].id);\n\n\t\tfor (const id of idsToDelete) {\n\t\t\tdeleteFlow(id);\n\t\t}\n\n\t\ttable.toggleAllRowsSelected(false);\n\t};\n\n\treturn (\n\t\t<div className=\"h-full\">\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t{Object.keys(rowSelection).length > 0 ? (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground flex items-center\">\n\t\t\t\t\t\t\t{Object.keys(rowSelection).length} selected\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tid=\"Trash2\"\n\t\t\t\t\t\t\t\tclassName=\"ml-2 cursor-pointer h-4 w-4 inline\"\n\t\t\t\t\t\t\t\tonClick={handleDeleteRows}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{count} {pluralize(count, \"Flow\")}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Flow names\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sort} onValueChange={onSortChange}>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Flow sort order\" className=\"w-full\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{FLOW_SORT_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} onPrefetchPage={onPrefetchPage} />\n\t\t</div>\n\t);\n}\n","import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const FlowsEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Workflow\" />\n\t\t<EmptyStateTitle>Run a flow to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tFlows are Python functions that encapsulate workflow logic and allow users\n\t\t\tto interact with and reason about the state of their workflows.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"flows-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const FlowsHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tFlows\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n","import type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport type { Flow } from \"@/api/flows\";\nimport FlowsTable from \"./data-table\";\nimport { FlowsEmptyState } from \"./empty-state\";\nimport { FlowsHeader } from \"./flows-page-header\";\n\ntype FlowSortValue = \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\" | \"UPDATED_DESC\";\n\ntype FlowsPageProps = {\n\tflows: Flow[];\n\tcount: number;\n\ttotalCount: number;\n\tpageCount: number;\n\tsort: FlowSortValue;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: FlowSortValue) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tonPrefetchPage?: (page: number) => void;\n};\n\nexport default function FlowsPage({\n\tflows,\n\tcount,\n\ttotalCount,\n\tpageCount,\n\tsort,\n\tpagination,\n\tonPaginationChange,\n\tonSortChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tonPrefetchPage,\n}: FlowsPageProps) {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<FlowsHeader />\n\t\t\t{totalCount === 0 ? (\n\t\t\t\t<FlowsEmptyState />\n\t\t\t) : (\n\t\t\t\t<FlowsTable\n\t\t\t\t\tflows={flows}\n\t\t\t\t\tcount={count}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tsort={sort}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tonSortChange={onSortChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport {\n\tbuildCountFlowsFilteredQuery,\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildNextRunsByFlowQuery,\n\tbuildPaginateFlowsQuery,\n\ttype FlowsPaginateFilter,\n} from \"@/api/flows\";\nimport FlowsPage from \"@/components/flows/flows-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n// Route for /flows/\n\nconst searchParams = z\n\t.object({\n\t\tname: z.string().optional(),\n\t\tpage: z.number().int().positive().optional().default(1).catch(1),\n\t\tlimit: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.positive()\n\t\t\t.max(100)\n\t\t\t.optional()\n\t\t\t.default(10)\n\t\t\t.catch(10),\n\t\ttags: z.array(z.string()).optional(),\n\t\tsort: z\n\t\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t\t.optional()\n\t\t\t.default(\"NAME_ASC\"),\n\t})\n\t.optional()\n\t.default({});\n\ntype SearchParams = z.infer<typeof searchParams>;\n\nconst buildPaginationBody = (search?: SearchParams): FlowsPaginateFilter => {\n\tconst hasNameFilter = Boolean(search?.name);\n\tconst hasTagsFilter = Boolean(search?.tags?.length);\n\n\tif (!hasNameFilter && !hasTagsFilter) {\n\t\treturn {\n\t\t\tpage: search?.page ?? 1,\n\t\t\tlimit: search?.limit ?? 10,\n\t\t\tsort: search?.sort ?? \"NAME_ASC\",\n\t\t};\n\t}\n\n\treturn {\n\t\tpage: search?.page ?? 1,\n\t\tlimit: search?.limit ?? 10,\n\t\tsort: search?.sort ?? \"NAME_ASC\",\n\t\tflows: {\n\t\t\toperator: \"and_\",\n\t\t\t...(hasNameFilter && { name: { like_: search?.name } }),\n\t\t\t...(hasTagsFilter && {\n\t\t\t\ttags: { operator: \"and_\", all_: search?.tags },\n\t\t\t}),\n\t\t},\n\t};\n};\n\nconst NUMBER_OF_ACTIVITY_BARS = 16;\n\nfunction FlowsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load flows\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Flows</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/flows/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: FlowsRoute,\n\terrorComponent: FlowsErrorComponent,\n\tloaderDeps: ({ search }) => buildPaginationBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch current page queries without blocking the loader\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowsQuery(deps, 30_000),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowsFilteredQuery({\n\t\t\t\toffset: 0,\n\t\t\t\tsort: deps.sort,\n\t\t\t\tflows: deps.flows ?? undefined,\n\t\t\t}),\n\t\t);\n\t\t// Prefetch total count for empty state check\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowsFilteredQuery({\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t}),\n\t\t);\n\t},\n\twrapInSuspense: true,\n});\n\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// Convert URL params (1-based page) to TanStack Table's PaginationState (0-based pageIndex)\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex: (search.page ?? 1) - 1,\n\t\t\tpageSize: search.limit ?? 10,\n\t\t}),\n\t\t[search.page, search.limit],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t// Convert TanStack Table's 0-based pageIndex back to 1-based page for URL\n\t\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\ntype FlowSort = \"CREATED_DESC\" | \"UPDATED_DESC\" | \"NAME_ASC\" | \"NAME_DESC\";\n\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortChange = useCallback(\n\t\t(sort: FlowSort) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortChange] as const;\n};\n\nconst useFlowsColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"name\", value: search.name },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.name, search.tags],\n\t);\n\n\tconst onColumnFiltersChange = useCallback(\n\t\t(newColumnFilters: ColumnFiltersState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => {\n\t\t\t\t\tconst name = newColumnFilters.find((filter) => filter.id === \"name\")\n\t\t\t\t\t\t?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tpage: 1,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [columnFilters, onColumnFiltersChange] as const;\n};\n\nfunction FlowsRoute() {\n\tconst search = Route.useSearch();\n\tconst queryClient = useQueryClient();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [columnFilters, onColumnFiltersChange] = useFlowsColumnFilters();\n\n\tconst paginationBody = buildPaginationBody(search);\n\n\t// Use useSuspenseQuery for count (stable key, won't cause suspense on search change)\n\tconst { data: count } = useSuspenseQuery(\n\t\tbuildCountFlowsFilteredQuery({\n\t\t\toffset: 0,\n\t\t\tsort: search.sort,\n\t\t\tflows: paginationBody.flows ?? undefined,\n\t\t}),\n\t);\n\n\t// Get total count of all flows (without filters) to determine if empty state should be shown\n\tconst { data: totalCount } = useSuspenseQuery(\n\t\tbuildCountFlowsFilteredQuery({\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\t// Use useQuery for paginated flows to leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: flowsPage } = useQuery(\n\t\tbuildPaginateFlowsQuery(paginationBody, 30_000),\n\t);\n\n\tconst flows = flowsPage?.results ?? [];\n\n\t// Prefetch a page and its child component data when user hovers over pagination buttons\n\tconst onPrefetchPage = useCallback(\n\t\t(page: number) => {\n\t\t\tconst pageDeps = { ...paginationBody, page };\n\t\t\tvoid queryClient\n\t\t\t\t.prefetchQuery(buildPaginateFlowsQuery(pageDeps, 30_000))\n\t\t\t\t.then(() => {\n\t\t\t\t\t// Get the prefetched page data from cache\n\t\t\t\t\tconst pageData = queryClient.getQueryData<{\n\t\t\t\t\t\tresults?: Array<{ id?: string }>;\n\t\t\t\t\t}>(buildPaginateFlowsQuery(pageDeps, 30_000).queryKey);\n\n\t\t\t\t\tconst flowIds =\n\t\t\t\t\t\tpageData?.results\n\t\t\t\t\t\t\t?.map((flow) => flow.id)\n\t\t\t\t\t\t\t.filter((id): id is string => Boolean(id)) ?? [];\n\n\t\t\t\t\tif (flowIds.length === 0) return;\n\n\t\t\t\t\t// Prefetch child component queries for each flow individually\n\t\t\t\t\t// Using individual flow IDs ensures query keys match what components use\n\t\t\t\t\tfor (const flowId of flowIds) {\n\t\t\t\t\t\t// FlowNextRun query - uses single flow ID array for query key matching\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(buildNextRunsByFlowQuery([flowId]));\n\n\t\t\t\t\t\t// FlowDeploymentCount query - uses single flow ID array for query key matching\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildDeploymentsCountByFlowQuery([flowId]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// FlowLastRun query - last completed run\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildFilterFlowRunsQuery({\n\t\t\t\t\t\t\t\tflows: { operator: \"and_\", id: { any_: [flowId] } },\n\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tstart_time: { is_null_: false },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tlimit: 1,\n\t\t\t\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// FlowActivity query - recent runs for activity chart\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildFilterFlowRunsQuery({\n\t\t\t\t\t\t\t\tflows: { operator: \"and_\", id: { any_: [flowId] } },\n\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tstart_time: { is_null_: false },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tlimit: NUMBER_OF_ACTIVITY_BARS,\n\t\t\t\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\t[queryClient, paginationBody],\n\t);\n\n\treturn (\n\t\t<FlowsPage\n\t\t\tflows={flows}\n\t\t\tcount={count ?? 0}\n\t\t\ttotalCount={totalCount ?? 0}\n\t\t\tpageCount={flowsPage?.pages ?? 0}\n\t\t\tsort={sort as \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\"}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t\tonSortChange={onSortChange}\n\t\t\tcolumnFilters={columnFilters}\n\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t/>\n\t);\n}\n"],"names":["FlowName","row","jsxs","jsx","Link","formatDate","FlowLastRun","flowId","flowRuns","useQuery","buildFilterFlowRunsQuery","lastRun","StateIcon","FlowNextRun","nextRunsMap","buildNextRunsByFlowQuery","nextRun","FlowDeploymentCount","countsMap","buildDeploymentsCountByFlowQuery","count","pluralize","FlowActionMenu","id","deleteFlow","useDeleteFlowById","DropdownMenu","DropdownMenuTrigger","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","toast","DropdownMenuSeparator","NUMBER_OF_ACTIVITY_BARS","FlowActivity","startDate","endDate","useMemo","now","subWeeks","FlowRunActivityBarChart","columns","table","Checkbox","value","FLOW_SORT_OPTIONS","FlowsTable","flows","pageCount","sort","pagination","onPaginationChange","onSortChange","columnFilters","onColumnFiltersChange","onPrefetchPage","rowSelection","setRowSelection","useState","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","useCallback","filters","handleTagsSearchChange","e","tags","handlePaginationChange","updater","newPagination","useReactTable","getCoreRowModel","handleDeleteRows","idsToDelete","rowId","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","DataTable","FlowsEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","FlowsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","FlowsPage","totalCount","z","name","string","optional","page","number","int","positive","default","catch","limit","max","buildPaginationBody","search","hasNameFilter","Boolean","hasTagsFilter","length","operator","like_","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","pageSize","to","prev","replace","useSort","useFlowsColumnFilters","newColumnFilters","find","FlowsRoute","queryClient","useQueryClient","paginationBody","data","useSuspenseQuery","buildCountFlowsFilteredQuery","offset","undefined","flowsPage","buildPaginateFlowsQuery","results","pageDeps","prefetchQuery","then","flowIds","getQueryData","queryKey","map","flow","any_","flow_runs","start_time","is_null_","pages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-lyQav_XM.js","sources":["../../src/components/flows/cells.tsx","../../src/components/flows/columns.tsx","../../src/components/flows/data-table.tsx","../../src/components/flows/empty-state/flows-empty-state.tsx","../../src/components/flows/flows-page-header.tsx","../../src/components/flows/flows-page.tsx","../../src/routes/flows/index.tsx?tsr-split=component"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { subWeeks } from \"date-fns\";\nimport { useMemo } from \"react\";\nimport { toast } from \"sonner\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport {\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildNextRunsByFlowQuery,\n\tuseDeleteFlowById,\n} from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateIcon } from \"@/components/ui/state-badge\";\nimport { pluralize } from \"@/utils\";\nimport { formatDate } from \"@/utils/date\";\n\ntype Flow = components[\"schemas\"][\"Flow\"];\n\nexport const FlowName = ({ row }: { row: { original: Flow } }) => {\n\tif (!row.original.id) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-col pl-4\">\n\t\t\t<Link\n\t\t\t\tto=\"/flows/flow/$id\"\n\t\t\t\tparams={{ id: row.original.id }}\n\t\t\t\tclassName=\"text-sm font-medium truncate\"\n\t\t\t\ttitle={row.original.name}\n\t\t\t>\n\t\t\t\t{row.original.name}\n\t\t\t</Link>\n\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\tCreated{\" \"}\n\t\t\t\t{row.original?.created && formatDate(row.original.created, \"dateTime\")}\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n\nexport const FlowLastRun = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: flowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflows: { operator: \"and_\", id: { any_: [flowId ?? \"\"] } },\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tstart_time: { is_null_: false },\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t}),\n\t\tenabled: !!flowId,\n\t});\n\n\tconst lastRun = flowRuns?.[0];\n\tif (!flowId || !lastRun) return null;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-1\">\n\t\t\t{lastRun.state_type && (\n\t\t\t\t<StateIcon\n\t\t\t\t\ttype={lastRun.state_type}\n\t\t\t\t\tname={lastRun.state_name ?? undefined}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<Link to=\"/runs/flow-run/$id\" params={{ id: lastRun.id ?? \"\" }}>\n\t\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t\t{lastRun.name}\n\t\t\t\t</span>\n\t\t\t</Link>\n\t\t</div>\n\t);\n};\n\nexport const FlowNextRun = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: nextRunsMap } = useQuery(\n\t\tbuildNextRunsByFlowQuery(flowId ? [flowId] : [], { enabled: !!flowId }),\n\t);\n\n\tconst nextRun = flowId ? nextRunsMap?.[flowId] : null;\n\tif (!flowId || !nextRun) return null;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-1\">\n\t\t\t{nextRun.state_type && (\n\t\t\t\t<StateIcon type={nextRun.state_type} name={nextRun.state_name} />\n\t\t\t)}\n\t\t\t<Link to=\"/runs/flow-run/$id\" params={{ id: nextRun.id ?? \"\" }}>\n\t\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t\t{nextRun.name}\n\t\t\t\t</span>\n\t\t\t</Link>\n\t\t</div>\n\t);\n};\n\nexport const FlowDeploymentCount = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\tconst { data: countsMap } = useQuery(\n\t\tbuildDeploymentsCountByFlowQuery(flowId ? [flowId] : [], {\n\t\t\tenabled: !!flowId,\n\t\t}),\n\t);\n\tif (!flowId) return null;\n\n\tconst count = countsMap?.[flowId] ?? 0;\n\n\tif (count === 0) {\n\t\treturn <span className=\"text-sm text-muted-foreground\">None</span>;\n\t}\n\n\treturn (\n\t\t<Link\n\t\t\tto=\"/flows/flow/$id\"\n\t\t\tparams={{ id: flowId }}\n\t\t\tsearch={{ tab: \"deployments\" }}\n\t\t>\n\t\t\t<span className=\"text-sm text-blue-700 hover:underline\">\n\t\t\t\t{count} {pluralize(count, \"Deployment\")}\n\t\t\t</span>\n\t\t</Link>\n\t);\n};\n\nexport const FlowActionMenu = ({ row }: { row: { original: Flow } }) => {\n\tconst id = row.original.id;\n\n\tconst { deleteFlow } = useDeleteFlowById();\n\n\tif (!id) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"flex justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"ghost\" className=\"h-8 w-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t<DropdownMenuItem onClick={() => deleteFlow(id)}>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>Automate</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nconst NUMBER_OF_ACTIVITY_BARS = 16;\n\nexport const FlowActivity = ({ row }: { row: { original: Flow } }) => {\n\tconst flowId = row.original.id;\n\n\tconst { startDate, endDate } = useMemo((): {\n\t\tstartDate: Date;\n\t\tendDate: Date;\n\t} => {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\tstartDate: subWeeks(now, 1),\n\t\t\tendDate: now,\n\t\t};\n\t}, []);\n\n\tconst { data: flowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflows: { operator: \"and_\", id: { any_: [flowId ?? \"\"] } },\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tstart_time: { is_null_: false },\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tlimit: NUMBER_OF_ACTIVITY_BARS,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t}),\n\t\tenabled: !!flowId,\n\t});\n\n\tif (!flowId) return null;\n\n\treturn (\n\t\t<FlowRunActivityBarChart\n\t\t\tchartId={`flow-activity-${flowId}`}\n\t\t\tenrichedFlowRuns={flowRuns ?? []}\n\t\t\tstartDate={startDate}\n\t\t\tendDate={endDate}\n\t\t\tnumberOfBars={NUMBER_OF_ACTIVITY_BARS}\n\t\t\tclassName=\"h-[24px] w-[140px]\"\n\t\t/>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { components } from \"@/api/prefect\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tFlowActionMenu,\n\tFlowActivity,\n\tFlowDeploymentCount,\n\tFlowLastRun,\n\tFlowName,\n\tFlowNextRun,\n} from \"./cells\";\n\ntype Flow = components[\"schemas\"][\"Flow\"];\n\nexport const columns: ColumnDef<Flow>[] = [\n\t{\n\t\tid: \"select\",\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\tonCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(!!value)}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t\tmaxSize: 10,\n\t},\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: () => <div className=\"pl-4\">Flow</div>,\n\t\tcell: FlowName,\n\t},\n\t{\n\t\taccessorKey: \"lastRuns\",\n\t\theader: \"Last Run\",\n\t\tcell: FlowLastRun,\n\t},\n\t{\n\t\taccessorKey: \"nextRuns\",\n\t\theader: \"Next Run\",\n\t\tcell: FlowNextRun,\n\t},\n\t{\n\t\taccessorKey: \"deployments\",\n\t\theader: \"Deployments\",\n\t\tcell: FlowDeploymentCount,\n\t},\n\t{\n\t\taccessorKey: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: FlowActivity,\n\t},\n\t{\n\t\tid: \"actions\",\n\t\tcell: FlowActionMenu,\n\t},\n];\n","import type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport type React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { type Flow, useDeleteFlowById } from \"@/api/flows\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { columns } from \"./columns\";\n\nconst FLOW_SORT_OPTIONS = [\n\t{ label: \"A to Z\", value: \"NAME_ASC\" },\n\t{ label: \"Z to A\", value: \"NAME_DESC\" },\n\t{ label: \"Created\", value: \"CREATED_DESC\" },\n] as const;\n\ntype FlowSortValue = \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\" | \"UPDATED_DESC\";\n\nexport default function FlowsTable({\n\tflows,\n\tcount,\n\tpageCount,\n\tsort,\n\tpagination,\n\tonPaginationChange,\n\tonSortChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tonPrefetchPage,\n}: {\n\tflows: Flow[];\n\tcount: number;\n\tpageCount: number;\n\tsort: FlowSortValue;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: FlowSortValue) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tonPrefetchPage?: (page: number) => void;\n}) {\n\tconst { deleteFlow } = useDeleteFlowById();\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\tconst nameSearchValue = (columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value ?? \"\") as string;\n\tconst tagsSearchValue = (columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value ?? []) as string[];\n\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : [];\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tcolumns: columns,\n\t\tdata: flows,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tpageCount,\n\t\tstate: {\n\t\t\trowSelection,\n\t\t\tpagination,\n\t\t},\n\t\tonRowSelectionChange: setRowSelection,\n\t\tonPaginationChange: handlePaginationChange,\n\t});\n\n\tconst handleDeleteRows = () => {\n\t\tconst selectedRows = Object.keys(rowSelection);\n\n\t\tconst idsToDelete = selectedRows.map((rowId) => flows[Number(rowId)].id);\n\n\t\tfor (const id of idsToDelete) {\n\t\t\tdeleteFlow(id);\n\t\t}\n\n\t\ttable.toggleAllRowsSelected(false);\n\t};\n\n\treturn (\n\t\t<div className=\"h-full\">\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t{Object.keys(rowSelection).length > 0 ? (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground flex items-center\">\n\t\t\t\t\t\t\t{Object.keys(rowSelection).length} selected\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tid=\"Trash2\"\n\t\t\t\t\t\t\t\tclassName=\"ml-2 cursor-pointer h-4 w-4 inline\"\n\t\t\t\t\t\t\t\tonClick={handleDeleteRows}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{count} {pluralize(count, \"Flow\")}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Flow names\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sort} onValueChange={onSortChange}>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Flow sort order\" className=\"w-full\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{FLOW_SORT_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} onPrefetchPage={onPrefetchPage} />\n\t\t</div>\n\t);\n}\n","import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const FlowsEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Workflow\" />\n\t\t<EmptyStateTitle>Run a flow to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tFlows are Python functions that encapsulate workflow logic and allow users\n\t\t\tto interact with and reason about the state of their workflows.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"flows-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const FlowsHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tFlows\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n","import type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport type { Flow } from \"@/api/flows\";\nimport FlowsTable from \"./data-table\";\nimport { FlowsEmptyState } from \"./empty-state\";\nimport { FlowsHeader } from \"./flows-page-header\";\n\ntype FlowSortValue = \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\" | \"UPDATED_DESC\";\n\ntype FlowsPageProps = {\n\tflows: Flow[];\n\tcount: number;\n\ttotalCount: number;\n\tpageCount: number;\n\tsort: FlowSortValue;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: FlowSortValue) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tonPrefetchPage?: (page: number) => void;\n};\n\nexport default function FlowsPage({\n\tflows,\n\tcount,\n\ttotalCount,\n\tpageCount,\n\tsort,\n\tpagination,\n\tonPaginationChange,\n\tonSortChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tonPrefetchPage,\n}: FlowsPageProps) {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<FlowsHeader />\n\t\t\t{totalCount === 0 ? (\n\t\t\t\t<FlowsEmptyState />\n\t\t\t) : (\n\t\t\t\t<FlowsTable\n\t\t\t\t\tflows={flows}\n\t\t\t\t\tcount={count}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tsort={sort}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tonSortChange={onSortChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport {\n\tbuildCountFlowsFilteredQuery,\n\tbuildDeploymentsCountByFlowQuery,\n\tbuildNextRunsByFlowQuery,\n\tbuildPaginateFlowsQuery,\n\ttype FlowsPaginateFilter,\n} from \"@/api/flows\";\nimport FlowsPage from \"@/components/flows/flows-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n// Route for /flows/\n\nconst searchParams = z\n\t.object({\n\t\tname: z.string().optional(),\n\t\tpage: z.number().int().positive().optional().default(1).catch(1),\n\t\tlimit: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.positive()\n\t\t\t.max(100)\n\t\t\t.optional()\n\t\t\t.default(10)\n\t\t\t.catch(10),\n\t\ttags: z.array(z.string()).optional(),\n\t\tsort: z\n\t\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t\t.optional()\n\t\t\t.default(\"NAME_ASC\"),\n\t})\n\t.optional()\n\t.default({});\n\ntype SearchParams = z.infer<typeof searchParams>;\n\nconst buildPaginationBody = (search?: SearchParams): FlowsPaginateFilter => {\n\tconst hasNameFilter = Boolean(search?.name);\n\tconst hasTagsFilter = Boolean(search?.tags?.length);\n\n\tif (!hasNameFilter && !hasTagsFilter) {\n\t\treturn {\n\t\t\tpage: search?.page ?? 1,\n\t\t\tlimit: search?.limit ?? 10,\n\t\t\tsort: search?.sort ?? \"NAME_ASC\",\n\t\t};\n\t}\n\n\treturn {\n\t\tpage: search?.page ?? 1,\n\t\tlimit: search?.limit ?? 10,\n\t\tsort: search?.sort ?? \"NAME_ASC\",\n\t\tflows: {\n\t\t\toperator: \"and_\",\n\t\t\t...(hasNameFilter && { name: { like_: search?.name } }),\n\t\t\t...(hasTagsFilter && {\n\t\t\t\ttags: { operator: \"and_\", all_: search?.tags },\n\t\t\t}),\n\t\t},\n\t};\n};\n\nconst NUMBER_OF_ACTIVITY_BARS = 16;\n\nfunction FlowsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load flows\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Flows</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/flows/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: FlowsRoute,\n\terrorComponent: FlowsErrorComponent,\n\tloaderDeps: ({ search }) => buildPaginationBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch current page queries without blocking the loader\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowsQuery(deps, 30_000),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowsFilteredQuery({\n\t\t\t\toffset: 0,\n\t\t\t\tsort: deps.sort,\n\t\t\t\tflows: deps.flows ?? undefined,\n\t\t\t}),\n\t\t);\n\t\t// Prefetch total count for empty state check\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountFlowsFilteredQuery({\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t}),\n\t\t);\n\t},\n\twrapInSuspense: true,\n});\n\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// Convert URL params (1-based page) to TanStack Table's PaginationState (0-based pageIndex)\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex: (search.page ?? 1) - 1,\n\t\t\tpageSize: search.limit ?? 10,\n\t\t}),\n\t\t[search.page, search.limit],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t// Convert TanStack Table's 0-based pageIndex back to 1-based page for URL\n\t\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\ntype FlowSort = \"CREATED_DESC\" | \"UPDATED_DESC\" | \"NAME_ASC\" | \"NAME_DESC\";\n\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortChange = useCallback(\n\t\t(sort: FlowSort) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortChange] as const;\n};\n\nconst useFlowsColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"name\", value: search.name },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.name, search.tags],\n\t);\n\n\tconst onColumnFiltersChange = useCallback(\n\t\t(newColumnFilters: ColumnFiltersState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => {\n\t\t\t\t\tconst name = newColumnFilters.find((filter) => filter.id === \"name\")\n\t\t\t\t\t\t?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tpage: 1,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [columnFilters, onColumnFiltersChange] as const;\n};\n\nfunction FlowsRoute() {\n\tconst search = Route.useSearch();\n\tconst queryClient = useQueryClient();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [columnFilters, onColumnFiltersChange] = useFlowsColumnFilters();\n\n\tconst paginationBody = buildPaginationBody(search);\n\n\t// Use useSuspenseQuery for count (stable key, won't cause suspense on search change)\n\tconst { data: count } = useSuspenseQuery(\n\t\tbuildCountFlowsFilteredQuery({\n\t\t\toffset: 0,\n\t\t\tsort: search.sort,\n\t\t\tflows: paginationBody.flows ?? undefined,\n\t\t}),\n\t);\n\n\t// Get total count of all flows (without filters) to determine if empty state should be shown\n\tconst { data: totalCount } = useSuspenseQuery(\n\t\tbuildCountFlowsFilteredQuery({\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\t// Use useQuery for paginated flows to leverage placeholderData: keepPreviousData\n\t// This prevents the page from suspending when search/filter changes\n\tconst { data: flowsPage } = useQuery(\n\t\tbuildPaginateFlowsQuery(paginationBody, 30_000),\n\t);\n\n\tconst flows = flowsPage?.results ?? [];\n\n\t// Prefetch a page and its child component data when user hovers over pagination buttons\n\tconst onPrefetchPage = useCallback(\n\t\t(page: number) => {\n\t\t\tconst pageDeps = { ...paginationBody, page };\n\t\t\tvoid queryClient\n\t\t\t\t.prefetchQuery(buildPaginateFlowsQuery(pageDeps, 30_000))\n\t\t\t\t.then(() => {\n\t\t\t\t\t// Get the prefetched page data from cache\n\t\t\t\t\tconst pageData = queryClient.getQueryData<{\n\t\t\t\t\t\tresults?: Array<{ id?: string }>;\n\t\t\t\t\t}>(buildPaginateFlowsQuery(pageDeps, 30_000).queryKey);\n\n\t\t\t\t\tconst flowIds =\n\t\t\t\t\t\tpageData?.results\n\t\t\t\t\t\t\t?.map((flow) => flow.id)\n\t\t\t\t\t\t\t.filter((id): id is string => Boolean(id)) ?? [];\n\n\t\t\t\t\tif (flowIds.length === 0) return;\n\n\t\t\t\t\t// Prefetch child component queries for each flow individually\n\t\t\t\t\t// Using individual flow IDs ensures query keys match what components use\n\t\t\t\t\tfor (const flowId of flowIds) {\n\t\t\t\t\t\t// FlowNextRun query - uses single flow ID array for query key matching\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(buildNextRunsByFlowQuery([flowId]));\n\n\t\t\t\t\t\t// FlowDeploymentCount query - uses single flow ID array for query key matching\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildDeploymentsCountByFlowQuery([flowId]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// FlowLastRun query - last completed run\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildFilterFlowRunsQuery({\n\t\t\t\t\t\t\t\tflows: { operator: \"and_\", id: { any_: [flowId] } },\n\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tstart_time: { is_null_: false },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tlimit: 1,\n\t\t\t\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// FlowActivity query - recent runs for activity chart\n\t\t\t\t\t\tvoid queryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildFilterFlowRunsQuery({\n\t\t\t\t\t\t\t\tflows: { operator: \"and_\", id: { any_: [flowId] } },\n\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tstart_time: { is_null_: false },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tlimit: NUMBER_OF_ACTIVITY_BARS,\n\t\t\t\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\t[queryClient, paginationBody],\n\t);\n\n\treturn (\n\t\t<FlowsPage\n\t\t\tflows={flows}\n\t\t\tcount={count ?? 0}\n\t\t\ttotalCount={totalCount ?? 0}\n\t\t\tpageCount={flowsPage?.pages ?? 0}\n\t\t\tsort={sort as \"NAME_ASC\" | \"NAME_DESC\" | \"CREATED_DESC\"}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t\tonSortChange={onSortChange}\n\t\t\tcolumnFilters={columnFilters}\n\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\tonPrefetchPage={onPrefetchPage}\n\t\t/>\n\t);\n}\n"],"names":["FlowName","row","jsxs","jsx","Link","formatDate","FlowLastRun","flowId","flowRuns","useQuery","buildFilterFlowRunsQuery","lastRun","StateIcon","FlowNextRun","nextRunsMap","buildNextRunsByFlowQuery","nextRun","FlowDeploymentCount","countsMap","buildDeploymentsCountByFlowQuery","count","pluralize","FlowActionMenu","id","deleteFlow","useDeleteFlowById","DropdownMenu","DropdownMenuTrigger","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","toast","DropdownMenuSeparator","NUMBER_OF_ACTIVITY_BARS","FlowActivity","startDate","endDate","useMemo","now","subWeeks","FlowRunActivityBarChart","columns","table","Checkbox","value","FLOW_SORT_OPTIONS","FlowsTable","flows","pageCount","sort","pagination","onPaginationChange","onSortChange","columnFilters","onColumnFiltersChange","onPrefetchPage","rowSelection","setRowSelection","useState","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","useCallback","filters","handleTagsSearchChange","e","tags","handlePaginationChange","updater","newPagination","useReactTable","getCoreRowModel","handleDeleteRows","idsToDelete","rowId","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","DataTable","FlowsEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","FlowsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","FlowsPage","totalCount","z","name","string","optional","page","number","int","positive","default","catch","limit","max","buildPaginationBody","search","hasNameFilter","Boolean","hasTagsFilter","length","operator","like_","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","pageSize","to","prev","replace","useSort","useFlowsColumnFilters","newColumnFilters","find","FlowsRoute","queryClient","useQueryClient","paginationBody","data","useSuspenseQuery","buildCountFlowsFilteredQuery","offset","undefined","flowsPage","buildPaginateFlowsQuery","results","pageDeps","prefetchQuery","then","flowIds","getQueryData","queryKey","map","flow","any_","flow_runs","start_time","is_null_","pages"],"mappings":"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"}
|