prefect 3.6.14.dev6__py3-none-any.whl → 3.6.15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/_build_info.py +3 -3
- prefect/events/clients.py +40 -21
- prefect/server/api/concurrency_limits_v2.py +5 -3
- prefect/server/ui-v2/assets/{artifact-card-fXxwNG3f.js → artifact-card-BBzQR-Cj.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-fXxwNG3f.js.map → artifact-card-BBzQR-Cj.js.map} +1 -1
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js +2 -0
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js.map +1 -0
- prefect/server/ui-v2/assets/{automation-wizard-bDZICLpV.js → automation-wizard-EYSfXlQ7.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-bDZICLpV.js.map → automation-wizard-EYSfXlQ7.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation._id-CmDL_Eta.js → automation._id-Dn7jABys.js} +2 -2
- prefect/server/ui-v2/assets/{automation._id-CmDL_Eta.js.map → automation._id-Dn7jABys.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-DY7_SAuk.js → automation_._id.edit-COrqswD3.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-DY7_SAuk.js.map → automation_._id.edit-COrqswD3.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-CgxOgR53.js → automations-header-DN_dmMXW.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-CgxOgR53.js.map → automations-header-DN_dmMXW.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-DilLn1Ul.js → base-job-template-form-section-De2ACYbw.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-DilLn1Ul.js.map → base-job-template-form-section-De2ACYbw.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-Cx4npO8Y.js → block-type-details-Cklc7TkK.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-Cx4npO8Y.js.map → block-type-details-Cklc7TkK.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js +2 -0
- prefect/server/ui-v2/assets/{block-type-logo-FrtMLMYr.js.map → block-type-logo-Cbpfxded.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-CWi9g5N3.js → block._id-tuz1Bcj2.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-CWi9g5N3.js.map → block._id-tuz1Bcj2.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-wf0QVPUL.js → block_._id.edit-CFEYhF5R.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-wf0QVPUL.js.map → block_._id.edit-CFEYhF5R.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-Iv1gLDUd.js → catalog-CCPRo7nY.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-Iv1gLDUd.js.map → catalog-CCPRo7nY.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug-DEHFXZzp.js → catalog_._slug-Bl2J2oI3.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug-DEHFXZzp.js.map → catalog_._slug-Bl2J2oI3.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-C-vFPUOy.js → catalog_._slug_.create-9UD_SxDN.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-C-vFPUOy.js.map → catalog_._slug_.create-9UD_SxDN.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-BlEqjqQu.js → collapsible-BVQTBG_U.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-BlEqjqQu.js.map → collapsible-BVQTBG_U.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-VfgyonlO.js → concurrency-limit._id-CsgRxA0a.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-VfgyonlO.js.map → concurrency-limit._id-CsgRxA0a.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-CC32TiFK.js → create-BycfZHGQ.js} +2 -2
- prefect/server/ui-v2/assets/{create-CC32TiFK.js.map → create-BycfZHGQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-fSiDZ1kD.js → create-D--LHaji.js} +2 -2
- prefect/server/ui-v2/assets/{create-fSiDZ1kD.js.map → create-D--LHaji.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-B2NqBPUR.js → data-table-rlbkLcrY.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-B2NqBPUR.js.map → data-table-rlbkLcrY.js.map} +1 -1
- prefect/server/ui-v2/assets/delete-confirmation-dialog-DHkm2p8m.js +2 -0
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-jlBI67Pk.js.map → delete-confirmation-dialog-DHkm2p8m.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-C203ndcC.js → deployment-action-header-D5GOooPm.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-C203ndcC.js.map → deployment-action-header-D5GOooPm.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-DB4i73UE.js → deployment-form-wfg6HeAJ.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-DB4i73UE.js.map → deployment-form-wfg6HeAJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-UZYTtmnK.js → deployment-links-6iugOgDh.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-UZYTtmnK.js.map → deployment-links-6iugOgDh.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-Drmf70gG.js → deployment._id-Ci9zge5n.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-Drmf70gG.js.map → deployment._id-Ci9zge5n.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-Bk44iuUn.js → deployment._id-whsGcHdu.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-Bk44iuUn.js.map → deployment._id-whsGcHdu.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-D9ZWkh8H.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-aUHtHuNO.js.map → deployment_._id.duplicate-D9ZWkh8H.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CS7sObzC.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-CPRKkA-W.js.map → deployment_._id.edit-CS7sObzC.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-C8EGDJeT.js → deployment_._id.run-g7SZuDFi.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-C8EGDJeT.js.map → deployment_._id.run-g7SZuDFi.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-CT6uZu-V.js → dropdown-menu-0atiOSFo.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-CT6uZu-V.js.map → dropdown-menu-0atiOSFo.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-DmCKu0PD.js → event-resource-display-DHiAb1Up.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-DmCKu0PD.js.map → event-resource-display-DHiAb1Up.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DqO9viGu.js → event._eventDate._eventId-D7Twzb22.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DqO9viGu.js.map → event._eventDate._eventId-D7Twzb22.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-BhzuSJLm.js +2 -0
- prefect/server/ui-v2/assets/{flow-run-graph-CIvkp1kl.js.map → flow-run-graph-BhzuSJLm.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-DyUEsBSd.js → flow-run._id-CqpH6bvx.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-DyUEsBSd.js.map → flow-run._id-CqpH6bvx.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-run._id-xahYswsG.js → flow-run._id-lIIQBD7H.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-xahYswsG.js.map → flow-run._id-lIIQBD7H.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-runs-pagination--FfnMca3.js → flow-runs-pagination-BATUweRV.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination--FfnMca3.js.map → flow-runs-pagination-BATUweRV.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow._id-C_ho4p55.js → flow._id-BdQGWPKP.js} +2 -2
- prefect/server/ui-v2/assets/{flow._id-C_ho4p55.js.map → flow._id-BdQGWPKP.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-CxD6-5Qf.js → form-DLrbC7rV.js} +2 -2
- prefect/server/ui-v2/assets/{form-CxD6-5Qf.js.map → form-DLrbC7rV.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-CYjjmMrB.js → header-BTAWyeXv.js} +2 -2
- prefect/server/ui-v2/assets/{header-CYjjmMrB.js.map → header-BTAWyeXv.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-Cjet3B6Z.js → header-ChFAx5uR.js} +2 -2
- prefect/server/ui-v2/assets/{header-Cjet3B6Z.js.map → header-ChFAx5uR.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-iN9gVtk7.js → header-CyQqOj1w.js} +2 -2
- prefect/server/ui-v2/assets/{header-iN9gVtk7.js.map → header-CyQqOj1w.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-C2ayqOiQ.js → index-7i4X9TeK.js} +2 -2
- prefect/server/ui-v2/assets/{index-C2ayqOiQ.js.map → index-7i4X9TeK.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-ltOkPb3X.js → index-BaWDC4da.js} +2 -2
- prefect/server/ui-v2/assets/{index-ltOkPb3X.js.map → index-BaWDC4da.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-d9_i_klL.js → index-BkiGTHwU.js} +2 -2
- prefect/server/ui-v2/assets/{index-d9_i_klL.js.map → index-BkiGTHwU.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-B5eJQPOP.js → index-Btb_-PDp.js} +2 -2
- prefect/server/ui-v2/assets/{index-B5eJQPOP.js.map → index-Btb_-PDp.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Cwd5Gvad.js → index-BwCLKpNb.js} +2 -2
- prefect/server/ui-v2/assets/{index-Cwd5Gvad.js.map → index-BwCLKpNb.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CT2kL3dS.js → index-CHf6xi9j.js} +2 -2
- prefect/server/ui-v2/assets/{index-CT2kL3dS.js.map → index-CHf6xi9j.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DQOPH4Rq.js → index-CKGj5lSu.js} +2 -2
- prefect/server/ui-v2/assets/{index-DQOPH4Rq.js.map → index-CKGj5lSu.js.map} +1 -1
- prefect/server/ui-v2/assets/index-COouj_0-.css +1 -0
- prefect/server/ui-v2/assets/{index-D0ANIqVp.js → index-CQnWiUE5.js} +2 -2
- prefect/server/ui-v2/assets/{index-D0ANIqVp.js.map → index-CQnWiUE5.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D4df3B9r.js → index-CiSFHkhI.js} +2 -2
- prefect/server/ui-v2/assets/{index-D4df3B9r.js.map → index-CiSFHkhI.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CSQa2wYx.js → index-CnlN-VC_.js} +2 -2
- prefect/server/ui-v2/assets/{index-CSQa2wYx.js.map → index-CnlN-VC_.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BfXKkd3I.js → index-CxUfZRkN.js} +2 -2
- prefect/server/ui-v2/assets/{index-BfXKkd3I.js.map → index-CxUfZRkN.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DI-aZXNg.js → index-D5RT-SAp.js} +2 -2
- prefect/server/ui-v2/assets/{index-DI-aZXNg.js.map → index-D5RT-SAp.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CTeNzxT9.js → index-DATPYZfT.js} +2 -2
- prefect/server/ui-v2/assets/{index-CTeNzxT9.js.map → index-DATPYZfT.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CfMaY6sy.js → index-DNh9ZBy4.js} +2 -2
- prefect/server/ui-v2/assets/{index-CfMaY6sy.js.map → index-DNh9ZBy4.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-C3A0XavU.js → index-DQGif3jm.js} +2 -2
- prefect/server/ui-v2/assets/{index-C3A0XavU.js.map → index-DQGif3jm.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BF3HB5BS.js → index-Eqdr6Ff7.js} +2 -2
- prefect/server/ui-v2/assets/{index-BF3HB5BS.js.map → index-Eqdr6Ff7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D8SbV2Tp.js → index-VH4TnZ4e.js} +2 -2
- prefect/server/ui-v2/assets/{index-D8SbV2Tp.js.map → index-VH4TnZ4e.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-0opjCZAR.js → index-kP_I5Qfd.js} +2 -2
- prefect/server/ui-v2/assets/{index-0opjCZAR.js.map → index-kP_I5Qfd.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D-yYhKPg.js → index-lyQav_XM.js} +2 -2
- prefect/server/ui-v2/assets/{index-D-yYhKPg.js.map → index-lyQav_XM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-nxDkMXcY.js → index-m48E4KcG.js} +13 -13
- prefect/server/ui-v2/assets/index-m48E4KcG.js.map +1 -0
- prefect/server/ui-v2/assets/{json-input-BGfZindW.js → json-input-Ba-BeBcw.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-BGfZindW.js.map → json-input-Ba-BeBcw.js.map} +1 -1
- prefect/server/ui-v2/assets/key-value-DkSKn6jE.js +2 -0
- prefect/server/ui-v2/assets/key-value-DkSKn6jE.js.map +1 -0
- prefect/server/ui-v2/assets/{key._key-mnO405kp.js → key._key-Cjx57ymg.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-mnO405kp.js.map → key._key-Cjx57ymg.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-CLclUkkd.js → lazy-markdown-Du2Xu3Yp.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-CLclUkkd.js.map → lazy-markdown-Du2Xu3Yp.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-ST_-h2GY.js → login-DxMF9Jvj.js} +2 -2
- prefect/server/ui-v2/assets/{login-ST_-h2GY.js.map → login-DxMF9Jvj.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-DemuemAs.js → markdown-input-DPi8zyRr.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-DemuemAs.js.map → markdown-input-DPi8zyRr.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-example-snippet-BUllaeTS.js → python-example-snippet-DfCFYPN_.js} +3 -3
- prefect/server/ui-v2/assets/{python-example-snippet-BUllaeTS.js.map → python-example-snippet-DfCFYPN_.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-DTpMdYLs.js → python-input-mr6GD840.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-DTpMdYLs.js.map → python-input-mr6GD840.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-CJhtPDwC.js → radio-group-Co3cN0Kv.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-CJhtPDwC.js.map → radio-group-Co3cN0Kv.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-D0wedcpP.js → route-error-state-DnBaNT2T.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-D0wedcpP.js.map → route-error-state-DnBaNT2T.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-Cx-6swYW.js → schema-form-CWDHSME9.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-Cx-6swYW.js.map → schema-form-CWDHSME9.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZkUje5U.js → schema-form-input-string-format-datetime-BSWlW_aQ.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZkUje5U.js.map → schema-form-input-string-format-datetime-BSWlW_aQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-nHtCkknH.js → settings-DU5y6tJE.js} +2 -2
- prefect/server/ui-v2/assets/{settings-nHtCkknH.js.map → settings-DU5y6tJE.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-QjOHFWPI.js → sort-filter-DpuWNkQo.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-QjOHFWPI.js.map → sort-filter-DpuWNkQo.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-Bx2Ol4j-.js → table-bBL6C0ZK.js} +2 -2
- prefect/server/ui-v2/assets/{table-Bx2Ol4j-.js.map → table-bBL6C0ZK.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-C7cxdTyV.js → tags-input-BLPMVWpZ.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-C7cxdTyV.js.map → tags-input-BLPMVWpZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG2F0Ufy.js → task-run-concurrency-limits-reset-dialog-S69sih55.js} +2 -2
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG2F0Ufy.js.map → task-run-concurrency-limits-reset-dialog-S69sih55.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-CapS5wad.js → task-run._id-B_tIDm4K.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-CapS5wad.js.map → task-run._id-B_tIDm4K.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-CevQxX-E.js → task-run._id-Dl3Azs8t.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-CevQxX-E.js.map → task-run._id-Dl3Azs8t.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-runs-pagination-Dbwa2yPe.js → task-runs-pagination-VdR-LO4r.js} +2 -2
- prefect/server/ui-v2/assets/{task-runs-pagination-Dbwa2yPe.js.map → task-runs-pagination-VdR-LO4r.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-vy4DM6KG.js → textarea-B3_TtPRi.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-vy4DM6KG.js.map → textarea-B3_TtPRi.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-DDUTUy-L.js → timezone-select-BuPYznge.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-DDUTUy-L.js.map → timezone-select-BuPYznge.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-Dx_fy9WJ.js → toggle-group-Cn07UIim.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-Dx_fy9WJ.js.map → toggle-group-Cn07UIim.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-ClQsotEa.js → use-delete-automation-confirmation-dialog-DpdsLH4t.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-ClQsotEa.js.map → use-delete-automation-confirmation-dialog-DpdsLH4t.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DM0Dy1PL.js → use-delete-block-document-confirmation-dialog-Cq5nGhzr.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DM0Dy1PL.js.map → use-delete-block-document-confirmation-dialog-Cq5nGhzr.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-UhMaQqzZ.js → use-flow-runs-selected-rows-DmQSWBTu.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-UhMaQqzZ.js.map → use-flow-runs-selected-rows-DmQSWBTu.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-P8C-ARMZ.js → use-get-artifacts-flow-task-runs-DTwcWiqW.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-P8C-ARMZ.js.map → use-get-artifacts-flow-task-runs-DTwcWiqW.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-DT0VEa9Z.js → use-quick-run-CPempwLh.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-DT0VEa9Z.js.map → use-quick-run-CPempwLh.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-state-favicon-DfEAuEQL.js → use-state-favicon-M09DmrNy.js} +2 -2
- prefect/server/ui-v2/assets/{use-state-favicon-DfEAuEQL.js.map → use-state-favicon-M09DmrNy.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-1OG0a_eo.js → use-stepper-CDucnvzp.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-1OG0a_eo.js.map → use-stepper-CDucnvzp.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-DabzLyXd.js → utilities-BRCNRcQl.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-DabzLyXd.js.map → utilities-BRCNRcQl.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-filter-CTTGgdIN.js → work-pool-filter-C2tpSS-w.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-CTTGgdIN.js.map → work-pool-filter-C2tpSS-w.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-B9KQxNdY.js → work-pool-queue-toggle-BQ9b-Wxy.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-B9KQxNdY.js.map → work-pool-queue-toggle-BQ9b-Wxy.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-CGqG95Pv.js → work-pool._workPoolName-C_LiL3SE.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-CGqG95Pv.js.map → work-pool._workPoolName-C_LiL3SE.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CcFrethu.js → work-pool_._workPoolName.edit-DBHlrVVx.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CcFrethu.js.map → work-pool_._workPoolName.edit-DBHlrVVx.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CwPnpSI9.js → work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CwPnpSI9.js.map → work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-Bix0rRM1.js → work-queue-icon-text-D4BWBVDN.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-Bix0rRM1.js.map → work-queue-icon-text-D4BWBVDN.js.map} +1 -1
- prefect/server/ui-v2/index.html +2 -2
- prefect/testing/fixtures.py +14 -13
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/METADATA +2 -2
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/RECORD +207 -205
- prefect/server/ui-v2/assets/artifact._id-BIyzb0Jb.js +0 -2
- prefect/server/ui-v2/assets/artifact._id-BIyzb0Jb.js.map +0 -1
- 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.15.dist-info}/WHEEL +0 -0
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-
|
|
1
|
+
{"version":3,"file":"header-BTAWyeXv.js","sources":["../../src/components/deployments/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nexport const DeploymentsPageHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tDeployments\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n"],"names":["DeploymentsPageHeader","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem"],"mappings":"wGAMO,MAAMA,EAAwB,IAEnCC,MAAC,MAAA,CAAI,UAAU,0BACd,eAACC,EAAA,CACA,SAAAD,MAACE,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,aAAA,CAElD,EACD,EACD,CAAA,CACD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as s,L as e}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as o,q as i,I as t}from"./index-
|
|
2
|
-
//# sourceMappingURL=header-
|
|
1
|
+
import{j as s,L as e}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as o,q as i,I as t}from"./index-m48E4KcG.js";const n=()=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(o,{className:"text-xl font-semibold",children:"Work pools"})})}),s.jsx(e,{to:"/work-pools/create",children:s.jsx(i,{size:"icon",className:"size-7",variant:"outline",children:s.jsx(t,{id:"Plus",className:"size-4"})})})]});export{n as W};
|
|
2
|
+
//# sourceMappingURL=header-ChFAx5uR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-
|
|
1
|
+
{"version":3,"file":"header-ChFAx5uR.js","sources":["../../src/components/work-pools/header.tsx"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const WorkPoolsPageHeader = () => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\tWork pools\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t\t<Link to=\"/work-pools/create\">\n\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</Link>\n\t</div>\n);\n"],"names":["WorkPoolsPageHeader","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Link","Button","Icon"],"mappings":"6HASO,MAAMA,EAAsB,IAClCC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,YAAA,CAElD,CAAA,CACD,EACD,QACCC,EAAA,CAAK,GAAG,qBACR,SAAAJ,EAAAA,IAACK,EAAA,CAAO,KAAK,OAAO,UAAU,SAAS,QAAQ,UAC9C,eAACC,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,EACpC,CAAA,CACD,CAAA,CAAA,CACD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as s}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as i,q as t,I as c}from"./index-
|
|
2
|
-
//# sourceMappingURL=header-
|
|
1
|
+
import{j as s}from"./vendor-tanstack-BcZfOOfy.js";import{B as a,g as r,h as i,q as t,I as c}from"./index-m48E4KcG.js";const n=({onAddVariableClick:e})=>s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(a,{children:s.jsx(r,{children:s.jsx(i,{className:"text-xl font-semibold",children:"Variables"})})}),e&&s.jsx(t,{size:"icon",className:"size-7",variant:"outline",onClick:()=>e(),children:s.jsx(c,{id:"Plus",className:"size-4"})})]});export{n as V};
|
|
2
|
+
//# sourceMappingURL=header-CyQqOj1w.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-
|
|
1
|
+
{"version":3,"file":"header-CyQqOj1w.js","sources":["../../src/components/variables/header.tsx"],"sourcesContent":["import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype VariablesPageHeaderProps = {\n\tonAddVariableClick?: () => void;\n};\n\nexport const VariablesPageHeader = ({\n\tonAddVariableClick,\n}: VariablesPageHeaderProps) => {\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tVariables\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t{onAddVariableClick && (\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"size-7\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onAddVariableClick()}\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["VariablesPageHeader","onAddVariableClick","jsxs","jsx","Breadcrumb","BreadcrumbList","BreadcrumbItem","Button","Icon"],"mappings":"sHAYO,MAAMA,EAAsB,CAAC,CACnC,mBAAAC,CACD,IAEEC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,eAACC,EAAA,CACA,SAAAF,EAAAA,IAACG,GAAe,UAAU,wBAAwB,SAAA,WAAA,CAElD,CAAA,CACD,EACD,EACCL,GACAE,EAAAA,IAACI,EAAA,CACA,KAAK,OACL,UAAU,SACV,QAAQ,UACR,QAAS,IAAMN,EAAA,EAEf,SAAAE,EAAAA,IAACK,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,EAEF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e,F as N,r as p,C as Q,G as W,D as X,B as Y,L as he}from"./vendor-tanstack-BcZfOOfy.js";import{q as d,I as k,y as v,bf as Z,G as ee,O as se,E as ne,t as ae,v as re,w as te,x as ce,D as oe,B as _,g as V,h as E,bg as xe,_ as G,$ as M,a0 as F,a1 as I,p as C,a3 as O,bh as P,bi as je,a2 as ge,bj as ye,bk as pe,bl as be,aw as Ce,ax as ve,ay as $,az as U}from"./index-nxDkMXcY.js";import{D as ie}from"./data-table-B2NqBPUR.js";import{D as fe,a as we,b as Le,c as Se,d as T}from"./dropdown-menu-CT6uZu-V.js";import{F as le,a as u,b as x,c as j,d as g,e as y}from"./form-CxD6-5Qf.js";import{a as de}from"./zod-Cuos7J7w.js";import{c as ue,o as z,n as L,s as h,b as ke,f as S,e as De}from"./vendor-forms-ClCIacbh.js";import{T as Re,a as Te,b as Ae}from"./task-run-concurrency-limits-reset-dialog-CG2F0Ufy.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BAN776s_.js";import"./vendor-date-wwuDAncJ.js";import"./table-Bx2Ol4j-.js";const Ne=({onEditRow:s,onDeleteRow:n,...a})=>{const r=i=>{navigator.clipboard.writeText(i),v.success("ID copied")},t=a.row.original;return e.jsxs(fe,{children:[e.jsx(we,{asChild:!0,children:e.jsxs(d,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(k,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(Le,{align:"end",children:[e.jsx(Se,{children:"Actions"}),e.jsx(T,{onClick:()=>r(t.id),children:"Copy ID"}),e.jsx(T,{onClick:()=>n(t),children:"Delete"}),e.jsx(T,{onClick:()=>s(t),children:"Edit"})]})]})},_e=s=>{const{updateGlobalConcurrencyLimit:n}=Z(),a=(i,c)=>{n({id_or_name:c,active:i},{onSuccess:()=>{v.success("Concurrency limit updated")},onError:o=>{const l=o.message||"Unknown error while updating active field.";console.error(l)}})},r=s.getValue(),t=s.row.original.id;return e.jsx(ee,{"aria-label":"toggle active",checked:r,onCheckedChange:i=>a(i,t)})},B=N("/concurrency-limits/"),b=Y(),Ve=({onEditRow:s,onDeleteRow:n})=>[b.accessor("name",{header:"Name"}),b.accessor("limit",{header:"Limit"}),b.accessor("active_slots",{header:"Active Slots"}),b.accessor("slot_decay_per_second",{header:"Slots Decay Per Second"}),b.accessor("active",{header:"Active",cell:_e}),b.display({id:"actions",cell:a=>e.jsx("div",{className:"flex flex-row justify-end",children:e.jsx(Ne,{...a,onEditRow:s,onDeleteRow:n})})})],Ee=({data:s,onEditRow:n,onDeleteRow:a})=>{const r=B.useNavigate(),{search:t}=B.useSearch(),i=p.useDeferredValue(t??""),c=p.useMemo(()=>s.filter(o=>o.name.toLowerCase().includes(i.toLowerCase())),[s,i]);return e.jsx(Ge,{data:c,onDeleteRow:a,onEditRow:n,searchValue:t,onSearchChange:o=>{r({to:".",search:l=>({...l,search:o})})}})};function Ge({data:s,onDeleteRow:n,onEditRow:a,onSearchChange:r,searchValue:t}){const i=Q({data:s,columns:Ve({onDeleteRow:n,onEditRow:a}),getCoreRowModel:X(),getPaginationRowModel:W()});return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(se,{className:"max-w-72",placeholder:"Search global concurrency limit",value:t,onChange:c=>r(c.target.value)}),e.jsx(ie,{table:i})]})}const Me=({onAdd:s})=>e.jsxs(ne,{children:[e.jsx(ae,{id:"AlignVerticalJustifyStart"}),e.jsx(re,{children:"Add a concurrency limit"}),e.jsx(te,{children:"Global concurrency limits can be applied to flow runs, task runs and any operation where you want to control concurrency."}),e.jsxs(ce,{children:[e.jsxs(d,{onClick:s,children:["Add Concurrency Limit ",e.jsx(k,{id:"Plus",className:"size-4 ml-2"})]}),e.jsx(oe,{id:"global-concurrency-guide"})]})]}),Fe=({onAdd:s})=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{children:e.jsx(V,{children:e.jsx(E,{className:"text-xl font-semibold",children:"Global Concurrency Limits"})})}),e.jsx(d,{onClick:s,size:"icon",className:"size-7",variant:"outline","aria-label":"add global concurrency limit",children:e.jsx(k,{id:"Plus",className:"size-4"})})]}),Ie=z({active:ke().default(!0),denied_slots:L().default(0).or(h()).pipe(S.number()),limit:L().default(0).or(h()).pipe(S.number()),name:h().min(2,{message:"Name must be at least 2 characters"}).default(""),slot_decay_per_second:L().default(0).or(h()).pipe(S.number()),active_slots:L().default(0).or(h()).pipe(S.number())}),A={active:!0,name:"",limit:0,slot_decay_per_second:0,denied_slots:0,active_slots:0},Oe=({limitToUpdate:s,onSubmit:n})=>{const{createGlobalConcurrencyLimit:a,status:r}=xe(),{updateGlobalConcurrencyLimit:t,status:i}=Z(),c=ue({resolver:de(Ie),defaultValues:A});return p.useEffect(()=>{if(s){const{active:l,name:D,limit:f,slot_decay_per_second:w,active_slots:me}=s;c.reset({active:l,name:D,limit:f,slot_decay_per_second:w,active_slots:me})}else c.reset(A)},[c,s]),{form:c,saveOrUpdate:l=>{const D=()=>{c.reset(A),n()};s?.id?t({id_or_name:s.id,...l},{onSuccess:()=>{v.success("Limit updated")},onError:f=>{const w=f.message||"Unknown error while updating limit.";c.setError("root",{message:w})},onSettled:D}):a(l,{onSuccess:()=>{v.success("Limit created")},onError:f=>{const w=f.message||"Unknown error while creating variable.";c.setError("root",{message:w})},onSettled:D})},isLoading:r==="pending"||i==="pending"}},H=({limitToUpdate:s,onOpenChange:n,onSubmit:a})=>{const{form:r,isLoading:t,saveOrUpdate:i}=Oe({limitToUpdate:s,onSubmit:a}),c=s?`Update ${s.name}`:"Add Concurrency Limit";return e.jsx(G,{open:!0,onOpenChange:n,children:e.jsxs(M,{"aria-describedby":void 0,children:[e.jsx(F,{children:e.jsx(I,{children:c})}),e.jsx(le,{...r,children:e.jsxs("form",{onSubmit:o=>{r.handleSubmit(i)(o)},className:"space-y-4",children:[e.jsx(u,{children:r.formState.errors.root?.message}),e.jsx(x,{control:r.control,name:"name",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Name"}),e.jsx(y,{children:e.jsx(C,{type:"text",autoComplete:"off",...o})}),e.jsx(u,{})]})}),e.jsx(x,{control:r.control,name:"limit",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Concurrency Limit"}),e.jsx(y,{children:e.jsx(C,{type:"number",...o})}),e.jsx(u,{})]})}),e.jsx(x,{control:r.control,name:"slot_decay_per_second",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Slot Decay Per Second"}),e.jsx(y,{children:e.jsx(C,{type:"number",...o})}),e.jsx(u,{})]})}),s&&e.jsx(x,{control:r.control,name:"active_slots",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Active Slots"}),e.jsx(y,{children:e.jsx(C,{type:"number",...o})}),e.jsx(u,{})]})}),e.jsx(x,{control:r.control,name:"active",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Active"}),e.jsx(y,{children:e.jsx(ee,{className:"block",checked:o.value,onCheckedChange:o.onChange})}),e.jsx(u,{})]})}),e.jsxs(O,{children:[e.jsx(P,{asChild:!0,children:e.jsx(d,{variant:"outline",children:"Close"})}),e.jsx(d,{type:"submit",loading:t,children:s?"Update":"Save"})]})]})})]})})},Pe=({limit:s,onOpenChange:n,onDelete:a})=>{const{deleteGlobalConcurrencyLimit:r,isPending:t}=je(),i=c=>{r(c,{onSuccess:()=>{v.success("Concurrency limit deleted")},onError:o=>{const l=o.message||"Unknown error while deleting concurrency limit.";console.error(l)},onSettled:a})};return e.jsx(G,{open:!0,onOpenChange:n,children:e.jsxs(M,{children:[e.jsx(F,{children:e.jsx(I,{children:"Delete Concurrency Limit"})}),e.jsxs(ge,{children:["Are you sure you want to delete ",s.name]}),e.jsxs(O,{children:[e.jsx(P,{asChild:!0,children:e.jsx(d,{variant:"outline",children:"Close"})}),e.jsx(d,{variant:"destructive",onClick:()=>i(s.id),loading:t,children:"Delete"})]})]})})},ze=({openDialog:s,onCloseDialog:n,onOpenChange:a})=>{const{dialog:r,data:t}=s;switch(r){case"create":return e.jsx(H,{onOpenChange:a,onSubmit:n});case"delete":return e.jsx(Pe,{limit:t,onOpenChange:a,onDelete:n});case"edit":return e.jsx(H,{onOpenChange:a,limitToUpdate:t,onSubmit:n});default:return null}},$e=()=>{const[s,n]=p.useState({dialog:null,data:void 0}),{data:a}=ye(),r=()=>n({dialog:"create",data:void 0}),t=l=>n({dialog:"edit",data:l}),i=l=>n({dialog:"delete",data:l}),c=()=>n({dialog:null,data:void 0}),o=l=>{l||c()};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Fe,{onAdd:r}),a.length===0?e.jsx(Me,{onAdd:r}):e.jsx(Ee,{data:a,onEditRow:t,onDeleteRow:i}),e.jsx(ze,{openDialog:s,onCloseDialog:c,onOpenChange:o})]})},Ue=s=>{const a=s.getValue().length;return a===0?"None":a},Be=s=>{const n=s.getValue(),a=s.row.original.id;return e.jsx(he,{params:{id:a},to:"/concurrency-limits/concurrency-limit/$id",children:n})},q=N("/concurrency-limits/"),R=Y(),He=({onDeleteRow:s,onResetRow:n})=>[R.accessor("tag",{header:"Tag",cell:Be}),R.accessor("concurrency_limit",{header:"Slots"}),R.accessor("active_slots",{header:"Active Task Runs",cell:Ue}),R.display({id:"actions",cell:a=>{const r=a.row.original;return e.jsx("div",{className:"flex flex-row justify-end",children:e.jsx(Re,{id:r.id,onDelete:()=>s(r),onReset:()=>n(r)})})}})],qe=({data:s,onDeleteRow:n,onResetRow:a})=>{const r=q.useNavigate(),{search:t}=q.useSearch(),i=p.useDeferredValue(t??""),c=p.useMemo(()=>s.filter(o=>o.tag.toLowerCase().includes(i.toLowerCase())),[s,i]);return e.jsx(Je,{data:c,onDeleteRow:n,onResetRow:a,searchValue:t,onSearchChange:o=>{r({to:".",search:l=>({...l,search:o})})}})};function Je({data:s,onDeleteRow:n,onResetRow:a,onSearchChange:r,searchValue:t}){const i=Q({data:s,columns:He({onDeleteRow:n,onResetRow:a}),getCoreRowModel:X(),getPaginationRowModel:W()});return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(se,{className:"max-w-72",placeholder:"Search active task limit",value:t,onChange:c=>r(c.target.value)}),e.jsx(ie,{table:i})]})}const Ke=({onAdd:s})=>e.jsxs(ne,{children:[e.jsx(ae,{id:"CircleArrowOutUpRight"}),e.jsx(re,{children:"Add a concurrency limit for your task runs"}),e.jsx(te,{children:"Creating a limit allows you to limit the number of tasks running simultaneously with a given tag."}),e.jsxs(ce,{children:[e.jsxs(d,{onClick:s,children:["Add Concurrency Limit ",e.jsx(k,{id:"Plus",className:"size-4 ml-2"})]}),e.jsx(oe,{id:"task-concurrency-guide"})]})]}),Qe=({onAdd:s})=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{children:e.jsx(V,{children:e.jsx(E,{className:"text-xl font-semibold",children:"Task Run Concurrency Limits"})})}),e.jsx(d,{onClick:s,size:"icon",className:"size-7",variant:"outline","aria-label":"add task run concurrency limit",children:e.jsx(k,{id:"Plus",className:"size-4"})})]}),We=z({tag:h().min(1),concurrency_limit:L().default(0).or(h()).pipe(S.number())}),J={tag:"",concurrency_limit:0},Xe=({onOpenChange:s,onSubmit:n})=>{const{createTaskRunConcurrencyLimit:a,isPending:r}=pe(),t=ue({resolver:de(We),defaultValues:J}),i=c=>{a(c,{onSuccess:()=>{v.success("Concurrency limit added")},onError:o=>{const l=o.message||"Unknown error while updating limit.";t.setError("root",{message:l})},onSettled:()=>{t.reset(J),n()}})};return e.jsx(G,{open:!0,onOpenChange:s,children:e.jsxs(M,{"aria-describedby":void 0,children:[e.jsx(F,{children:e.jsx(I,{children:"Add Task Run Concurrency Limit"})}),e.jsx(le,{...t,children:e.jsxs("form",{onSubmit:c=>{t.handleSubmit(i)(c)},className:"space-y-4",children:[e.jsx(u,{children:t.formState.errors.root?.message}),e.jsx(x,{control:t.control,name:"tag",render:({field:c})=>e.jsxs(j,{children:[e.jsx(g,{children:"Tag"}),e.jsx(y,{children:e.jsx(C,{type:"text",autoComplete:"off",...c})}),e.jsx(u,{})]})}),e.jsx(x,{control:t.control,name:"concurrency_limit",render:({field:c})=>e.jsxs(j,{children:[e.jsx(g,{children:"Concurrency Limit"}),e.jsx(y,{children:e.jsx(C,{type:"number",...c})}),e.jsx(u,{})]})}),e.jsxs(O,{children:[e.jsx(P,{asChild:!0,children:e.jsx(d,{variant:"outline",children:"Close"})}),e.jsx(d,{type:"submit",loading:r,children:"Add"})]})]})})]})})},Ye=({openDialog:s,onCloseDialog:n,onOpenChange:a})=>{const{dialog:r,data:t}=s;switch(r){case"create":return e.jsx(Xe,{onOpenChange:a,onSubmit:n});case"reset":return e.jsx(Ae,{data:t,onOpenChange:a,onReset:n});case"delete":return e.jsx(Te,{data:t,onOpenChange:a,onDelete:n});default:return null}},Ze=()=>{const[s,n]=p.useState({dialog:null,data:void 0}),{data:a}=be(),r=()=>n({dialog:"create",data:void 0}),t=l=>n({dialog:"delete",data:l}),i=l=>n({dialog:"reset",data:l}),c=()=>n({dialog:null,data:void 0}),o=l=>{l||c()};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Qe,{onAdd:r}),a.length===0?e.jsx(Ke,{onAdd:r}):e.jsx(qe,{data:a,onDeleteRow:t,onResetRow:i}),e.jsx(Ye,{openDialog:s,onCloseDialog:c,onOpenChange:o})]})},K=N("/concurrency-limits/"),m={global:{tabSearchValue:"global",displayValue:"Global"},"task-run":{tabSearchValue:"task-run",displayValue:"Task Run"}},es=({globalView:s,taskRunView:n})=>{const{tab:a}=K.useSearch(),r=K.useNavigate();return e.jsxs(Ce,{defaultValue:"Global",value:a,children:[e.jsxs(ve,{children:[e.jsx($,{value:m.global.tabSearchValue,onClick:()=>{r({to:"/concurrency-limits",search:{tab:m.global.tabSearchValue}})},children:m.global.displayValue}),e.jsx($,{value:m["task-run"].tabSearchValue,onClick:()=>{r({to:"/concurrency-limits",search:{tab:m["task-run"].tabSearchValue}})},children:m["task-run"].displayValue})]}),e.jsx(U,{value:m.global.tabSearchValue,children:s}),e.jsx(U,{value:m["task-run"].tabSearchValue,children:n})]})},ss=()=>e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(ns,{}),e.jsx(es,{globalView:e.jsx($e,{}),taskRunView:e.jsx(Ze,{})})]}),ns=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(_,{children:e.jsx(V,{children:e.jsx(E,{className:"text-xl font-semibold",children:"Concurrency"})})})});z({search:h().optional(),tab:De(["global","task-run"]).default("global")});const gs=ss;export{gs as component};
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as e,F as N,r as p,C as Q,G as W,D as X,B as Y,L as he}from"./vendor-tanstack-BcZfOOfy.js";import{q as d,I as k,y as v,bf as Z,G as ee,O as se,E as ne,t as ae,v as re,w as te,x as ce,D as oe,B as _,g as V,h as E,bg as xe,_ as G,$ as M,a0 as F,a1 as I,p as C,a3 as O,bh as P,bi as je,a2 as ge,bj as ye,bk as pe,bl as be,aw as Ce,ax as ve,ay as $,az as U}from"./index-m48E4KcG.js";import{D as ie}from"./data-table-rlbkLcrY.js";import{D as fe,a as we,b as Le,c as Se,d as T}from"./dropdown-menu-0atiOSFo.js";import{F as le,a as u,b as x,c as j,d as g,e as y}from"./form-DLrbC7rV.js";import{a as de}from"./zod-Cuos7J7w.js";import{c as ue,o as z,n as L,s as h,b as ke,f as S,e as De}from"./vendor-forms-ClCIacbh.js";import{T as Re,a as Te,b as Ae}from"./task-run-concurrency-limits-reset-dialog-S69sih55.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BAN776s_.js";import"./vendor-date-wwuDAncJ.js";import"./table-bBL6C0ZK.js";const Ne=({onEditRow:s,onDeleteRow:n,...a})=>{const r=i=>{navigator.clipboard.writeText(i),v.success("ID copied")},t=a.row.original;return e.jsxs(fe,{children:[e.jsx(we,{asChild:!0,children:e.jsxs(d,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(k,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(Le,{align:"end",children:[e.jsx(Se,{children:"Actions"}),e.jsx(T,{onClick:()=>r(t.id),children:"Copy ID"}),e.jsx(T,{onClick:()=>n(t),children:"Delete"}),e.jsx(T,{onClick:()=>s(t),children:"Edit"})]})]})},_e=s=>{const{updateGlobalConcurrencyLimit:n}=Z(),a=(i,c)=>{n({id_or_name:c,active:i},{onSuccess:()=>{v.success("Concurrency limit updated")},onError:o=>{const l=o.message||"Unknown error while updating active field.";console.error(l)}})},r=s.getValue(),t=s.row.original.id;return e.jsx(ee,{"aria-label":"toggle active",checked:r,onCheckedChange:i=>a(i,t)})},B=N("/concurrency-limits/"),b=Y(),Ve=({onEditRow:s,onDeleteRow:n})=>[b.accessor("name",{header:"Name"}),b.accessor("limit",{header:"Limit"}),b.accessor("active_slots",{header:"Active Slots"}),b.accessor("slot_decay_per_second",{header:"Slots Decay Per Second"}),b.accessor("active",{header:"Active",cell:_e}),b.display({id:"actions",cell:a=>e.jsx("div",{className:"flex flex-row justify-end",children:e.jsx(Ne,{...a,onEditRow:s,onDeleteRow:n})})})],Ee=({data:s,onEditRow:n,onDeleteRow:a})=>{const r=B.useNavigate(),{search:t}=B.useSearch(),i=p.useDeferredValue(t??""),c=p.useMemo(()=>s.filter(o=>o.name.toLowerCase().includes(i.toLowerCase())),[s,i]);return e.jsx(Ge,{data:c,onDeleteRow:a,onEditRow:n,searchValue:t,onSearchChange:o=>{r({to:".",search:l=>({...l,search:o})})}})};function Ge({data:s,onDeleteRow:n,onEditRow:a,onSearchChange:r,searchValue:t}){const i=Q({data:s,columns:Ve({onDeleteRow:n,onEditRow:a}),getCoreRowModel:X(),getPaginationRowModel:W()});return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(se,{className:"max-w-72",placeholder:"Search global concurrency limit",value:t,onChange:c=>r(c.target.value)}),e.jsx(ie,{table:i})]})}const Me=({onAdd:s})=>e.jsxs(ne,{children:[e.jsx(ae,{id:"AlignVerticalJustifyStart"}),e.jsx(re,{children:"Add a concurrency limit"}),e.jsx(te,{children:"Global concurrency limits can be applied to flow runs, task runs and any operation where you want to control concurrency."}),e.jsxs(ce,{children:[e.jsxs(d,{onClick:s,children:["Add Concurrency Limit ",e.jsx(k,{id:"Plus",className:"size-4 ml-2"})]}),e.jsx(oe,{id:"global-concurrency-guide"})]})]}),Fe=({onAdd:s})=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{children:e.jsx(V,{children:e.jsx(E,{className:"text-xl font-semibold",children:"Global Concurrency Limits"})})}),e.jsx(d,{onClick:s,size:"icon",className:"size-7",variant:"outline","aria-label":"add global concurrency limit",children:e.jsx(k,{id:"Plus",className:"size-4"})})]}),Ie=z({active:ke().default(!0),denied_slots:L().default(0).or(h()).pipe(S.number()),limit:L().default(0).or(h()).pipe(S.number()),name:h().min(2,{message:"Name must be at least 2 characters"}).default(""),slot_decay_per_second:L().default(0).or(h()).pipe(S.number()),active_slots:L().default(0).or(h()).pipe(S.number())}),A={active:!0,name:"",limit:0,slot_decay_per_second:0,denied_slots:0,active_slots:0},Oe=({limitToUpdate:s,onSubmit:n})=>{const{createGlobalConcurrencyLimit:a,status:r}=xe(),{updateGlobalConcurrencyLimit:t,status:i}=Z(),c=ue({resolver:de(Ie),defaultValues:A});return p.useEffect(()=>{if(s){const{active:l,name:D,limit:f,slot_decay_per_second:w,active_slots:me}=s;c.reset({active:l,name:D,limit:f,slot_decay_per_second:w,active_slots:me})}else c.reset(A)},[c,s]),{form:c,saveOrUpdate:l=>{const D=()=>{c.reset(A),n()};s?.id?t({id_or_name:s.id,...l},{onSuccess:()=>{v.success("Limit updated")},onError:f=>{const w=f.message||"Unknown error while updating limit.";c.setError("root",{message:w})},onSettled:D}):a(l,{onSuccess:()=>{v.success("Limit created")},onError:f=>{const w=f.message||"Unknown error while creating variable.";c.setError("root",{message:w})},onSettled:D})},isLoading:r==="pending"||i==="pending"}},H=({limitToUpdate:s,onOpenChange:n,onSubmit:a})=>{const{form:r,isLoading:t,saveOrUpdate:i}=Oe({limitToUpdate:s,onSubmit:a}),c=s?`Update ${s.name}`:"Add Concurrency Limit";return e.jsx(G,{open:!0,onOpenChange:n,children:e.jsxs(M,{"aria-describedby":void 0,children:[e.jsx(F,{children:e.jsx(I,{children:c})}),e.jsx(le,{...r,children:e.jsxs("form",{onSubmit:o=>{r.handleSubmit(i)(o)},className:"space-y-4",children:[e.jsx(u,{children:r.formState.errors.root?.message}),e.jsx(x,{control:r.control,name:"name",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Name"}),e.jsx(y,{children:e.jsx(C,{type:"text",autoComplete:"off",...o})}),e.jsx(u,{})]})}),e.jsx(x,{control:r.control,name:"limit",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Concurrency Limit"}),e.jsx(y,{children:e.jsx(C,{type:"number",...o})}),e.jsx(u,{})]})}),e.jsx(x,{control:r.control,name:"slot_decay_per_second",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Slot Decay Per Second"}),e.jsx(y,{children:e.jsx(C,{type:"number",...o})}),e.jsx(u,{})]})}),s&&e.jsx(x,{control:r.control,name:"active_slots",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Active Slots"}),e.jsx(y,{children:e.jsx(C,{type:"number",...o})}),e.jsx(u,{})]})}),e.jsx(x,{control:r.control,name:"active",render:({field:o})=>e.jsxs(j,{children:[e.jsx(g,{children:"Active"}),e.jsx(y,{children:e.jsx(ee,{className:"block",checked:o.value,onCheckedChange:o.onChange})}),e.jsx(u,{})]})}),e.jsxs(O,{children:[e.jsx(P,{asChild:!0,children:e.jsx(d,{variant:"outline",children:"Close"})}),e.jsx(d,{type:"submit",loading:t,children:s?"Update":"Save"})]})]})})]})})},Pe=({limit:s,onOpenChange:n,onDelete:a})=>{const{deleteGlobalConcurrencyLimit:r,isPending:t}=je(),i=c=>{r(c,{onSuccess:()=>{v.success("Concurrency limit deleted")},onError:o=>{const l=o.message||"Unknown error while deleting concurrency limit.";console.error(l)},onSettled:a})};return e.jsx(G,{open:!0,onOpenChange:n,children:e.jsxs(M,{children:[e.jsx(F,{children:e.jsx(I,{children:"Delete Concurrency Limit"})}),e.jsxs(ge,{children:["Are you sure you want to delete ",s.name]}),e.jsxs(O,{children:[e.jsx(P,{asChild:!0,children:e.jsx(d,{variant:"outline",children:"Close"})}),e.jsx(d,{variant:"destructive",onClick:()=>i(s.id),loading:t,children:"Delete"})]})]})})},ze=({openDialog:s,onCloseDialog:n,onOpenChange:a})=>{const{dialog:r,data:t}=s;switch(r){case"create":return e.jsx(H,{onOpenChange:a,onSubmit:n});case"delete":return e.jsx(Pe,{limit:t,onOpenChange:a,onDelete:n});case"edit":return e.jsx(H,{onOpenChange:a,limitToUpdate:t,onSubmit:n});default:return null}},$e=()=>{const[s,n]=p.useState({dialog:null,data:void 0}),{data:a}=ye(),r=()=>n({dialog:"create",data:void 0}),t=l=>n({dialog:"edit",data:l}),i=l=>n({dialog:"delete",data:l}),c=()=>n({dialog:null,data:void 0}),o=l=>{l||c()};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Fe,{onAdd:r}),a.length===0?e.jsx(Me,{onAdd:r}):e.jsx(Ee,{data:a,onEditRow:t,onDeleteRow:i}),e.jsx(ze,{openDialog:s,onCloseDialog:c,onOpenChange:o})]})},Ue=s=>{const a=s.getValue().length;return a===0?"None":a},Be=s=>{const n=s.getValue(),a=s.row.original.id;return e.jsx(he,{params:{id:a},to:"/concurrency-limits/concurrency-limit/$id",children:n})},q=N("/concurrency-limits/"),R=Y(),He=({onDeleteRow:s,onResetRow:n})=>[R.accessor("tag",{header:"Tag",cell:Be}),R.accessor("concurrency_limit",{header:"Slots"}),R.accessor("active_slots",{header:"Active Task Runs",cell:Ue}),R.display({id:"actions",cell:a=>{const r=a.row.original;return e.jsx("div",{className:"flex flex-row justify-end",children:e.jsx(Re,{id:r.id,onDelete:()=>s(r),onReset:()=>n(r)})})}})],qe=({data:s,onDeleteRow:n,onResetRow:a})=>{const r=q.useNavigate(),{search:t}=q.useSearch(),i=p.useDeferredValue(t??""),c=p.useMemo(()=>s.filter(o=>o.tag.toLowerCase().includes(i.toLowerCase())),[s,i]);return e.jsx(Je,{data:c,onDeleteRow:n,onResetRow:a,searchValue:t,onSearchChange:o=>{r({to:".",search:l=>({...l,search:o})})}})};function Je({data:s,onDeleteRow:n,onResetRow:a,onSearchChange:r,searchValue:t}){const i=Q({data:s,columns:He({onDeleteRow:n,onResetRow:a}),getCoreRowModel:X(),getPaginationRowModel:W()});return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(se,{className:"max-w-72",placeholder:"Search active task limit",value:t,onChange:c=>r(c.target.value)}),e.jsx(ie,{table:i})]})}const Ke=({onAdd:s})=>e.jsxs(ne,{children:[e.jsx(ae,{id:"CircleArrowOutUpRight"}),e.jsx(re,{children:"Add a concurrency limit for your task runs"}),e.jsx(te,{children:"Creating a limit allows you to limit the number of tasks running simultaneously with a given tag."}),e.jsxs(ce,{children:[e.jsxs(d,{onClick:s,children:["Add Concurrency Limit ",e.jsx(k,{id:"Plus",className:"size-4 ml-2"})]}),e.jsx(oe,{id:"task-concurrency-guide"})]})]}),Qe=({onAdd:s})=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{children:e.jsx(V,{children:e.jsx(E,{className:"text-xl font-semibold",children:"Task Run Concurrency Limits"})})}),e.jsx(d,{onClick:s,size:"icon",className:"size-7",variant:"outline","aria-label":"add task run concurrency limit",children:e.jsx(k,{id:"Plus",className:"size-4"})})]}),We=z({tag:h().min(1),concurrency_limit:L().default(0).or(h()).pipe(S.number())}),J={tag:"",concurrency_limit:0},Xe=({onOpenChange:s,onSubmit:n})=>{const{createTaskRunConcurrencyLimit:a,isPending:r}=pe(),t=ue({resolver:de(We),defaultValues:J}),i=c=>{a(c,{onSuccess:()=>{v.success("Concurrency limit added")},onError:o=>{const l=o.message||"Unknown error while updating limit.";t.setError("root",{message:l})},onSettled:()=>{t.reset(J),n()}})};return e.jsx(G,{open:!0,onOpenChange:s,children:e.jsxs(M,{"aria-describedby":void 0,children:[e.jsx(F,{children:e.jsx(I,{children:"Add Task Run Concurrency Limit"})}),e.jsx(le,{...t,children:e.jsxs("form",{onSubmit:c=>{t.handleSubmit(i)(c)},className:"space-y-4",children:[e.jsx(u,{children:t.formState.errors.root?.message}),e.jsx(x,{control:t.control,name:"tag",render:({field:c})=>e.jsxs(j,{children:[e.jsx(g,{children:"Tag"}),e.jsx(y,{children:e.jsx(C,{type:"text",autoComplete:"off",...c})}),e.jsx(u,{})]})}),e.jsx(x,{control:t.control,name:"concurrency_limit",render:({field:c})=>e.jsxs(j,{children:[e.jsx(g,{children:"Concurrency Limit"}),e.jsx(y,{children:e.jsx(C,{type:"number",...c})}),e.jsx(u,{})]})}),e.jsxs(O,{children:[e.jsx(P,{asChild:!0,children:e.jsx(d,{variant:"outline",children:"Close"})}),e.jsx(d,{type:"submit",loading:r,children:"Add"})]})]})})]})})},Ye=({openDialog:s,onCloseDialog:n,onOpenChange:a})=>{const{dialog:r,data:t}=s;switch(r){case"create":return e.jsx(Xe,{onOpenChange:a,onSubmit:n});case"reset":return e.jsx(Ae,{data:t,onOpenChange:a,onReset:n});case"delete":return e.jsx(Te,{data:t,onOpenChange:a,onDelete:n});default:return null}},Ze=()=>{const[s,n]=p.useState({dialog:null,data:void 0}),{data:a}=be(),r=()=>n({dialog:"create",data:void 0}),t=l=>n({dialog:"delete",data:l}),i=l=>n({dialog:"reset",data:l}),c=()=>n({dialog:null,data:void 0}),o=l=>{l||c()};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Qe,{onAdd:r}),a.length===0?e.jsx(Ke,{onAdd:r}):e.jsx(qe,{data:a,onDeleteRow:t,onResetRow:i}),e.jsx(Ye,{openDialog:s,onCloseDialog:c,onOpenChange:o})]})},K=N("/concurrency-limits/"),m={global:{tabSearchValue:"global",displayValue:"Global"},"task-run":{tabSearchValue:"task-run",displayValue:"Task Run"}},es=({globalView:s,taskRunView:n})=>{const{tab:a}=K.useSearch(),r=K.useNavigate();return e.jsxs(Ce,{defaultValue:"Global",value:a,children:[e.jsxs(ve,{children:[e.jsx($,{value:m.global.tabSearchValue,onClick:()=>{r({to:"/concurrency-limits",search:{tab:m.global.tabSearchValue}})},children:m.global.displayValue}),e.jsx($,{value:m["task-run"].tabSearchValue,onClick:()=>{r({to:"/concurrency-limits",search:{tab:m["task-run"].tabSearchValue}})},children:m["task-run"].displayValue})]}),e.jsx(U,{value:m.global.tabSearchValue,children:s}),e.jsx(U,{value:m["task-run"].tabSearchValue,children:n})]})},ss=()=>e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(ns,{}),e.jsx(es,{globalView:e.jsx($e,{}),taskRunView:e.jsx(Ze,{})})]}),ns=()=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(_,{children:e.jsx(V,{children:e.jsx(E,{className:"text-xl font-semibold",children:"Concurrency"})})})});z({search:h().optional(),tab:De(["global","task-run"]).default("global")});const gs=ss;export{gs as component};
|
|
2
|
+
//# sourceMappingURL=index-7i4X9TeK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-C2ayqOiQ.js","sources":["../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table/actions-cell.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table/active-cell.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table/global-concurrency-limits-data-table.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-empty-state/global-concurrency-limits-empty-state.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-header/global-concurrency-limits-header.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-create-or-edit-dialog/use-create-or-edit-global-concurrency-limit-form.ts","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-create-or-edit-dialog/global-concurrency-limits-create-or-edit-dialog.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-delete-dialog/global-concurrency-limits-delete-dialog.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-view/global-conccurency-limits-dialog.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-view/index.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table/active-task-runs-cell.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table/tag-cell.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table/task-run-concurrency-limits-data-table.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-empty-state/task-run-concurrency-limits-empty-state.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-header/task-run-concurrency-limits-header.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-create-dialog/task-run-concurrency-limits-create-dialog.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-view/task-run-concurrency-limit-dialog.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-view/index.tsx","../../src/components/concurrency/concurrency-limits-tabs.tsx","../../src/components/concurrency/concurrency-limits-page.tsx","../../src/routes/concurrency-limits/index.tsx?tsr-split=component"],"sourcesContent":["import type { CellContext } from \"@tanstack/react-table\";\nimport { toast } from \"sonner\";\nimport type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype ActionsCellProps = CellContext<GlobalConcurrencyLimit, unknown> & {\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n};\n\nexport const ActionsCell = ({\n\tonEditRow,\n\tonDeleteRow,\n\t...props\n}: ActionsCellProps) => {\n\tconst handleCopyId = (id: string) => {\n\t\tvoid navigator.clipboard.writeText(id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\tconst row = props.row.original;\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={() => handleCopyId(row.id)}>\n\t\t\t\t\tCopy ID\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={() => onDeleteRow(row)}>\n\t\t\t\t\tDelete\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={() => onEditRow(row)}>Edit</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import type { CellContext } from \"@tanstack/react-table\";\nimport { toast } from \"sonner\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseUpdateGlobalConcurrencyLimit,\n} from \"@/api/global-concurrency-limits\";\nimport { Switch } from \"@/components/ui/switch\";\n\nexport const ActiveCell = (\n\tprops: CellContext<GlobalConcurrencyLimit, boolean>,\n) => {\n\tconst { updateGlobalConcurrencyLimit } = useUpdateGlobalConcurrencyLimit();\n\n\tconst handleCheckedChange = (checked: boolean, id: string) => {\n\t\tupdateGlobalConcurrencyLimit(\n\t\t\t{\n\t\t\t\tid_or_name: id,\n\t\t\t\tactive: checked,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Concurrency limit updated\");\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while updating active field.\";\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst rowActive = props.getValue();\n\tconst rowId = props.row.original.id;\n\n\treturn (\n\t\t<Switch\n\t\t\taria-label=\"toggle active\"\n\t\t\tchecked={rowActive}\n\t\t\tonCheckedChange={(checked) => handleCheckedChange(checked, rowId)}\n\t\t/>\n\t);\n};\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useDeferredValue, useMemo } from \"react\";\nimport type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { ActionsCell } from \"./actions-cell\";\nimport { ActiveCell } from \"./active-cell\";\n\nconst routeApi = getRouteApi(\"/concurrency-limits/\");\n\nconst columnHelper = createColumnHelper<GlobalConcurrencyLimit>();\n\nconst createColumns = ({\n\tonEditRow,\n\tonDeleteRow,\n}: {\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n}) => [\n\tcolumnHelper.accessor(\"name\", {\n\t\theader: \"Name\",\n\t}),\n\tcolumnHelper.accessor(\"limit\", {\n\t\theader: \"Limit\",\n\t}),\n\tcolumnHelper.accessor(\"active_slots\", {\n\t\theader: \"Active Slots\",\n\t}),\n\tcolumnHelper.accessor(\"slot_decay_per_second\", {\n\t\theader: \"Slots Decay Per Second\",\n\t}),\n\tcolumnHelper.accessor(\"active\", {\n\t\theader: \"Active\",\n\t\tcell: ActiveCell,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => (\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<ActionsCell\n\t\t\t\t\t{...props}\n\t\t\t\t\tonEditRow={onEditRow}\n\t\t\t\t\tonDeleteRow={onDeleteRow}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t),\n\t}),\n];\n\ntype GlobalConcurrencyLimitsDataTableProps = {\n\tdata: Array<GlobalConcurrencyLimit>;\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n};\n\nexport const GlobalConcurrencyLimitsDataTable = ({\n\tdata,\n\tonEditRow,\n\tonDeleteRow,\n}: GlobalConcurrencyLimitsDataTableProps) => {\n\tconst navigate = routeApi.useNavigate();\n\tconst { search } = routeApi.useSearch();\n\tconst deferredSearch = useDeferredValue(search ?? \"\");\n\n\tconst filteredData = useMemo(() => {\n\t\treturn data.filter((row) =>\n\t\t\trow.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\treturn (\n\t\t<Table\n\t\t\tdata={filteredData}\n\t\t\tonDeleteRow={onDeleteRow}\n\t\t\tonEditRow={onEditRow}\n\t\t\tsearchValue={search}\n\t\t\tonSearchChange={(value) =>\n\t\t\t\tvoid navigate({\n\t\t\t\t\tto: \".\",\n\t\t\t\t\tsearch: (prev) => ({ ...prev, search: value }),\n\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n};\n\ntype TableProps = {\n\tdata: Array<GlobalConcurrencyLimit>;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonSearchChange: (value: string) => void;\n\tsearchValue: string | undefined;\n};\n\nexport function Table({\n\tdata,\n\tonDeleteRow,\n\tonEditRow,\n\tonSearchChange,\n\tsearchValue,\n}: TableProps) {\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: createColumns({ onDeleteRow, onEditRow }),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(), //load client-side pagination code\n\t});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<SearchInput\n\t\t\t\tclassName=\"max-w-72\"\n\t\t\t\tplaceholder=\"Search global concurrency limit\"\n\t\t\t\tvalue={searchValue}\n\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t/>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n}\n","import { 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\ntype GlobalConcurrencyLimitsEmptyStateProps = {\n\tonAdd: () => void;\n};\nexport const GlobalConcurrencyLimitsEmptyState = ({\n\tonAdd,\n}: GlobalConcurrencyLimitsEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"AlignVerticalJustifyStart\" />\n\t\t<EmptyStateTitle>Add a concurrency limit</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tGlobal concurrency limits can be applied to flow runs, task runs and any\n\t\t\toperation where you want to control concurrency.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={onAdd}>\n\t\t\t\tAdd Concurrency Limit <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"global-concurrency-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype GlobalConcurrencyLimitsHeaderProps = {\n\tonAdd: () => void;\n};\n\nexport const GlobalConcurrencyLimitsHeader = ({\n\tonAdd,\n}: GlobalConcurrencyLimitsHeaderProps) => {\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\tGlobal Concurrency Limits\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<Button\n\t\t\t\tonClick={onAdd}\n\t\t\t\tsize=\"icon\"\n\t\t\t\tclassName=\"size-7\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\taria-label=\"add global concurrency limit\"\n\t\t\t>\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useEffect } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseCreateGlobalConcurrencyLimit,\n\tuseUpdateGlobalConcurrencyLimit,\n} from \"@/api/global-concurrency-limits\";\n\nconst formSchema = z.object({\n\tactive: z.boolean().default(true),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tdenied_slots: z.number().default(0).or(z.string()).pipe(z.coerce.number()),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tlimit: z.number().default(0).or(z.string()).pipe(z.coerce.number()),\n\tname: z\n\t\t.string()\n\t\t.min(2, { message: \"Name must be at least 2 characters\" })\n\t\t.default(\"\"),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tslot_decay_per_second: z\n\t\t.number()\n\t\t.default(0)\n\t\t.or(z.string())\n\t\t.pipe(z.coerce.number()),\n\t/** Additional fields post creation. Coerce to solve common issue of transforming a string number to a number type */\n\tactive_slots: z.number().default(0).or(z.string()).pipe(z.coerce.number()),\n});\n\nconst DEFAULT_VALUES = {\n\tactive: true,\n\tname: \"\",\n\tlimit: 0,\n\tslot_decay_per_second: 0,\n\tdenied_slots: 0,\n\tactive_slots: 0,\n} as const;\n\ntype UseCreateOrEditGlobalConcurrencyLimitFormOptions = {\n\t/** Limit to edit. Pass undefined if creating a new limit */\n\tlimitToUpdate: GlobalConcurrencyLimit | undefined;\n\t/** Callback after hitting Save or Update */\n\tonSubmit: () => void;\n};\n\nexport const useCreateOrEditGlobalConcurrencyLimitForm = ({\n\tlimitToUpdate,\n\tonSubmit,\n}: UseCreateOrEditGlobalConcurrencyLimitFormOptions) => {\n\tconst { createGlobalConcurrencyLimit, status: createStatus } =\n\t\tuseCreateGlobalConcurrencyLimit();\n\tconst { updateGlobalConcurrencyLimit, status: updateStatus } =\n\t\tuseUpdateGlobalConcurrencyLimit();\n\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: DEFAULT_VALUES,\n\t});\n\n\t// Sync form data with limit-to-edit data\n\tuseEffect(() => {\n\t\tif (limitToUpdate) {\n\t\t\tconst { active, name, limit, slot_decay_per_second, active_slots } =\n\t\t\t\tlimitToUpdate;\n\t\t\tform.reset({ active, name, limit, slot_decay_per_second, active_slots });\n\t\t} else {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t}\n\t}, [form, limitToUpdate]);\n\n\tconst saveOrUpdate = (values: z.infer<typeof formSchema>) => {\n\t\tconst onSettled = () => {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t\tonSubmit();\n\t\t};\n\n\t\tif (limitToUpdate?.id) {\n\t\t\tupdateGlobalConcurrencyLimit(\n\t\t\t\t{\n\t\t\t\t\tid_or_name: limitToUpdate.id,\n\t\t\t\t\t...values,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Limit updated\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror.message || \"Unknown error while updating limit.\";\n\t\t\t\t\t\tform.setError(\"root\", { message });\n\t\t\t\t\t},\n\t\t\t\t\tonSettled,\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\tcreateGlobalConcurrencyLimit(values, {\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Limit created\");\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while creating variable.\";\n\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonSettled,\n\t\t\t});\n\t\t}\n\t};\n\n\treturn {\n\t\tform,\n\t\tsaveOrUpdate,\n\t\tisLoading: createStatus === \"pending\" || updateStatus === \"pending\",\n\t};\n};\n","import type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { Switch } from \"@/components/ui/switch\";\n\nimport { useCreateOrEditGlobalConcurrencyLimitForm } from \"./use-create-or-edit-global-concurrency-limit-form\";\n\ntype GlobalConcurrencyLimitsCreateOrEditDialogProps = {\n\tlimitToUpdate?: GlobalConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonSubmit: () => void;\n};\n\nexport const GlobalConcurrencyLimitsCreateOrEditDialog = ({\n\tlimitToUpdate,\n\tonOpenChange,\n\tonSubmit,\n}: GlobalConcurrencyLimitsCreateOrEditDialogProps) => {\n\tconst { form, isLoading, saveOrUpdate } =\n\t\tuseCreateOrEditGlobalConcurrencyLimitForm({\n\t\t\tlimitToUpdate,\n\t\t\tonSubmit,\n\t\t});\n\n\tconst dialogTitle = limitToUpdate\n\t\t? `Update ${limitToUpdate.name}`\n\t\t: \"Add Concurrency Limit\";\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent aria-describedby={undefined}>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<Form {...form}>\n\t\t\t\t\t<form\n\t\t\t\t\t\tonSubmit={(e) => void form.handleSubmit(saveOrUpdate)(e)}\n\t\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"text\" autoComplete=\"off\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"limit\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Concurrency Limit</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"slot_decay_per_second\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Slot Decay Per Second</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{limitToUpdate && (\n\t\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\t\tname=\"active_slots\"\n\t\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t\t<FormLabel>Active Slots</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"active\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Active</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t\t\t\t\t\tchecked={field.value}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={field.onChange}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isLoading}>\n\t\t\t\t\t\t\t\t{limitToUpdate ? \"Update\" : \"Save\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</DialogFooter>\n\t\t\t\t\t</form>\n\t\t\t\t</Form>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { toast } from \"sonner\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseDeleteGlobalConcurrencyLimit,\n} from \"@/api/global-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\n\ntype GlobalConcurrencyLimitsDeleteDialogProps = {\n\tlimit: GlobalConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonDelete: () => void;\n};\n\nexport const GlobalConcurrencyLimitsDeleteDialog = ({\n\tlimit,\n\tonOpenChange,\n\tonDelete,\n}: GlobalConcurrencyLimitsDeleteDialogProps) => {\n\tconst { deleteGlobalConcurrencyLimit, isPending } =\n\t\tuseDeleteGlobalConcurrencyLimit();\n\n\tconst handleOnClick = (id: string) => {\n\t\tdeleteGlobalConcurrencyLimit(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit deleted\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while deleting concurrency limit.\";\n\t\t\t\tconsole.error(message);\n\t\t\t},\n\t\t\tonSettled: onDelete,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Delete Concurrency Limit</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>\n\t\t\t\t\tAre you sure you want to delete {limit.name}\n\t\t\t\t</DialogDescription>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\tonClick={() => handleOnClick(limit.id)}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\n\nimport { GlobalConcurrencyLimitsCreateOrEditDialog } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-create-or-edit-dialog\";\nimport { GlobalConcurrencyLimitsDeleteDialog } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-delete-dialog\";\n\nexport type DialogState =\n\t| { dialog: null | \"create\"; data: undefined }\n\t| {\n\t\t\tdialog: \"delete\" | \"edit\";\n\t\t\tdata: GlobalConcurrencyLimit;\n\t };\n\nexport const GlobalConcurrencyLimitsDialog = ({\n\topenDialog,\n\tonCloseDialog,\n\tonOpenChange,\n}: {\n\topenDialog: DialogState;\n\tonOpenChange: (open: boolean) => void;\n\tonCloseDialog: () => void;\n}) => {\n\tconst { dialog, data } = openDialog;\n\tswitch (dialog) {\n\t\tcase \"create\":\n\t\t\treturn (\n\t\t\t\t<GlobalConcurrencyLimitsCreateOrEditDialog\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonSubmit={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"delete\":\n\t\t\treturn (\n\t\t\t\t<GlobalConcurrencyLimitsDeleteDialog\n\t\t\t\t\tlimit={data}\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonDelete={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"edit\":\n\t\t\treturn (\n\t\t\t\t<GlobalConcurrencyLimitsCreateOrEditDialog\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tlimitToUpdate={data}\n\t\t\t\t\tonSubmit={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { useState } from \"react\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseListGlobalConcurrencyLimits,\n} from \"@/api/global-concurrency-limits\";\n\nimport { GlobalConcurrencyLimitsDataTable } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table\";\nimport { GlobalConcurrencyLimitsEmptyState } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-empty-state\";\nimport { GlobalConcurrencyLimitsHeader } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-header\";\n\nimport {\n\ttype DialogState,\n\tGlobalConcurrencyLimitsDialog,\n} from \"./global-conccurency-limits-dialog\";\n\nexport const GlobalConcurrencyLimitsView = () => {\n\tconst [openDialog, setOpenDialog] = useState<DialogState>({\n\t\tdialog: null,\n\t\tdata: undefined,\n\t});\n\n\tconst { data } = useListGlobalConcurrencyLimits();\n\n\tconst handleAddRow = () =>\n\t\tsetOpenDialog({ dialog: \"create\", data: undefined });\n\n\tconst handleEditRow = (data: GlobalConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"edit\", data });\n\n\tconst handleDeleteRow = (data: GlobalConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"delete\", data });\n\n\tconst handleCloseDialog = () =>\n\t\tsetOpenDialog({ dialog: null, data: undefined });\n\n\t// Because all modals will be rendered, only control the closing logic\n\tconst handleOpenChange = (open: boolean) => {\n\t\tif (!open) {\n\t\t\thandleCloseDialog();\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<GlobalConcurrencyLimitsHeader onAdd={handleAddRow} />\n\t\t\t{data.length === 0 ? (\n\t\t\t\t<GlobalConcurrencyLimitsEmptyState onAdd={handleAddRow} />\n\t\t\t) : (\n\t\t\t\t<GlobalConcurrencyLimitsDataTable\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonEditRow={handleEditRow}\n\t\t\t\t\tonDeleteRow={handleDeleteRow}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<GlobalConcurrencyLimitsDialog\n\t\t\t\topenDialog={openDialog}\n\t\t\t\tonCloseDialog={handleCloseDialog}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import type { CellContext } from \"@tanstack/react-table\";\nimport type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\n\ntype ActiveTaskRunCellsProps = CellContext<\n\tTaskRunConcurrencyLimit,\n\tArray<string>\n>;\n\nexport const ActiveTaskRunCells = (props: ActiveTaskRunCellsProps) => {\n\tconst activeTaskRuns = props.getValue();\n\tconst numActiveTaskRuns = activeTaskRuns.length;\n\tif (numActiveTaskRuns === 0) {\n\t\treturn \"None\";\n\t}\n\treturn numActiveTaskRuns;\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type { CellContext } from \"@tanstack/react-table\";\nimport type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\n\ntype TagCellProps = CellContext<TaskRunConcurrencyLimit, string>;\n\nexport const TagCell = (props: TagCellProps) => {\n\tconst tag = props.getValue();\n\tconst id = props.row.original.id;\n\treturn (\n\t\t<Link params={{ id }} to={\"/concurrency-limits/concurrency-limit/$id\"}>\n\t\t\t{tag}\n\t\t</Link>\n\t);\n};\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useDeferredValue, useMemo } from \"react\";\nimport type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\nimport { TaskRunConcurrencyLimitsActionsMenu } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-actions-menu\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\n\nimport { ActiveTaskRunCells } from \"./active-task-runs-cell\";\nimport { TagCell } from \"./tag-cell\";\n\nconst routeApi = getRouteApi(\"/concurrency-limits/\");\nconst columnHelper = createColumnHelper<TaskRunConcurrencyLimit>();\n\nconst createColumns = ({\n\tonDeleteRow,\n\tonResetRow,\n}: {\n\tonDeleteRow: (row: TaskRunConcurrencyLimit) => void;\n\tonResetRow: (row: TaskRunConcurrencyLimit) => void;\n}) => [\n\tcolumnHelper.accessor(\"tag\", {\n\t\theader: \"Tag\",\n\t\tcell: TagCell,\n\t}),\n\tcolumnHelper.accessor(\"concurrency_limit\", {\n\t\theader: \"Slots\",\n\t}),\n\tcolumnHelper.accessor(\"active_slots\", {\n\t\theader: \"Active Task Runs\",\n\t\tcell: ActiveTaskRunCells,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => {\n\t\t\tconst row = props.row.original;\n\t\t\treturn (\n\t\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t\t<TaskRunConcurrencyLimitsActionsMenu\n\t\t\t\t\t\tid={row.id}\n\t\t\t\t\t\tonDelete={() => onDeleteRow(row)}\n\t\t\t\t\t\tonReset={() => onResetRow(row)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t}),\n];\n\ntype TaskRunConcurrencyLimitsDataTableProps = {\n\tdata: Array<TaskRunConcurrencyLimit>;\n\tonDeleteRow: (row: TaskRunConcurrencyLimit) => void;\n\tonResetRow: (row: TaskRunConcurrencyLimit) => void;\n};\n\nexport const TaskRunConcurrencyLimitsDataTable = ({\n\tdata,\n\tonDeleteRow,\n\tonResetRow,\n}: TaskRunConcurrencyLimitsDataTableProps) => {\n\tconst navigate = routeApi.useNavigate();\n\tconst { search } = routeApi.useSearch();\n\tconst deferredSearch = useDeferredValue(search ?? \"\");\n\n\tconst filteredData = useMemo(() => {\n\t\treturn data.filter((row) =>\n\t\t\trow.tag.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\treturn (\n\t\t<Table\n\t\t\tdata={filteredData}\n\t\t\tonDeleteRow={onDeleteRow}\n\t\t\tonResetRow={onResetRow}\n\t\t\tsearchValue={search}\n\t\t\tonSearchChange={(value) =>\n\t\t\t\tvoid navigate({\n\t\t\t\t\tto: \".\",\n\t\t\t\t\tsearch: (prev) => ({ ...prev, search: value }),\n\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n};\n\ntype TableProps = {\n\tdata: Array<TaskRunConcurrencyLimit>;\n\tonDeleteRow: (row: TaskRunConcurrencyLimit) => void;\n\tonResetRow: (row: TaskRunConcurrencyLimit) => void;\n\tonSearchChange: (value: string) => void;\n\tsearchValue: string | undefined;\n};\n\nexport function Table({\n\tdata,\n\tonDeleteRow,\n\tonResetRow,\n\tonSearchChange,\n\tsearchValue,\n}: TableProps) {\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: createColumns({ onDeleteRow, onResetRow }),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(), //load client-side pagination code\n\t});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<SearchInput\n\t\t\t\tclassName=\"max-w-72\"\n\t\t\t\tplaceholder=\"Search active task limit\"\n\t\t\t\tvalue={searchValue}\n\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t/>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n}\n","import { 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\ntype TaskRunConcurrencyLimitsEmptyStateProps = {\n\tonAdd: () => void;\n};\nexport const TaskRunConcurrencyLimitsEmptyState = ({\n\tonAdd,\n}: TaskRunConcurrencyLimitsEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"CircleArrowOutUpRight\" />\n\t\t<EmptyStateTitle>\n\t\t\tAdd a concurrency limit for your task runs\n\t\t</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tCreating a limit allows you to limit the number of tasks running\n\t\t\tsimultaneously with a given tag.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={onAdd}>\n\t\t\t\tAdd Concurrency Limit <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"task-concurrency-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype TaskRunConcurrencyLimitsHeaderProps = {\n\tonAdd: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsHeader = ({\n\tonAdd,\n}: TaskRunConcurrencyLimitsHeaderProps) => {\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\tTask Run Concurrency Limits\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<Button\n\t\t\t\tonClick={onAdd}\n\t\t\t\tsize=\"icon\"\n\t\t\t\tclassName=\"size-7\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\taria-label=\"add task run concurrency limit\"\n\t\t\t>\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport { useCreateTaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\n\nconst formSchema = z.object({\n\ttag: z.string().min(1),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tconcurrency_limit: z\n\t\t.number()\n\t\t.default(0)\n\t\t.or(z.string())\n\t\t.pipe(z.coerce.number()),\n});\n\nconst DEFAULT_VALUES = {\n\ttag: \"\",\n\tconcurrency_limit: 0,\n} as const;\n\ntype TaskRunConcurrencyLimitsCreateDialogProps = {\n\tonOpenChange: (open: boolean) => void;\n\tonSubmit: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsCreateDialog = ({\n\tonOpenChange,\n\tonSubmit,\n}: TaskRunConcurrencyLimitsCreateDialogProps) => {\n\tconst { createTaskRunConcurrencyLimit, isPending } =\n\t\tuseCreateTaskRunConcurrencyLimit();\n\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: DEFAULT_VALUES,\n\t});\n\n\tconst handleAddLimit = (values: z.infer<typeof formSchema>) => {\n\t\tcreateTaskRunConcurrencyLimit(values, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit added\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message = error.message || \"Unknown error while updating limit.\";\n\t\t\t\tform.setError(\"root\", { message });\n\t\t\t},\n\t\t\tonSettled: () => {\n\t\t\t\tform.reset(DEFAULT_VALUES);\n\t\t\t\tonSubmit();\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent aria-describedby={undefined}>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Add Task Run Concurrency Limit</DialogTitle>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<Form {...form}>\n\t\t\t\t\t<form\n\t\t\t\t\t\tonSubmit={(e) => void form.handleSubmit(handleAddLimit)(e)}\n\t\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"tag\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Tag</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"text\" autoComplete=\"off\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"concurrency_limit\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Concurrency Limit</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isPending}>\n\t\t\t\t\t\t\t\tAdd\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</DialogFooter>\n\t\t\t\t\t</form>\n\t\t\t\t</Form>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\nimport { TaskRunConcurrencyLimitsCreateDialog } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-create-dialog\";\nimport { TaskRunConcurrencyLimitsDeleteDialog } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-delete-dialog\";\nimport { TaskRunConcurrencyLimitsResetDialog } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-reset-dialog\";\n\nexport type DialogState =\n\t| { dialog: null | \"create\"; data: undefined }\n\t| {\n\t\t\tdialog: \"reset\" | \"delete\";\n\t\t\tdata: TaskRunConcurrencyLimit;\n\t };\n\nexport const TaskRunConcurrencyLimitDialog = ({\n\topenDialog,\n\tonCloseDialog,\n\tonOpenChange,\n}: {\n\topenDialog: DialogState;\n\tonOpenChange: (open: boolean) => void;\n\tonCloseDialog: () => void;\n}) => {\n\tconst { dialog, data } = openDialog;\n\tswitch (dialog) {\n\t\tcase \"create\":\n\t\t\treturn (\n\t\t\t\t<TaskRunConcurrencyLimitsCreateDialog\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonSubmit={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"reset\":\n\t\t\treturn (\n\t\t\t\t<TaskRunConcurrencyLimitsResetDialog\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonReset={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"delete\":\n\t\t\treturn (\n\t\t\t\t<TaskRunConcurrencyLimitsDeleteDialog\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonDelete={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { useState } from \"react\";\nimport {\n\ttype TaskRunConcurrencyLimit,\n\tuseListTaskRunConcurrencyLimits,\n} from \"@/api/task-run-concurrency-limits\";\n\nimport { TaskRunConcurrencyLimitsDataTable } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table\";\nimport { TaskRunConcurrencyLimitsEmptyState } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-empty-state\";\nimport { TaskRunConcurrencyLimitsHeader } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-header\";\nimport {\n\ttype DialogState,\n\tTaskRunConcurrencyLimitDialog,\n} from \"./task-run-concurrency-limit-dialog\";\n\nexport const TaskRunConcurrencyLimitsView = () => {\n\tconst [openDialog, setOpenDialog] = useState<DialogState>({\n\t\tdialog: null,\n\t\tdata: undefined,\n\t});\n\n\tconst { data } = useListTaskRunConcurrencyLimits();\n\n\tconst handleAddRow = () =>\n\t\tsetOpenDialog({ dialog: \"create\", data: undefined });\n\n\tconst handleDeleteRow = (data: TaskRunConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"delete\", data });\n\n\tconst handleResetRow = (data: TaskRunConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"reset\", data });\n\n\tconst handleCloseDialog = () =>\n\t\tsetOpenDialog({ dialog: null, data: undefined });\n\n\t// Because all modals will be rendered, only control the closing logic\n\tconst handleOpenChange = (open: boolean) => {\n\t\tif (!open) {\n\t\t\thandleCloseDialog();\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<TaskRunConcurrencyLimitsHeader onAdd={handleAddRow} />\n\t\t\t{data.length === 0 ? (\n\t\t\t\t<TaskRunConcurrencyLimitsEmptyState onAdd={handleAddRow} />\n\t\t\t) : (\n\t\t\t\t<TaskRunConcurrencyLimitsDataTable\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonDeleteRow={handleDeleteRow}\n\t\t\t\t\tonResetRow={handleResetRow}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<TaskRunConcurrencyLimitDialog\n\t\t\t\topenDialog={openDialog}\n\t\t\t\tonCloseDialog={handleCloseDialog}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport type { JSX } from \"react\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { TabOptions } from \"@/routes/concurrency-limits\";\n\nconst routeApi = getRouteApi(\"/concurrency-limits/\");\n\ntype TabOptionValues = {\n\t/** Value of search value in url */\n\ttabSearchValue: TabOptions;\n\t/** Display value for the UI */\n\tdisplayValue: string;\n};\n\n/** Maps url tab option to visual name */\nconst TAB_OPTIONS: Record<TabOptions, TabOptionValues> = {\n\tglobal: {\n\t\ttabSearchValue: \"global\",\n\t\tdisplayValue: \"Global\",\n\t},\n\t\"task-run\": {\n\t\ttabSearchValue: \"task-run\",\n\t\tdisplayValue: \"Task Run\",\n\t},\n} as const;\n\ntype ConcurrencyLimitsTabsProps = {\n\tglobalView: React.ReactNode;\n\ttaskRunView: React.ReactNode;\n};\n\n// TODO: Move Tabs for navigation to a generic styled component\n\nexport const ConcurrencyLimitsTabs = ({\n\tglobalView,\n\ttaskRunView,\n}: ConcurrencyLimitsTabsProps): JSX.Element => {\n\tconst { tab } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\treturn (\n\t\t<Tabs defaultValue=\"Global\" value={tab}>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger\n\t\t\t\t\tvalue={TAB_OPTIONS.global.tabSearchValue}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/concurrency-limits\",\n\t\t\t\t\t\t\tsearch: {\n\t\t\t\t\t\t\t\ttab: TAB_OPTIONS.global.tabSearchValue,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{TAB_OPTIONS.global.displayValue}\n\t\t\t\t</TabsTrigger>\n\t\t\t\t<TabsTrigger\n\t\t\t\t\tvalue={TAB_OPTIONS[\"task-run\"].tabSearchValue}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/concurrency-limits\",\n\t\t\t\t\t\t\tsearch: {\n\t\t\t\t\t\t\t\ttab: TAB_OPTIONS[\"task-run\"].tabSearchValue,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{TAB_OPTIONS[\"task-run\"].displayValue}\n\t\t\t\t</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value={TAB_OPTIONS.global.tabSearchValue}>\n\t\t\t\t{globalView}\n\t\t\t</TabsContent>\n\t\t\t<TabsContent value={TAB_OPTIONS[\"task-run\"].tabSearchValue}>\n\t\t\t\t{taskRunView}\n\t\t\t</TabsContent>\n\t\t</Tabs>\n\t);\n};\n","import { GlobalConcurrencyLimitsView } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-view\";\nimport { TaskRunConcurrencyLimitsView } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-view\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nimport { ConcurrencyLimitsTabs } from \"./concurrency-limits-tabs\";\n\nexport const ConcurrencyLimitsPage = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ConcurrencyLimitTitle />\n\t\t\t<ConcurrencyLimitsTabs\n\t\t\t\tglobalView={<GlobalConcurrencyLimitsView />}\n\t\t\t\ttaskRunView={<TaskRunConcurrencyLimitsView />}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nconst ConcurrencyLimitTitle = () => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\tConcurrency\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListGlobalConcurrencyLimitsQuery } from \"@/api/global-concurrency-limits\";\nimport { buildListTaskRunConcurrencyLimitsQuery } from \"@/api/task-run-concurrency-limits\";\nimport { ConcurrencyLimitsPage } from \"@/components/concurrency/concurrency-limits-page\";\n\n/**\n * Schema for validating URL search parameters for the Concurrency Limits page.\n * @property {string} search used to filter data table\n * @property {'global' | 'task-run'} tab used designate which tab view to display\n */\nconst searchParams = z.object({\n\tsearch: z.string().optional(),\n\ttab: z.enum([\"global\", \"task-run\"]).default(\"global\"),\n});\n\nexport type TabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nexport const Route = createFileRoute(\"/concurrency-limits/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: ConcurrencyLimitsPage,\n\twrapInSuspense: true,\n\tloader: ({ context }) =>\n\t\tPromise.all([\n\t\t\tcontext.queryClient.ensureQueryData(\n\t\t\t\tbuildListGlobalConcurrencyLimitsQuery(),\n\t\t\t),\n\t\t\tcontext.queryClient.ensureQueryData(\n\t\t\t\tbuildListTaskRunConcurrencyLimitsQuery(),\n\t\t\t),\n\t\t]),\n});\n"],"names":["ActionsCell","onEditRow","onDeleteRow","props","handleCopyId","id","toast","row","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","ActiveCell","updateGlobalConcurrencyLimit","useUpdateGlobalConcurrencyLimit","handleCheckedChange","checked","error","message","rowActive","rowId","Switch","routeApi","getRouteApi","columnHelper","createColumnHelper","createColumns","GlobalConcurrencyLimitsDataTable","data","navigate","search","deferredSearch","useDeferredValue","filteredData","useMemo","Table","value","prev","onSearchChange","searchValue","table","useReactTable","getCoreRowModel","getPaginationRowModel","SearchInput","e","DataTable","GlobalConcurrencyLimitsEmptyState","onAdd","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","GlobalConcurrencyLimitsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","formSchema","z.object","z.boolean","z.number","z.string","z.coerce","DEFAULT_VALUES","useCreateOrEditGlobalConcurrencyLimitForm","limitToUpdate","onSubmit","createGlobalConcurrencyLimit","createStatus","useCreateGlobalConcurrencyLimit","updateStatus","form","useForm","zodResolver","useEffect","active","name","limit","slot_decay_per_second","active_slots","values","onSettled","GlobalConcurrencyLimitsCreateOrEditDialog","onOpenChange","isLoading","saveOrUpdate","dialogTitle","Dialog","DialogContent","DialogHeader","DialogTitle","Form","FormMessage","FormField","field","FormItem","FormLabel","FormControl","Input","DialogFooter","DialogTrigger","GlobalConcurrencyLimitsDeleteDialog","onDelete","deleteGlobalConcurrencyLimit","isPending","useDeleteGlobalConcurrencyLimit","handleOnClick","DialogDescription","GlobalConcurrencyLimitsDialog","openDialog","onCloseDialog","dialog","GlobalConcurrencyLimitsView","setOpenDialog","useState","useListGlobalConcurrencyLimits","handleAddRow","handleEditRow","handleDeleteRow","handleCloseDialog","handleOpenChange","open","ActiveTaskRunCells","numActiveTaskRuns","TagCell","tag","Link","onResetRow","TaskRunConcurrencyLimitsActionsMenu","TaskRunConcurrencyLimitsDataTable","TaskRunConcurrencyLimitsEmptyState","TaskRunConcurrencyLimitsHeader","TaskRunConcurrencyLimitsCreateDialog","createTaskRunConcurrencyLimit","useCreateTaskRunConcurrencyLimit","handleAddLimit","TaskRunConcurrencyLimitDialog","TaskRunConcurrencyLimitsResetDialog","TaskRunConcurrencyLimitsDeleteDialog","TaskRunConcurrencyLimitsView","useListTaskRunConcurrencyLimits","handleResetRow","TAB_OPTIONS","ConcurrencyLimitsTabs","globalView","taskRunView","tab","Tabs","TabsList","TabsTrigger","TabsContent","ConcurrencyLimitsPage","ConcurrencyLimitTitle","z","string","optional","default","SplitComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-7i4X9TeK.js","sources":["../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table/actions-cell.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table/active-cell.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table/global-concurrency-limits-data-table.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-empty-state/global-concurrency-limits-empty-state.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-header/global-concurrency-limits-header.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-create-or-edit-dialog/use-create-or-edit-global-concurrency-limit-form.ts","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-create-or-edit-dialog/global-concurrency-limits-create-or-edit-dialog.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-delete-dialog/global-concurrency-limits-delete-dialog.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-view/global-conccurency-limits-dialog.tsx","../../src/components/concurrency/global-concurrency-limits/global-concurrency-limits-view/index.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table/active-task-runs-cell.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table/tag-cell.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table/task-run-concurrency-limits-data-table.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-empty-state/task-run-concurrency-limits-empty-state.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-header/task-run-concurrency-limits-header.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-create-dialog/task-run-concurrency-limits-create-dialog.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-view/task-run-concurrency-limit-dialog.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-view/index.tsx","../../src/components/concurrency/concurrency-limits-tabs.tsx","../../src/components/concurrency/concurrency-limits-page.tsx","../../src/routes/concurrency-limits/index.tsx?tsr-split=component"],"sourcesContent":["import type { CellContext } from \"@tanstack/react-table\";\nimport { toast } from \"sonner\";\nimport type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype ActionsCellProps = CellContext<GlobalConcurrencyLimit, unknown> & {\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n};\n\nexport const ActionsCell = ({\n\tonEditRow,\n\tonDeleteRow,\n\t...props\n}: ActionsCellProps) => {\n\tconst handleCopyId = (id: string) => {\n\t\tvoid navigator.clipboard.writeText(id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\tconst row = props.row.original;\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={() => handleCopyId(row.id)}>\n\t\t\t\t\tCopy ID\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={() => onDeleteRow(row)}>\n\t\t\t\t\tDelete\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={() => onEditRow(row)}>Edit</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import type { CellContext } from \"@tanstack/react-table\";\nimport { toast } from \"sonner\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseUpdateGlobalConcurrencyLimit,\n} from \"@/api/global-concurrency-limits\";\nimport { Switch } from \"@/components/ui/switch\";\n\nexport const ActiveCell = (\n\tprops: CellContext<GlobalConcurrencyLimit, boolean>,\n) => {\n\tconst { updateGlobalConcurrencyLimit } = useUpdateGlobalConcurrencyLimit();\n\n\tconst handleCheckedChange = (checked: boolean, id: string) => {\n\t\tupdateGlobalConcurrencyLimit(\n\t\t\t{\n\t\t\t\tid_or_name: id,\n\t\t\t\tactive: checked,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Concurrency limit updated\");\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while updating active field.\";\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst rowActive = props.getValue();\n\tconst rowId = props.row.original.id;\n\n\treturn (\n\t\t<Switch\n\t\t\taria-label=\"toggle active\"\n\t\t\tchecked={rowActive}\n\t\t\tonCheckedChange={(checked) => handleCheckedChange(checked, rowId)}\n\t\t/>\n\t);\n};\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useDeferredValue, useMemo } from \"react\";\nimport type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { ActionsCell } from \"./actions-cell\";\nimport { ActiveCell } from \"./active-cell\";\n\nconst routeApi = getRouteApi(\"/concurrency-limits/\");\n\nconst columnHelper = createColumnHelper<GlobalConcurrencyLimit>();\n\nconst createColumns = ({\n\tonEditRow,\n\tonDeleteRow,\n}: {\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n}) => [\n\tcolumnHelper.accessor(\"name\", {\n\t\theader: \"Name\",\n\t}),\n\tcolumnHelper.accessor(\"limit\", {\n\t\theader: \"Limit\",\n\t}),\n\tcolumnHelper.accessor(\"active_slots\", {\n\t\theader: \"Active Slots\",\n\t}),\n\tcolumnHelper.accessor(\"slot_decay_per_second\", {\n\t\theader: \"Slots Decay Per Second\",\n\t}),\n\tcolumnHelper.accessor(\"active\", {\n\t\theader: \"Active\",\n\t\tcell: ActiveCell,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => (\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<ActionsCell\n\t\t\t\t\t{...props}\n\t\t\t\t\tonEditRow={onEditRow}\n\t\t\t\t\tonDeleteRow={onDeleteRow}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t),\n\t}),\n];\n\ntype GlobalConcurrencyLimitsDataTableProps = {\n\tdata: Array<GlobalConcurrencyLimit>;\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n};\n\nexport const GlobalConcurrencyLimitsDataTable = ({\n\tdata,\n\tonEditRow,\n\tonDeleteRow,\n}: GlobalConcurrencyLimitsDataTableProps) => {\n\tconst navigate = routeApi.useNavigate();\n\tconst { search } = routeApi.useSearch();\n\tconst deferredSearch = useDeferredValue(search ?? \"\");\n\n\tconst filteredData = useMemo(() => {\n\t\treturn data.filter((row) =>\n\t\t\trow.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\treturn (\n\t\t<Table\n\t\t\tdata={filteredData}\n\t\t\tonDeleteRow={onDeleteRow}\n\t\t\tonEditRow={onEditRow}\n\t\t\tsearchValue={search}\n\t\t\tonSearchChange={(value) =>\n\t\t\t\tvoid navigate({\n\t\t\t\t\tto: \".\",\n\t\t\t\t\tsearch: (prev) => ({ ...prev, search: value }),\n\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n};\n\ntype TableProps = {\n\tdata: Array<GlobalConcurrencyLimit>;\n\tonDeleteRow: (row: GlobalConcurrencyLimit) => void;\n\tonEditRow: (row: GlobalConcurrencyLimit) => void;\n\tonSearchChange: (value: string) => void;\n\tsearchValue: string | undefined;\n};\n\nexport function Table({\n\tdata,\n\tonDeleteRow,\n\tonEditRow,\n\tonSearchChange,\n\tsearchValue,\n}: TableProps) {\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: createColumns({ onDeleteRow, onEditRow }),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(), //load client-side pagination code\n\t});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<SearchInput\n\t\t\t\tclassName=\"max-w-72\"\n\t\t\t\tplaceholder=\"Search global concurrency limit\"\n\t\t\t\tvalue={searchValue}\n\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t/>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n}\n","import { 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\ntype GlobalConcurrencyLimitsEmptyStateProps = {\n\tonAdd: () => void;\n};\nexport const GlobalConcurrencyLimitsEmptyState = ({\n\tonAdd,\n}: GlobalConcurrencyLimitsEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"AlignVerticalJustifyStart\" />\n\t\t<EmptyStateTitle>Add a concurrency limit</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tGlobal concurrency limits can be applied to flow runs, task runs and any\n\t\t\toperation where you want to control concurrency.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={onAdd}>\n\t\t\t\tAdd Concurrency Limit <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"global-concurrency-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype GlobalConcurrencyLimitsHeaderProps = {\n\tonAdd: () => void;\n};\n\nexport const GlobalConcurrencyLimitsHeader = ({\n\tonAdd,\n}: GlobalConcurrencyLimitsHeaderProps) => {\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\tGlobal Concurrency Limits\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<Button\n\t\t\t\tonClick={onAdd}\n\t\t\t\tsize=\"icon\"\n\t\t\t\tclassName=\"size-7\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\taria-label=\"add global concurrency limit\"\n\t\t\t>\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useEffect } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseCreateGlobalConcurrencyLimit,\n\tuseUpdateGlobalConcurrencyLimit,\n} from \"@/api/global-concurrency-limits\";\n\nconst formSchema = z.object({\n\tactive: z.boolean().default(true),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tdenied_slots: z.number().default(0).or(z.string()).pipe(z.coerce.number()),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tlimit: z.number().default(0).or(z.string()).pipe(z.coerce.number()),\n\tname: z\n\t\t.string()\n\t\t.min(2, { message: \"Name must be at least 2 characters\" })\n\t\t.default(\"\"),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tslot_decay_per_second: z\n\t\t.number()\n\t\t.default(0)\n\t\t.or(z.string())\n\t\t.pipe(z.coerce.number()),\n\t/** Additional fields post creation. Coerce to solve common issue of transforming a string number to a number type */\n\tactive_slots: z.number().default(0).or(z.string()).pipe(z.coerce.number()),\n});\n\nconst DEFAULT_VALUES = {\n\tactive: true,\n\tname: \"\",\n\tlimit: 0,\n\tslot_decay_per_second: 0,\n\tdenied_slots: 0,\n\tactive_slots: 0,\n} as const;\n\ntype UseCreateOrEditGlobalConcurrencyLimitFormOptions = {\n\t/** Limit to edit. Pass undefined if creating a new limit */\n\tlimitToUpdate: GlobalConcurrencyLimit | undefined;\n\t/** Callback after hitting Save or Update */\n\tonSubmit: () => void;\n};\n\nexport const useCreateOrEditGlobalConcurrencyLimitForm = ({\n\tlimitToUpdate,\n\tonSubmit,\n}: UseCreateOrEditGlobalConcurrencyLimitFormOptions) => {\n\tconst { createGlobalConcurrencyLimit, status: createStatus } =\n\t\tuseCreateGlobalConcurrencyLimit();\n\tconst { updateGlobalConcurrencyLimit, status: updateStatus } =\n\t\tuseUpdateGlobalConcurrencyLimit();\n\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: DEFAULT_VALUES,\n\t});\n\n\t// Sync form data with limit-to-edit data\n\tuseEffect(() => {\n\t\tif (limitToUpdate) {\n\t\t\tconst { active, name, limit, slot_decay_per_second, active_slots } =\n\t\t\t\tlimitToUpdate;\n\t\t\tform.reset({ active, name, limit, slot_decay_per_second, active_slots });\n\t\t} else {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t}\n\t}, [form, limitToUpdate]);\n\n\tconst saveOrUpdate = (values: z.infer<typeof formSchema>) => {\n\t\tconst onSettled = () => {\n\t\t\tform.reset(DEFAULT_VALUES);\n\t\t\tonSubmit();\n\t\t};\n\n\t\tif (limitToUpdate?.id) {\n\t\t\tupdateGlobalConcurrencyLimit(\n\t\t\t\t{\n\t\t\t\t\tid_or_name: limitToUpdate.id,\n\t\t\t\t\t...values,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Limit updated\");\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror.message || \"Unknown error while updating limit.\";\n\t\t\t\t\t\tform.setError(\"root\", { message });\n\t\t\t\t\t},\n\t\t\t\t\tonSettled,\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\tcreateGlobalConcurrencyLimit(values, {\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Limit created\");\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while creating variable.\";\n\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonSettled,\n\t\t\t});\n\t\t}\n\t};\n\n\treturn {\n\t\tform,\n\t\tsaveOrUpdate,\n\t\tisLoading: createStatus === \"pending\" || updateStatus === \"pending\",\n\t};\n};\n","import type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { Switch } from \"@/components/ui/switch\";\n\nimport { useCreateOrEditGlobalConcurrencyLimitForm } from \"./use-create-or-edit-global-concurrency-limit-form\";\n\ntype GlobalConcurrencyLimitsCreateOrEditDialogProps = {\n\tlimitToUpdate?: GlobalConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonSubmit: () => void;\n};\n\nexport const GlobalConcurrencyLimitsCreateOrEditDialog = ({\n\tlimitToUpdate,\n\tonOpenChange,\n\tonSubmit,\n}: GlobalConcurrencyLimitsCreateOrEditDialogProps) => {\n\tconst { form, isLoading, saveOrUpdate } =\n\t\tuseCreateOrEditGlobalConcurrencyLimitForm({\n\t\t\tlimitToUpdate,\n\t\t\tonSubmit,\n\t\t});\n\n\tconst dialogTitle = limitToUpdate\n\t\t? `Update ${limitToUpdate.name}`\n\t\t: \"Add Concurrency Limit\";\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent aria-describedby={undefined}>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<Form {...form}>\n\t\t\t\t\t<form\n\t\t\t\t\t\tonSubmit={(e) => void form.handleSubmit(saveOrUpdate)(e)}\n\t\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"text\" autoComplete=\"off\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"limit\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Concurrency Limit</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"slot_decay_per_second\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Slot Decay Per Second</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{limitToUpdate && (\n\t\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\t\tname=\"active_slots\"\n\t\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t\t<FormLabel>Active Slots</FormLabel>\n\t\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"active\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Active</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t\t\t\t\t\tchecked={field.value}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={field.onChange}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isLoading}>\n\t\t\t\t\t\t\t\t{limitToUpdate ? \"Update\" : \"Save\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</DialogFooter>\n\t\t\t\t\t</form>\n\t\t\t\t</Form>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { toast } from \"sonner\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseDeleteGlobalConcurrencyLimit,\n} from \"@/api/global-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\n\ntype GlobalConcurrencyLimitsDeleteDialogProps = {\n\tlimit: GlobalConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonDelete: () => void;\n};\n\nexport const GlobalConcurrencyLimitsDeleteDialog = ({\n\tlimit,\n\tonOpenChange,\n\tonDelete,\n}: GlobalConcurrencyLimitsDeleteDialogProps) => {\n\tconst { deleteGlobalConcurrencyLimit, isPending } =\n\t\tuseDeleteGlobalConcurrencyLimit();\n\n\tconst handleOnClick = (id: string) => {\n\t\tdeleteGlobalConcurrencyLimit(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit deleted\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while deleting concurrency limit.\";\n\t\t\t\tconsole.error(message);\n\t\t\t},\n\t\t\tonSettled: onDelete,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Delete Concurrency Limit</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>\n\t\t\t\t\tAre you sure you want to delete {limit.name}\n\t\t\t\t</DialogDescription>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\tonClick={() => handleOnClick(limit.id)}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import type { GlobalConcurrencyLimit } from \"@/api/global-concurrency-limits\";\n\nimport { GlobalConcurrencyLimitsCreateOrEditDialog } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-create-or-edit-dialog\";\nimport { GlobalConcurrencyLimitsDeleteDialog } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-delete-dialog\";\n\nexport type DialogState =\n\t| { dialog: null | \"create\"; data: undefined }\n\t| {\n\t\t\tdialog: \"delete\" | \"edit\";\n\t\t\tdata: GlobalConcurrencyLimit;\n\t };\n\nexport const GlobalConcurrencyLimitsDialog = ({\n\topenDialog,\n\tonCloseDialog,\n\tonOpenChange,\n}: {\n\topenDialog: DialogState;\n\tonOpenChange: (open: boolean) => void;\n\tonCloseDialog: () => void;\n}) => {\n\tconst { dialog, data } = openDialog;\n\tswitch (dialog) {\n\t\tcase \"create\":\n\t\t\treturn (\n\t\t\t\t<GlobalConcurrencyLimitsCreateOrEditDialog\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonSubmit={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"delete\":\n\t\t\treturn (\n\t\t\t\t<GlobalConcurrencyLimitsDeleteDialog\n\t\t\t\t\tlimit={data}\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonDelete={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"edit\":\n\t\t\treturn (\n\t\t\t\t<GlobalConcurrencyLimitsCreateOrEditDialog\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tlimitToUpdate={data}\n\t\t\t\t\tonSubmit={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { useState } from \"react\";\nimport {\n\ttype GlobalConcurrencyLimit,\n\tuseListGlobalConcurrencyLimits,\n} from \"@/api/global-concurrency-limits\";\n\nimport { GlobalConcurrencyLimitsDataTable } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-data-table\";\nimport { GlobalConcurrencyLimitsEmptyState } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-empty-state\";\nimport { GlobalConcurrencyLimitsHeader } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-header\";\n\nimport {\n\ttype DialogState,\n\tGlobalConcurrencyLimitsDialog,\n} from \"./global-conccurency-limits-dialog\";\n\nexport const GlobalConcurrencyLimitsView = () => {\n\tconst [openDialog, setOpenDialog] = useState<DialogState>({\n\t\tdialog: null,\n\t\tdata: undefined,\n\t});\n\n\tconst { data } = useListGlobalConcurrencyLimits();\n\n\tconst handleAddRow = () =>\n\t\tsetOpenDialog({ dialog: \"create\", data: undefined });\n\n\tconst handleEditRow = (data: GlobalConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"edit\", data });\n\n\tconst handleDeleteRow = (data: GlobalConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"delete\", data });\n\n\tconst handleCloseDialog = () =>\n\t\tsetOpenDialog({ dialog: null, data: undefined });\n\n\t// Because all modals will be rendered, only control the closing logic\n\tconst handleOpenChange = (open: boolean) => {\n\t\tif (!open) {\n\t\t\thandleCloseDialog();\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<GlobalConcurrencyLimitsHeader onAdd={handleAddRow} />\n\t\t\t{data.length === 0 ? (\n\t\t\t\t<GlobalConcurrencyLimitsEmptyState onAdd={handleAddRow} />\n\t\t\t) : (\n\t\t\t\t<GlobalConcurrencyLimitsDataTable\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonEditRow={handleEditRow}\n\t\t\t\t\tonDeleteRow={handleDeleteRow}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<GlobalConcurrencyLimitsDialog\n\t\t\t\topenDialog={openDialog}\n\t\t\t\tonCloseDialog={handleCloseDialog}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import type { CellContext } from \"@tanstack/react-table\";\nimport type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\n\ntype ActiveTaskRunCellsProps = CellContext<\n\tTaskRunConcurrencyLimit,\n\tArray<string>\n>;\n\nexport const ActiveTaskRunCells = (props: ActiveTaskRunCellsProps) => {\n\tconst activeTaskRuns = props.getValue();\n\tconst numActiveTaskRuns = activeTaskRuns.length;\n\tif (numActiveTaskRuns === 0) {\n\t\treturn \"None\";\n\t}\n\treturn numActiveTaskRuns;\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type { CellContext } from \"@tanstack/react-table\";\nimport type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\n\ntype TagCellProps = CellContext<TaskRunConcurrencyLimit, string>;\n\nexport const TagCell = (props: TagCellProps) => {\n\tconst tag = props.getValue();\n\tconst id = props.row.original.id;\n\treturn (\n\t\t<Link params={{ id }} to={\"/concurrency-limits/concurrency-limit/$id\"}>\n\t\t\t{tag}\n\t\t</Link>\n\t);\n};\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useDeferredValue, useMemo } from \"react\";\nimport type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\nimport { TaskRunConcurrencyLimitsActionsMenu } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-actions-menu\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\n\nimport { ActiveTaskRunCells } from \"./active-task-runs-cell\";\nimport { TagCell } from \"./tag-cell\";\n\nconst routeApi = getRouteApi(\"/concurrency-limits/\");\nconst columnHelper = createColumnHelper<TaskRunConcurrencyLimit>();\n\nconst createColumns = ({\n\tonDeleteRow,\n\tonResetRow,\n}: {\n\tonDeleteRow: (row: TaskRunConcurrencyLimit) => void;\n\tonResetRow: (row: TaskRunConcurrencyLimit) => void;\n}) => [\n\tcolumnHelper.accessor(\"tag\", {\n\t\theader: \"Tag\",\n\t\tcell: TagCell,\n\t}),\n\tcolumnHelper.accessor(\"concurrency_limit\", {\n\t\theader: \"Slots\",\n\t}),\n\tcolumnHelper.accessor(\"active_slots\", {\n\t\theader: \"Active Task Runs\",\n\t\tcell: ActiveTaskRunCells,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => {\n\t\t\tconst row = props.row.original;\n\t\t\treturn (\n\t\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t\t<TaskRunConcurrencyLimitsActionsMenu\n\t\t\t\t\t\tid={row.id}\n\t\t\t\t\t\tonDelete={() => onDeleteRow(row)}\n\t\t\t\t\t\tonReset={() => onResetRow(row)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t}),\n];\n\ntype TaskRunConcurrencyLimitsDataTableProps = {\n\tdata: Array<TaskRunConcurrencyLimit>;\n\tonDeleteRow: (row: TaskRunConcurrencyLimit) => void;\n\tonResetRow: (row: TaskRunConcurrencyLimit) => void;\n};\n\nexport const TaskRunConcurrencyLimitsDataTable = ({\n\tdata,\n\tonDeleteRow,\n\tonResetRow,\n}: TaskRunConcurrencyLimitsDataTableProps) => {\n\tconst navigate = routeApi.useNavigate();\n\tconst { search } = routeApi.useSearch();\n\tconst deferredSearch = useDeferredValue(search ?? \"\");\n\n\tconst filteredData = useMemo(() => {\n\t\treturn data.filter((row) =>\n\t\t\trow.tag.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\treturn (\n\t\t<Table\n\t\t\tdata={filteredData}\n\t\t\tonDeleteRow={onDeleteRow}\n\t\t\tonResetRow={onResetRow}\n\t\t\tsearchValue={search}\n\t\t\tonSearchChange={(value) =>\n\t\t\t\tvoid navigate({\n\t\t\t\t\tto: \".\",\n\t\t\t\t\tsearch: (prev) => ({ ...prev, search: value }),\n\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n};\n\ntype TableProps = {\n\tdata: Array<TaskRunConcurrencyLimit>;\n\tonDeleteRow: (row: TaskRunConcurrencyLimit) => void;\n\tonResetRow: (row: TaskRunConcurrencyLimit) => void;\n\tonSearchChange: (value: string) => void;\n\tsearchValue: string | undefined;\n};\n\nexport function Table({\n\tdata,\n\tonDeleteRow,\n\tonResetRow,\n\tonSearchChange,\n\tsearchValue,\n}: TableProps) {\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: createColumns({ onDeleteRow, onResetRow }),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(), //load client-side pagination code\n\t});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<SearchInput\n\t\t\t\tclassName=\"max-w-72\"\n\t\t\t\tplaceholder=\"Search active task limit\"\n\t\t\t\tvalue={searchValue}\n\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t/>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n}\n","import { 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\ntype TaskRunConcurrencyLimitsEmptyStateProps = {\n\tonAdd: () => void;\n};\nexport const TaskRunConcurrencyLimitsEmptyState = ({\n\tonAdd,\n}: TaskRunConcurrencyLimitsEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"CircleArrowOutUpRight\" />\n\t\t<EmptyStateTitle>\n\t\t\tAdd a concurrency limit for your task runs\n\t\t</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tCreating a limit allows you to limit the number of tasks running\n\t\t\tsimultaneously with a given tag.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={onAdd}>\n\t\t\t\tAdd Concurrency Limit <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"task-concurrency-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype TaskRunConcurrencyLimitsHeaderProps = {\n\tonAdd: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsHeader = ({\n\tonAdd,\n}: TaskRunConcurrencyLimitsHeaderProps) => {\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\tTask Run Concurrency Limits\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<Button\n\t\t\t\tonClick={onAdd}\n\t\t\t\tsize=\"icon\"\n\t\t\t\tclassName=\"size-7\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\taria-label=\"add task run concurrency limit\"\n\t\t\t>\n\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport { useCreateTaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\n\nconst formSchema = z.object({\n\ttag: z.string().min(1),\n\t/** Coerce to solve common issue of transforming a string number to a number type */\n\tconcurrency_limit: z\n\t\t.number()\n\t\t.default(0)\n\t\t.or(z.string())\n\t\t.pipe(z.coerce.number()),\n});\n\nconst DEFAULT_VALUES = {\n\ttag: \"\",\n\tconcurrency_limit: 0,\n} as const;\n\ntype TaskRunConcurrencyLimitsCreateDialogProps = {\n\tonOpenChange: (open: boolean) => void;\n\tonSubmit: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsCreateDialog = ({\n\tonOpenChange,\n\tonSubmit,\n}: TaskRunConcurrencyLimitsCreateDialogProps) => {\n\tconst { createTaskRunConcurrencyLimit, isPending } =\n\t\tuseCreateTaskRunConcurrencyLimit();\n\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: DEFAULT_VALUES,\n\t});\n\n\tconst handleAddLimit = (values: z.infer<typeof formSchema>) => {\n\t\tcreateTaskRunConcurrencyLimit(values, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit added\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message = error.message || \"Unknown error while updating limit.\";\n\t\t\t\tform.setError(\"root\", { message });\n\t\t\t},\n\t\t\tonSettled: () => {\n\t\t\t\tform.reset(DEFAULT_VALUES);\n\t\t\t\tonSubmit();\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent aria-describedby={undefined}>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Add Task Run Concurrency Limit</DialogTitle>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<Form {...form}>\n\t\t\t\t\t<form\n\t\t\t\t\t\tonSubmit={(e) => void form.handleSubmit(handleAddLimit)(e)}\n\t\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"tag\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Tag</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"text\" autoComplete=\"off\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"concurrency_limit\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Concurrency Limit</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input type=\"number\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isPending}>\n\t\t\t\t\t\t\t\tAdd\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</DialogFooter>\n\t\t\t\t\t</form>\n\t\t\t\t</Form>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import type { TaskRunConcurrencyLimit } from \"@/api/task-run-concurrency-limits\";\nimport { TaskRunConcurrencyLimitsCreateDialog } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-create-dialog\";\nimport { TaskRunConcurrencyLimitsDeleteDialog } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-delete-dialog\";\nimport { TaskRunConcurrencyLimitsResetDialog } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-reset-dialog\";\n\nexport type DialogState =\n\t| { dialog: null | \"create\"; data: undefined }\n\t| {\n\t\t\tdialog: \"reset\" | \"delete\";\n\t\t\tdata: TaskRunConcurrencyLimit;\n\t };\n\nexport const TaskRunConcurrencyLimitDialog = ({\n\topenDialog,\n\tonCloseDialog,\n\tonOpenChange,\n}: {\n\topenDialog: DialogState;\n\tonOpenChange: (open: boolean) => void;\n\tonCloseDialog: () => void;\n}) => {\n\tconst { dialog, data } = openDialog;\n\tswitch (dialog) {\n\t\tcase \"create\":\n\t\t\treturn (\n\t\t\t\t<TaskRunConcurrencyLimitsCreateDialog\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonSubmit={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"reset\":\n\t\t\treturn (\n\t\t\t\t<TaskRunConcurrencyLimitsResetDialog\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonReset={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"delete\":\n\t\t\treturn (\n\t\t\t\t<TaskRunConcurrencyLimitsDeleteDialog\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\tonDelete={onCloseDialog}\n\t\t\t\t/>\n\t\t\t);\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { useState } from \"react\";\nimport {\n\ttype TaskRunConcurrencyLimit,\n\tuseListTaskRunConcurrencyLimits,\n} from \"@/api/task-run-concurrency-limits\";\n\nimport { TaskRunConcurrencyLimitsDataTable } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-data-table\";\nimport { TaskRunConcurrencyLimitsEmptyState } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-empty-state\";\nimport { TaskRunConcurrencyLimitsHeader } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-header\";\nimport {\n\ttype DialogState,\n\tTaskRunConcurrencyLimitDialog,\n} from \"./task-run-concurrency-limit-dialog\";\n\nexport const TaskRunConcurrencyLimitsView = () => {\n\tconst [openDialog, setOpenDialog] = useState<DialogState>({\n\t\tdialog: null,\n\t\tdata: undefined,\n\t});\n\n\tconst { data } = useListTaskRunConcurrencyLimits();\n\n\tconst handleAddRow = () =>\n\t\tsetOpenDialog({ dialog: \"create\", data: undefined });\n\n\tconst handleDeleteRow = (data: TaskRunConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"delete\", data });\n\n\tconst handleResetRow = (data: TaskRunConcurrencyLimit) =>\n\t\tsetOpenDialog({ dialog: \"reset\", data });\n\n\tconst handleCloseDialog = () =>\n\t\tsetOpenDialog({ dialog: null, data: undefined });\n\n\t// Because all modals will be rendered, only control the closing logic\n\tconst handleOpenChange = (open: boolean) => {\n\t\tif (!open) {\n\t\t\thandleCloseDialog();\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<TaskRunConcurrencyLimitsHeader onAdd={handleAddRow} />\n\t\t\t{data.length === 0 ? (\n\t\t\t\t<TaskRunConcurrencyLimitsEmptyState onAdd={handleAddRow} />\n\t\t\t) : (\n\t\t\t\t<TaskRunConcurrencyLimitsDataTable\n\t\t\t\t\tdata={data}\n\t\t\t\t\tonDeleteRow={handleDeleteRow}\n\t\t\t\t\tonResetRow={handleResetRow}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<TaskRunConcurrencyLimitDialog\n\t\t\t\topenDialog={openDialog}\n\t\t\t\tonCloseDialog={handleCloseDialog}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { getRouteApi } from \"@tanstack/react-router\";\nimport type { JSX } from \"react\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { TabOptions } from \"@/routes/concurrency-limits\";\n\nconst routeApi = getRouteApi(\"/concurrency-limits/\");\n\ntype TabOptionValues = {\n\t/** Value of search value in url */\n\ttabSearchValue: TabOptions;\n\t/** Display value for the UI */\n\tdisplayValue: string;\n};\n\n/** Maps url tab option to visual name */\nconst TAB_OPTIONS: Record<TabOptions, TabOptionValues> = {\n\tglobal: {\n\t\ttabSearchValue: \"global\",\n\t\tdisplayValue: \"Global\",\n\t},\n\t\"task-run\": {\n\t\ttabSearchValue: \"task-run\",\n\t\tdisplayValue: \"Task Run\",\n\t},\n} as const;\n\ntype ConcurrencyLimitsTabsProps = {\n\tglobalView: React.ReactNode;\n\ttaskRunView: React.ReactNode;\n};\n\n// TODO: Move Tabs for navigation to a generic styled component\n\nexport const ConcurrencyLimitsTabs = ({\n\tglobalView,\n\ttaskRunView,\n}: ConcurrencyLimitsTabsProps): JSX.Element => {\n\tconst { tab } = routeApi.useSearch();\n\tconst navigate = routeApi.useNavigate();\n\n\treturn (\n\t\t<Tabs defaultValue=\"Global\" value={tab}>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger\n\t\t\t\t\tvalue={TAB_OPTIONS.global.tabSearchValue}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/concurrency-limits\",\n\t\t\t\t\t\t\tsearch: {\n\t\t\t\t\t\t\t\ttab: TAB_OPTIONS.global.tabSearchValue,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{TAB_OPTIONS.global.displayValue}\n\t\t\t\t</TabsTrigger>\n\t\t\t\t<TabsTrigger\n\t\t\t\t\tvalue={TAB_OPTIONS[\"task-run\"].tabSearchValue}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/concurrency-limits\",\n\t\t\t\t\t\t\tsearch: {\n\t\t\t\t\t\t\t\ttab: TAB_OPTIONS[\"task-run\"].tabSearchValue,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{TAB_OPTIONS[\"task-run\"].displayValue}\n\t\t\t\t</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value={TAB_OPTIONS.global.tabSearchValue}>\n\t\t\t\t{globalView}\n\t\t\t</TabsContent>\n\t\t\t<TabsContent value={TAB_OPTIONS[\"task-run\"].tabSearchValue}>\n\t\t\t\t{taskRunView}\n\t\t\t</TabsContent>\n\t\t</Tabs>\n\t);\n};\n","import { GlobalConcurrencyLimitsView } from \"@/components/concurrency/global-concurrency-limits/global-concurrency-limits-view\";\nimport { TaskRunConcurrencyLimitsView } from \"@/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-view\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\nimport { ConcurrencyLimitsTabs } from \"./concurrency-limits-tabs\";\n\nexport const ConcurrencyLimitsPage = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ConcurrencyLimitTitle />\n\t\t\t<ConcurrencyLimitsTabs\n\t\t\t\tglobalView={<GlobalConcurrencyLimitsView />}\n\t\t\t\ttaskRunView={<TaskRunConcurrencyLimitsView />}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nconst ConcurrencyLimitTitle = () => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\tConcurrency\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListGlobalConcurrencyLimitsQuery } from \"@/api/global-concurrency-limits\";\nimport { buildListTaskRunConcurrencyLimitsQuery } from \"@/api/task-run-concurrency-limits\";\nimport { ConcurrencyLimitsPage } from \"@/components/concurrency/concurrency-limits-page\";\n\n/**\n * Schema for validating URL search parameters for the Concurrency Limits page.\n * @property {string} search used to filter data table\n * @property {'global' | 'task-run'} tab used designate which tab view to display\n */\nconst searchParams = z.object({\n\tsearch: z.string().optional(),\n\ttab: z.enum([\"global\", \"task-run\"]).default(\"global\"),\n});\n\nexport type TabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nexport const Route = createFileRoute(\"/concurrency-limits/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: ConcurrencyLimitsPage,\n\twrapInSuspense: true,\n\tloader: ({ context }) =>\n\t\tPromise.all([\n\t\t\tcontext.queryClient.ensureQueryData(\n\t\t\t\tbuildListGlobalConcurrencyLimitsQuery(),\n\t\t\t),\n\t\t\tcontext.queryClient.ensureQueryData(\n\t\t\t\tbuildListTaskRunConcurrencyLimitsQuery(),\n\t\t\t),\n\t\t]),\n});\n"],"names":["ActionsCell","onEditRow","onDeleteRow","props","handleCopyId","id","toast","row","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","ActiveCell","updateGlobalConcurrencyLimit","useUpdateGlobalConcurrencyLimit","handleCheckedChange","checked","error","message","rowActive","rowId","Switch","routeApi","getRouteApi","columnHelper","createColumnHelper","createColumns","GlobalConcurrencyLimitsDataTable","data","navigate","search","deferredSearch","useDeferredValue","filteredData","useMemo","Table","value","prev","onSearchChange","searchValue","table","useReactTable","getCoreRowModel","getPaginationRowModel","SearchInput","e","DataTable","GlobalConcurrencyLimitsEmptyState","onAdd","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","GlobalConcurrencyLimitsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","formSchema","z.object","z.boolean","z.number","z.string","z.coerce","DEFAULT_VALUES","useCreateOrEditGlobalConcurrencyLimitForm","limitToUpdate","onSubmit","createGlobalConcurrencyLimit","createStatus","useCreateGlobalConcurrencyLimit","updateStatus","form","useForm","zodResolver","useEffect","active","name","limit","slot_decay_per_second","active_slots","values","onSettled","GlobalConcurrencyLimitsCreateOrEditDialog","onOpenChange","isLoading","saveOrUpdate","dialogTitle","Dialog","DialogContent","DialogHeader","DialogTitle","Form","FormMessage","FormField","field","FormItem","FormLabel","FormControl","Input","DialogFooter","DialogTrigger","GlobalConcurrencyLimitsDeleteDialog","onDelete","deleteGlobalConcurrencyLimit","isPending","useDeleteGlobalConcurrencyLimit","handleOnClick","DialogDescription","GlobalConcurrencyLimitsDialog","openDialog","onCloseDialog","dialog","GlobalConcurrencyLimitsView","setOpenDialog","useState","useListGlobalConcurrencyLimits","handleAddRow","handleEditRow","handleDeleteRow","handleCloseDialog","handleOpenChange","open","ActiveTaskRunCells","numActiveTaskRuns","TagCell","tag","Link","onResetRow","TaskRunConcurrencyLimitsActionsMenu","TaskRunConcurrencyLimitsDataTable","TaskRunConcurrencyLimitsEmptyState","TaskRunConcurrencyLimitsHeader","TaskRunConcurrencyLimitsCreateDialog","createTaskRunConcurrencyLimit","useCreateTaskRunConcurrencyLimit","handleAddLimit","TaskRunConcurrencyLimitDialog","TaskRunConcurrencyLimitsResetDialog","TaskRunConcurrencyLimitsDeleteDialog","TaskRunConcurrencyLimitsView","useListTaskRunConcurrencyLimits","handleResetRow","TAB_OPTIONS","ConcurrencyLimitsTabs","globalView","taskRunView","tab","Tabs","TabsList","TabsTrigger","TabsContent","ConcurrencyLimitsPage","ConcurrencyLimitTitle","z","string","optional","default","SplitComponent"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as o}from"./vendor-tanstack-BcZfOOfy.js";import{s}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as o}from"./vendor-tanstack-BcZfOOfy.js";import{s}from"./index-m48E4KcG.js";import{R as p}from"./route-error-state-DnBaNT2T.js";import{o as n,e as l,a as m,n as e,s as a}from"./vendor-forms-ClCIacbh.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BAN776s_.js";import"./vendor-date-wwuDAncJ.js";n({name:a().optional(),page:e().int().positive().optional().default(1).catch(1),limit:e().int().positive().max(100).optional().default(10).catch(10),tags:m(a()).optional(),sort:l(["CREATED_DESC","UPDATED_DESC","NAME_ASC","NAME_DESC"]).optional().default("NAME_ASC")}).optional().default({});function h({error:t,reset:i}){const r=s(t,"Failed to load flows");if(r.type!=="server-error"&&r.type!=="client-error")throw t;return o.jsxs("div",{className:"flex flex-col gap-4",children:[o.jsx("div",{children:o.jsx("h1",{className:"text-2xl font-semibold",children:"Flows"})}),o.jsx(p,{error:r,onRetry:i})]})}export{h as errorComponent};
|
|
2
|
+
//# sourceMappingURL=index-BaWDC4da.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-ltOkPb3X.js","sources":["../../src/routes/flows/index.tsx?tsr-split=errorComponent"],"sourcesContent":["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":["z","name","string","optional","page","number","int","positive","default","catch","limit","max","tags","sort","FlowsErrorComponent","error","reset","serverError","categorizeError","type","jsxs","jsx","RouteErrorState"],"mappings":"kWA4BqBA,EACZ,CACPC,KAAMD,EAAEE,EAASC,SAAAA,EACjBC,KAAMJ,EAAEK,EAASC,MAAMC,SAAAA,EAAWJ,SAAAA,EAAWK,QAAQ,CAAC,EAAEC,MAAM,CAAC,EAC/DC,MAAOV,EACLK,EACAC,IAAAA,EACAC,SAAAA,EACAI,IAAI,GAAG,EACPR,SAAAA,EACAK,QAAQ,EAAE,EACVC,MAAM,EAAE,EACVG,KAAMZ,EAAQA,EAAEE,CAAQ,EAAEC,SAAAA,EAC1BU,KAAMb,EACC,CAAC,eAAgB,eAAgB,WAAY,WAAW,CAAC,EAC9DG,WACAK,QAAQ,UAAU,CACrB,CAAC,EACAL,WACAK,QAAQ,CAAA,CAAE,EAgCZ,SAASM,EAAoB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACnE,MAAMC,EAAcC,EAAgBH,EAAO,sBAAsB,EAIjE,GACCE,EAAYE,OAAS,gBACrBF,EAAYE,OAAS,eAErB,MAAMJ,EAGP,OACCK,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,OACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,yBAAyB,iBAAK,CAAA,CAC7C,EACAA,EAAAA,IAACC,EAAA,CAAgB,MAAOL,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
|
|
1
|
+
{"version":3,"file":"index-BaWDC4da.js","sources":["../../src/routes/flows/index.tsx?tsr-split=errorComponent"],"sourcesContent":["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":["z","name","string","optional","page","number","int","positive","default","catch","limit","max","tags","sort","FlowsErrorComponent","error","reset","serverError","categorizeError","type","jsxs","jsx","RouteErrorState"],"mappings":"kWA4BqBA,EACZ,CACPC,KAAMD,EAAEE,EAASC,SAAAA,EACjBC,KAAMJ,EAAEK,EAASC,MAAMC,SAAAA,EAAWJ,SAAAA,EAAWK,QAAQ,CAAC,EAAEC,MAAM,CAAC,EAC/DC,MAAOV,EACLK,EACAC,IAAAA,EACAC,SAAAA,EACAI,IAAI,GAAG,EACPR,SAAAA,EACAK,QAAQ,EAAE,EACVC,MAAM,EAAE,EACVG,KAAMZ,EAAQA,EAAEE,CAAQ,EAAEC,SAAAA,EAC1BU,KAAMb,EACC,CAAC,eAAgB,eAAgB,WAAY,WAAW,CAAC,EAC9DG,WACAK,QAAQ,UAAU,CACrB,CAAC,EACAL,WACAK,QAAQ,CAAA,CAAE,EAgCZ,SAASM,EAAoB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACnE,MAAMC,EAAcC,EAAgBH,EAAO,sBAAsB,EAIjE,GACCE,EAAYE,OAAS,gBACrBF,EAAYE,OAAS,eAErB,MAAMJ,EAGP,OACCK,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,OACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,yBAAyB,iBAAK,CAAA,CAC7C,EACAA,EAAAA,IAACC,EAAA,CAAgB,MAAOL,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
|