prefect 3.6.15__py3-none-any.whl → 3.6.16.dev3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/__init__.py +20 -0
- prefect/_build_info.py +3 -3
- prefect/_internal/analytics/__init__.py +80 -0
- prefect/_internal/analytics/_config.py +2 -0
- prefect/_internal/analytics/ci_detection.py +39 -0
- prefect/_internal/analytics/client.py +132 -0
- prefect/_internal/analytics/device_id.py +55 -0
- prefect/_internal/analytics/emit.py +90 -0
- prefect/_internal/analytics/enabled.py +33 -0
- prefect/_internal/analytics/events.py +14 -0
- prefect/_internal/analytics/milestones.py +177 -0
- prefect/_internal/analytics/notice.py +60 -0
- prefect/_internal/analytics/service.py +238 -0
- prefect/analytics/__init__.py +67 -0
- prefect/deployments/runner.py +20 -0
- prefect/flow_engine.py +16 -0
- prefect/flows.py +8 -0
- prefect/logging/formatters.py +24 -1
- prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js → artifact-card-BclosG8t.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js.map → artifact-card-BclosG8t.js.map} +1 -1
- prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js +2 -0
- prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js.map +1 -0
- prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js → automation-wizard-Bmgt6nn8.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js.map → automation-wizard-Bmgt6nn8.js.map} +1 -1
- prefect/server/ui-v2/assets/automation._id-Ccke3KJz.js +2 -0
- prefect/server/ui-v2/assets/{automation._id-Dn7jABys.js.map → automation._id-Ccke3KJz.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js → automation_._id.edit-BlKPUTVf.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js.map → automation_._id.edit-BlKPUTVf.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js → automations-header-Df2zw3SC.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js.map → automations-header-Df2zw3SC.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js → base-job-template-form-section-oZD6U-RW.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js.map → base-job-template-form-section-oZD6U-RW.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js → block-type-details-CYrdaLot.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js.map → block-type-details-CYrdaLot.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js +2 -0
- prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js.map +1 -0
- prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js → block._id-CBgHrpTP.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js.map → block._id-CBgHrpTP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js → block_._id.edit-CW-kdi4O.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js.map → block_._id.edit-CW-kdi4O.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js → catalog-Brh0kn1I.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js.map → catalog-Brh0kn1I.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog_._slug-MCgzguIZ.js +2 -0
- prefect/server/ui-v2/assets/{catalog_._slug-Bl2J2oI3.js.map → catalog_._slug-MCgzguIZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js → catalog_._slug_.create-DBaeHi9Q.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js.map → catalog_._slug_.create-DBaeHi9Q.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js → collapsible-B_NJS0uJ.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js.map → collapsible-B_NJS0uJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js → concurrency-limit._id-qzNUQzQa.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js.map → concurrency-limit._id-qzNUQzQa.js.map} +1 -1
- prefect/server/ui-v2/assets/create-BwXG6EIb.js +2 -0
- prefect/server/ui-v2/assets/{create-D--LHaji.js.map → create-BwXG6EIb.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-BycfZHGQ.js → create-MoiIE9Ms.js} +2 -2
- prefect/server/ui-v2/assets/{create-BycfZHGQ.js.map → create-MoiIE9Ms.js.map} +1 -1
- prefect/server/ui-v2/assets/data-table-CPkppyg6.js +2 -0
- prefect/server/ui-v2/assets/data-table-CPkppyg6.js.map +1 -0
- prefect/server/ui-v2/assets/delete-confirmation-dialog-CwDK_2QS.js +2 -0
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-DHkm2p8m.js.map → delete-confirmation-dialog-CwDK_2QS.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js → deployment-action-header-Vp9YsCJO.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js.map → deployment-action-header-Vp9YsCJO.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js → deployment-form-CJcg_6DJ.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js.map → deployment-form-CJcg_6DJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js → deployment-links-CIkJIuHh.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js.map → deployment-links-CIkJIuHh.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment._id-C6XrGMp_.js +2 -0
- prefect/server/ui-v2/assets/{deployment._id-Ci9zge5n.js.map → deployment._id-C6XrGMp_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js → deployment._id-CWgTYmTG.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js.map → deployment._id-CWgTYmTG.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-Bg0s0ZJn.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-D9ZWkh8H.js.map → deployment_._id.duplicate-Bg0s0ZJn.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CnoB0UeG.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-CS7sObzC.js.map → deployment_._id.edit-CnoB0UeG.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js → deployment_._id.run-BqPK6rTB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js.map → deployment_._id.run-BqPK6rTB.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js → dropdown-menu-D7Gwbd15.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js.map → dropdown-menu-D7Gwbd15.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js → event-resource-display-CDRgVKd4.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js.map → event-resource-display-CDRgVKd4.js.map} +1 -1
- prefect/server/ui-v2/assets/event._eventDate._eventId-C73GMDkK.js +2 -0
- prefect/server/ui-v2/assets/{event._eventDate._eventId-D7Twzb22.js.map → event._eventDate._eventId-C73GMDkK.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js → flow-run-graph-ckiE3mA9.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js.map → flow-run-graph-ckiE3mA9.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js → flow-run._id-BukrNCAq.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js.map → flow-run._id-BukrNCAq.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js → flow-run._id-CtI5VZ2M.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js.map → flow-run._id-CtI5VZ2M.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-s1UJuakA.js +4 -0
- prefect/server/ui-v2/assets/{flow-run._id-RLy2kBh0.js.map → flow-run._id-s1UJuakA.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js → flow-runs-pagination-SLbYtvaR.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js.map → flow-runs-pagination-SLbYtvaR.js.map} +1 -1
- prefect/server/ui-v2/assets/flow._id-CZ5P0v4N.js +2 -0
- prefect/server/ui-v2/assets/{flow._id-BdQGWPKP.js.map → flow._id-CZ5P0v4N.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-DLrbC7rV.js → form-mws4law8.js} +2 -2
- prefect/server/ui-v2/assets/{form-DLrbC7rV.js.map → form-mws4law8.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-BTAWyeXv.js → header-Bes1LmY7.js} +2 -2
- prefect/server/ui-v2/assets/{header-BTAWyeXv.js.map → header-Bes1LmY7.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-ChFAx5uR.js → header-Bj_zBR-a.js} +2 -2
- prefect/server/ui-v2/assets/{header-ChFAx5uR.js.map → header-Bj_zBR-a.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-CyQqOj1w.js → header-CPxTHSvz.js} +2 -2
- prefect/server/ui-v2/assets/{header-CyQqOj1w.js.map → header-CPxTHSvz.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-m48E4KcG.js → index-B8vo2Lrg.js} +5 -5
- prefect/server/ui-v2/assets/{index-m48E4KcG.js.map → index-B8vo2Lrg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D5RT-SAp.js → index-BBeh-3Nh.js} +2 -2
- prefect/server/ui-v2/assets/{index-D5RT-SAp.js.map → index-BBeh-3Nh.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BLnEvHia.js +2 -0
- prefect/server/ui-v2/assets/{index-7i4X9TeK.js.map → index-BLnEvHia.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BpKoubXu.js +2 -0
- prefect/server/ui-v2/assets/index-BpKoubXu.js.map +1 -0
- prefect/server/ui-v2/assets/index-By6YGqR3.js +2 -0
- prefect/server/ui-v2/assets/index-By6YGqR3.js.map +1 -0
- prefect/server/ui-v2/assets/index-CEi3BlKI.js +2 -0
- prefect/server/ui-v2/assets/index-CEi3BlKI.js.map +1 -0
- prefect/server/ui-v2/assets/{index-BaWDC4da.js → index-CS-zxv7Z.js} +2 -2
- prefect/server/ui-v2/assets/{index-BaWDC4da.js.map → index-CS-zxv7Z.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-kP_I5Qfd.js → index-CToHKh4q.js} +2 -2
- prefect/server/ui-v2/assets/{index-kP_I5Qfd.js.map → index-CToHKh4q.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CKGj5lSu.js → index-CUVvZndW.js} +2 -2
- prefect/server/ui-v2/assets/{index-CKGj5lSu.js.map → index-CUVvZndW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CxUfZRkN.js → index-CYVn-I3i.js} +2 -2
- prefect/server/ui-v2/assets/{index-CxUfZRkN.js.map → index-CYVn-I3i.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CnlN-VC_.js → index-Cun0JN4t.js} +2 -2
- prefect/server/ui-v2/assets/{index-CnlN-VC_.js.map → index-Cun0JN4t.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BwCLKpNb.js → index-D6ynV6U7.js} +2 -2
- prefect/server/ui-v2/assets/{index-BwCLKpNb.js.map → index-D6ynV6U7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CHf6xi9j.js → index-DdNUJLRW.js} +2 -2
- prefect/server/ui-v2/assets/{index-CHf6xi9j.js.map → index-DdNUJLRW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CQnWiUE5.js → index-DlHOXQhu.js} +2 -2
- prefect/server/ui-v2/assets/{index-CQnWiUE5.js.map → index-DlHOXQhu.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js → index-DyVw8YE8.js} +2 -2
- prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js.map → index-DyVw8YE8.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Btb_-PDp.js → index-DzRz7D2P.js} +2 -2
- prefect/server/ui-v2/assets/{index-Btb_-PDp.js.map → index-DzRz7D2P.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DQGif3jm.js → index-DzUcVNZg.js} +2 -2
- prefect/server/ui-v2/assets/{index-DQGif3jm.js.map → index-DzUcVNZg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DNh9ZBy4.js → index-IBvMMs6S.js} +2 -2
- prefect/server/ui-v2/assets/{index-DNh9ZBy4.js.map → index-IBvMMs6S.js.map} +1 -1
- prefect/server/ui-v2/assets/index-_kpA__te.js +2 -0
- prefect/server/ui-v2/assets/{index-CiSFHkhI.js.map → index-_kpA__te.js.map} +1 -1
- prefect/server/ui-v2/assets/index-m9O-nIOl.css +1 -0
- prefect/server/ui-v2/assets/{index-lyQav_XM.js → index-wOvyf10b.js} +2 -2
- prefect/server/ui-v2/assets/{index-lyQav_XM.js.map → index-wOvyf10b.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js → json-input-Ce-HlRqa.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js.map → json-input-Ce-HlRqa.js.map} +1 -1
- prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js → key-value-XHEZOtZX.js} +2 -2
- prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js.map → key-value-XHEZOtZX.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js → key._key-LpsMf3zD.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js.map → key._key-LpsMf3zD.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js → lazy-markdown-1Hz0xzca.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js.map → lazy-markdown-1Hz0xzca.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-DxMF9Jvj.js → login-D5uepl9L.js} +2 -2
- prefect/server/ui-v2/assets/{login-DxMF9Jvj.js.map → login-D5uepl9L.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js → markdown-input-CG6M9zD0.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js.map → markdown-input-CG6M9zD0.js.map} +1 -1
- prefect/server/ui-v2/assets/python-example-snippet-DRHcUlCX.js +3 -0
- prefect/server/ui-v2/assets/{python-example-snippet-DfCFYPN_.js.map → python-example-snippet-DRHcUlCX.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-mr6GD840.js → python-input-BsUS8fw1.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-mr6GD840.js.map → python-input-BsUS8fw1.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js → radio-group-BUsmwdrt.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js.map → radio-group-BUsmwdrt.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js → route-error-state-BFBpiIhD.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js.map → route-error-state-BFBpiIhD.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-CWDHSME9.js → schema-form-BwTmkvJk.js} +2 -2
- prefect/server/ui-v2/assets/schema-form-BwTmkvJk.js.map +1 -0
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js → schema-form-input-string-format-datetime-nrb3g-JJ.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js.map → schema-form-input-string-format-datetime-nrb3g-JJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-DU5y6tJE.js → settings-CUBtK5aW.js} +2 -2
- prefect/server/ui-v2/assets/{settings-DU5y6tJE.js.map → settings-CUBtK5aW.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js → sort-filter-Cv8zAXMp.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js.map → sort-filter-Cv8zAXMp.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-bBL6C0ZK.js → table-BBNGfPra.js} +2 -2
- prefect/server/ui-v2/assets/{table-bBL6C0ZK.js.map → table-BBNGfPra.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js → tags-input-DHrnkwjQ.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js.map → tags-input-DHrnkwjQ.js.map} +1 -1
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js +2 -0
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-S69sih55.js.map → task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js → task-run._id-BY58gqs2.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js.map → task-run._id-BY58gqs2.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js → task-run._id-u73Jxfqw.js} +3 -3
- prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js.map → task-run._id-u73Jxfqw.js.map} +1 -1
- prefect/server/ui-v2/assets/task-runs-pagination-DUy3147A.js +2 -0
- prefect/server/ui-v2/assets/{task-runs-pagination-VdR-LO4r.js.map → task-runs-pagination-DUy3147A.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js → textarea-DUhh6-kq.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js.map → textarea-DUhh6-kq.js.map} +1 -1
- prefect/server/ui-v2/assets/timezone-select-D4Q6VBtD.js +2 -0
- prefect/server/ui-v2/assets/{timezone-select-BuPYznge.js.map → timezone-select-D4Q6VBtD.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js → toggle-group-7WUJn2Tx.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js.map → toggle-group-7WUJn2Tx.js.map} +1 -1
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-D4AD5Ndf.js +2 -0
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DpdsLH4t.js.map → use-delete-automation-confirmation-dialog-D4AD5Ndf.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js → use-delete-block-document-confirmation-dialog-DnwWEGUY.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js.map → use-delete-block-document-confirmation-dialog-DnwWEGUY.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js → use-flow-runs-selected-rows-C-tehPRB.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js.map → use-flow-runs-selected-rows-C-tehPRB.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js → use-get-artifacts-flow-task-runs-DRWRrmrb.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js.map → use-get-artifacts-flow-task-runs-DRWRrmrb.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js → use-quick-run-B4Xj-YQQ.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js.map → use-quick-run-B4Xj-YQQ.js.map} +1 -1
- prefect/server/ui-v2/assets/use-state-favicon-au2TZdMV.js +2 -0
- prefect/server/ui-v2/assets/{use-state-favicon-M09DmrNy.js.map → use-state-favicon-au2TZdMV.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js → use-stepper-DyIb3vlq.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js.map → use-stepper-DyIb3vlq.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js → utilities-D9Y2wo66.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js.map → utilities-D9Y2wo66.js.map} +1 -1
- prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js +34 -0
- prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js.map +1 -0
- prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js → work-pool-filter-CSOATj2D.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js.map → work-pool-filter-CSOATj2D.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-Dh7B1zMo.js +2 -0
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-BQ9b-Wxy.js.map → work-pool-queue-toggle-Dh7B1zMo.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool._workPoolName-B_NFWXKS.js +2 -0
- prefect/server/ui-v2/assets/{work-pool._workPoolName-C_LiL3SE.js.map → work-pool._workPoolName-B_NFWXKS.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js → work-pool_._workPoolName.edit-Cyzn8g-S.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js.map → work-pool_._workPoolName.edit-Cyzn8g-S.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js.map → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js → work-queue-icon-text-BOpcJ8YU.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js.map → work-queue-icon-text-BOpcJ8YU.js.map} +1 -1
- prefect/server/ui-v2/index.html +3 -3
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/METADATA +2 -1
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/RECORD +223 -211
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js +0 -2
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js.map +0 -1
- prefect/server/ui-v2/assets/automation._id-Dn7jABys.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js.map +0 -1
- prefect/server/ui-v2/assets/catalog_._slug-Bl2J2oI3.js +0 -2
- prefect/server/ui-v2/assets/create-D--LHaji.js +0 -2
- prefect/server/ui-v2/assets/data-table-rlbkLcrY.js +0 -2
- prefect/server/ui-v2/assets/data-table-rlbkLcrY.js.map +0 -1
- prefect/server/ui-v2/assets/delete-confirmation-dialog-DHkm2p8m.js +0 -2
- prefect/server/ui-v2/assets/deployment._id-Ci9zge5n.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-D9ZWkh8H.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-CS7sObzC.js +0 -2
- prefect/server/ui-v2/assets/event._eventDate._eventId-D7Twzb22.js +0 -2
- prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js +0 -4
- prefect/server/ui-v2/assets/flow._id-BdQGWPKP.js +0 -2
- prefect/server/ui-v2/assets/index-7i4X9TeK.js +0 -2
- prefect/server/ui-v2/assets/index-BkiGTHwU.js +0 -2
- prefect/server/ui-v2/assets/index-BkiGTHwU.js.map +0 -1
- prefect/server/ui-v2/assets/index-COouj_0-.css +0 -1
- prefect/server/ui-v2/assets/index-CiSFHkhI.js +0 -2
- prefect/server/ui-v2/assets/index-DATPYZfT.js +0 -2
- prefect/server/ui-v2/assets/index-DATPYZfT.js.map +0 -1
- prefect/server/ui-v2/assets/index-VH4TnZ4e.js +0 -2
- prefect/server/ui-v2/assets/index-VH4TnZ4e.js.map +0 -1
- prefect/server/ui-v2/assets/python-example-snippet-DfCFYPN_.js +0 -3
- prefect/server/ui-v2/assets/schema-form-CWDHSME9.js.map +0 -1
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-S69sih55.js +0 -2
- prefect/server/ui-v2/assets/task-runs-pagination-VdR-LO4r.js +0 -2
- prefect/server/ui-v2/assets/timezone-select-BuPYznge.js +0 -2
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DpdsLH4t.js +0 -2
- prefect/server/ui-v2/assets/use-state-favicon-M09DmrNy.js +0 -2
- prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js +0 -34
- prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js.map +0 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-BQ9b-Wxy.js +0 -2
- prefect/server/ui-v2/assets/work-pool._workPoolName-C_LiL3SE.js +0 -2
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/WHEEL +0 -0
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DzRz7D2P.js","sources":["../../src/components/automations/automations-empty-state/automations-empty-state.tsx","../../src/components/automations/automations-page.tsx","../../src/routes/automations/index.tsx?tsr-split=component"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const AutomationsEmptyState = () => {\n\treturn (\n\t\t<EmptyState>\n\t\t\t<EmptyStateIcon id=\"Bot\" />\n\t\t\t<EmptyStateTitle>Create an automation to get started</EmptyStateTitle>\n\t\t\t<EmptyStateDescription>\n\t\t\t\tAutomations bring reactivity to your data stack and let you configure\n\t\t\t\ttriggers and actions based on events.\n\t\t\t</EmptyStateDescription>\n\t\t\t<EmptyStateActions>\n\t\t\t\t<Link to=\"/automations/create\">\n\t\t\t\t\t<Button>\n\t\t\t\t\t\tAdd Automation <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</Link>\n\t\t\t\t<DocsLink id=\"automations-guide\" />\n\t\t\t</EmptyStateActions>\n\t\t</EmptyState>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { type Automation, buildListAutomationsQuery } from \"@/api/automations\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Card } from \"@/components/ui/card\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { Typography } from \"../ui/typography\";\nimport {\n\tAutomationActions,\n\tAutomationDescription,\n\tAutomationTrigger,\n} from \"./automation-details\";\nimport { AutomationEnableToggle } from \"./automation-enable-toggle\";\nimport { AutomationsActionsMenu } from \"./automations-actions-menu\";\nimport { AutomationsEmptyState } from \"./automations-empty-state\";\nimport { AutomationsHeader } from \"./automations-header\";\nimport { useDeleteAutomationConfirmationDialog } from \"./use-delete-automation-confirmation-dialog\";\n\nexport const AutomationsPage = () => {\n\tconst [dialogState, confirmDelete] = useDeleteAutomationConfirmationDialog();\n\tconst { data } = useSuspenseQuery(buildListAutomationsQuery());\n\n\tconst handleDelete = (automation: Automation) => confirmDelete(automation);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<AutomationsHeader />\n\t\t\t\t{data.length === 0 ? (\n\t\t\t\t\t<AutomationsEmptyState />\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{data.length}{\" \"}\n\t\t\t\t\t\t\t{`${data.length === 1 ? \"automation\" : \"automations\"}`}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t{data.map((automation) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={automation.id}\n\t\t\t\t\t\t\t\t\taria-label={`automation item ${automation.name}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<AutomationCardDetails\n\t\t\t\t\t\t\t\t\t\tautomation={automation}\n\t\t\t\t\t\t\t\t\t\tonDelete={() => handleDelete(automation)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n\ntype AutomationCardDetailsProps = {\n\tautomation: Automation;\n\tonDelete: () => void;\n};\nconst AutomationCardDetails = ({\n\tautomation,\n\tonDelete,\n}: AutomationCardDetailsProps) => {\n\treturn (\n\t\t<Card className=\"p-4 pt-5 flex flex-col gap-6\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<NavHeader automation={automation} />\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<AutomationEnableToggle automation={automation} />\n\t\t\t\t\t<AutomationsActionsMenu id={automation.id} onDelete={onDelete} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t{automation.description && (\n\t\t\t\t\t<AutomationDescription automation={automation} />\n\t\t\t\t)}\n\t\t\t\t<AutomationTrigger automation={automation} />\n\t\t\t\t<AutomationActions automation={automation} />\n\t\t\t</div>\n\t\t</Card>\n\t);\n};\n\ntype NavHeaderProps = {\n\tautomation: Automation;\n};\n\nconst NavHeader = ({ automation }: NavHeaderProps) => {\n\treturn (\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\tto=\"/automations/automation/$id\"\n\t\t\t\t\t\tparams={{ id: automation.id }}\n\t\t\t\t\t\tclassName=\"text-lg\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{automation.name}\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { buildListAutomationsQuery } from \"@/api/automations\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { AutomationsHeader } from \"@/components/automations/automations-header\";\nimport { AutomationsPage } from \"@/components/automations/automations-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nfunction AutomationsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load automations\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<AutomationsHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\n// nb: Currently there is no filtering or search params used on this page\nexport const Route = createFileRoute(\"/automations/\")({\n\tcomponent: AutomationsPage,\n\terrorComponent: AutomationsErrorComponent,\n\tloader: ({ context }) =>\n\t\tcontext.queryClient.ensureQueryData(buildListAutomationsQuery()),\n\twrapInSuspense: true,\n});\n"],"names":["AutomationsEmptyState","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","Link","jsxs","Button","Icon","DocsLink","AutomationsPage","dialogState","confirmDelete","useDeleteAutomationConfirmationDialog","data","useSuspenseQuery","buildListAutomationsQuery","handleDelete","automation","Fragment","AutomationsHeader","Typography","AutomationCardDetails","DeleteConfirmationDialog","onDelete","Card","NavHeader","AutomationEnableToggle","AutomationsActionsMenu","AutomationDescription","AutomationTrigger","AutomationActions","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","SplitComponent"],"mappings":"0vBAYO,MAAMA,EAAwB,WAElCC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAe,GAAG,KAAA,CAAM,EACzBD,EAAAA,IAACE,GAAgB,SAAA,qCAAA,CAAmC,EACpDF,EAAAA,IAACG,GAAsB,SAAA,6GAAA,CAGvB,SACCC,EAAA,CACA,SAAA,CAAAJ,MAACK,EAAA,CAAK,GAAG,sBACR,SAAAC,EAAAA,KAACC,EAAA,CAAO,SAAA,CAAA,kBACQP,EAAAA,IAACQ,EAAA,CAAK,GAAG,OAAO,UAAU,aAAA,CAAc,CAAA,CAAA,CACxD,CAAA,CACD,EACAR,EAAAA,IAACS,EAAA,CAAS,GAAG,mBAAA,CAAoB,CAAA,CAAA,CAClC,CAAA,EACD,ECPWC,EAAkB,IAAM,CACpC,KAAM,CAACC,EAAaC,CAAa,EAAIC,EAAA,EAC/B,CAAE,KAAAC,CAAA,EAASC,EAAiBC,GAA2B,EAEvDC,EAAgBC,GAA2BN,EAAcM,CAAU,EAEzE,OACCZ,EAAAA,KAAAa,WAAA,CACC,SAAA,CAAAb,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAN,EAAAA,IAACoB,EAAA,EAAkB,EAClBN,EAAK,SAAW,EAChBd,EAAAA,IAACF,IAAsB,EAEvBQ,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAA,EAAAA,KAACe,EAAA,CAAW,QAAQ,YAAY,UAAU,wBACxC,SAAA,CAAAP,EAAK,OAAQ,IACb,GAAGA,EAAK,SAAW,EAAI,aAAe,aAAa,EAAA,EACrD,QACC,KAAA,CAAG,UAAU,sBACZ,SAAAA,EAAK,IAAKI,GACVlB,EAAAA,IAAC,KAAA,CAEA,aAAY,mBAAmBkB,EAAW,IAAI,GAE9C,SAAAlB,EAAAA,IAACsB,EAAA,CACA,WAAAJ,EACA,SAAU,IAAMD,EAAaC,CAAU,CAAA,CAAA,CACxC,EANKA,EAAW,EAAA,CAQjB,CAAA,CACF,CAAA,CAAA,CACD,CAAA,EAEF,EACAlB,MAACuB,EAAA,CAA0B,GAAGZ,CAAA,CAAa,CAAA,EAC5C,CAEF,EAMMW,EAAwB,CAAC,CAC9B,WAAAJ,EACA,SAAAM,CACD,IAEElB,EAAAA,KAACmB,EAAA,CAAK,UAAU,+BACf,SAAA,CAAAnB,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAN,MAAC0B,GAAU,WAAAR,EAAwB,EACnCZ,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAN,MAAC2B,GAAuB,WAAAT,EAAwB,EAChDlB,EAAAA,IAAC4B,EAAA,CAAuB,GAAIV,EAAW,GAAI,SAAAM,CAAA,CAAoB,CAAA,CAAA,CAChE,CAAA,EACD,EACAlB,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAY,EAAW,aACXlB,EAAAA,IAAC6B,EAAA,CAAsB,WAAAX,CAAA,CAAwB,EAEhDlB,MAAC8B,GAAkB,WAAAZ,EAAwB,EAC3ClB,MAAC+B,GAAkB,WAAAb,CAAA,CAAwB,CAAA,CAAA,CAC5C,CAAA,EACD,EAQIQ,EAAY,CAAC,CAAE,WAAAR,WAElBc,EAAA,CACA,SAAAhC,EAAAA,IAACiC,GACA,SAAAjC,EAAAA,IAACkC,EAAA,CAAe,UAAU,UACzB,SAAAlC,EAAAA,IAACmC,EAAA,CACA,GAAG,8BACH,OAAQ,CAAE,GAAIjB,EAAW,EAAA,EACzB,UAAU,UAET,SAAAA,EAAW,IAAA,CAAA,CACb,CACD,EACD,EACD,EC/EFkB,EAvBS1B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t,E as h,t as D,r as u}from"./vendor-tanstack-BcZfOOfy.js";import{E as S,t as d,v as C,w as v,x as w,D as j,
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as t,E as h,t as D,r as u}from"./vendor-tanstack-BcZfOOfy.js";import{E as S,t as d,v as C,w as v,x as w,D as j,bg as r,bh as N,bi as _,af as b}from"./index-B8vo2Lrg.js";import{D as E}from"./index-IBvMMs6S.js";import{D as k}from"./header-Bes1LmY7.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BvvJP9Po.js";import"./vendor-forms-ClCIacbh.js";import"./vendor-date-wwuDAncJ.js";import"./use-quick-run-B4Xj-YQQ.js";import"./use-delete-confirmation-dialog-CUdii6Lo.js";import"./data-table-CPkppyg6.js";import"./table-BBNGfPra.js";import"./delete-confirmation-dialog-CwDK_2QS.js";import"./index-DlHOXQhu.js";import"./cronstrue-Bevg0uGw.js";import"./use-is-overflowing-CpSV4NPP.js";import"./index-CUVvZndW.js";import"./tags-input-DHrnkwjQ.js";import"./dropdown-menu-D7Gwbd15.js";const P=()=>t.jsxs(S,{children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx(d,{id:"Workflow"}),t.jsx(d,{id:"MoreHorizontal"}),t.jsx(d,{id:"Rocket"})]}),t.jsx(C,{children:"Create a deployment to get started"}),t.jsx(v,{children:"Deployments elevate workflows from functions you call manually to API objects that can be remotely triggered."}),t.jsx(w,{children:t.jsx(j,{id:"deployments-guide"})})]}),A=e=>({page:e?.page??1,limit:e?.limit??10,sort:e?.sort??"NAME_ASC",deployments:{operator:"and_",flow_or_deployment_name:{like_:e?.flowOrDeploymentName??""},tags:{operator:"and_",all_:e?.tags??[]}}}),F=()=>{const e=r.useSearch(),o=r.useNavigate(),s=(e.page??1)-1,a=e.limit??10,n=u.useMemo(()=>({pageIndex:s,pageSize:a}),[s,a]),p=u.useCallback(i=>{o({to:".",search:l=>({...l,page:i.pageIndex+1,limit:i.pageSize}),replace:!0})},[o]);return[n,p]},O=()=>{const e=r.useSearch(),o=r.useNavigate(),s=a=>{o({to:".",search:n=>({...n,sort:a}),replace:!0})};return[e.sort,s]},M=()=>{const e=r.useSearch(),o=r.useNavigate(),s=u.useMemo(()=>[{id:"flowOrDeploymentName",value:e.flowOrDeploymentName},{id:"tags",value:e.tags}],[e.flowOrDeploymentName,e.tags]),a=u.useCallback(n=>{o({to:".",search:p=>{const i=n.find(m=>m.id==="flowOrDeploymentName")?.value,l=n.find(m=>m.id==="tags")?.value;return{...p,offset:0,flowOrDeploymentName:i,tags:l}},replace:!0})},[o]);return[s,a]};function te(){const e=r.useSearch(),[o,s]=F(),[a,n]=O(),[p,i]=M(),[{data:l},{data:m}]=h({queries:[N(),_(A(e))]}),g=m?.results??[],{data:y}=D(b({flows:{operator:"and_",id:{any_:[...new Set(g.map(c=>c.flow_id))]}},offset:0,sort:"NAME_ASC"})),f=g.map(c=>({...c,flow:y?.find(x=>x.id===c.flow_id)}));return t.jsxs("div",{className:"flex flex-col gap-4",children:[t.jsx(k,{}),l===0?t.jsx(P,{}):t.jsx(E,{deployments:f,currentDeploymentsCount:l,pageCount:m?.pages??0,pagination:o,sort:a,columnFilters:p,onPaginationChange:s,onSortChange:n,onColumnFiltersChange:i})]})}export{te as component};
|
|
2
|
+
//# sourceMappingURL=index-DzUcVNZg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DQGif3jm.js","sources":["../../src/components/deployments/empty-state/index.tsx","../../src/routes/deployments/index.tsx?tsr-split=component"],"sourcesContent":["import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const DeploymentsEmptyState = () => (\n\t<EmptyState>\n\t\t<div className=\"flex items-center gap-3\">\n\t\t\t<EmptyStateIcon id=\"Workflow\" />\n\t\t\t<EmptyStateIcon id=\"MoreHorizontal\" />\n\t\t\t<EmptyStateIcon id=\"Rocket\" />\n\t\t</div>\n\t\t<EmptyStateTitle>Create a deployment to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tDeployments elevate workflows from functions you call manually to API\n\t\t\tobjects that can be remotely triggered.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"deployments-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useQuery, useSuspenseQueries } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\tbuildCountDeploymentsQuery,\n\tbuildPaginateDeploymentsQuery,\n\ttype DeploymentsPaginationFilter,\n} from \"@/api/deployments\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildListFlowsQuery } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport { DeploymentsDataTable } from \"@/components/deployments/data-table\";\nimport { DeploymentsEmptyState } from \"@/components/deployments/empty-state\";\nimport { DeploymentsPageHeader } from \"@/components/deployments/header\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the variables page.\n * @property {number} page - The page number to display. Must be positive. Defaults to 1.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n */\nconst searchParams = z.object({\n\tpage: z.number().int().positive().optional().default(1).catch(1),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\tsort: z\n\t\t.enum([\"NAME_ASC\", \"NAME_DESC\", \"CREATED_DESC\", \"UPDATED_DESC\"])\n\t\t.optional()\n\t\t.default(\"NAME_ASC\")\n\t\t.catch(\"NAME_ASC\"),\n\tflowOrDeploymentName: z.string().optional().catch(\"\"),\n\ttags: z.array(z.string()).optional().catch([]),\n});\n\n/**\n * Builds pagination parameters for deployments query from search params\n *\n * @param search - Optional validated search parameters containing page and limit\n * @returns DeploymentsPaginationFilter with page, limit and sort order\n *\n * @example\n * ```ts\n * const filter = buildPaginationBody({ page: 2, limit: 25 })\n * // Returns { page: 2, limit: 25, sort: \"NAME_ASC\" }\n * ```\n */\nconst buildPaginationBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): DeploymentsPaginationFilter => ({\n\tpage: search?.page ?? 1,\n\tlimit: search?.limit ?? 10,\n\tsort: search?.sort ?? \"NAME_ASC\",\n\tdeployments: {\n\t\toperator: \"and_\",\n\t\tflow_or_deployment_name: { like_: search?.flowOrDeploymentName ?? \"\" },\n\t\ttags: { operator: \"and_\", all_: search?.tags ?? [] },\n\t},\n});\n\nfunction DeploymentsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load deployments\");\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<DeploymentsPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/deployments/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\terrorComponent: DeploymentsErrorComponent,\n\tloaderDeps: ({ search }) => buildPaginationBody(search),\n\tloader: async ({ deps, context }) => {\n\t\t// Get full count of deployments, don't block the UI\n\t\tconst deploymentsCountResult = context.queryClient.ensureQueryData(\n\t\t\tbuildCountDeploymentsQuery(),\n\t\t);\n\n\t\t// Get paginated deployments, wait for the result to get corresponding flows\n\t\tconst deploymentsPaginateResult = await context.queryClient.ensureQueryData(\n\t\t\tbuildPaginateDeploymentsQuery(deps),\n\t\t);\n\n\t\tconst deployments = deploymentsPaginateResult?.results ?? [];\n\n\t\tconst flowIds = [\n\t\t\t...new Set(deployments.map((deployment) => deployment.flow_id)),\n\t\t];\n\n\t\t// Get flows corresponding to the deployments\n\t\tconst flowsFilterResult = context.queryClient.ensureQueryData(\n\t\t\tbuildListFlowsQuery({\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: {\n\t\t\t\t\t\tany_: flowIds,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t}),\n\t\t);\n\n\t\treturn {\n\t\t\tdeploymentsCountResult,\n\t\t\tdeploymentsPaginateResult,\n\t\t\tflowsFilterResult,\n\t\t};\n\t},\n\twrapInSuspense: true,\n});\n\n/**\n * Hook to manage pagination state and navigation for deployments table\n *\n * Handles conversion between 1-based page numbers in the URL and 0-based indices used by React Table.\n * Updates the URL search parameters when pagination changes.\n *\n * @returns A tuple containing:\n * - pagination: Current pagination state with pageIndex and pageSize\n * - onPaginationChange: Callback to update pagination and navigate with new search params\n */\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// React Table uses 0-based pagination, so we need to subtract 1 from the page number\n\tconst pageIndex = (search.page ?? 1) - 1;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\n/**\n * Hook to manage sorting state and navigation for deployments table\n *\n * Handles updating the URL search parameters when sort order changes.\n * Returns the current sort value from URL and a callback to update it.\n *\n * @returns A tuple containing:\n * - sort: Current sort value from URL search params\n * - onSortingChange: Callback to update sort and navigate with new search params\n */\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortingChange = (sort: components[\"schemas\"][\"DeploymentSort\"]) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({ ...prev, sort }),\n\t\t\treplace: true,\n\t\t});\n\t};\n\n\treturn [search.sort, onSortingChange] as const;\n};\n\nconst useDeploymentsColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"flowOrDeploymentName\", value: search.flowOrDeploymentName },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.flowOrDeploymentName, 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 flowOrDeploymentName = newColumnFilters.find(\n\t\t\t\t\t\t(filter) => filter.id === \"flowOrDeploymentName\",\n\t\t\t\t\t)?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tflowOrDeploymentName,\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 RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [columnFilters, onColumnFiltersChange] = useDeploymentsColumnFilters();\n\n\tconst [{ data: deploymentsCount }, { data: deploymentsPage }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildCountDeploymentsQuery(),\n\t\t\t\tbuildPaginateDeploymentsQuery(buildPaginationBody(search)),\n\t\t\t],\n\t\t});\n\n\tconst deployments = deploymentsPage?.results ?? [];\n\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery({\n\t\t\tflows: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: {\n\t\t\t\t\tany_: [\n\t\t\t\t\t\t...new Set(deployments.map((deployment) => deployment.flow_id)),\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst deploymentsWithFlows = deployments.map((deployment) => ({\n\t\t...deployment,\n\t\tflow: flows?.find((flow) => flow.id === deployment.flow_id),\n\t}));\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<DeploymentsPageHeader />\n\t\t\t{deploymentsCount === 0 ? (\n\t\t\t\t<DeploymentsEmptyState />\n\t\t\t) : (\n\t\t\t\t<DeploymentsDataTable\n\t\t\t\t\tdeployments={deploymentsWithFlows}\n\t\t\t\t\tcurrentDeploymentsCount={deploymentsCount}\n\t\t\t\t\tpageCount={deploymentsPage?.pages ?? 0}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tsort={sort}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tonSortChange={onSortChange}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["DeploymentsEmptyState","jsxs","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","buildPaginationBody","search","page","limit","sort","deployments","operator","flow_or_deployment_name","like_","flowOrDeploymentName","tags","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","pageSize","pagination","useMemo","onPaginationChange","useCallback","newPagination","to","prev","replace","useSort","onSortingChange","useDeploymentsColumnFilters","columnFilters","id","value","onColumnFiltersChange","newColumnFilters","find","filter","offset","RouteComponent","onSortChange","data","deploymentsCount","deploymentsPage","useSuspenseQueries","queries","buildCountDeploymentsQuery","buildPaginateDeploymentsQuery","results","flows","useQuery","buildListFlowsQuery","any_","Set","map","deployment","flow_id","deploymentsWithFlows","flow","DeploymentsPageHeader","DeploymentsDataTable","pages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-DzUcVNZg.js","sources":["../../src/components/deployments/empty-state/index.tsx","../../src/routes/deployments/index.tsx?tsr-split=component"],"sourcesContent":["import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const DeploymentsEmptyState = () => (\n\t<EmptyState>\n\t\t<div className=\"flex items-center gap-3\">\n\t\t\t<EmptyStateIcon id=\"Workflow\" />\n\t\t\t<EmptyStateIcon id=\"MoreHorizontal\" />\n\t\t\t<EmptyStateIcon id=\"Rocket\" />\n\t\t</div>\n\t\t<EmptyStateTitle>Create a deployment to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tDeployments elevate workflows from functions you call manually to API\n\t\t\tobjects that can be remotely triggered.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"deployments-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useQuery, useSuspenseQueries } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\tbuildCountDeploymentsQuery,\n\tbuildPaginateDeploymentsQuery,\n\ttype DeploymentsPaginationFilter,\n} from \"@/api/deployments\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildListFlowsQuery } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport { DeploymentsDataTable } from \"@/components/deployments/data-table\";\nimport { DeploymentsEmptyState } from \"@/components/deployments/empty-state\";\nimport { DeploymentsPageHeader } from \"@/components/deployments/header\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the variables page.\n * @property {number} page - The page number to display. Must be positive. Defaults to 1.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n */\nconst searchParams = z.object({\n\tpage: z.number().int().positive().optional().default(1).catch(1),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\tsort: z\n\t\t.enum([\"NAME_ASC\", \"NAME_DESC\", \"CREATED_DESC\", \"UPDATED_DESC\"])\n\t\t.optional()\n\t\t.default(\"NAME_ASC\")\n\t\t.catch(\"NAME_ASC\"),\n\tflowOrDeploymentName: z.string().optional().catch(\"\"),\n\ttags: z.array(z.string()).optional().catch([]),\n});\n\n/**\n * Builds pagination parameters for deployments query from search params\n *\n * @param search - Optional validated search parameters containing page and limit\n * @returns DeploymentsPaginationFilter with page, limit and sort order\n *\n * @example\n * ```ts\n * const filter = buildPaginationBody({ page: 2, limit: 25 })\n * // Returns { page: 2, limit: 25, sort: \"NAME_ASC\" }\n * ```\n */\nconst buildPaginationBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): DeploymentsPaginationFilter => ({\n\tpage: search?.page ?? 1,\n\tlimit: search?.limit ?? 10,\n\tsort: search?.sort ?? \"NAME_ASC\",\n\tdeployments: {\n\t\toperator: \"and_\",\n\t\tflow_or_deployment_name: { like_: search?.flowOrDeploymentName ?? \"\" },\n\t\ttags: { operator: \"and_\", all_: search?.tags ?? [] },\n\t},\n});\n\nfunction DeploymentsErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load deployments\");\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<DeploymentsPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/deployments/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\terrorComponent: DeploymentsErrorComponent,\n\tloaderDeps: ({ search }) => buildPaginationBody(search),\n\tloader: async ({ deps, context }) => {\n\t\t// Get full count of deployments, don't block the UI\n\t\tconst deploymentsCountResult = context.queryClient.ensureQueryData(\n\t\t\tbuildCountDeploymentsQuery(),\n\t\t);\n\n\t\t// Get paginated deployments, wait for the result to get corresponding flows\n\t\tconst deploymentsPaginateResult = await context.queryClient.ensureQueryData(\n\t\t\tbuildPaginateDeploymentsQuery(deps),\n\t\t);\n\n\t\tconst deployments = deploymentsPaginateResult?.results ?? [];\n\n\t\tconst flowIds = [\n\t\t\t...new Set(deployments.map((deployment) => deployment.flow_id)),\n\t\t];\n\n\t\t// Get flows corresponding to the deployments\n\t\tconst flowsFilterResult = context.queryClient.ensureQueryData(\n\t\t\tbuildListFlowsQuery({\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: {\n\t\t\t\t\t\tany_: flowIds,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t}),\n\t\t);\n\n\t\treturn {\n\t\t\tdeploymentsCountResult,\n\t\t\tdeploymentsPaginateResult,\n\t\t\tflowsFilterResult,\n\t\t};\n\t},\n\twrapInSuspense: true,\n});\n\n/**\n * Hook to manage pagination state and navigation for deployments table\n *\n * Handles conversion between 1-based page numbers in the URL and 0-based indices used by React Table.\n * Updates the URL search parameters when pagination changes.\n *\n * @returns A tuple containing:\n * - pagination: Current pagination state with pageIndex and pageSize\n * - onPaginationChange: Callback to update pagination and navigate with new search params\n */\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// React Table uses 0-based pagination, so we need to subtract 1 from the page number\n\tconst pageIndex = (search.page ?? 1) - 1;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\n/**\n * Hook to manage sorting state and navigation for deployments table\n *\n * Handles updating the URL search parameters when sort order changes.\n * Returns the current sort value from URL and a callback to update it.\n *\n * @returns A tuple containing:\n * - sort: Current sort value from URL search params\n * - onSortingChange: Callback to update sort and navigate with new search params\n */\nconst useSort = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortingChange = (sort: components[\"schemas\"][\"DeploymentSort\"]) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({ ...prev, sort }),\n\t\t\treplace: true,\n\t\t});\n\t};\n\n\treturn [search.sort, onSortingChange] as const;\n};\n\nconst useDeploymentsColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"flowOrDeploymentName\", value: search.flowOrDeploymentName },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.flowOrDeploymentName, 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 flowOrDeploymentName = newColumnFilters.find(\n\t\t\t\t\t\t(filter) => filter.id === \"flowOrDeploymentName\",\n\t\t\t\t\t)?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tflowOrDeploymentName,\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 RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [sort, onSortChange] = useSort();\n\tconst [columnFilters, onColumnFiltersChange] = useDeploymentsColumnFilters();\n\n\tconst [{ data: deploymentsCount }, { data: deploymentsPage }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildCountDeploymentsQuery(),\n\t\t\t\tbuildPaginateDeploymentsQuery(buildPaginationBody(search)),\n\t\t\t],\n\t\t});\n\n\tconst deployments = deploymentsPage?.results ?? [];\n\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery({\n\t\t\tflows: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: {\n\t\t\t\t\tany_: [\n\t\t\t\t\t\t...new Set(deployments.map((deployment) => deployment.flow_id)),\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst deploymentsWithFlows = deployments.map((deployment) => ({\n\t\t...deployment,\n\t\tflow: flows?.find((flow) => flow.id === deployment.flow_id),\n\t}));\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<DeploymentsPageHeader />\n\t\t\t{deploymentsCount === 0 ? (\n\t\t\t\t<DeploymentsEmptyState />\n\t\t\t) : (\n\t\t\t\t<DeploymentsDataTable\n\t\t\t\t\tdeployments={deploymentsWithFlows}\n\t\t\t\t\tcurrentDeploymentsCount={deploymentsCount}\n\t\t\t\t\tpageCount={deploymentsPage?.pages ?? 0}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tsort={sort}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tonSortChange={onSortChange}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["DeploymentsEmptyState","jsxs","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","buildPaginationBody","search","page","limit","sort","deployments","operator","flow_or_deployment_name","like_","flowOrDeploymentName","tags","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","pageSize","pagination","useMemo","onPaginationChange","useCallback","newPagination","to","prev","replace","useSort","onSortingChange","useDeploymentsColumnFilters","columnFilters","id","value","onColumnFiltersChange","newColumnFilters","find","filter","offset","RouteComponent","onSortChange","data","deploymentsCount","deploymentsPage","useSuspenseQueries","queries","buildCountDeploymentsQuery","buildPaginateDeploymentsQuery","results","flows","useQuery","buildListFlowsQuery","any_","Set","map","deployment","flow_id","deploymentsWithFlows","flow","DeploymentsPageHeader","DeploymentsDataTable","pages"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as p,t as A,j as e,L as D,C as T,D as B,B as E}from"./vendor-tanstack-BcZfOOfy.js";import{u as I,a as k}from"./use-quick-run-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{r as p,t as A,j as e,L as D,C as T,D as B,B as E}from"./vendor-tanstack-BcZfOOfy.js";import{u as I,a as k}from"./use-quick-run-B4Xj-YQQ.js";import{bQ as M,aR as z,aV as O,q as _,I as P,y as V,U as $,V as Q,S as G,a as U,b as W,c as H,e as j,c7 as L,c8 as Z,$ as q}from"./index-B8vo2Lrg.js";import{D as J}from"./data-table-CPkppyg6.js";import{D as K}from"./delete-confirmation-dialog-CwDK_2QS.js";import{S as X}from"./index-DlHOXQhu.js";import{S as Y}from"./index-CUVvZndW.js";import{T as F}from"./tags-input-DHrnkwjQ.js";import{s as ee,U as se}from"./vendor-date-wwuDAncJ.js";import{D as ae,a as le,b as te,c as ne,d}from"./dropdown-menu-D7Gwbd15.js";const ie=({row:n,onDelete:s})=>{const{id:l,parameters:o}=n.original,{onQuickRun:u,isPending:i}=I();return l?e.jsx("div",{className:"flex flex-row justify-end",children:e.jsxs(ae,{children:[e.jsx(le,{asChild:!0,children:e.jsxs(_,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(P,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(te,{align:"end",children:[e.jsx(ne,{children:"Actions"}),e.jsx(d,{disabled:i,onClick:()=>u(l),children:"Quick Run"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/run",params:{id:l},search:{parameters:o},children:"Custom Run"})}),e.jsx(d,{onClick:()=>{navigator.clipboard.writeText(l),V.success("ID copied")},children:"Copy ID"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/edit",params:{id:l},children:"Edit"})}),e.jsx(d,{onClick:()=>s(n.original),children:"Delete"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/duplicate",params:{id:l},children:"Duplicate"})})]})]})}):null},C=8,re=4,oe=({row:n})=>{const[s,l]=p.useState(0),o=M(s,150),u=p.useCallback(r=>{if(!r)return;const x=()=>{const v=r.getBoundingClientRect().width;l(Math.floor(v/(C+re)))};x();const g=new ResizeObserver(x);return g.observe(r),()=>{g.disconnect()}},[]),{data:i}=A(z({deployments:{operator:"and_",id:{any_:[n.original.id]}},sort:"START_TIME_DESC",limit:o||s,offset:0})),{flow:h,...y}=n.original,c=i?.map(r=>({...r,deployment:y,flow:h}))??[];return e.jsx("div",{className:"w-full",ref:u,children:e.jsx(O,{startDate:ee(new Date,se),endDate:new Date,numberOfBars:o||s,barWidth:C,enrichedFlowRuns:c,className:"h-12 w-full",chartId:n.original.id})})},m=E(),ce=({onDelete:n})=>[m.display({id:"name",header:"Deployment",cell:({row:s})=>e.jsxs("div",{className:"flex flex-col",children:[e.jsx(D,{to:"/deployments/deployment/$id",params:{id:s.original.id},children:e.jsx("span",{className:"text-sm font-medium truncate",title:s.original.name,children:s.original.name})}),s.original.flow&&e.jsx(Z,{flow:s.original.flow,className:"text-xs text-muted-foreground flex items-center gap-1",iconSize:12})]}),size:100}),m.accessor("status",{id:"status",header:"Status",cell:({row:s})=>{const l=s.original.status;return l?e.jsx("div",{className:"min-w-28",children:e.jsx(Y,{status:l})}):null},size:50}),m.display({id:"activity",header:"Activity",cell:s=>e.jsx("div",{className:"flex flex-row gap-2 items-center min-w-28",children:e.jsx(oe,{...s})}),size:300}),m.display({id:"tags",header:()=>null,cell:({row:s})=>e.jsx(q,{tags:s.original.tags??[]})}),m.display({id:"schedules",header:"Schedules",cell:({row:s})=>{const l=s.original.schedules;return!l||l.length===0?null:e.jsx(X,{schedules:l})},size:150}),m.display({id:"actions",cell:s=>e.jsx(ie,{...s,onDelete:n})})],ye=({deployments:n,currentDeploymentsCount:s,pagination:l,pageCount:o,sort:u,columnFilters:i,onPaginationChange:h,onSortChange:y,onColumnFiltersChange:c})=>{const[r,x]=k(),g=i.find(a=>a.id==="flowOrDeploymentName")?.value??"",v=i.find(a=>a.id==="tags")?.value??[],b=p.useCallback(a=>{const t=i.filter(f=>f.id!=="flowOrDeploymentName");c(a?[...t,{id:"flowOrDeploymentName",value:a}]:t)},[c,i]),S=p.useCallback(a=>{const t=Array.isArray(a)?a:a.target.value,f=i.filter(R=>R.id!=="tags");c(t.length?[...f,{id:"tags",value:t}]:f)},[c,i]),w=p.useCallback(a=>{let t=l;typeof a=="function"?t=a(l):t=a,h(t)},[l,h]),N=T({data:n,columns:ce({onDelete:a=>{const t=a.flow?.name?`${a.flow?.name}/${a.name}`:a.name;x({...a,name:t})}}),getCoreRowModel:B(),pageCount:o,manualPagination:!0,defaultColumn:{maxSize:300},state:{pagination:l},onPaginationChange:w});return e.jsxs("div",{children:[e.jsxs("div",{className:"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center",children:[e.jsx("div",{className:"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first",children:e.jsxs("p",{className:"text-sm text-muted-foreground",children:[s," ",$(s,"Deployment")]})}),e.jsx("div",{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",children:e.jsx(Q,{placeholder:"Search deployments",value:g,onChange:a=>b(a.target.value)})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-3",children:e.jsx(F,{placeholder:"Filter by tags",onChange:S,value:v})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-2",children:e.jsxs(G,{value:u,onValueChange:y,children:[e.jsx(U,{"aria-label":"Deployment sort order",className:"w-full",children:e.jsx(W,{placeholder:"Sort by"})}),e.jsxs(H,{children:[e.jsx(j,{value:"CREATED_DESC",children:"Created"}),e.jsx(j,{value:"UPDATED_DESC",children:"Updated"}),e.jsx(j,{value:"NAME_ASC",children:"A to Z"}),e.jsx(j,{value:"NAME_DESC",children:"Z to A"})]})]})})]}),e.jsx(K,{...r}),e.jsx(L,{children:e.jsx(J,{table:N})})]})};export{ye as D};
|
|
2
|
+
//# sourceMappingURL=index-IBvMMs6S.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DNh9ZBy4.js","sources":["../../src/components/deployments/data-table/cells.tsx","../../src/components/deployments/data-table/index.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport type { CellContext } from \"@tanstack/react-table\";\nimport { subSeconds } from \"date-fns\";\nimport { secondsInWeek } from \"date-fns/constants\";\nimport { useCallback, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport { useQuickRun } from \"@/components/deployments/use-quick-run\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Icon } from \"@/components/ui/icons\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype ActionsCellProps = CellContext<DeploymentWithFlow, unknown> & {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n};\n\nexport const ActionsCell = ({ row, onDelete }: ActionsCellProps) => {\n\tconst { id, parameters } = row.original;\n\tconst { onQuickRun, isPending } = useQuickRun();\n\n\tif (!id) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem disabled={isPending} onClick={() => onQuickRun(id)}>\n\t\t\t\t\t\tQuick Run\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/deployments/deployment/$id/run\"\n\t\t\t\t\t\t\tparams={{ id }}\n\t\t\t\t\t\t\tsearch={{ parameters }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCustom Run\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link to=\"/deployments/deployment/$id/edit\" params={{ id }}>\n\t\t\t\t\t\t\tEdit\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onDelete(row.original)}>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link to=\"/deployments/deployment/$id/duplicate\" params={{ id }}>\n\t\t\t\t\t\t\tDuplicate\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nconst BAR_WIDTH = 8;\nconst BAR_GAP = 4;\n\nexport const ActivityCell = ({\n\trow,\n}: CellContext<DeploymentWithFlow, unknown>) => {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\t// Set the initial number of bars based on the chart width\n\t\tupdateBars();\n\n\t\t// Observe the chart for resize events\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => {\n\t\t\t// Clean up the observer\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tconst { data: flowRuns } = useQuery(\n\t\tbuildFilterFlowRunsQuery({\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: {\n\t\t\t\t\tany_: [row.original.id],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: debouncedNumberOfBars || numberOfBars,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst { flow, ...deployment } = row.original;\n\tconst enrichedFlowRuns =\n\t\tflowRuns?.map((flowRun) => ({\n\t\t\t...flowRun,\n\t\t\tdeployment,\n\t\t\tflow,\n\t\t})) ?? [];\n\n\treturn (\n\t\t<div className=\"w-full\" ref={chartRef}>\n\t\t\t<FlowRunActivityBarChart\n\t\t\t\tstartDate={subSeconds(new Date(), secondsInWeek)}\n\t\t\t\tendDate={new Date()}\n\t\t\t\t// If debouncedNumberOfBars is 0, use numberOfBars for an asymmetric debounce to avoid rendering an empty chart on initial paint.\n\t\t\t\tnumberOfBars={debouncedNumberOfBars || numberOfBars}\n\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\tclassName=\"h-12 w-full\"\n\t\t\t\tchartId={row.original.id}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteDeploymentConfirmationDialog } from \"@/components/deployments/use-delete-deployment-confirmation-dialog\";\nimport { FlowIconText } from \"@/components/flows/flow-icon-text\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { FlowRunActivityBarGraphTooltipProvider } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { ScheduleBadgeGroup } from \"@/components/ui/schedule-badge\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ActivityCell } from \"./cells\";\n\nexport type DeploymentsDataTableProps = {\n\tdeployments: DeploymentWithFlow[];\n\tcurrentDeploymentsCount: number;\n\tpageCount: number;\n\tpagination: PaginationState;\n\tsort: components[\"schemas\"][\"DeploymentSort\"];\n\tcolumnFilters: ColumnFiltersState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: components[\"schemas\"][\"DeploymentSort\"]) => void;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n};\n\nconst columnHelper = createColumnHelper<DeploymentWithFlow>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tid: \"name\",\n\t\theader: \"Deployment\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t<Link to=\"/deployments/deployment/$id\" params={{ id: row.original.id }}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium truncate\"\n\t\t\t\t\t\ttitle={row.original.name}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.original.name}\n\t\t\t\t\t</span>\n\t\t\t\t</Link>\n\n\t\t\t\t{row.original.flow && (\n\t\t\t\t\t<FlowIconText\n\t\t\t\t\t\tflow={row.original.flow}\n\t\t\t\t\t\tclassName=\"text-xs text-muted-foreground flex items-center gap-1\"\n\t\t\t\t\t\ticonSize={12}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t),\n\t\tsize: 100,\n\t}),\n\tcolumnHelper.accessor(\"status\", {\n\t\tid: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => {\n\t\t\tconst status = row.original.status;\n\t\t\tif (!status) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"min-w-28\">\n\t\t\t\t\t<StatusBadge status={status} />\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t\tsize: 50,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: (props) => (\n\t\t\t<div className=\"flex flex-row gap-2 items-center min-w-28\">\n\t\t\t\t<ActivityCell {...props} />\n\t\t\t</div>\n\t\t),\n\t\tsize: 300,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"tags\",\n\t\theader: () => null,\n\t\tcell: ({ row }) => <TagBadgeGroup tags={row.original.tags ?? []} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"schedules\",\n\t\theader: \"Schedules\",\n\t\tcell: ({ row }) => {\n\t\t\tconst schedules = row.original.schedules;\n\t\t\tif (!schedules || schedules.length === 0) return null;\n\t\t\treturn <ScheduleBadgeGroup schedules={schedules} />;\n\t\t},\n\t\tsize: 150,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onDelete={onDelete} />,\n\t}),\n];\n\nexport const DeploymentsDataTable = ({\n\tdeployments,\n\tcurrentDeploymentsCount,\n\tpagination,\n\tpageCount,\n\tsort,\n\tcolumnFilters,\n\tonPaginationChange,\n\tonSortChange,\n\tonColumnFiltersChange,\n}: DeploymentsDataTableProps) => {\n\tconst [deleteConfirmationDialogState, confirmDelete] =\n\t\tuseDeleteDeploymentConfirmationDialog();\n\n\tconst nameSearchValue = (columnFilters.find(\n\t\t(filter) => filter.id === \"flowOrDeploymentName\",\n\t)?.value ?? \"\") as string;\n\tconst tagsSearchValue = (columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value ?? []) as string[];\n\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter(\n\t\t\t\t(filter) => filter.id !== \"flowOrDeploymentName\",\n\t\t\t);\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"flowOrDeploymentName\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: deployments,\n\t\tcolumns: createColumns({\n\t\t\tonDelete: (deployment) => {\n\t\t\t\tconst name = deployment.flow?.name\n\t\t\t\t\t? `${deployment.flow?.name}/${deployment.name}`\n\t\t\t\t\t: deployment.name;\n\t\t\t\tconfirmDelete({ ...deployment, name });\n\t\t\t},\n\t\t}),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tpageCount,\n\t\tmanualPagination: true,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t\tstate: {\n\t\t\tpagination,\n\t\t},\n\t\tonPaginationChange: handlePaginationChange,\n\t});\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentDeploymentsCount}{\" \"}\n\t\t\t\t\t\t{pluralize(currentDeploymentsCount, \"Deployment\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search deployments\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sort} onValueChange={onSortChange}>\n\t\t\t\t\t\t<SelectTrigger\n\t\t\t\t\t\t\taria-label=\"Deployment sort order\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t<DataTable table={table} />\n\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\t\t</div>\n\t);\n};\n"],"names":["ActionsCell","row","onDelete","id","parameters","onQuickRun","isPending","useQuickRun","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","Link","toast","BAR_WIDTH","BAR_GAP","ActivityCell","numberOfBars","setNumberOfBars","useState","debouncedNumberOfBars","useDebounce","chartRef","useCallback","node","updateBars","chartWidth","resizeObserver","flowRuns","useQuery","buildFilterFlowRunsQuery","flow","deployment","enrichedFlowRuns","flowRun","FlowRunActivityBarChart","subSeconds","secondsInWeek","columnHelper","createColumnHelper","createColumns","FlowIconText","status","StatusBadge","props","TagBadgeGroup","schedules","ScheduleBadgeGroup","DeploymentsDataTable","deployments","currentDeploymentsCount","pagination","pageCount","sort","columnFilters","onPaginationChange","onSortChange","onColumnFiltersChange","deleteConfirmationDialogState","confirmDelete","useDeleteDeploymentConfirmationDialog","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","value","filters","handleTagsSearchChange","e","tags","handlePaginationChange","updater","newPagination","table","useReactTable","name","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DeleteConfirmationDialog","FlowRunActivityBarGraphTooltipProvider","DataTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-IBvMMs6S.js","sources":["../../src/components/deployments/data-table/cells.tsx","../../src/components/deployments/data-table/index.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport type { CellContext } from \"@tanstack/react-table\";\nimport { subSeconds } from \"date-fns\";\nimport { secondsInWeek } from \"date-fns/constants\";\nimport { useCallback, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport { useQuickRun } from \"@/components/deployments/use-quick-run\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Icon } from \"@/components/ui/icons\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype ActionsCellProps = CellContext<DeploymentWithFlow, unknown> & {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n};\n\nexport const ActionsCell = ({ row, onDelete }: ActionsCellProps) => {\n\tconst { id, parameters } = row.original;\n\tconst { onQuickRun, isPending } = useQuickRun();\n\n\tif (!id) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem disabled={isPending} onClick={() => onQuickRun(id)}>\n\t\t\t\t\t\tQuick Run\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/deployments/deployment/$id/run\"\n\t\t\t\t\t\t\tparams={{ id }}\n\t\t\t\t\t\t\tsearch={{ parameters }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCustom Run\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link to=\"/deployments/deployment/$id/edit\" params={{ id }}>\n\t\t\t\t\t\t\tEdit\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onDelete(row.original)}>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link to=\"/deployments/deployment/$id/duplicate\" params={{ id }}>\n\t\t\t\t\t\t\tDuplicate\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nconst BAR_WIDTH = 8;\nconst BAR_GAP = 4;\n\nexport const ActivityCell = ({\n\trow,\n}: CellContext<DeploymentWithFlow, unknown>) => {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\t// Set the initial number of bars based on the chart width\n\t\tupdateBars();\n\n\t\t// Observe the chart for resize events\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => {\n\t\t\t// Clean up the observer\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tconst { data: flowRuns } = useQuery(\n\t\tbuildFilterFlowRunsQuery({\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: {\n\t\t\t\t\tany_: [row.original.id],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: debouncedNumberOfBars || numberOfBars,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst { flow, ...deployment } = row.original;\n\tconst enrichedFlowRuns =\n\t\tflowRuns?.map((flowRun) => ({\n\t\t\t...flowRun,\n\t\t\tdeployment,\n\t\t\tflow,\n\t\t})) ?? [];\n\n\treturn (\n\t\t<div className=\"w-full\" ref={chartRef}>\n\t\t\t<FlowRunActivityBarChart\n\t\t\t\tstartDate={subSeconds(new Date(), secondsInWeek)}\n\t\t\t\tendDate={new Date()}\n\t\t\t\t// If debouncedNumberOfBars is 0, use numberOfBars for an asymmetric debounce to avoid rendering an empty chart on initial paint.\n\t\t\t\tnumberOfBars={debouncedNumberOfBars || numberOfBars}\n\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\tclassName=\"h-12 w-full\"\n\t\t\t\tchartId={row.original.id}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteDeploymentConfirmationDialog } from \"@/components/deployments/use-delete-deployment-confirmation-dialog\";\nimport { FlowIconText } from \"@/components/flows/flow-icon-text\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { FlowRunActivityBarGraphTooltipProvider } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { ScheduleBadgeGroup } from \"@/components/ui/schedule-badge\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ActivityCell } from \"./cells\";\n\nexport type DeploymentsDataTableProps = {\n\tdeployments: DeploymentWithFlow[];\n\tcurrentDeploymentsCount: number;\n\tpageCount: number;\n\tpagination: PaginationState;\n\tsort: components[\"schemas\"][\"DeploymentSort\"];\n\tcolumnFilters: ColumnFiltersState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: components[\"schemas\"][\"DeploymentSort\"]) => void;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n};\n\nconst columnHelper = createColumnHelper<DeploymentWithFlow>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tid: \"name\",\n\t\theader: \"Deployment\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t<Link to=\"/deployments/deployment/$id\" params={{ id: row.original.id }}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium truncate\"\n\t\t\t\t\t\ttitle={row.original.name}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.original.name}\n\t\t\t\t\t</span>\n\t\t\t\t</Link>\n\n\t\t\t\t{row.original.flow && (\n\t\t\t\t\t<FlowIconText\n\t\t\t\t\t\tflow={row.original.flow}\n\t\t\t\t\t\tclassName=\"text-xs text-muted-foreground flex items-center gap-1\"\n\t\t\t\t\t\ticonSize={12}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t),\n\t\tsize: 100,\n\t}),\n\tcolumnHelper.accessor(\"status\", {\n\t\tid: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => {\n\t\t\tconst status = row.original.status;\n\t\t\tif (!status) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"min-w-28\">\n\t\t\t\t\t<StatusBadge status={status} />\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t\tsize: 50,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: (props) => (\n\t\t\t<div className=\"flex flex-row gap-2 items-center min-w-28\">\n\t\t\t\t<ActivityCell {...props} />\n\t\t\t</div>\n\t\t),\n\t\tsize: 300,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"tags\",\n\t\theader: () => null,\n\t\tcell: ({ row }) => <TagBadgeGroup tags={row.original.tags ?? []} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"schedules\",\n\t\theader: \"Schedules\",\n\t\tcell: ({ row }) => {\n\t\t\tconst schedules = row.original.schedules;\n\t\t\tif (!schedules || schedules.length === 0) return null;\n\t\t\treturn <ScheduleBadgeGroup schedules={schedules} />;\n\t\t},\n\t\tsize: 150,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onDelete={onDelete} />,\n\t}),\n];\n\nexport const DeploymentsDataTable = ({\n\tdeployments,\n\tcurrentDeploymentsCount,\n\tpagination,\n\tpageCount,\n\tsort,\n\tcolumnFilters,\n\tonPaginationChange,\n\tonSortChange,\n\tonColumnFiltersChange,\n}: DeploymentsDataTableProps) => {\n\tconst [deleteConfirmationDialogState, confirmDelete] =\n\t\tuseDeleteDeploymentConfirmationDialog();\n\n\tconst nameSearchValue = (columnFilters.find(\n\t\t(filter) => filter.id === \"flowOrDeploymentName\",\n\t)?.value ?? \"\") as string;\n\tconst tagsSearchValue = (columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value ?? []) as string[];\n\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter(\n\t\t\t\t(filter) => filter.id !== \"flowOrDeploymentName\",\n\t\t\t);\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"flowOrDeploymentName\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: deployments,\n\t\tcolumns: createColumns({\n\t\t\tonDelete: (deployment) => {\n\t\t\t\tconst name = deployment.flow?.name\n\t\t\t\t\t? `${deployment.flow?.name}/${deployment.name}`\n\t\t\t\t\t: deployment.name;\n\t\t\t\tconfirmDelete({ ...deployment, name });\n\t\t\t},\n\t\t}),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tpageCount,\n\t\tmanualPagination: true,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t\tstate: {\n\t\t\tpagination,\n\t\t},\n\t\tonPaginationChange: handlePaginationChange,\n\t});\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentDeploymentsCount}{\" \"}\n\t\t\t\t\t\t{pluralize(currentDeploymentsCount, \"Deployment\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search deployments\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sort} onValueChange={onSortChange}>\n\t\t\t\t\t\t<SelectTrigger\n\t\t\t\t\t\t\taria-label=\"Deployment sort order\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t<DataTable table={table} />\n\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\t\t</div>\n\t);\n};\n"],"names":["ActionsCell","row","onDelete","id","parameters","onQuickRun","isPending","useQuickRun","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","Link","toast","BAR_WIDTH","BAR_GAP","ActivityCell","numberOfBars","setNumberOfBars","useState","debouncedNumberOfBars","useDebounce","chartRef","useCallback","node","updateBars","chartWidth","resizeObserver","flowRuns","useQuery","buildFilterFlowRunsQuery","flow","deployment","enrichedFlowRuns","flowRun","FlowRunActivityBarChart","subSeconds","secondsInWeek","columnHelper","createColumnHelper","createColumns","FlowIconText","status","StatusBadge","props","TagBadgeGroup","schedules","ScheduleBadgeGroup","DeploymentsDataTable","deployments","currentDeploymentsCount","pagination","pageCount","sort","columnFilters","onPaginationChange","onSortChange","onColumnFiltersChange","deleteConfirmationDialogState","confirmDelete","useDeleteDeploymentConfirmationDialog","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","value","filters","handleTagsSearchChange","e","tags","handlePaginationChange","updater","newPagination","table","useReactTable","name","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DeleteConfirmationDialog","FlowRunActivityBarGraphTooltipProvider","DataTable"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as c,j as e,B as J,C as L,D as P,E as H}from"./vendor-tanstack-BcZfOOfy.js";import{X as B,Y as Q,Z,L as R,_ as q,q as E,I as F,y as h,U as G,V as X,S as Y,a as $,b as K,c as W,e as y,$ as ee,E as ae,t as se,v as te,w as ne,x as re,D as le,a0 as oe,a1 as ie,a2 as ce,a3 as de,a4 as ue,a5 as me,a6 as ge,p as pe,a7 as he,a8 as xe,a9 as p,aa as je,ab as T}from"./index-B8vo2Lrg.js";import{D as fe}from"./data-table-CPkppyg6.js";import{T as U}from"./tags-input-DHrnkwjQ.js";import{D as be,a as ve,b as Ce,c as Se,d as C}from"./dropdown-menu-D7Gwbd15.js";import{u as Ve}from"./use-is-overflowing-CpSV4NPP.js";import{V as De}from"./header-CPxTHSvz.js";import{a as ye}from"./zod-Cuos7J7w.js";import{c as Ne,o as Ee,s as A}from"./vendor-forms-ClCIacbh.js";import{F as Ae,a as N,b as k,c as w,d as M,e as I}from"./form-mws4law8.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BvvJP9Po.js";import"./vendor-date-wwuDAncJ.js";import"./table-BBNGfPra.js";const ke=({row:a,onVariableEdit:t})=>{const s=a.original.id,{deleteVariable:n}=q();if(!s)return null;const r=()=>{n(s,{onSuccess:()=>{h.success("Variable deleted")}})};return e.jsx("div",{className:"flex flex-row justify-end",children:e.jsxs(be,{children:[e.jsx(ve,{asChild:!0,children:e.jsxs(E,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(F,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(Ce,{align:"end",children:[e.jsx(Se,{children:"Actions"}),e.jsx(C,{onClick:()=>{navigator.clipboard.writeText(s),h.success("ID copied")},children:"Copy ID"}),e.jsx(C,{onClick:()=>{navigator.clipboard.writeText(a.original.name),h.success("Name copied")},children:"Copy Name"}),e.jsx(C,{onClick:()=>{const l=typeof a.original.value!="string"?JSON.stringify(a.original.value):a.original.value;l&&(navigator.clipboard.writeText(l),h.success("Value copied"))},children:"Copy Value"}),e.jsx(C,{onClick:()=>t(a.original),children:"Edit"}),e.jsx(C,{onClick:r,children:"Delete"})]})]})})},we=a=>{const t=a.getValue(),s=c.useRef(null),n=Ve(s);return t?e.jsxs(B,{open:n?void 0:!1,children:[e.jsx(Q,{asChild:!0,children:e.jsx("code",{ref:s,className:"px-2 py-1 font-mono text-sm text-ellipsis overflow-hidden whitespace-nowrap block",children:JSON.stringify(t,null,2)})}),e.jsx(Z,{className:"p-0",children:e.jsx(R,{value:JSON.stringify(t,null,2),disabled:!0})})]}):null},S=J(),Me=a=>[S.accessor("name",{header:"Name"}),S.accessor("value",{header:"Value",cell:we}),S.accessor("updated",{header:"Updated",cell:t=>{const s=t.getValue();return s?new Date(s??new Date).toLocaleString(void 0,{year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric",hour12:!0}).replace(",",""):null}}),S.accessor("tags",{header:()=>null,cell:t=>{const s=t.getValue();return s?e.jsx(ee,{tags:s,maxTagsDisplayed:3}):null}}),S.display({id:"actions",cell:t=>e.jsx(ke,{...t,onVariableEdit:a})})],Ie=({variables:a,currentVariableCount:t,pagination:s,onPaginationChange:n,columnFilters:r,onColumnFiltersChange:l,sorting:u,onSortingChange:m,onVariableEdit:d})=>{const x=c.useMemo(()=>Me(d),[d]),j=r.find(i=>i.id==="name")?.value,f=r.find(i=>i.id==="tags")?.value,o=c.useCallback(i=>{const g=r.filter(D=>D.id!=="name");l(i?[...g,{id:"name",value:i}]:g)},[l,r]),V=c.useCallback(i=>{const g=Array.isArray(i)?i:i.target.value,D=r.filter(z=>z.id!=="tags");l(g.length?[...D,{id:"tags",value:g}]:D)},[l,r]),b=c.useCallback(i=>{let g=s;typeof i=="function"?g=i(s):g=i,n(g)},[s,n]),v=L({data:a,columns:x,state:{pagination:s,columnFilters:r},getCoreRowModel:P(),manualPagination:!0,onPaginationChange:b,rowCount:t,defaultColumn:{maxSize:300}});return e.jsxs("div",{children:[e.jsxs("div",{className:"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center",children:[e.jsx("div",{className:"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first",children:e.jsxs("p",{className:"text-sm text-muted-foreground",children:[t," ",G(t,"Variable")]})}),e.jsx("div",{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",children:e.jsx(X,{placeholder:"Search variables",value:j,onChange:i=>o(i.target.value)})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-3",children:e.jsx(U,{placeholder:"Filter by tags",onChange:V,value:f})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-2",children:e.jsxs(Y,{value:u,onValueChange:m,children:[e.jsx($,{"aria-label":"Variable sort order",className:"w-full",children:e.jsx(K,{placeholder:"Sort by"})}),e.jsxs(W,{children:[e.jsx(y,{value:"CREATED_DESC",children:"Created"}),e.jsx(y,{value:"UPDATED_DESC",children:"Updated"}),e.jsx(y,{value:"NAME_ASC",children:"A to Z"}),e.jsx(y,{value:"NAME_DESC",children:"Z to A"})]})]})})]}),e.jsx(fe,{table:v})]})},Te=({onAddVariableClick:a})=>e.jsxs(ae,{children:[e.jsx(se,{id:"Variable"}),e.jsx(te,{children:"Add a variable to get started"}),e.jsx(ne,{children:"Variables store non-sensitive pieces of JSON."}),e.jsxs(re,{children:[e.jsxs(E,{onClick:()=>a(),children:["Add Variable ",e.jsx(F,{id:"Plus",className:"size-4 ml-2"})]}),e.jsx(le,{id:"variables-guide"})]})]}),Oe=()=>{const a=c.useCallback(r=>{s(l=>({...l,open:r}))},[]),[t,s]=c.useState({open:!1,onOpenChange:a}),n=c.useCallback(r=>{s(l=>({...l,open:!0,variableToEdit:r}))},[]);return[t,n]},_e=Ee({name:A().min(2,{message:"Name must be at least 2 characters"}),value:A(),tags:A().array().optional()}),O={name:"",value:"",tags:[]},Re=({onOpenChange:a,open:t,variableToEdit:s})=>{const n=Ne({resolver:ye(_e),defaultValues:O}),r=c.useMemo(()=>{if(s)return{name:s.name,value:JSON.stringify(s.value,null,2),tags:s.tags}},[s]);c.useEffect(()=>{t&&n.reset(r??O)},[r,n,t]);const{createVariable:l,isPending:u}=oe(),{updateVariable:m,isPending:d}=ie(),x=o=>{try{const V=JSON.parse(o.value);s?.id?m({id:s.id,name:o.name,value:V,tags:o.tags},{onSuccess:()=>{h.success("Variable updated"),a(!1)},onError:b=>{const v=b.message||"Unknown error while updating variable.";n.setError("root",{message:v})}}):l({name:o.name,value:V,tags:o.tags},{onSuccess:()=>{h.success("Variable created"),a(!1)},onError:b=>{const v=b.message||"Unknown error while creating variable.";n.setError("root",{message:v})}})}catch{n.setError("value",{message:"Value must be valid JSON"})}},j=s?"Edit Variable":"New Variable",f=s?"Edit the variable by changing the name, value, or tags.":"Add a new variable by providing a name, value, and optional tags. Values can be any valid JSON value.";return e.jsx(ce,{open:t,onOpenChange:a,children:e.jsxs(de,{children:[e.jsx(ue,{children:e.jsx(me,{children:j})}),e.jsx(ge,{children:f}),e.jsx(Ae,{...n,children:e.jsxs("form",{onSubmit:o=>{n.handleSubmit(x)(o)},className:"space-y-4",children:[e.jsx(N,{children:n.formState.errors.root?.message}),e.jsx(k,{control:n.control,name:"name",render:({field:o})=>e.jsxs(w,{children:[e.jsx(M,{children:"Name"}),e.jsx(I,{children:e.jsx(pe,{autoComplete:"off",...o})}),e.jsx(N,{})]})}),e.jsx(k,{control:n.control,name:"value",render:({field:o})=>e.jsxs(w,{children:[e.jsx(M,{children:"Value"}),e.jsx(I,{children:e.jsx(R,{...o})}),e.jsx(N,{})]})}),e.jsx(k,{control:n.control,name:"tags",render:({field:o})=>e.jsxs(w,{children:[e.jsx(M,{children:"Tags"}),e.jsx(I,{children:e.jsx(U,{...o})}),e.jsx(N,{})]})}),e.jsxs(he,{children:[e.jsx(xe,{asChild:!0,children:e.jsx(E,{type:"button",variant:"outline",children:"Close"})}),e.jsx(E,{type:"submit",loading:u||d,children:s?"Save":"Create"})]})]})})]})})},_=a=>({offset:a?.offset??0,limit:a?.limit??10,sort:a?.sort??"CREATED_DESC",variables:{operator:"and_",...a?.name&&{name:{like_:a.name}},...a?.tags?.length&&{tags:{operator:"and_",all_:a.tags}}}}),Fe=()=>{const a=p.useSearch(),t=p.useNavigate(),s=a.offset?Math.ceil(a.offset/a.limit):0,n=a.limit??10,r=c.useMemo(()=>({pageIndex:s,pageSize:n}),[s,n]),l=c.useCallback(u=>{t({to:".",search:m=>({...m,offset:u.pageIndex*u.pageSize,limit:u.pageSize}),replace:!0})},[t]);return[r,l]},Ue=()=>{const a=p.useSearch(),t=p.useNavigate(),s=c.useMemo(()=>[{id:"name",value:a.name},{id:"tags",value:a.tags}],[a.name,a.tags]),n=c.useCallback(r=>{t({to:".",search:l=>{const u=r.find(d=>d.id==="name")?.value,m=r.find(d=>d.id==="tags")?.value;return{...l,offset:0,name:u,tags:m}},replace:!0})},[t]);return[s,n]},ze=()=>{const a=p.useSearch(),t=p.useNavigate(),s=c.useCallback(n=>{t({to:".",search:r=>({...r,sort:n}),replace:!0})},[t]);return[a.sort,s]};function aa(){const a=p.useSearch(),[t,s]=Fe(),[n,r]=Ue(),[l,u]=ze(),[m,d]=Oe(),[{data:x},{data:j},{data:f}]=H({queries:[je(_(a)),T(_(a)),T()]}),o=(f??0)>0;return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(De,{onAddVariableClick:d}),e.jsx(Re,{...m}),o?e.jsx(Ie,{variables:x??[],currentVariableCount:j??0,pagination:t,onPaginationChange:s,columnFilters:n,onColumnFiltersChange:r,sorting:l,onSortingChange:u,onVariableEdit:d}):e.jsx(Te,{onAddVariableClick:d})]})}export{aa as component};
|
|
2
|
+
//# sourceMappingURL=index-_kpA__te.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CiSFHkhI.js","sources":["../../src/components/variables/data-table/cells.tsx","../../src/components/variables/data-table/data-table.tsx","../../src/components/variables/empty-state.tsx","../../src/components/variables/variable-dialog/use-variable-dialog.ts","../../src/components/variables/variable-dialog/variable-dialog.tsx","../../src/routes/variables/index.tsx?tsr-split=component"],"sourcesContent":["import type { CellContext } from \"@tanstack/react-table\";\nimport { useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n\tHoverCard,\n\tHoverCardContent,\n\tHoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { useIsOverflowing } from \"@/hooks/use-is-overflowing\";\n\ntype ActionsCellProps = CellContext<\n\tcomponents[\"schemas\"][\"Variable\"],\n\tunknown\n> & {\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const ActionsCell = ({ row, onVariableEdit }: ActionsCellProps) => {\n\tconst id = row.original.id;\n\tconst { deleteVariable } = useDeleteVariable();\n\tif (!id) return null;\n\n\tconst onVariableDelete = () => {\n\t\tdeleteVariable(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Variable deleted\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(row.original.name);\n\t\t\t\t\t\t\ttoast.success(\"Name copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy Name\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tconst copyValue =\n\t\t\t\t\t\t\t\ttypeof row.original.value !== \"string\"\n\t\t\t\t\t\t\t\t\t? JSON.stringify(row.original.value)\n\t\t\t\t\t\t\t\t\t: row.original.value;\n\t\t\t\t\t\t\tif (copyValue) {\n\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(copyValue);\n\t\t\t\t\t\t\t\ttoast.success(\"Value copied\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy Value\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onVariableEdit(row.original)}>\n\t\t\t\t\t\tEdit\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={onVariableDelete}>Delete</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nexport const ValueCell = (\n\tprops: CellContext<components[\"schemas\"][\"Variable\"], unknown>,\n) => {\n\tconst value = props.getValue();\n\tconst codeRef = useRef<HTMLDivElement>(null);\n\tconst isOverflowing = useIsOverflowing(codeRef);\n\n\tif (!value) return null;\n\treturn (\n\t\t// Disable the hover card if the value is not overflowing\n\t\t<HoverCard open={isOverflowing ? undefined : false}>\n\t\t\t<HoverCardTrigger asChild>\n\t\t\t\t<code\n\t\t\t\t\tref={codeRef}\n\t\t\t\t\tclassName=\"px-2 py-1 font-mono text-sm text-ellipsis overflow-hidden whitespace-nowrap block\"\n\t\t\t\t>\n\t\t\t\t\t{JSON.stringify(value, null, 2)}\n\t\t\t\t</code>\n\t\t\t</HoverCardTrigger>\n\t\t\t<HoverCardContent className=\"p-0\">\n\t\t\t\t<JsonInput value={JSON.stringify(value, null, 2)} disabled />\n\t\t\t</HoverCardContent>\n\t\t</HoverCard>\n\t);\n};\n","import {\n\ttype ColumnFiltersState,\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport type React from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type { components } from \"@/api/prefect\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ValueCell } from \"./cells\";\n\nconst columnHelper = createColumnHelper<components[\"schemas\"][\"Variable\"]>();\n\nconst createColumns = (\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void,\n) => [\n\tcolumnHelper.accessor(\"name\", {\n\t\theader: \"Name\",\n\t}),\n\tcolumnHelper.accessor(\"value\", {\n\t\theader: \"Value\",\n\t\tcell: ValueCell,\n\t}),\n\tcolumnHelper.accessor(\"updated\", {\n\t\theader: \"Updated\",\n\t\tcell: (props) => {\n\t\t\tconst updated = props.getValue();\n\t\t\tif (!updated) return null;\n\t\t\treturn new Date(updated ?? new Date())\n\t\t\t\t.toLocaleString(undefined, {\n\t\t\t\t\tyear: \"numeric\",\n\t\t\t\t\tmonth: \"numeric\",\n\t\t\t\t\tday: \"numeric\",\n\t\t\t\t\thour: \"numeric\",\n\t\t\t\t\tminute: \"numeric\",\n\t\t\t\t\tsecond: \"numeric\",\n\t\t\t\t\thour12: true,\n\t\t\t\t})\n\t\t\t\t.replace(\",\", \"\");\n\t\t},\n\t}),\n\tcolumnHelper.accessor(\"tags\", {\n\t\theader: () => null,\n\t\tcell: (props) => {\n\t\t\tconst tags = props.getValue();\n\t\t\tif (!tags) return null;\n\t\t\treturn <TagBadgeGroup tags={tags} maxTagsDisplayed={3} />;\n\t\t},\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onVariableEdit={onVariableEdit} />,\n\t}),\n];\n\ntype VariablesDataTableProps = {\n\tvariables: components[\"schemas\"][\"Variable\"][];\n\tcurrentVariableCount: number;\n\tpagination: PaginationState;\n\tonPaginationChange: (newPagination: PaginationState) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (newColumnFilters: ColumnFiltersState) => void;\n\tsorting: components[\"schemas\"][\"VariableSort\"];\n\tonSortingChange: (sortKey: components[\"schemas\"][\"VariableSort\"]) => void;\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const VariablesDataTable = ({\n\tvariables,\n\tcurrentVariableCount,\n\tpagination,\n\tonPaginationChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tsorting,\n\tonSortingChange,\n\tonVariableEdit,\n}: VariablesDataTableProps) => {\n\tconst columns = useMemo(\n\t\t() => createColumns(onVariableEdit),\n\t\t[onVariableEdit],\n\t);\n\n\tconst nameSearchValue = columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value as string;\n\tconst tagsSearchValue = columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value as string[];\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: variables,\n\t\tcolumns: columns,\n\t\tstate: {\n\t\t\tpagination,\n\t\t\tcolumnFilters,\n\t\t},\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: currentVariableCount,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentVariableCount} {pluralize(currentVariableCount, \"Variable\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search variables\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sorting} onValueChange={onSortingChange}>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Variable sort order\" className=\"w-full\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\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 VariablesEmptyStateProps = {\n\tonAddVariableClick: () => void;\n};\nexport const VariablesEmptyState = ({\n\tonAddVariableClick,\n}: VariablesEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Variable\" />\n\t\t<EmptyStateTitle>Add a variable to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tVariables store non-sensitive pieces of JSON.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={() => onAddVariableClick()}>\n\t\t\t\tAdd Variable <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"variables-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useCallback, useState } from \"react\";\nimport type { VariableDialogProps } from \"./variable-dialog\";\n\nexport const useVariableDialog = () => {\n\tconst handleVariableDialogOpenChange = useCallback((open: boolean) => {\n\t\tsetDialogState((prev) => ({\n\t\t\t...prev,\n\t\t\topen,\n\t\t}));\n\t}, []);\n\n\tconst [dialogState, setDialogState] = useState<VariableDialogProps>({\n\t\topen: false,\n\t\tonOpenChange: handleVariableDialogOpenChange,\n\t});\n\n\tconst handleVariableAddOrEdit = useCallback(\n\t\t(variableToEdit?: VariableDialogProps[\"variableToEdit\"]) => {\n\t\t\tsetDialogState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\topen: true,\n\t\t\t\tvariableToEdit,\n\t\t\t}));\n\t\t},\n\t\t[],\n\t);\n\n\treturn [dialogState, handleVariableAddOrEdit] as const;\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useEffect, useMemo } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport type { components } from \"@/api/prefect\";\nimport { useCreateVariable, useUpdateVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\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 { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\n\nexport type JSONValue =\n\t| string\n\t| number\n\t| boolean\n\t| Record<string, never>\n\t| unknown[]\n\t| null;\n\nconst formSchema = z.object({\n\tname: z.string().min(2, { message: \"Name must be at least 2 characters\" }),\n\tvalue: z.string(),\n\ttags: z.string().array().optional(),\n});\n\nexport type VariableDialogProps = {\n\tonOpenChange: (open: boolean) => void;\n\topen: boolean;\n\tvariableToEdit?: components[\"schemas\"][\"Variable\"];\n};\n\nconst VARIABLE_FORM_DEFAULT_VALUES = {\n\tname: \"\",\n\tvalue: \"\",\n\ttags: [],\n};\n\nexport const VariableDialog = ({\n\tonOpenChange,\n\topen,\n\tvariableToEdit,\n}: VariableDialogProps) => {\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: VARIABLE_FORM_DEFAULT_VALUES,\n\t});\n\tconst initialValues = useMemo(() => {\n\t\tif (!variableToEdit) return undefined;\n\t\treturn {\n\t\t\tname: variableToEdit.name,\n\t\t\tvalue: JSON.stringify(variableToEdit.value, null, 2),\n\t\t\ttags: variableToEdit.tags,\n\t\t};\n\t}, [variableToEdit]);\n\n\tuseEffect(() => {\n\t\t// Ensure we start with the initial values when the dialog opens\n\t\tif (open) {\n\t\t\tform.reset(initialValues ?? VARIABLE_FORM_DEFAULT_VALUES);\n\t\t}\n\t}, [initialValues, form, open]);\n\n\tconst { createVariable, isPending: isCreating } = useCreateVariable();\n\n\tconst { updateVariable, isPending: isUpdating } = useUpdateVariable();\n\n\tconst onSubmit = (values: z.infer<typeof formSchema>) => {\n\t\ttry {\n\t\t\tconst value = JSON.parse(values.value) as JSONValue;\n\t\t\tif (variableToEdit?.id) {\n\t\t\t\tupdateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: variableToEdit.id,\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable updated\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while updating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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} else {\n\t\t\t\tcreateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable created\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while creating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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}\n\t\t} catch {\n\t\t\tform.setError(\"value\", { message: \"Value must be valid JSON\" });\n\t\t}\n\t};\n\tconst dialogTitle = variableToEdit ? \"Edit Variable\" : \"New Variable\";\n\tconst dialogDescription = variableToEdit\n\t\t? \"Edit the variable by changing the name, value, or tags.\"\n\t\t: \"Add a new variable by providing a name, value, and optional tags. Values can be any valid JSON value.\";\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>{dialogDescription}</DialogDescription>\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(onSubmit)(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 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=\"value\"\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>Value</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<JsonInput {...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=\"tags\"\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>Tags</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<TagsInput {...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<DialogClose asChild>\n\t\t\t\t\t\t\t\t<Button type=\"button\" variant=\"outline\">\n\t\t\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</DialogClose>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isCreating || isUpdating}>\n\t\t\t\t\t\t\t\t{variableToEdit ? \"Save\" : \"Create\"}\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 { useSuspenseQueries } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountVariablesQuery,\n\tbuildFilterVariablesQuery,\n\ttype VariablesFilter,\n} from \"@/api/variables\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\nimport { VariablesDataTable } from \"@/components/variables/data-table\";\nimport { VariablesEmptyState } from \"@/components/variables/empty-state\";\nimport { VariablesPageHeader } from \"@/components/variables/header\";\nimport {\n\tuseVariableDialog,\n\tVariableDialog,\n} from \"@/components/variables/variable-dialog\";\n\n/**\n * Schema for validating URL search parameters for the variables page.\n * @property {number} offset - The number of items to skip (for pagination). Must be non-negative. Defaults to 0.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n * @property {string} sort - The sort order for variables. Can be \"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", or \"NAME_DESC\". Defaults to \"CREATED_DESC\".\n * @property {string} name - Optional filter to search variables by name.\n * @property {string[]} tags - Optional array of tags to filter variables by.\n */\nconst searchParams = z.object({\n\toffset: z.number().int().nonnegative().optional().default(0).catch(0),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\tsort: z\n\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t.optional()\n\t\t.default(\"CREATED_DESC\")\n\t\t.catch(\"CREATED_DESC\"),\n\tname: z.string().optional().catch(undefined),\n\ttags: z.array(z.string()).optional().catch(undefined),\n});\n\n/**\n * Builds a filter body for the variables API based on search parameters.\n * @param search - Optional search parameters containing offset, limit, sort, name filter, and tags filter\n * @returns An object containing pagination parameters and variable filters that can be passed to the variables API\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): VariablesFilter => ({\n\toffset: search?.offset ?? 0,\n\tlimit: search?.limit ?? 10,\n\tsort: search?.sort ?? \"CREATED_DESC\",\n\tvariables: {\n\t\toperator: \"and_\" as const,\n\t\t...(search?.name && { name: { like_: search.name } }),\n\t\t...(search?.tags?.length && {\n\t\t\ttags: { operator: \"and_\" as const, all_: search.tags },\n\t\t}),\n\t},\n});\n\nfunction VariablesErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load variables\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/variables/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\terrorComponent: VariablesErrorComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch filtered variables\n\t\tvoid context.queryClient.prefetchQuery(buildFilterVariablesQuery(deps));\n\t\t// Prefetch filtered count\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery(deps));\n\t\t// Prefetch total count (no filter)\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery());\n\t},\n\twrapInSuspense: true,\n});\n\n/**\n * Hook to manage pagination state and navigation for variables table\n *\n * Calculates current page index and size from URL search parameters and provides\n * a callback to update pagination state. Updates the URL when pagination changes.\n *\n * @returns A tuple containing:\n * - pagination: Current pagination state with pageIndex and pageSize\n * - onPaginationChange: Callback to update pagination and navigate with new search params\n */\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pageIndex = search.offset ? Math.ceil(search.offset / search.limit) : 0;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\toffset: newPagination.pageIndex * newPagination.pageSize,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\n/**\n * Hook to manage column filtering state and navigation for variables table\n *\n * Handles filtering by name and tags, updating the URL search parameters when filters change.\n * Resets pagination offset when filters are updated.\n *\n * @returns A tuple containing:\n * - columnFilters: Current column filter state for name and tags\n * - onColumnFiltersChange: Callback to update filters and navigate with new search params\n */\nconst useVariableColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"name\", value: search.name },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.name, search.tags],\n\t);\n\n\tconst onColumnFiltersChange = useCallback(\n\t\t(newColumnFilters: ColumnFiltersState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => {\n\t\t\t\t\tconst name = newColumnFilters.find((filter) => filter.id === \"name\")\n\t\t\t\t\t\t?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [columnFilters, onColumnFiltersChange] as const;\n};\n\n/**\n * Hook to manage sorting state and navigation for variables table\n *\n * Handles updating the URL search parameters when sort key changes.\n * Uses the current sort value from search params and provides a callback\n * to update sorting.\n *\n * @returns A tuple containing:\n * - sorting: Current sort key from search params\n * - onSortingChange: Callback to update sort and navigate with new search params\n */\nconst useVariableSorting = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortingChange = useCallback(\n\t\t(sortKey: components[\"schemas\"][\"VariableSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort: sortKey }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortingChange] as const;\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [columnFilters, onColumnFiltersChange] = useVariableColumnFilters();\n\tconst [sorting, onSortingChange] = useVariableSorting();\n\tconst [variableDialogState, onVariableAddOrEdit] = useVariableDialog();\n\n\tconst [{ data: variables }, { data: filteredCount }, { data: totalCount }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildFilterVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(),\n\t\t\t],\n\t\t});\n\n\tconst hasVariables = (totalCount ?? 0) > 0;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t<VariableDialog {...variableDialogState} />\n\t\t\t{hasVariables ? (\n\t\t\t\t<VariablesDataTable\n\t\t\t\t\tvariables={variables ?? []}\n\t\t\t\t\tcurrentVariableCount={filteredCount ?? 0}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tsorting={sorting}\n\t\t\t\t\tonSortingChange={onSortingChange}\n\t\t\t\t\tonVariableEdit={onVariableAddOrEdit}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<VariablesEmptyState onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["ActionsCell","row","onVariableEdit","id","deleteVariable","useDeleteVariable","onVariableDelete","toast","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","copyValue","ValueCell","props","value","codeRef","useRef","isOverflowing","useIsOverflowing","HoverCard","HoverCardTrigger","HoverCardContent","JsonInput","columnHelper","createColumnHelper","createColumns","updated","tags","TagBadgeGroup","VariablesDataTable","variables","currentVariableCount","pagination","onPaginationChange","columnFilters","onColumnFiltersChange","sorting","onSortingChange","columns","useMemo","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","useCallback","filters","handleTagsSearchChange","e","handlePaginationChange","updater","newPagination","table","useReactTable","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DataTable","VariablesEmptyState","onAddVariableClick","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","useVariableDialog","handleVariableDialogOpenChange","open","setDialogState","prev","dialogState","useState","handleVariableAddOrEdit","variableToEdit","formSchema","z.object","z.string","VARIABLE_FORM_DEFAULT_VALUES","VariableDialog","onOpenChange","form","useForm","zodResolver","initialValues","useEffect","createVariable","isCreating","useCreateVariable","updateVariable","isUpdating","useUpdateVariable","onSubmit","values","error","message","dialogTitle","dialogDescription","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Form","FormMessage","FormField","field","FormItem","FormLabel","FormControl","Input","DialogFooter","DialogClose","buildFilterBody","search","offset","limit","sort","operator","name","like_","length","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","Math","ceil","pageSize","to","replace","useVariableColumnFilters","newColumnFilters","find","useVariableSorting","sortKey","RouteComponent","variableDialogState","onVariableAddOrEdit","data","filteredCount","totalCount","useSuspenseQueries","queries","buildFilterVariablesQuery","buildCountVariablesQuery","hasVariables","VariablesPageHeader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-_kpA__te.js","sources":["../../src/components/variables/data-table/cells.tsx","../../src/components/variables/data-table/data-table.tsx","../../src/components/variables/empty-state.tsx","../../src/components/variables/variable-dialog/use-variable-dialog.ts","../../src/components/variables/variable-dialog/variable-dialog.tsx","../../src/routes/variables/index.tsx?tsr-split=component"],"sourcesContent":["import type { CellContext } from \"@tanstack/react-table\";\nimport { useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n\tHoverCard,\n\tHoverCardContent,\n\tHoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { useIsOverflowing } from \"@/hooks/use-is-overflowing\";\n\ntype ActionsCellProps = CellContext<\n\tcomponents[\"schemas\"][\"Variable\"],\n\tunknown\n> & {\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const ActionsCell = ({ row, onVariableEdit }: ActionsCellProps) => {\n\tconst id = row.original.id;\n\tconst { deleteVariable } = useDeleteVariable();\n\tif (!id) return null;\n\n\tconst onVariableDelete = () => {\n\t\tdeleteVariable(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Variable deleted\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(row.original.name);\n\t\t\t\t\t\t\ttoast.success(\"Name copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy Name\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tconst copyValue =\n\t\t\t\t\t\t\t\ttypeof row.original.value !== \"string\"\n\t\t\t\t\t\t\t\t\t? JSON.stringify(row.original.value)\n\t\t\t\t\t\t\t\t\t: row.original.value;\n\t\t\t\t\t\t\tif (copyValue) {\n\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(copyValue);\n\t\t\t\t\t\t\t\ttoast.success(\"Value copied\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy Value\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onVariableEdit(row.original)}>\n\t\t\t\t\t\tEdit\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={onVariableDelete}>Delete</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nexport const ValueCell = (\n\tprops: CellContext<components[\"schemas\"][\"Variable\"], unknown>,\n) => {\n\tconst value = props.getValue();\n\tconst codeRef = useRef<HTMLDivElement>(null);\n\tconst isOverflowing = useIsOverflowing(codeRef);\n\n\tif (!value) return null;\n\treturn (\n\t\t// Disable the hover card if the value is not overflowing\n\t\t<HoverCard open={isOverflowing ? undefined : false}>\n\t\t\t<HoverCardTrigger asChild>\n\t\t\t\t<code\n\t\t\t\t\tref={codeRef}\n\t\t\t\t\tclassName=\"px-2 py-1 font-mono text-sm text-ellipsis overflow-hidden whitespace-nowrap block\"\n\t\t\t\t>\n\t\t\t\t\t{JSON.stringify(value, null, 2)}\n\t\t\t\t</code>\n\t\t\t</HoverCardTrigger>\n\t\t\t<HoverCardContent className=\"p-0\">\n\t\t\t\t<JsonInput value={JSON.stringify(value, null, 2)} disabled />\n\t\t\t</HoverCardContent>\n\t\t</HoverCard>\n\t);\n};\n","import {\n\ttype ColumnFiltersState,\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport type React from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type { components } from \"@/api/prefect\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ValueCell } from \"./cells\";\n\nconst columnHelper = createColumnHelper<components[\"schemas\"][\"Variable\"]>();\n\nconst createColumns = (\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void,\n) => [\n\tcolumnHelper.accessor(\"name\", {\n\t\theader: \"Name\",\n\t}),\n\tcolumnHelper.accessor(\"value\", {\n\t\theader: \"Value\",\n\t\tcell: ValueCell,\n\t}),\n\tcolumnHelper.accessor(\"updated\", {\n\t\theader: \"Updated\",\n\t\tcell: (props) => {\n\t\t\tconst updated = props.getValue();\n\t\t\tif (!updated) return null;\n\t\t\treturn new Date(updated ?? new Date())\n\t\t\t\t.toLocaleString(undefined, {\n\t\t\t\t\tyear: \"numeric\",\n\t\t\t\t\tmonth: \"numeric\",\n\t\t\t\t\tday: \"numeric\",\n\t\t\t\t\thour: \"numeric\",\n\t\t\t\t\tminute: \"numeric\",\n\t\t\t\t\tsecond: \"numeric\",\n\t\t\t\t\thour12: true,\n\t\t\t\t})\n\t\t\t\t.replace(\",\", \"\");\n\t\t},\n\t}),\n\tcolumnHelper.accessor(\"tags\", {\n\t\theader: () => null,\n\t\tcell: (props) => {\n\t\t\tconst tags = props.getValue();\n\t\t\tif (!tags) return null;\n\t\t\treturn <TagBadgeGroup tags={tags} maxTagsDisplayed={3} />;\n\t\t},\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onVariableEdit={onVariableEdit} />,\n\t}),\n];\n\ntype VariablesDataTableProps = {\n\tvariables: components[\"schemas\"][\"Variable\"][];\n\tcurrentVariableCount: number;\n\tpagination: PaginationState;\n\tonPaginationChange: (newPagination: PaginationState) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (newColumnFilters: ColumnFiltersState) => void;\n\tsorting: components[\"schemas\"][\"VariableSort\"];\n\tonSortingChange: (sortKey: components[\"schemas\"][\"VariableSort\"]) => void;\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const VariablesDataTable = ({\n\tvariables,\n\tcurrentVariableCount,\n\tpagination,\n\tonPaginationChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tsorting,\n\tonSortingChange,\n\tonVariableEdit,\n}: VariablesDataTableProps) => {\n\tconst columns = useMemo(\n\t\t() => createColumns(onVariableEdit),\n\t\t[onVariableEdit],\n\t);\n\n\tconst nameSearchValue = columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value as string;\n\tconst tagsSearchValue = columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value as string[];\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: variables,\n\t\tcolumns: columns,\n\t\tstate: {\n\t\t\tpagination,\n\t\t\tcolumnFilters,\n\t\t},\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: currentVariableCount,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentVariableCount} {pluralize(currentVariableCount, \"Variable\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search variables\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sorting} onValueChange={onSortingChange}>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Variable sort order\" className=\"w-full\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\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 VariablesEmptyStateProps = {\n\tonAddVariableClick: () => void;\n};\nexport const VariablesEmptyState = ({\n\tonAddVariableClick,\n}: VariablesEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Variable\" />\n\t\t<EmptyStateTitle>Add a variable to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tVariables store non-sensitive pieces of JSON.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={() => onAddVariableClick()}>\n\t\t\t\tAdd Variable <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"variables-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useCallback, useState } from \"react\";\nimport type { VariableDialogProps } from \"./variable-dialog\";\n\nexport const useVariableDialog = () => {\n\tconst handleVariableDialogOpenChange = useCallback((open: boolean) => {\n\t\tsetDialogState((prev) => ({\n\t\t\t...prev,\n\t\t\topen,\n\t\t}));\n\t}, []);\n\n\tconst [dialogState, setDialogState] = useState<VariableDialogProps>({\n\t\topen: false,\n\t\tonOpenChange: handleVariableDialogOpenChange,\n\t});\n\n\tconst handleVariableAddOrEdit = useCallback(\n\t\t(variableToEdit?: VariableDialogProps[\"variableToEdit\"]) => {\n\t\t\tsetDialogState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\topen: true,\n\t\t\t\tvariableToEdit,\n\t\t\t}));\n\t\t},\n\t\t[],\n\t);\n\n\treturn [dialogState, handleVariableAddOrEdit] as const;\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useEffect, useMemo } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport type { components } from \"@/api/prefect\";\nimport { useCreateVariable, useUpdateVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\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 { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\n\nexport type JSONValue =\n\t| string\n\t| number\n\t| boolean\n\t| Record<string, never>\n\t| unknown[]\n\t| null;\n\nconst formSchema = z.object({\n\tname: z.string().min(2, { message: \"Name must be at least 2 characters\" }),\n\tvalue: z.string(),\n\ttags: z.string().array().optional(),\n});\n\nexport type VariableDialogProps = {\n\tonOpenChange: (open: boolean) => void;\n\topen: boolean;\n\tvariableToEdit?: components[\"schemas\"][\"Variable\"];\n};\n\nconst VARIABLE_FORM_DEFAULT_VALUES = {\n\tname: \"\",\n\tvalue: \"\",\n\ttags: [],\n};\n\nexport const VariableDialog = ({\n\tonOpenChange,\n\topen,\n\tvariableToEdit,\n}: VariableDialogProps) => {\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: VARIABLE_FORM_DEFAULT_VALUES,\n\t});\n\tconst initialValues = useMemo(() => {\n\t\tif (!variableToEdit) return undefined;\n\t\treturn {\n\t\t\tname: variableToEdit.name,\n\t\t\tvalue: JSON.stringify(variableToEdit.value, null, 2),\n\t\t\ttags: variableToEdit.tags,\n\t\t};\n\t}, [variableToEdit]);\n\n\tuseEffect(() => {\n\t\t// Ensure we start with the initial values when the dialog opens\n\t\tif (open) {\n\t\t\tform.reset(initialValues ?? VARIABLE_FORM_DEFAULT_VALUES);\n\t\t}\n\t}, [initialValues, form, open]);\n\n\tconst { createVariable, isPending: isCreating } = useCreateVariable();\n\n\tconst { updateVariable, isPending: isUpdating } = useUpdateVariable();\n\n\tconst onSubmit = (values: z.infer<typeof formSchema>) => {\n\t\ttry {\n\t\t\tconst value = JSON.parse(values.value) as JSONValue;\n\t\t\tif (variableToEdit?.id) {\n\t\t\t\tupdateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: variableToEdit.id,\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable updated\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while updating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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} else {\n\t\t\t\tcreateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable created\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while creating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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}\n\t\t} catch {\n\t\t\tform.setError(\"value\", { message: \"Value must be valid JSON\" });\n\t\t}\n\t};\n\tconst dialogTitle = variableToEdit ? \"Edit Variable\" : \"New Variable\";\n\tconst dialogDescription = variableToEdit\n\t\t? \"Edit the variable by changing the name, value, or tags.\"\n\t\t: \"Add a new variable by providing a name, value, and optional tags. Values can be any valid JSON value.\";\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>{dialogDescription}</DialogDescription>\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(onSubmit)(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 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=\"value\"\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>Value</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<JsonInput {...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=\"tags\"\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>Tags</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<TagsInput {...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<DialogClose asChild>\n\t\t\t\t\t\t\t\t<Button type=\"button\" variant=\"outline\">\n\t\t\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</DialogClose>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isCreating || isUpdating}>\n\t\t\t\t\t\t\t\t{variableToEdit ? \"Save\" : \"Create\"}\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 { useSuspenseQueries } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountVariablesQuery,\n\tbuildFilterVariablesQuery,\n\ttype VariablesFilter,\n} from \"@/api/variables\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\nimport { VariablesDataTable } from \"@/components/variables/data-table\";\nimport { VariablesEmptyState } from \"@/components/variables/empty-state\";\nimport { VariablesPageHeader } from \"@/components/variables/header\";\nimport {\n\tuseVariableDialog,\n\tVariableDialog,\n} from \"@/components/variables/variable-dialog\";\n\n/**\n * Schema for validating URL search parameters for the variables page.\n * @property {number} offset - The number of items to skip (for pagination). Must be non-negative. Defaults to 0.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n * @property {string} sort - The sort order for variables. Can be \"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", or \"NAME_DESC\". Defaults to \"CREATED_DESC\".\n * @property {string} name - Optional filter to search variables by name.\n * @property {string[]} tags - Optional array of tags to filter variables by.\n */\nconst searchParams = z.object({\n\toffset: z.number().int().nonnegative().optional().default(0).catch(0),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\tsort: z\n\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t.optional()\n\t\t.default(\"CREATED_DESC\")\n\t\t.catch(\"CREATED_DESC\"),\n\tname: z.string().optional().catch(undefined),\n\ttags: z.array(z.string()).optional().catch(undefined),\n});\n\n/**\n * Builds a filter body for the variables API based on search parameters.\n * @param search - Optional search parameters containing offset, limit, sort, name filter, and tags filter\n * @returns An object containing pagination parameters and variable filters that can be passed to the variables API\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): VariablesFilter => ({\n\toffset: search?.offset ?? 0,\n\tlimit: search?.limit ?? 10,\n\tsort: search?.sort ?? \"CREATED_DESC\",\n\tvariables: {\n\t\toperator: \"and_\" as const,\n\t\t...(search?.name && { name: { like_: search.name } }),\n\t\t...(search?.tags?.length && {\n\t\t\ttags: { operator: \"and_\" as const, all_: search.tags },\n\t\t}),\n\t},\n});\n\nfunction VariablesErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load variables\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/variables/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\terrorComponent: VariablesErrorComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch filtered variables\n\t\tvoid context.queryClient.prefetchQuery(buildFilterVariablesQuery(deps));\n\t\t// Prefetch filtered count\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery(deps));\n\t\t// Prefetch total count (no filter)\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery());\n\t},\n\twrapInSuspense: true,\n});\n\n/**\n * Hook to manage pagination state and navigation for variables table\n *\n * Calculates current page index and size from URL search parameters and provides\n * a callback to update pagination state. Updates the URL when pagination changes.\n *\n * @returns A tuple containing:\n * - pagination: Current pagination state with pageIndex and pageSize\n * - onPaginationChange: Callback to update pagination and navigate with new search params\n */\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pageIndex = search.offset ? Math.ceil(search.offset / search.limit) : 0;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\toffset: newPagination.pageIndex * newPagination.pageSize,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\n/**\n * Hook to manage column filtering state and navigation for variables table\n *\n * Handles filtering by name and tags, updating the URL search parameters when filters change.\n * Resets pagination offset when filters are updated.\n *\n * @returns A tuple containing:\n * - columnFilters: Current column filter state for name and tags\n * - onColumnFiltersChange: Callback to update filters and navigate with new search params\n */\nconst useVariableColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"name\", value: search.name },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.name, search.tags],\n\t);\n\n\tconst onColumnFiltersChange = useCallback(\n\t\t(newColumnFilters: ColumnFiltersState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => {\n\t\t\t\t\tconst name = newColumnFilters.find((filter) => filter.id === \"name\")\n\t\t\t\t\t\t?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [columnFilters, onColumnFiltersChange] as const;\n};\n\n/**\n * Hook to manage sorting state and navigation for variables table\n *\n * Handles updating the URL search parameters when sort key changes.\n * Uses the current sort value from search params and provides a callback\n * to update sorting.\n *\n * @returns A tuple containing:\n * - sorting: Current sort key from search params\n * - onSortingChange: Callback to update sort and navigate with new search params\n */\nconst useVariableSorting = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortingChange = useCallback(\n\t\t(sortKey: components[\"schemas\"][\"VariableSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort: sortKey }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortingChange] as const;\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [columnFilters, onColumnFiltersChange] = useVariableColumnFilters();\n\tconst [sorting, onSortingChange] = useVariableSorting();\n\tconst [variableDialogState, onVariableAddOrEdit] = useVariableDialog();\n\n\tconst [{ data: variables }, { data: filteredCount }, { data: totalCount }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildFilterVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(),\n\t\t\t],\n\t\t});\n\n\tconst hasVariables = (totalCount ?? 0) > 0;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t<VariableDialog {...variableDialogState} />\n\t\t\t{hasVariables ? (\n\t\t\t\t<VariablesDataTable\n\t\t\t\t\tvariables={variables ?? []}\n\t\t\t\t\tcurrentVariableCount={filteredCount ?? 0}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tsorting={sorting}\n\t\t\t\t\tonSortingChange={onSortingChange}\n\t\t\t\t\tonVariableEdit={onVariableAddOrEdit}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<VariablesEmptyState onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["ActionsCell","row","onVariableEdit","id","deleteVariable","useDeleteVariable","onVariableDelete","toast","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","copyValue","ValueCell","props","value","codeRef","useRef","isOverflowing","useIsOverflowing","HoverCard","HoverCardTrigger","HoverCardContent","JsonInput","columnHelper","createColumnHelper","createColumns","updated","tags","TagBadgeGroup","VariablesDataTable","variables","currentVariableCount","pagination","onPaginationChange","columnFilters","onColumnFiltersChange","sorting","onSortingChange","columns","useMemo","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","useCallback","filters","handleTagsSearchChange","e","handlePaginationChange","updater","newPagination","table","useReactTable","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DataTable","VariablesEmptyState","onAddVariableClick","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","useVariableDialog","handleVariableDialogOpenChange","open","setDialogState","prev","dialogState","useState","handleVariableAddOrEdit","variableToEdit","formSchema","z.object","z.string","VARIABLE_FORM_DEFAULT_VALUES","VariableDialog","onOpenChange","form","useForm","zodResolver","initialValues","useEffect","createVariable","isCreating","useCreateVariable","updateVariable","isUpdating","useUpdateVariable","onSubmit","values","error","message","dialogTitle","dialogDescription","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Form","FormMessage","FormField","field","FormItem","FormLabel","FormControl","Input","DialogFooter","DialogClose","buildFilterBody","search","offset","limit","sort","operator","name","like_","length","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","Math","ceil","pageSize","to","replace","useVariableColumnFilters","newColumnFilters","find","useVariableSorting","sortKey","RouteComponent","variableDialogState","onVariableAddOrEdit","data","filteredCount","totalCount","useSuspenseQueries","queries","buildFilterVariablesQuery","buildCountVariablesQuery","hasVariables","VariablesPageHeader"],"mappings":"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"}
|