prefect 3.6.14.dev6__py3-none-any.whl → 3.6.14.dev7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/_build_info.py +3 -3
- prefect/server/ui-v2/assets/{artifact-card-fXxwNG3f.js → artifact-card-9Cw_dMVb.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-fXxwNG3f.js.map → artifact-card-9Cw_dMVb.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifact._id-BIyzb0Jb.js → artifact._id-zuZ8P2RD.js} +2 -2
- prefect/server/ui-v2/assets/{artifact._id-BIyzb0Jb.js.map → artifact._id-zuZ8P2RD.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation-wizard-bDZICLpV.js → automation-wizard-D7nVgckT.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-bDZICLpV.js.map → automation-wizard-D7nVgckT.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation._id-CmDL_Eta.js → automation._id-BhEFaDc6.js} +2 -2
- prefect/server/ui-v2/assets/{automation._id-CmDL_Eta.js.map → automation._id-BhEFaDc6.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-DY7_SAuk.js → automation_._id.edit-CffnUlbj.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-DY7_SAuk.js.map → automation_._id.edit-CffnUlbj.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-CgxOgR53.js → automations-header-qb94agIp.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-CgxOgR53.js.map → automations-header-qb94agIp.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-DilLn1Ul.js → base-job-template-form-section-DdDSFAJa.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-DilLn1Ul.js.map → base-job-template-form-section-DdDSFAJa.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-Cx4npO8Y.js → block-type-details-2rIqbqoZ.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-Cx4npO8Y.js.map → block-type-details-2rIqbqoZ.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-DV1pSkV0.js +2 -0
- prefect/server/ui-v2/assets/{block-type-logo-FrtMLMYr.js.map → block-type-logo-DV1pSkV0.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-CWi9g5N3.js → block._id-OeCbdPeL.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-CWi9g5N3.js.map → block._id-OeCbdPeL.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-wf0QVPUL.js → block_._id.edit-CD22VllN.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-wf0QVPUL.js.map → block_._id.edit-CD22VllN.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-Iv1gLDUd.js → catalog-Dj7lYV7b.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-Iv1gLDUd.js.map → catalog-Dj7lYV7b.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug-DEHFXZzp.js → catalog_._slug-NLgWS8vG.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug-DEHFXZzp.js.map → catalog_._slug-NLgWS8vG.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-C-vFPUOy.js → catalog_._slug_.create-D0vc1Piy.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-C-vFPUOy.js.map → catalog_._slug_.create-D0vc1Piy.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-BlEqjqQu.js → collapsible-Dgk2Qvjj.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-BlEqjqQu.js.map → collapsible-Dgk2Qvjj.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-VfgyonlO.js → concurrency-limit._id-BZiyM0NT.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-VfgyonlO.js.map → concurrency-limit._id-BZiyM0NT.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-fSiDZ1kD.js → create-1j1-8yhV.js} +2 -2
- prefect/server/ui-v2/assets/{create-fSiDZ1kD.js.map → create-1j1-8yhV.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-CC32TiFK.js → create-H21iiYVl.js} +2 -2
- prefect/server/ui-v2/assets/{create-CC32TiFK.js.map → create-H21iiYVl.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-B2NqBPUR.js → data-table-DHlbTUL7.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-B2NqBPUR.js.map → data-table-DHlbTUL7.js.map} +1 -1
- prefect/server/ui-v2/assets/delete-confirmation-dialog-B9-8JHV7.js +2 -0
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-jlBI67Pk.js.map → delete-confirmation-dialog-B9-8JHV7.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-C203ndcC.js → deployment-action-header-DlD2GSJB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-C203ndcC.js.map → deployment-action-header-DlD2GSJB.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-DB4i73UE.js → deployment-form-CFcOIeIi.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-DB4i73UE.js.map → deployment-form-CFcOIeIi.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-UZYTtmnK.js → deployment-links-DN2Oa0r1.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-UZYTtmnK.js.map → deployment-links-DN2Oa0r1.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-Drmf70gG.js → deployment._id-C8NPwIIQ.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-Drmf70gG.js.map → deployment._id-C8NPwIIQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-Bk44iuUn.js → deployment._id-DsVQUPNp.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-Bk44iuUn.js.map → deployment._id-DsVQUPNp.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-4uYFgdPg.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-aUHtHuNO.js.map → deployment_._id.duplicate-4uYFgdPg.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-Z859_W76.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-CPRKkA-W.js.map → deployment_._id.edit-Z859_W76.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-C8EGDJeT.js → deployment_._id.run-MW5q2SRM.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-C8EGDJeT.js.map → deployment_._id.run-MW5q2SRM.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-CT6uZu-V.js → dropdown-menu-DF4QR3Cp.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-CT6uZu-V.js.map → dropdown-menu-DF4QR3Cp.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-DmCKu0PD.js → event-resource-display-DR3zL_k_.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-DmCKu0PD.js.map → event-resource-display-DR3zL_k_.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DqO9viGu.js → event._eventDate._eventId-DfU7SalU.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DqO9viGu.js.map → event._eventDate._eventId-DfU7SalU.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-Bf9t75GK.js +2 -0
- prefect/server/ui-v2/assets/{flow-run-graph-CIvkp1kl.js.map → flow-run-graph-Bf9t75GK.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-33WKPXsZ.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-33WKPXsZ.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-run._id-xahYswsG.js → flow-run._id-DTsj_xO3.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-xahYswsG.js.map → flow-run._id-DTsj_xO3.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-DyUEsBSd.js → flow-run._id-RL0qeSLl.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-DyUEsBSd.js.map → flow-run._id-RL0qeSLl.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-runs-pagination--FfnMca3.js → flow-runs-pagination-Bfelp8UO.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination--FfnMca3.js.map → flow-runs-pagination-Bfelp8UO.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow._id-C_ho4p55.js → flow._id-DuQ5AUjj.js} +2 -2
- prefect/server/ui-v2/assets/{flow._id-C_ho4p55.js.map → flow._id-DuQ5AUjj.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-CxD6-5Qf.js → form-DHWphysD.js} +2 -2
- prefect/server/ui-v2/assets/{form-CxD6-5Qf.js.map → form-DHWphysD.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-iN9gVtk7.js → header-B9SuuoZx.js} +2 -2
- prefect/server/ui-v2/assets/{header-iN9gVtk7.js.map → header-B9SuuoZx.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-CYjjmMrB.js → header-BK_NuSng.js} +2 -2
- prefect/server/ui-v2/assets/{header-CYjjmMrB.js.map → header-BK_NuSng.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-Cjet3B6Z.js → header-nu-ZKuen.js} +2 -2
- prefect/server/ui-v2/assets/{header-Cjet3B6Z.js.map → header-nu-ZKuen.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CfMaY6sy.js → index-BCR-yD58.js} +2 -2
- prefect/server/ui-v2/assets/{index-CfMaY6sy.js.map → index-BCR-yD58.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-ltOkPb3X.js → index-BPXdHXTb.js} +2 -2
- prefect/server/ui-v2/assets/{index-ltOkPb3X.js.map → index-BPXdHXTb.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CTeNzxT9.js → index-BqwU5GSv.js} +2 -2
- prefect/server/ui-v2/assets/{index-CTeNzxT9.js.map → index-BqwU5GSv.js.map} +1 -1
- prefect/server/ui-v2/assets/index-Br7MUvka.css +1 -0
- prefect/server/ui-v2/assets/{index-D-yYhKPg.js → index-C0MMjoUe.js} +2 -2
- prefect/server/ui-v2/assets/{index-D-yYhKPg.js.map → index-C0MMjoUe.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-0opjCZAR.js → index-CPFMHkRh.js} +2 -2
- prefect/server/ui-v2/assets/{index-0opjCZAR.js.map → index-CPFMHkRh.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D8SbV2Tp.js → index-CYjH7t93.js} +2 -2
- prefect/server/ui-v2/assets/{index-D8SbV2Tp.js.map → index-CYjH7t93.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BF3HB5BS.js → index-Cj5ihRiw.js} +2 -2
- prefect/server/ui-v2/assets/{index-BF3HB5BS.js.map → index-Cj5ihRiw.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-d9_i_klL.js → index-CqUa3fbN.js} +2 -2
- prefect/server/ui-v2/assets/{index-d9_i_klL.js.map → index-CqUa3fbN.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CSQa2wYx.js → index-DFS5GNpT.js} +2 -2
- prefect/server/ui-v2/assets/{index-CSQa2wYx.js.map → index-DFS5GNpT.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-B5eJQPOP.js → index-DNuhJlQK.js} +2 -2
- prefect/server/ui-v2/assets/{index-B5eJQPOP.js.map → index-DNuhJlQK.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DQOPH4Rq.js → index-DSBmxhwG.js} +2 -2
- prefect/server/ui-v2/assets/{index-DQOPH4Rq.js.map → index-DSBmxhwG.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CT2kL3dS.js → index-DVsNA4UN.js} +2 -2
- prefect/server/ui-v2/assets/{index-CT2kL3dS.js.map → index-DVsNA4UN.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D4df3B9r.js → index-DWGx9irM.js} +2 -2
- prefect/server/ui-v2/assets/{index-D4df3B9r.js.map → index-DWGx9irM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Cwd5Gvad.js → index-DcMpyvW7.js} +2 -2
- prefect/server/ui-v2/assets/{index-Cwd5Gvad.js.map → index-DcMpyvW7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-C2ayqOiQ.js → index-Dl_iSX0z.js} +2 -2
- prefect/server/ui-v2/assets/{index-C2ayqOiQ.js.map → index-Dl_iSX0z.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DI-aZXNg.js → index-DsK1RlS9.js} +2 -2
- prefect/server/ui-v2/assets/{index-DI-aZXNg.js.map → index-DsK1RlS9.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-C3A0XavU.js → index-DtrQRjt_.js} +2 -2
- prefect/server/ui-v2/assets/{index-C3A0XavU.js.map → index-DtrQRjt_.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-nxDkMXcY.js → index-_0OOjqn5.js} +13 -13
- prefect/server/ui-v2/assets/index-_0OOjqn5.js.map +1 -0
- prefect/server/ui-v2/assets/{index-BfXKkd3I.js → index-mj9GNKt7.js} +2 -2
- prefect/server/ui-v2/assets/{index-BfXKkd3I.js.map → index-mj9GNKt7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D0ANIqVp.js → index-vRbn9rG4.js} +2 -2
- prefect/server/ui-v2/assets/{index-D0ANIqVp.js.map → index-vRbn9rG4.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-BGfZindW.js → json-input-CMZiW5M2.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-BGfZindW.js.map → json-input-CMZiW5M2.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-mnO405kp.js → key._key-CdonPtNh.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-mnO405kp.js.map → key._key-CdonPtNh.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-CLclUkkd.js → lazy-markdown-CKcd9ksG.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-CLclUkkd.js.map → lazy-markdown-CKcd9ksG.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-ST_-h2GY.js → login-Dnd-tV90.js} +2 -2
- prefect/server/ui-v2/assets/{login-ST_-h2GY.js.map → login-Dnd-tV90.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-DemuemAs.js → markdown-input-D6rfyTa_.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-DemuemAs.js.map → markdown-input-D6rfyTa_.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-example-snippet-BUllaeTS.js → python-example-snippet-eWuRXCxE.js} +3 -3
- prefect/server/ui-v2/assets/{python-example-snippet-BUllaeTS.js.map → python-example-snippet-eWuRXCxE.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-DTpMdYLs.js → python-input-itfwkkBT.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-DTpMdYLs.js.map → python-input-itfwkkBT.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-CJhtPDwC.js → radio-group-DeN-_krn.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-CJhtPDwC.js.map → radio-group-DeN-_krn.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-D0wedcpP.js → route-error-state-tYzhKCqH.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-D0wedcpP.js.map → route-error-state-tYzhKCqH.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-Cx-6swYW.js → schema-form-DDUzvjpL.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-Cx-6swYW.js.map → schema-form-DDUzvjpL.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZkUje5U.js → schema-form-input-string-format-datetime-DrpJmvST.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZkUje5U.js.map → schema-form-input-string-format-datetime-DrpJmvST.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-nHtCkknH.js → settings-OdrJDFrk.js} +2 -2
- prefect/server/ui-v2/assets/{settings-nHtCkknH.js.map → settings-OdrJDFrk.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-QjOHFWPI.js → sort-filter-DaBGDmua.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-QjOHFWPI.js.map → sort-filter-DaBGDmua.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-Bx2Ol4j-.js → table-4GUC4YOD.js} +2 -2
- prefect/server/ui-v2/assets/{table-Bx2Ol4j-.js.map → table-4GUC4YOD.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-C7cxdTyV.js → tags-input-BvH9UY8h.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-C7cxdTyV.js.map → tags-input-BvH9UY8h.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG2F0Ufy.js → task-run-concurrency-limits-reset-dialog-CLZz3kwW.js} +2 -2
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG2F0Ufy.js.map → task-run-concurrency-limits-reset-dialog-CLZz3kwW.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-CapS5wad.js → task-run._id-DHHzTQ9d.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-CapS5wad.js.map → task-run._id-DHHzTQ9d.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-CevQxX-E.js → task-run._id-DgXFfCuq.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-CevQxX-E.js.map → task-run._id-DgXFfCuq.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-runs-pagination-Dbwa2yPe.js → task-runs-pagination-fR9zqj38.js} +2 -2
- prefect/server/ui-v2/assets/{task-runs-pagination-Dbwa2yPe.js.map → task-runs-pagination-fR9zqj38.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-vy4DM6KG.js → textarea-DL9UCBaB.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-vy4DM6KG.js.map → textarea-DL9UCBaB.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-DDUTUy-L.js → timezone-select-qBEoPcyO.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-DDUTUy-L.js.map → timezone-select-qBEoPcyO.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-Dx_fy9WJ.js → toggle-group-Cf-ZSSDP.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-Dx_fy9WJ.js.map → toggle-group-Cf-ZSSDP.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-ClQsotEa.js → use-delete-automation-confirmation-dialog-DRX9Kvie.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-ClQsotEa.js.map → use-delete-automation-confirmation-dialog-DRX9Kvie.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DM0Dy1PL.js → use-delete-block-document-confirmation-dialog-CogrfdiO.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DM0Dy1PL.js.map → use-delete-block-document-confirmation-dialog-CogrfdiO.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-UhMaQqzZ.js → use-flow-runs-selected-rows-CdMKKvm5.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-UhMaQqzZ.js.map → use-flow-runs-selected-rows-CdMKKvm5.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-P8C-ARMZ.js → use-get-artifacts-flow-task-runs-Be1qg-IF.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-P8C-ARMZ.js.map → use-get-artifacts-flow-task-runs-Be1qg-IF.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-DT0VEa9Z.js → use-quick-run-DXDfXpvs.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-DT0VEa9Z.js.map → use-quick-run-DXDfXpvs.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-state-favicon-DfEAuEQL.js → use-state-favicon-Dhkg1tqx.js} +2 -2
- prefect/server/ui-v2/assets/{use-state-favicon-DfEAuEQL.js.map → use-state-favicon-Dhkg1tqx.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-1OG0a_eo.js → use-stepper-jTTsXpho.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-1OG0a_eo.js.map → use-stepper-jTTsXpho.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-DabzLyXd.js → utilities-CgJi7g2F.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-DabzLyXd.js.map → utilities-CgJi7g2F.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-filter-CTTGgdIN.js → work-pool-filter-DLkRAAHz.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-CTTGgdIN.js.map → work-pool-filter-DLkRAAHz.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-B9KQxNdY.js → work-pool-queue-toggle-BFodtXQe.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-B9KQxNdY.js.map → work-pool-queue-toggle-BFodtXQe.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-CGqG95Pv.js → work-pool._workPoolName-Bjh_bO5G.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-CGqG95Pv.js.map → work-pool._workPoolName-Bjh_bO5G.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CcFrethu.js → work-pool_._workPoolName.edit-B-gnp5dc.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CcFrethu.js.map → work-pool_._workPoolName.edit-B-gnp5dc.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CwPnpSI9.js → work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CwPnpSI9.js.map → work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-Bix0rRM1.js → work-queue-icon-text-BK_qfkJJ.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-Bix0rRM1.js.map → work-queue-icon-text-BK_qfkJJ.js.map} +1 -1
- prefect/server/ui-v2/index.html +2 -2
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.14.dev7.dist-info}/METADATA +1 -1
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.14.dev7.dist-info}/RECORD +202 -202
- prefect/server/ui-v2/assets/block-type-logo-FrtMLMYr.js +0 -2
- prefect/server/ui-v2/assets/delete-confirmation-dialog-jlBI67Pk.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-aUHtHuNO.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-CPRKkA-W.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-CIvkp1kl.js +0 -2
- prefect/server/ui-v2/assets/flow-run._id-BT3wztDF.js +0 -4
- prefect/server/ui-v2/assets/flow-run._id-BT3wztDF.js.map +0 -1
- prefect/server/ui-v2/assets/index-CYc_PWA3.css +0 -1
- prefect/server/ui-v2/assets/index-nxDkMXcY.js.map +0 -1
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.14.dev7.dist-info}/WHEEL +0 -0
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.14.dev7.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.14.dev7.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-D-yYhKPg.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-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,2 +1,2 @@
|
|
|
1
|
-
import{j as o}from"./vendor-tanstack-BcZfOOfy.js";import{s as a}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as o}from"./vendor-tanstack-BcZfOOfy.js";import{s as a}from"./index-_0OOjqn5.js";import{R as i}from"./route-error-state-tYzhKCqH.js";import{V as s}from"./header-B9SuuoZx.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";function E({error:e,reset:t}){const r=a(e,"Failed to load variables");if(r.type!=="server-error"&&r.type!=="client-error")throw e;return o.jsxs("div",{className:"flex flex-col gap-4",children:[o.jsx(s,{}),o.jsx(i,{error:r,onRetry:t})]})}export{E as errorComponent};
|
|
2
|
+
//# sourceMappingURL=index-CPFMHkRh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-CPFMHkRh.js","sources":["../../src/routes/variables/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { useSuspenseQueries } 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 type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountVariablesQuery,\n\tbuildFilterVariablesQuery,\n\ttype VariablesFilter,\n} from \"@/api/variables\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\nimport { VariablesDataTable } from \"@/components/variables/data-table\";\nimport { VariablesEmptyState } from \"@/components/variables/empty-state\";\nimport { VariablesPageHeader } from \"@/components/variables/header\";\nimport {\n\tuseVariableDialog,\n\tVariableDialog,\n} from \"@/components/variables/variable-dialog\";\n\n/**\n * Schema for validating URL search parameters for the variables page.\n * @property {number} offset - The number of items to skip (for pagination). Must be non-negative. Defaults to 0.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n * @property {string} sort - The sort order for variables. Can be \"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", or \"NAME_DESC\". Defaults to \"CREATED_DESC\".\n * @property {string} name - Optional filter to search variables by name.\n * @property {string[]} tags - Optional array of tags to filter variables by.\n */\nconst searchParams = z.object({\n\toffset: z.number().int().nonnegative().optional().default(0).catch(0),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\tsort: z\n\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t.optional()\n\t\t.default(\"CREATED_DESC\")\n\t\t.catch(\"CREATED_DESC\"),\n\tname: z.string().optional().catch(undefined),\n\ttags: z.array(z.string()).optional().catch(undefined),\n});\n\n/**\n * Builds a filter body for the variables API based on search parameters.\n * @param search - Optional search parameters containing offset, limit, sort, name filter, and tags filter\n * @returns An object containing pagination parameters and variable filters that can be passed to the variables API\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): VariablesFilter => ({\n\toffset: search?.offset ?? 0,\n\tlimit: search?.limit ?? 10,\n\tsort: search?.sort ?? \"CREATED_DESC\",\n\tvariables: {\n\t\toperator: \"and_\" as const,\n\t\t...(search?.name && { name: { like_: search.name } }),\n\t\t...(search?.tags?.length && {\n\t\t\ttags: { operator: \"and_\" as const, all_: search.tags },\n\t\t}),\n\t},\n});\n\nfunction VariablesErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load variables\");\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<VariablesPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/variables/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\terrorComponent: VariablesErrorComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch filtered variables\n\t\tvoid context.queryClient.prefetchQuery(buildFilterVariablesQuery(deps));\n\t\t// Prefetch filtered count\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery(deps));\n\t\t// Prefetch total count (no filter)\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery());\n\t},\n\twrapInSuspense: true,\n});\n\n/**\n * Hook to manage pagination state and navigation for variables table\n *\n * Calculates current page index and size from URL search parameters and provides\n * a callback to update pagination state. Updates the URL when pagination changes.\n *\n * @returns A tuple containing:\n * - pagination: Current pagination state with pageIndex and pageSize\n * - onPaginationChange: Callback to update pagination and navigate with new search params\n */\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pageIndex = search.offset ? Math.ceil(search.offset / search.limit) : 0;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\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\toffset: newPagination.pageIndex * newPagination.pageSize,\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\n/**\n * Hook to manage column filtering state and navigation for variables table\n *\n * Handles filtering by name and tags, updating the URL search parameters when filters change.\n * Resets pagination offset when filters are updated.\n *\n * @returns A tuple containing:\n * - columnFilters: Current column filter state for name and tags\n * - onColumnFiltersChange: Callback to update filters and navigate with new search params\n */\nconst useVariableColumnFilters = () => {\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\toffset: 0,\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\n/**\n * Hook to manage sorting state and navigation for variables table\n *\n * Handles updating the URL search parameters when sort key changes.\n * Uses the current sort value from search params and provides a callback\n * to update sorting.\n *\n * @returns A tuple containing:\n * - sorting: Current sort key from search params\n * - onSortingChange: Callback to update sort and navigate with new search params\n */\nconst useVariableSorting = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortingChange = useCallback(\n\t\t(sortKey: components[\"schemas\"][\"VariableSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort: sortKey }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortingChange] as const;\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [columnFilters, onColumnFiltersChange] = useVariableColumnFilters();\n\tconst [sorting, onSortingChange] = useVariableSorting();\n\tconst [variableDialogState, onVariableAddOrEdit] = useVariableDialog();\n\n\tconst [{ data: variables }, { data: filteredCount }, { data: totalCount }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildFilterVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(),\n\t\t\t],\n\t\t});\n\n\tconst hasVariables = (totalCount ?? 0) > 0;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t<VariableDialog {...variableDialogState} />\n\t\t\t{hasVariables ? (\n\t\t\t\t<VariablesDataTable\n\t\t\t\t\tvariables={variables ?? []}\n\t\t\t\t\tcurrentVariableCount={filteredCount ?? 0}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tsorting={sorting}\n\t\t\t\t\tonSortingChange={onSortingChange}\n\t\t\t\t\tonVariableEdit={onVariableAddOrEdit}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<VariablesEmptyState onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["VariablesErrorComponent","error","reset","serverError","categorizeError","type","jsxs","jsx","VariablesPageHeader","RouteErrorState"],"mappings":"wWAkEA,SAASA,EAAwB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACvE,MAAMC,EAAcC,EAAgBH,EAAO,0BAA0B,EAIrE,GACCE,EAAYE,OAAS,gBACrBF,EAAYE,OAAS,eAErB,MAAMJ,EAGP,OACCK,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAmB,EACpBD,EAAAA,IAACE,EAAA,CAAgB,MAAON,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e,L as h,r as d,C as v,D,B as N,s as S,t as T}from"./vendor-tanstack-BcZfOOfy.js";import{al as p,ak as f,bm as w,ac as I,ad as R,bn as _,ae as z,af as E,ah as M,ag as P,ai as A,aj as L,q as j,I as k,N as F,E as Q,t as q,v as H,w as V,x as $,D as O,B as G,h as U,O as J,bo as K,bp as W,bq as x}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as e,L as h,r as d,C as v,D,B as N,s as S,t as T}from"./vendor-tanstack-BcZfOOfy.js";import{al as p,ak as f,bm as w,ac as I,ad as R,bn as _,ae as z,af as E,ah as M,ag as P,ai as A,aj as L,q as j,I as k,N as F,E as Q,t as q,v as H,w as V,x as $,D as O,B as G,h as U,O as J,bo as K,bp as W,bq as x}from"./index-_0OOjqn5.js";import{u as C,B as X}from"./use-delete-block-document-confirmation-dialog-CogrfdiO.js";import{D as Y}from"./data-table-DHlbTUL7.js";import{D as y}from"./delete-confirmation-dialog-B9-8JHV7.js";import{B as Z}from"./block-type-logo-DV1pSkV0.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";import"./dropdown-menu-DF4QR3Cp.js";import"./use-delete-confirmation-dialog-CUdii6Lo.js";import"./table-4GUC4YOD.js";const ee=({blockDocument:a})=>{const{id:o,name:s,block_type:t,block_type_name:l}=a;return e.jsxs("div",{className:"flex gap-4 items-center",children:[t&&l&&e.jsx(Z,{size:"sm",logoUrl:t.logo_url,alt:`${l} logo`}),e.jsxs("div",{className:"flex flex-col",children:[s&&e.jsx(h,{to:"/blocks/block/$id",params:{id:o},children:e.jsx(p,{className:"font-semibold",children:s})}),l&&a.block_type?.slug&&e.jsx(h,{to:"/blocks/catalog/$slug",params:{slug:a.block_type.slug},children:e.jsx(p,{variant:"bodySmall",className:"text-muted-foreground",children:l})})]})]})},b=N(),se=({onDelete:a})=>[b.display({size:20,id:"select",header:({table:o})=>{let s=!1;return o.getIsAllRowsSelected()?s=!0:o.getIsSomePageRowsSelected()&&(s="indeterminate"),e.jsx(f,{checked:s,onCheckedChange:t=>o.toggleAllPageRowsSelected(!!t),"aria-label":"Select all"})},cell:({row:o})=>e.jsx(f,{checked:o.getIsSelected(),onCheckedChange:s=>o.toggleSelected(!!s),"aria-label":"Select row"}),enableSorting:!1,enableHiding:!1}),b.display({id:"block",header:"Block",cell:({row:o})=>e.jsx(ee,{blockDocument:o.original})}),b.display({id:"actions",cell:o=>{const s=o.row.original;return e.jsx("div",{className:"flex justify-end",children:e.jsx(X,{blockDocument:s,onDelete:()=>a(s)})})}})],oe=({blockDocuments:a,blockDocumentsCount:o,onPaginationChange:s,pagination:t,rowSelection:l,setRowSelection:i})=>{const[r,m]=C(),u=d.useCallback(c=>{let g=t;typeof c=="function"?g=c(t):g=c,s(g)},[t,s]),n=v({columns:se({onDelete:m}),data:a,defaultColumn:{maxSize:300},getCoreRowModel:D(),manualPagination:!0,onPaginationChange:u,rowCount:o,getRowId:c=>c.id,onRowSelectionChange:i,state:{pagination:t,rowSelection:l}});return e.jsxs(e.Fragment,{children:[e.jsx(Y,{table:n}),e.jsx(y,{...r})]})};function ae({selectedBlockTypesSlugs:a,onToggleBlockTypeSlug:o,onRemoveBlockTypeSlug:s}){return e.jsx(d.Suspense,{children:e.jsx(te,{selectedBlockTypesSlugs:a,onToggleBlockTypeSlug:o,onRemoveBlockTypeSlug:s})})}function te({selectedBlockTypesSlugs:a,onToggleBlockTypeSlug:o,onRemoveBlockTypeSlug:s}){const[t,l]=d.useState(""),i=d.useDeferredValue(t),{data:r}=S(w()),m=d.useMemo(()=>a.map(n=>r.find(c=>c.slug===n)).filter(Boolean),[r,a]),u=d.useMemo(()=>r.filter(n=>n.name.toLowerCase().includes(i.toLowerCase())),[r,i]);return e.jsxs(I,{children:[e.jsx(R,{selected:a.length>0,children:e.jsx("div",{className:"flex gap-1",children:a.length>0?m.map(n=>e.jsx(_,{tag:n.name,onRemove:()=>s(n.slug)},n.id)):"Select blocks"})}),e.jsxs(z,{children:[e.jsx(E,{value:t,onValueChange:l,placeholder:"Search for a block type..."}),e.jsx(M,{children:"No block type found"}),e.jsx(P,{children:e.jsx(A,{children:u.map(n=>e.jsx(L,{selected:a.includes(n.slug),onSelect:c=>{o(c),l("")},value:n.slug,children:n.name},n.id))})})]})]})}const le=({count:a,rowSelection:o,setRowSelection:s})=>{const[t,l]=C(),i=d.useMemo(()=>Object.keys(o),[o]);return i.length>0?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(p,{variant:"bodySmall",className:"text-muted-foreground",children:[i.length," selected"]}),e.jsx(j,{"aria-label":"Delete rows",size:"icon",variant:"secondary",onClick:()=>{l(i,{onSuccess:()=>s({})})},children:e.jsx(k,{id:"Trash2",className:"size-4"})})]}),e.jsx(y,{...t})]}):e.jsxs(p,{variant:"bodySmall",className:"text-muted-foreground",children:[a," ",F(a,"Block")]})},ne=()=>e.jsxs(Q,{children:[e.jsx(q,{id:"Box"}),e.jsx(H,{children:"Add a block to get started"}),e.jsx(V,{children:"Blocks securely store credentials and configuration to easily manage connections to external systems."}),e.jsxs($,{children:[e.jsx(h,{to:"/blocks/catalog",children:e.jsxs(j,{children:["Add Block ",e.jsx(k,{id:"Plus",className:"size-4 ml-2"})]})}),e.jsx(O,{id:"blocks-guide"})]})]}),ce=({allCount:a,blockDocuments:o=[],onSearch:s,search:t,blockTypeSlugsFilter:l,onToggleBlockTypeSlug:i,onRemoveBlockTypeSlug:r,pagination:m,onPaginationChange:u})=>{const[n,c]=d.useState({});return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(G,{children:e.jsx(U,{className:"text-xl font-semibold",children:"Blocks"})}),e.jsx(j,{size:"icon",className:"size-7",variant:"outline",children:e.jsx(h,{to:"/blocks/catalog",children:e.jsx(k,{id:"Plus",className:"size-4"})})})]}),a===0?e.jsx(ne,{}):e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(le,{rowSelection:n,setRowSelection:c,count:a}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ae,{selectedBlockTypesSlugs:l,onToggleBlockTypeSlug:i,onRemoveBlockTypeSlug:r}),e.jsx("div",{className:"min-w-56",children:e.jsx(J,{"aria-label":"search blocks",placeholder:"Search blocks",value:t,onChange:g=>s(g.target.value)})})]})]}),e.jsx(oe,{blockDocuments:o,rowSelection:n,setRowSelection:c,blockDocumentsCount:a,pagination:m,onPaginationChange:u})]})]})};function ve(){const[a,o]=ie(),[s,t]=re(),[l,i]=de(),{data:r}=S(K()),{data:m}=T(W({sort:"NAME_ASC",include_secrets:!1,block_documents:{name:{like_:a},operator:"and_",is_anonymous:{eq_:!1}},block_types:{slug:{any_:s.length>0?s:void 0}},offset:l.pageIndex*l.pageSize,limit:l.pageSize})),u=c=>{const g=s.filter(B=>B!==c);t(g)},n=c=>{if(s.includes(c))return u(c);t([...s,c])};return e.jsx(ce,{allCount:r,blockDocuments:m,onSearch:o,search:a,blockTypeSlugsFilter:s,onRemoveBlockTypeSlug:u,onToggleBlockTypeSlug:n,pagination:l,onPaginationChange:i})}function ie(){const{blockName:a}=x.useSearch(),o=x.useNavigate(),s=d.useCallback(l=>{o({to:".",search:i=>({...i,blockName:l}),replace:!0})},[o]);return[d.useMemo(()=>a??"",[a]),s]}function re(){const{blockTypes:a=[]}=x.useSearch(),o=x.useNavigate(),s=d.useCallback(t=>{o({to:".",search:l=>({...l,blockTypes:t}),replace:!0})},[o]);return[a,s]}function de(){const a=x.useSearch(),o=x.useNavigate(),s=(a.page??1)-1,t=a.limit??10,l=d.useMemo(()=>({pageIndex:s,pageSize:t}),[s,t]),i=d.useCallback(r=>{o({to:".",search:m=>({...m,page:r.pageIndex+1,limit:r.pageSize}),replace:!0})},[o]);return[l,i]}export{ve as component};
|
|
2
|
+
//# sourceMappingURL=index-CYjH7t93.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-D8SbV2Tp.js","sources":["../../src/components/blocks/block-document-data-table/block-document-cell.tsx","../../src/components/blocks/block-document-data-table/block-document-data-table.tsx","../../src/components/blocks/block-types-multi-select/block-types-multi-select.tsx","../../src/components/blocks/blocks-row-count/blocks-row-count.tsx","../../src/components/blocks/empty-state/empty-state.tsx","../../src/components/blocks/blocks-page.tsx","../../src/routes/blocks/index.tsx?tsr-split=component"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockTypeLogo } from \"@/components/block-type-logo/block-type-logo\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype BlockDocumentCellProps = {\n\tblockDocument: BlockDocument;\n};\n\nexport const BlockDocumentCell = ({\n\tblockDocument,\n}: BlockDocumentCellProps) => {\n\tconst { id, name, block_type, block_type_name } = blockDocument;\n\n\treturn (\n\t\t<div className=\"flex gap-4 items-center\">\n\t\t\t{block_type && block_type_name && (\n\t\t\t\t<BlockTypeLogo\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tlogoUrl={block_type.logo_url}\n\t\t\t\t\talt={`${block_type_name} logo`}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t{name && (\n\t\t\t\t\t<Link to=\"/blocks/block/$id\" params={{ id }}>\n\t\t\t\t\t\t<Typography className=\"font-semibold\">{name}</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t\t{block_type_name && blockDocument.block_type?.slug && (\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/blocks/catalog/$slug\"\n\t\t\t\t\t\tparams={{ slug: blockDocument.block_type.slug }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{block_type_name}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { CheckedState } from \"@radix-ui/react-checkbox\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockDocumentActionMenu } from \"@/components/blocks/block-document-action-menu\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { BlockDocumentCell } from \"./block-document-cell\";\n\nconst columnHelper = createColumnHelper<BlockDocument>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (blockDocument: BlockDocument) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tsize: 20,\n\t\tid: \"select\",\n\t\theader: ({ table }) => {\n\t\t\tlet checkedState: CheckedState = false;\n\t\t\tif (table.getIsAllRowsSelected()) {\n\t\t\t\tcheckedState = true;\n\t\t\t} else if (table.getIsSomePageRowsSelected()) {\n\t\t\t\tcheckedState = \"indeterminate\";\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={checkedState}\n\t\t\t\t\tonCheckedChange={(value) =>\n\t\t\t\t\t\ttable.toggleAllPageRowsSelected(Boolean(value))\n\t\t\t\t\t}\n\t\t\t\t\taria-label=\"Select all\"\n\t\t\t\t/>\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(Boolean(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}),\n\tcolumnHelper.display({\n\t\tid: \"block\",\n\t\theader: \"Block\",\n\t\tcell: ({ row }) => <BlockDocumentCell blockDocument={row.original} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => {\n\t\t\tconst cell = props.row.original;\n\t\t\treturn (\n\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t<BlockDocumentActionMenu\n\t\t\t\t\t\tblockDocument={cell}\n\t\t\t\t\t\tonDelete={() => onDelete(cell)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t}),\n];\n\nexport type BlockDocumentsDataTableProps = {\n\tblockDocumentsCount: number;\n\tblockDocuments: Array<BlockDocument>;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlockDocumentsDataTable = ({\n\tblockDocuments,\n\tblockDocumentsCount,\n\tonPaginationChange,\n\tpagination,\n\trowSelection,\n\tsetRowSelection,\n}: BlockDocumentsDataTableProps) => {\n\tconst [dialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\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: createColumns({ onDelete: handleConfirmDelete }),\n\t\tdata: blockDocuments,\n\t\tdefaultColumn: { maxSize: 300 },\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: blockDocumentsCount,\n\t\tgetRowId: (row) => row.id,\n\t\tonRowSelectionChange: setRowSelection,\n\t\tstate: { pagination, rowSelection },\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<DataTable table={table} />\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n","\"use client\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\ttype BlockType,\n\tbuildListFilterBlockTypesQuery,\n} from \"@/api/block-types\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\n\ntype BlockTypesMultiSelectProps = {\n\tselectedBlockTypesSlugs: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeSlug: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeSlug: string) => void;\n};\n\nexport function BlockTypesMultiSelect({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<BlockTypesMultiSelectImplementation\n\t\t\t\tselectedBlockTypesSlugs={selectedBlockTypesSlugs}\n\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n}\n\nfunction BlockTypesMultiSelectImplementation({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: blockTypes } = useSuspenseQuery(\n\t\tbuildListFilterBlockTypesQuery(),\n\t);\n\n\tconst selectedBlockTypes = useMemo(() => {\n\t\treturn selectedBlockTypesSlugs\n\t\t\t.map((blockTypeSlug) =>\n\t\t\t\tblockTypes.find((blockType) => blockType.slug === blockTypeSlug),\n\t\t\t)\n\t\t\t.filter(Boolean) as Array<BlockType>;\n\t}, [blockTypes, selectedBlockTypesSlugs]);\n\n\tconst filteredData = useMemo(() => {\n\t\treturn blockTypes.filter((blockType) =>\n\t\t\tblockType.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [blockTypes, deferredSearch]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedBlockTypesSlugs.length > 0}>\n\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t{selectedBlockTypesSlugs.length > 0\n\t\t\t\t\t\t? selectedBlockTypes.map((blockType) => (\n\t\t\t\t\t\t\t\t<TagBadge\n\t\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\t\ttag={blockType.name}\n\t\t\t\t\t\t\t\t\tonRemove={() => onRemoveBlockTypeSlug(blockType.slug)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t: \"Select blocks\"}\n\t\t\t\t</div>\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search for a block type...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No block type found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredData.map((blockType) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\tselected={selectedBlockTypesSlugs.includes(blockType.slug)}\n\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\tonToggleBlockTypeSlug(value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={blockType.slug}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{blockType.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import type { OnChangeFn, RowSelectionState } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { pluralize } from \"@/utils\";\n\nexport type BlocksRowCountProps = {\n\tcount: number;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlocksRowCount = ({\n\tcount,\n\trowSelection,\n\tsetRowSelection,\n}: BlocksRowCountProps) => {\n\tconst [deleteConfirmationDialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\n\n\tconst selectedBlockIds = useMemo(\n\t\t() => Object.keys(rowSelection),\n\t\t[rowSelection],\n\t);\n\n\t// If has selected rows\n\tif (selectedBlockIds.length > 0)\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{selectedBlockIds.length} selected\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Delete rows\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\thandleConfirmDelete(selectedBlockIds, {\n\t\t\t\t\t\t\t\tonSuccess: () => setRowSelection({}),\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\t<Icon id=\"Trash2\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t</>\n\t\t);\n\n\treturn (\n\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t{count} {pluralize(count, \"Block\")}\n\t\t</Typography>\n\t);\n};\n","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 BlocksEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Box\" />\n\t\t<EmptyStateTitle>Add a block to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tBlocks securely store credentials and configuration to easily manage\n\t\t\tconnections to external systems.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t<Button>\n\t\t\t\t\tAdd Block <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=\"blocks-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport type { PaginationState, RowSelectionState } from \"@tanstack/react-table\";\nimport { useState } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { Breadcrumb, BreadcrumbItem } from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { BlockDocumentsDataTable } from \"./block-document-data-table\";\nimport { BlockTypesMultiSelect } from \"./block-types-multi-select\";\nimport { BlocksRowCount } from \"./blocks-row-count\";\nimport { BlocksEmptyState } from \"./empty-state\";\n\ntype BlocksPageProps = {\n\tallCount: number;\n\tblockDocuments: Array<BlockDocument> | undefined;\n\tonSearch: (value?: string) => void;\n\tsearch: string;\n\tblockTypeSlugsFilter: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeIds: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeIds: string) => void;\n\tpagination: PaginationState;\n\tonPaginationChange: (paginationState: PaginationState) => void;\n};\n\nexport const BlocksPage = ({\n\tallCount,\n\tblockDocuments = [],\n\tonSearch,\n\tsearch,\n\tblockTypeSlugsFilter,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n\tpagination,\n\tonPaginationChange,\n}: BlocksPageProps) => {\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tBlocks\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</Breadcrumb>\n\t\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t\t</Link>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t{allCount === 0 ? (\n\t\t\t\t<BlocksEmptyState />\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<BlocksRowCount\n\t\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\t\tcount={allCount}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<BlockTypesMultiSelect\n\t\t\t\t\t\t\t\tselectedBlockTypesSlugs={blockTypeSlugsFilter}\n\t\t\t\t\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\t\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\t\taria-label=\"search blocks\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search blocks\"\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onSearch(e.target.value)}\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</div>\n\t\t\t\t\t<BlockDocumentsDataTable\n\t\t\t\t\t\tblockDocuments={blockDocuments}\n\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\tblockDocumentsCount={allCount}\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type { PaginationState } from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype BlockDocumentsFilter,\n\tbuildCountAllBlockDocumentsQuery,\n\tbuildCountFilterBlockDocumentsQuery,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport { BlocksPage } from \"@/components/blocks/blocks-page\";\n\nconst searchParams = z.object({\n\tblockName: z.string().optional(),\n\tblockTypes: z.array(z.string()).optional(),\n\tpage: z.number().int().positive().optional().default(1).catch(1),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n});\n\nexport const Route = createFileRoute(\"/blocks/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloaderDeps: ({ search: { blockName, blockTypes, page, limit } }) => ({\n\t\tblockName,\n\t\tblockTypes,\n\t\tpage,\n\t\tlimit,\n\t}),\n\tloader: ({ deps, context: { queryClient } }) => {\n\t\t// ----- Critical data\n\t\tconst filter: BlockDocumentsFilter = {\n\t\t\tblock_types: { slug: { any_: deps.blockTypes } },\n\t\t\tblock_documents: {\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t\toperator: \"or_\",\n\t\t\t\tname: { like_: deps.blockName },\n\t\t\t},\n\t\t\tlimit: deps.limit,\n\t\t\toffset: deps.page,\n\t\t\tinclude_secrets: false,\n\t\t\tsort: \"NAME_ASC\",\n\t\t};\n\t\treturn Promise.all([\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockTypesQuery()),\n\t\t\t// All count query\n\t\t\tqueryClient.ensureQueryData(buildCountAllBlockDocumentsQuery()),\n\t\t\t// Filtered block document\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockDocumentsQuery(filter)),\n\t\t\t// Filtered count query\n\t\t\tqueryClient.ensureQueryData(buildCountFilterBlockDocumentsQuery(filter)),\n\t\t]);\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst [search, onSearch] = useSearch();\n\tconst [blockTypeSlugs, onSetBlockTypeSlugs] = useFilterByBlockTypes();\n\tconst [pagination, onPaginationChange] = usePagination();\n\n\tconst { data: allBlockDocumentsCount } = useSuspenseQuery(\n\t\tbuildCountAllBlockDocumentsQuery(),\n\t);\n\n\tconst { data: blockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery({\n\t\t\tsort: \"NAME_ASC\",\n\t\t\tinclude_secrets: false,\n\t\t\tblock_documents: {\n\t\t\t\tname: { like_: search },\n\t\t\t\toperator: \"and_\",\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t},\n\t\t\tblock_types: {\n\t\t\t\tslug: {\n\t\t\t\t\tany_: blockTypeSlugs.length > 0 ? blockTypeSlugs : undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\toffset: pagination.pageIndex * pagination.pageSize,\n\t\t\tlimit: pagination.pageSize,\n\t\t}),\n\t);\n\n\tconst handleRemoveBlockType = (id: string) => {\n\t\tconst newValue = blockTypeSlugs.filter((blockId) => blockId !== id);\n\t\tonSetBlockTypeSlugs(newValue);\n\t};\n\n\tconst handleToggleBlockType = (id: string) => {\n\t\t// Remove block id if its in the list\n\t\tif (blockTypeSlugs.includes(id)) {\n\t\t\treturn handleRemoveBlockType(id);\n\t\t}\n\t\t// Else add it to the list\n\t\tonSetBlockTypeSlugs([...blockTypeSlugs, id]);\n\t};\n\n\treturn (\n\t\t<BlocksPage\n\t\t\tallCount={allBlockDocumentsCount}\n\t\t\tblockDocuments={blockDocuments}\n\t\t\tonSearch={onSearch}\n\t\t\tsearch={search}\n\t\t\tblockTypeSlugsFilter={blockTypeSlugs}\n\t\t\tonRemoveBlockTypeSlug={handleRemoveBlockType}\n\t\t\tonToggleBlockTypeSlug={handleToggleBlockType}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t/>\n\t);\n}\n\nfunction useSearch() {\n\tconst { blockName } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSearch = useCallback(\n\t\t(value?: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockName: value,\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\tconst search = useMemo(() => blockName ?? \"\", [blockName]);\n\treturn [search, onSearch] as const;\n}\n\nfunction useFilterByBlockTypes() {\n\tconst { blockTypes = [] } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSetBlockTypes = useCallback(\n\t\t(value?: Array<string>) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockTypes: value,\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 [blockTypes, onSetBlockTypes] as const;\n}\n\nfunction usePagination() {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// React Table uses 0-based pagination, so we need to subtract 1 from the page number\n\tconst pageIndex = (search.page ?? 1) - 1;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\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\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"],"names":["BlockDocumentCell","blockDocument","id","name","block_type","block_type_name","jsxs","jsx","BlockTypeLogo","Link","Typography","columnHelper","createColumnHelper","createColumns","onDelete","table","checkedState","Checkbox","value","row","props","cell","BlockDocumentActionMenu","BlockDocumentsDataTable","blockDocuments","blockDocumentsCount","onPaginationChange","pagination","rowSelection","setRowSelection","dialogState","handleConfirmDelete","useDeleteBlockDocumentConfirmationDialog","handlePaginationChange","useCallback","updater","newPagination","useReactTable","getCoreRowModel","Fragment","DataTable","DeleteConfirmationDialog","BlockTypesMultiSelect","selectedBlockTypesSlugs","onToggleBlockTypeSlug","onRemoveBlockTypeSlug","Suspense","BlockTypesMultiSelectImplementation","search","setSearch","useState","deferredSearch","useDeferredValue","blockTypes","useSuspenseQuery","buildListFilterBlockTypesQuery","selectedBlockTypes","useMemo","blockTypeSlug","blockType","filteredData","Combobox","ComboboxTrigger","TagBadge","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","ComboboxCommandGroup","ComboboxCommandItem","BlocksRowCount","count","deleteConfirmationDialogState","selectedBlockIds","Button","Icon","pluralize","BlocksEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","BlocksPage","allCount","onSearch","blockTypeSlugsFilter","Breadcrumb","BreadcrumbItem","SearchInput","e","RouteComponent","useSearch","blockTypeSlugs","onSetBlockTypeSlugs","useFilterByBlockTypes","usePagination","data","allBlockDocumentsCount","buildCountAllBlockDocumentsQuery","useQuery","buildListFilterBlockDocumentsQuery","sort","include_secrets","block_documents","like_","operator","is_anonymous","eq_","block_types","slug","any_","length","undefined","offset","pageIndex","pageSize","limit","handleRemoveBlockType","newValue","filter","blockId","handleToggleBlockType","includes","blockName","Route","navigate","useNavigate","to","prev","replace","onSetBlockTypes","page"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-CYjH7t93.js","sources":["../../src/components/blocks/block-document-data-table/block-document-cell.tsx","../../src/components/blocks/block-document-data-table/block-document-data-table.tsx","../../src/components/blocks/block-types-multi-select/block-types-multi-select.tsx","../../src/components/blocks/blocks-row-count/blocks-row-count.tsx","../../src/components/blocks/empty-state/empty-state.tsx","../../src/components/blocks/blocks-page.tsx","../../src/routes/blocks/index.tsx?tsr-split=component"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockTypeLogo } from \"@/components/block-type-logo/block-type-logo\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype BlockDocumentCellProps = {\n\tblockDocument: BlockDocument;\n};\n\nexport const BlockDocumentCell = ({\n\tblockDocument,\n}: BlockDocumentCellProps) => {\n\tconst { id, name, block_type, block_type_name } = blockDocument;\n\n\treturn (\n\t\t<div className=\"flex gap-4 items-center\">\n\t\t\t{block_type && block_type_name && (\n\t\t\t\t<BlockTypeLogo\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tlogoUrl={block_type.logo_url}\n\t\t\t\t\talt={`${block_type_name} logo`}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t{name && (\n\t\t\t\t\t<Link to=\"/blocks/block/$id\" params={{ id }}>\n\t\t\t\t\t\t<Typography className=\"font-semibold\">{name}</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t\t{block_type_name && blockDocument.block_type?.slug && (\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/blocks/catalog/$slug\"\n\t\t\t\t\t\tparams={{ slug: blockDocument.block_type.slug }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{block_type_name}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { CheckedState } from \"@radix-ui/react-checkbox\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockDocumentActionMenu } from \"@/components/blocks/block-document-action-menu\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { BlockDocumentCell } from \"./block-document-cell\";\n\nconst columnHelper = createColumnHelper<BlockDocument>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (blockDocument: BlockDocument) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tsize: 20,\n\t\tid: \"select\",\n\t\theader: ({ table }) => {\n\t\t\tlet checkedState: CheckedState = false;\n\t\t\tif (table.getIsAllRowsSelected()) {\n\t\t\t\tcheckedState = true;\n\t\t\t} else if (table.getIsSomePageRowsSelected()) {\n\t\t\t\tcheckedState = \"indeterminate\";\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={checkedState}\n\t\t\t\t\tonCheckedChange={(value) =>\n\t\t\t\t\t\ttable.toggleAllPageRowsSelected(Boolean(value))\n\t\t\t\t\t}\n\t\t\t\t\taria-label=\"Select all\"\n\t\t\t\t/>\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(Boolean(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}),\n\tcolumnHelper.display({\n\t\tid: \"block\",\n\t\theader: \"Block\",\n\t\tcell: ({ row }) => <BlockDocumentCell blockDocument={row.original} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => {\n\t\t\tconst cell = props.row.original;\n\t\t\treturn (\n\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t<BlockDocumentActionMenu\n\t\t\t\t\t\tblockDocument={cell}\n\t\t\t\t\t\tonDelete={() => onDelete(cell)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t}),\n];\n\nexport type BlockDocumentsDataTableProps = {\n\tblockDocumentsCount: number;\n\tblockDocuments: Array<BlockDocument>;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlockDocumentsDataTable = ({\n\tblockDocuments,\n\tblockDocumentsCount,\n\tonPaginationChange,\n\tpagination,\n\trowSelection,\n\tsetRowSelection,\n}: BlockDocumentsDataTableProps) => {\n\tconst [dialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\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: createColumns({ onDelete: handleConfirmDelete }),\n\t\tdata: blockDocuments,\n\t\tdefaultColumn: { maxSize: 300 },\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: blockDocumentsCount,\n\t\tgetRowId: (row) => row.id,\n\t\tonRowSelectionChange: setRowSelection,\n\t\tstate: { pagination, rowSelection },\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<DataTable table={table} />\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n","\"use client\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\ttype BlockType,\n\tbuildListFilterBlockTypesQuery,\n} from \"@/api/block-types\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\n\ntype BlockTypesMultiSelectProps = {\n\tselectedBlockTypesSlugs: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeSlug: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeSlug: string) => void;\n};\n\nexport function BlockTypesMultiSelect({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<BlockTypesMultiSelectImplementation\n\t\t\t\tselectedBlockTypesSlugs={selectedBlockTypesSlugs}\n\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n}\n\nfunction BlockTypesMultiSelectImplementation({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: blockTypes } = useSuspenseQuery(\n\t\tbuildListFilterBlockTypesQuery(),\n\t);\n\n\tconst selectedBlockTypes = useMemo(() => {\n\t\treturn selectedBlockTypesSlugs\n\t\t\t.map((blockTypeSlug) =>\n\t\t\t\tblockTypes.find((blockType) => blockType.slug === blockTypeSlug),\n\t\t\t)\n\t\t\t.filter(Boolean) as Array<BlockType>;\n\t}, [blockTypes, selectedBlockTypesSlugs]);\n\n\tconst filteredData = useMemo(() => {\n\t\treturn blockTypes.filter((blockType) =>\n\t\t\tblockType.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [blockTypes, deferredSearch]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedBlockTypesSlugs.length > 0}>\n\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t{selectedBlockTypesSlugs.length > 0\n\t\t\t\t\t\t? selectedBlockTypes.map((blockType) => (\n\t\t\t\t\t\t\t\t<TagBadge\n\t\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\t\ttag={blockType.name}\n\t\t\t\t\t\t\t\t\tonRemove={() => onRemoveBlockTypeSlug(blockType.slug)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t: \"Select blocks\"}\n\t\t\t\t</div>\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search for a block type...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No block type found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredData.map((blockType) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\tselected={selectedBlockTypesSlugs.includes(blockType.slug)}\n\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\tonToggleBlockTypeSlug(value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={blockType.slug}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{blockType.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import type { OnChangeFn, RowSelectionState } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { pluralize } from \"@/utils\";\n\nexport type BlocksRowCountProps = {\n\tcount: number;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlocksRowCount = ({\n\tcount,\n\trowSelection,\n\tsetRowSelection,\n}: BlocksRowCountProps) => {\n\tconst [deleteConfirmationDialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\n\n\tconst selectedBlockIds = useMemo(\n\t\t() => Object.keys(rowSelection),\n\t\t[rowSelection],\n\t);\n\n\t// If has selected rows\n\tif (selectedBlockIds.length > 0)\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{selectedBlockIds.length} selected\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Delete rows\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\thandleConfirmDelete(selectedBlockIds, {\n\t\t\t\t\t\t\t\tonSuccess: () => setRowSelection({}),\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\t<Icon id=\"Trash2\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t</>\n\t\t);\n\n\treturn (\n\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t{count} {pluralize(count, \"Block\")}\n\t\t</Typography>\n\t);\n};\n","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 BlocksEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Box\" />\n\t\t<EmptyStateTitle>Add a block to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tBlocks securely store credentials and configuration to easily manage\n\t\t\tconnections to external systems.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t<Button>\n\t\t\t\t\tAdd Block <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=\"blocks-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport type { PaginationState, RowSelectionState } from \"@tanstack/react-table\";\nimport { useState } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { Breadcrumb, BreadcrumbItem } from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { BlockDocumentsDataTable } from \"./block-document-data-table\";\nimport { BlockTypesMultiSelect } from \"./block-types-multi-select\";\nimport { BlocksRowCount } from \"./blocks-row-count\";\nimport { BlocksEmptyState } from \"./empty-state\";\n\ntype BlocksPageProps = {\n\tallCount: number;\n\tblockDocuments: Array<BlockDocument> | undefined;\n\tonSearch: (value?: string) => void;\n\tsearch: string;\n\tblockTypeSlugsFilter: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeIds: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeIds: string) => void;\n\tpagination: PaginationState;\n\tonPaginationChange: (paginationState: PaginationState) => void;\n};\n\nexport const BlocksPage = ({\n\tallCount,\n\tblockDocuments = [],\n\tonSearch,\n\tsearch,\n\tblockTypeSlugsFilter,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n\tpagination,\n\tonPaginationChange,\n}: BlocksPageProps) => {\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tBlocks\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</Breadcrumb>\n\t\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t\t</Link>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t{allCount === 0 ? (\n\t\t\t\t<BlocksEmptyState />\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<BlocksRowCount\n\t\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\t\tcount={allCount}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<BlockTypesMultiSelect\n\t\t\t\t\t\t\t\tselectedBlockTypesSlugs={blockTypeSlugsFilter}\n\t\t\t\t\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\t\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\t\taria-label=\"search blocks\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search blocks\"\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onSearch(e.target.value)}\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</div>\n\t\t\t\t\t<BlockDocumentsDataTable\n\t\t\t\t\t\tblockDocuments={blockDocuments}\n\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\tblockDocumentsCount={allCount}\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type { PaginationState } from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype BlockDocumentsFilter,\n\tbuildCountAllBlockDocumentsQuery,\n\tbuildCountFilterBlockDocumentsQuery,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport { BlocksPage } from \"@/components/blocks/blocks-page\";\n\nconst searchParams = z.object({\n\tblockName: z.string().optional(),\n\tblockTypes: z.array(z.string()).optional(),\n\tpage: z.number().int().positive().optional().default(1).catch(1),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n});\n\nexport const Route = createFileRoute(\"/blocks/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloaderDeps: ({ search: { blockName, blockTypes, page, limit } }) => ({\n\t\tblockName,\n\t\tblockTypes,\n\t\tpage,\n\t\tlimit,\n\t}),\n\tloader: ({ deps, context: { queryClient } }) => {\n\t\t// ----- Critical data\n\t\tconst filter: BlockDocumentsFilter = {\n\t\t\tblock_types: { slug: { any_: deps.blockTypes } },\n\t\t\tblock_documents: {\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t\toperator: \"or_\",\n\t\t\t\tname: { like_: deps.blockName },\n\t\t\t},\n\t\t\tlimit: deps.limit,\n\t\t\toffset: deps.page,\n\t\t\tinclude_secrets: false,\n\t\t\tsort: \"NAME_ASC\",\n\t\t};\n\t\treturn Promise.all([\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockTypesQuery()),\n\t\t\t// All count query\n\t\t\tqueryClient.ensureQueryData(buildCountAllBlockDocumentsQuery()),\n\t\t\t// Filtered block document\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockDocumentsQuery(filter)),\n\t\t\t// Filtered count query\n\t\t\tqueryClient.ensureQueryData(buildCountFilterBlockDocumentsQuery(filter)),\n\t\t]);\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst [search, onSearch] = useSearch();\n\tconst [blockTypeSlugs, onSetBlockTypeSlugs] = useFilterByBlockTypes();\n\tconst [pagination, onPaginationChange] = usePagination();\n\n\tconst { data: allBlockDocumentsCount } = useSuspenseQuery(\n\t\tbuildCountAllBlockDocumentsQuery(),\n\t);\n\n\tconst { data: blockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery({\n\t\t\tsort: \"NAME_ASC\",\n\t\t\tinclude_secrets: false,\n\t\t\tblock_documents: {\n\t\t\t\tname: { like_: search },\n\t\t\t\toperator: \"and_\",\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t},\n\t\t\tblock_types: {\n\t\t\t\tslug: {\n\t\t\t\t\tany_: blockTypeSlugs.length > 0 ? blockTypeSlugs : undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\toffset: pagination.pageIndex * pagination.pageSize,\n\t\t\tlimit: pagination.pageSize,\n\t\t}),\n\t);\n\n\tconst handleRemoveBlockType = (id: string) => {\n\t\tconst newValue = blockTypeSlugs.filter((blockId) => blockId !== id);\n\t\tonSetBlockTypeSlugs(newValue);\n\t};\n\n\tconst handleToggleBlockType = (id: string) => {\n\t\t// Remove block id if its in the list\n\t\tif (blockTypeSlugs.includes(id)) {\n\t\t\treturn handleRemoveBlockType(id);\n\t\t}\n\t\t// Else add it to the list\n\t\tonSetBlockTypeSlugs([...blockTypeSlugs, id]);\n\t};\n\n\treturn (\n\t\t<BlocksPage\n\t\t\tallCount={allBlockDocumentsCount}\n\t\t\tblockDocuments={blockDocuments}\n\t\t\tonSearch={onSearch}\n\t\t\tsearch={search}\n\t\t\tblockTypeSlugsFilter={blockTypeSlugs}\n\t\t\tonRemoveBlockTypeSlug={handleRemoveBlockType}\n\t\t\tonToggleBlockTypeSlug={handleToggleBlockType}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t/>\n\t);\n}\n\nfunction useSearch() {\n\tconst { blockName } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSearch = useCallback(\n\t\t(value?: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockName: value,\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\tconst search = useMemo(() => blockName ?? \"\", [blockName]);\n\treturn [search, onSearch] as const;\n}\n\nfunction useFilterByBlockTypes() {\n\tconst { blockTypes = [] } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSetBlockTypes = useCallback(\n\t\t(value?: Array<string>) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockTypes: value,\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 [blockTypes, onSetBlockTypes] as const;\n}\n\nfunction usePagination() {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// React Table uses 0-based pagination, so we need to subtract 1 from the page number\n\tconst pageIndex = (search.page ?? 1) - 1;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\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\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"],"names":["BlockDocumentCell","blockDocument","id","name","block_type","block_type_name","jsxs","jsx","BlockTypeLogo","Link","Typography","columnHelper","createColumnHelper","createColumns","onDelete","table","checkedState","Checkbox","value","row","props","cell","BlockDocumentActionMenu","BlockDocumentsDataTable","blockDocuments","blockDocumentsCount","onPaginationChange","pagination","rowSelection","setRowSelection","dialogState","handleConfirmDelete","useDeleteBlockDocumentConfirmationDialog","handlePaginationChange","useCallback","updater","newPagination","useReactTable","getCoreRowModel","Fragment","DataTable","DeleteConfirmationDialog","BlockTypesMultiSelect","selectedBlockTypesSlugs","onToggleBlockTypeSlug","onRemoveBlockTypeSlug","Suspense","BlockTypesMultiSelectImplementation","search","setSearch","useState","deferredSearch","useDeferredValue","blockTypes","useSuspenseQuery","buildListFilterBlockTypesQuery","selectedBlockTypes","useMemo","blockTypeSlug","blockType","filteredData","Combobox","ComboboxTrigger","TagBadge","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","ComboboxCommandGroup","ComboboxCommandItem","BlocksRowCount","count","deleteConfirmationDialogState","selectedBlockIds","Button","Icon","pluralize","BlocksEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","BlocksPage","allCount","onSearch","blockTypeSlugsFilter","Breadcrumb","BreadcrumbItem","SearchInput","e","RouteComponent","useSearch","blockTypeSlugs","onSetBlockTypeSlugs","useFilterByBlockTypes","usePagination","data","allBlockDocumentsCount","buildCountAllBlockDocumentsQuery","useQuery","buildListFilterBlockDocumentsQuery","sort","include_secrets","block_documents","like_","operator","is_anonymous","eq_","block_types","slug","any_","length","undefined","offset","pageIndex","pageSize","limit","handleRemoveBlockType","newValue","filter","blockId","handleToggleBlockType","includes","blockName","Route","navigate","useNavigate","to","prev","replace","onSetBlockTypes","page"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as c,j as e,E as h}from"./vendor-tanstack-BcZfOOfy.js";import{al as j,N as b,O as v,S,a as A,b as C,c as N,e as T,I as x,B as E,g as k,h as I,D as y,E as D,t as M,v as V,w as L,x as w,au as B,bt as p,bu as R,bv as _}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{r as c,j as e,E as h}from"./vendor-tanstack-BcZfOOfy.js";import{al as j,N as b,O as v,S,a as A,b as C,c as N,e as T,I as x,B as E,g as k,h as I,D as y,E as D,t as M,v as V,w as L,x as w,au as B,bt as p,bu as R,bv as _}from"./index-_0OOjqn5.js";import{A as G}from"./artifact-card-9Cw_dMVb.js";import{T as Q,a as f}from"./toggle-group-Cf-ZSSDP.js";import{u as F}from"./use-debounce-callback-CSs1BjLI.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";import"./lazy-markdown-CKcd9ksG.js";const O=[{value:"all",label:"All Types"},{value:"markdown",label:"Markdown"},{value:"progress",label:"Progress"},{value:"image",label:"Image"},{value:"table",label:"Table"}],P=({filters:a,onFilterChange:s,totalCount:r,displayMode:o,setDisplayMode:i})=>{const l=c.useCallback(t=>{s([...a.filter(u=>u.id!=="name"),{id:"name",label:"Name",value:t}])},[a,s]),d=c.useCallback(t=>{s([...a.filter(u=>u.id!=="type"),{id:"type",label:"Type",value:t}])},[a,s]),m=c.useMemo(()=>a.find(t=>t.id==="type")?.value,[a]),n=c.useMemo(()=>a.find(t=>t.id==="name")?.value,[a]);return e.jsxs("div",{"data-testid":"artifact-filter",className:"flex justify-between items-center",children:[e.jsx("div",{children:e.jsxs(j,{variant:"body",className:"text-sm text-muted-foreground",children:[r," ",b(r,"artifact")]})}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx(v,{"data-testid":"search-input",defaultValue:n,placeholder:"Search artifacts",onChange:t=>l(t.target.value)}),e.jsxs("div",{className:"flex gap-4",children:[e.jsxs(S,{"data-testid":"type-select",value:m,onValueChange:d,children:[e.jsx(A,{"aria-label":"Artifact type",children:e.jsx(C,{placeholder:"Type"})}),e.jsx(N,{children:O.map(({value:t,label:u})=>e.jsx(T,{value:t,children:u},t))})]}),e.jsx("div",{children:e.jsxs(Q,{type:"single",defaultValue:o,onValueChange:t=>i(t),children:[e.jsx(f,{"data-testid":"grid-layout",value:"grid",children:e.jsx(x,{id:"LayoutGrid"})}),e.jsx(f,{"data-testid":"list-layout",value:"list",children:e.jsx(x,{id:"AlignJustify"})})]})})]})]})]})},q=()=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(E,{children:e.jsx(k,{children:e.jsx(I,{className:"text-xl font-semibold",children:"Artifacts"})})})}),e.jsx(y,{id:"artifacts-guide",label:"Documentation"})]}),z=()=>e.jsxs(D,{children:[e.jsx("div",{className:"flex items-center gap-3",children:e.jsx(M,{id:"Image"})}),e.jsx(V,{children:"Create an artifact to get started"}),e.jsx(L,{children:"Artifacts are byproducts of your runs; they can be anything from a markdown string to a table."}),e.jsx(w,{children:e.jsx(y,{id:"artifacts-guide"})})]}),H=({filters:a,onFilterChange:s,artifactsList:r,artifactsCount:o})=>{const[i,l]=B("artifacts-grid-style","grid"),d=c.useMemo(()=>i==="grid"?"grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4":"grid-cols-1",[i]),m=c.useMemo(()=>r.reduce((n,t)=>(n.find(u=>u.key===t.key)||n.push(t),n),[]),[r]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(q,{}),e.jsx(P,{filters:a,onFilterChange:s,totalCount:o,setDisplayMode:l,displayMode:i}),m.length===0?e.jsx(z,{}):e.jsx("div",{className:d,children:m.map(n=>e.jsx(G,{artifact:n},n.id))})]})},g=a=>({artifacts:{operator:"and_",type:{any_:a?.type&&a?.type!=="all"?[a.type]:void 0},key:{like_:a?.name??""}},sort:"CREATED_DESC",offset:0}),J=()=>{const a=p.useSearch(),s=p.useNavigate(),r=c.useMemo(()=>[{id:"type",label:"Type",value:a.type??"all"},{id:"name",label:"Name",value:a.name}],[a.type,a.name]),o=F(c.useCallback(i=>{i&&s({to:".",search:()=>i.filter(l=>l.value).reduce((l,d)=>(d.value&&(l[d.id]=d.value),l),{}),replace:!0})},[s]),400);return{filters:r,onFilterChange:o}};function ie(){const a=p.useSearch(),{filters:s,onFilterChange:r}=J(),[{data:o},{data:i}]=h({queries:[R(g(a)),_(g(a))]});return e.jsx(H,{filters:s,onFilterChange:r,artifactsCount:o,artifactsList:i})}export{ie as component};
|
|
2
|
+
//# sourceMappingURL=index-Cj5ihRiw.js.map
|