prefect 3.6.13__py3-none-any.whl → 3.6.13.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/_build_info.py +3 -3
- prefect/_internal/compatibility/blocks.py +0 -18
- prefect/client/schemas/filters.py +0 -24
- prefect/flow_engine.py +10 -192
- prefect/flows.py +2 -61
- prefect/results.py +21 -262
- prefect/runner/runner.py +82 -29
- prefect/runner/storage.py +2 -3
- prefect/server/schemas/filters.py +0 -45
- prefect/server/ui-v2/assets/{artifact-card-CUEaRDGw.js → artifact-card-C8JEQRHl.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-CUEaRDGw.js.map → artifact-card-C8JEQRHl.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifact._id-Ca6VCUS0.js → artifact._id-67V8kTg9.js} +2 -2
- prefect/server/ui-v2/assets/{artifact._id-Ca6VCUS0.js.map → artifact._id-67V8kTg9.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation-wizard-z26pICBl.js → automation-wizard-DuxZ47Nn.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-z26pICBl.js.map → automation-wizard-DuxZ47Nn.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation._id-DuodjY5t.js → automation._id-D8S8r4Ji.js} +2 -2
- prefect/server/ui-v2/assets/{automation._id-DuodjY5t.js.map → automation._id-D8S8r4Ji.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-CcuJhc-y.js → automation_._id.edit-C1fOM0Hx.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-CcuJhc-y.js.map → automation_._id.edit-C1fOM0Hx.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-CgOWwuc6.js → automations-header-DrijTNGi.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-CgOWwuc6.js.map → automations-header-DrijTNGi.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-DN9HyjM5.js → base-job-template-form-section-BDkqOkpe.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-DN9HyjM5.js.map → base-job-template-form-section-BDkqOkpe.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-rrToxL5r.js → block-type-details-CrFHWH5D.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-rrToxL5r.js.map → block-type-details-CrFHWH5D.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-WQNm0PzP.js +2 -0
- prefect/server/ui-v2/assets/{block-type-logo-DURScH8H.js.map → block-type-logo-WQNm0PzP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-Bue6lnrN.js → block._id-C3gN1Ae8.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-Bue6lnrN.js.map → block._id-C3gN1Ae8.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-QY0OzN_b.js → block_._id.edit-DzPuSvat.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-QY0OzN_b.js.map → block_._id.edit-DzPuSvat.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-CGjRGWv6.js → catalog-T-7MqsyE.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-CGjRGWv6.js.map → catalog-T-7MqsyE.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug-BMFNZhEb.js → catalog_._slug-DMOI61fc.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug-BMFNZhEb.js.map → catalog_._slug-DMOI61fc.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-CuFA3kUC.js → catalog_._slug_.create-l9bGUPi-.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-CuFA3kUC.js.map → catalog_._slug_.create-l9bGUPi-.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-Ell2FjrX.js → collapsible-DM-Ze5-Y.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-Ell2FjrX.js.map → collapsible-DM-Ze5-Y.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-Rr1ysUct.js → concurrency-limit._id-BHEt9viF.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-Rr1ysUct.js.map → concurrency-limit._id-BHEt9viF.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-ewA3uq_h.js → create-BMxUOyN5.js} +2 -2
- prefect/server/ui-v2/assets/{create-ewA3uq_h.js.map → create-BMxUOyN5.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-CQK8-uO1.js → create-Cq-EAHVk.js} +2 -2
- prefect/server/ui-v2/assets/{create-CQK8-uO1.js.map → create-Cq-EAHVk.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-Bx1uYX_M.js → data-table-Bw8TZx9D.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-Bx1uYX_M.js.map → data-table-Bw8TZx9D.js.map} +1 -1
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-CqKsUEj_.js → delete-confirmation-dialog-CTdWZlGM.js} +2 -2
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-CqKsUEj_.js.map → delete-confirmation-dialog-CTdWZlGM.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-Bz5COdER.js → deployment-action-header-BObYqmI_.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-Bz5COdER.js.map → deployment-action-header-BObYqmI_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-CrlZlNoj.js → deployment-form-CntyhRrK.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-CrlZlNoj.js.map → deployment-form-CntyhRrK.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-D9ZR_vmp.js → deployment-links-DBUSCaxB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-D9ZR_vmp.js.map → deployment-links-DBUSCaxB.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-DvHhx-qN.js → deployment._id-BXanVFA8.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-DvHhx-qN.js.map → deployment._id-BXanVFA8.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-BV0rSqba.js → deployment._id-Q5cvHMX9.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-BV0rSqba.js.map → deployment._id-Q5cvHMX9.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-DB-4hHHc.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-BrEOenqP.js.map → deployment_._id.duplicate-DB-4hHHc.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CWf1RIGy.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-BbYKPK42.js.map → deployment_._id.edit-CWf1RIGy.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-Dv7S_MJR.js → deployment_._id.run-CoHGXFoM.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-Dv7S_MJR.js.map → deployment_._id.run-CoHGXFoM.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-e0Fqb6aw.js → dropdown-menu-CT-s-V7d.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-e0Fqb6aw.js.map → dropdown-menu-CT-s-V7d.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-Cp4UmGqq.js → event._eventDate._eventId-BITo_GYL.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-Cp4UmGqq.js.map → event._eventDate._eventId-BITo_GYL.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js +2 -0
- prefect/server/ui-v2/assets/{flow-run-graph-BrqoR3E2.js.map → flow-run-graph-DxIl6fzW.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-BOp38Pbq.js → flow-run._id-Bbm9OpDi.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-BOp38Pbq.js.map → flow-run._id-Bbm9OpDi.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-DJnTDEN_.js → flow-run._id-BtSgRDtA.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-DJnTDEN_.js.map → flow-run._id-BtSgRDtA.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bq2ZUzM6.js → flow-runs-pagination-LrU9Aio8.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bq2ZUzM6.js.map → flow-runs-pagination-LrU9Aio8.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow._id-eCBL95rg.js → flow._id-BJBRokk4.js} +2 -2
- prefect/server/ui-v2/assets/{flow._id-eCBL95rg.js.map → flow._id-BJBRokk4.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-DNerk3LS.js → form-CVSlEnl8.js} +2 -2
- prefect/server/ui-v2/assets/{form-DNerk3LS.js.map → form-CVSlEnl8.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-DwagHBlF.js → header-4plZZheZ.js} +2 -2
- prefect/server/ui-v2/assets/{header-DwagHBlF.js.map → header-4plZZheZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-huSvwxKI.js → header-9rXZ4r39.js} +2 -2
- prefect/server/ui-v2/assets/{header-huSvwxKI.js.map → header-9rXZ4r39.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-B0ejRncu.js → header-D3uM8_xM.js} +2 -2
- prefect/server/ui-v2/assets/{header-B0ejRncu.js.map → header-D3uM8_xM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DI2DC5gd.js → index-6OsEYhIi.js} +2 -2
- prefect/server/ui-v2/assets/{index-DI2DC5gd.js.map → index-6OsEYhIi.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BzN9bQeM.js → index-B7xsJ-QH.js} +2 -2
- prefect/server/ui-v2/assets/{index-BzN9bQeM.js.map → index-B7xsJ-QH.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CnIJUujl.js → index-BeoNC2tJ.js} +2 -2
- prefect/server/ui-v2/assets/{index-CnIJUujl.js.map → index-BeoNC2tJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CTnoa3Ho.js → index-BfJLUM7N.js} +2 -2
- prefect/server/ui-v2/assets/{index-CTnoa3Ho.js.map → index-BfJLUM7N.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CWkbSdxY.js → index-Bj0OOguP.js} +2 -2
- prefect/server/ui-v2/assets/{index-CWkbSdxY.js.map → index-Bj0OOguP.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CBhi1P9g.js → index-BlpD74iH.js} +2 -2
- prefect/server/ui-v2/assets/{index-CBhi1P9g.js.map → index-BlpD74iH.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D5RdrxkU.js → index-BvSl3DKP.js} +8 -8
- prefect/server/ui-v2/assets/index-BvSl3DKP.js.map +1 -0
- prefect/server/ui-v2/assets/{index-BU4yZRd3.js → index-CDwJvjUM.js} +2 -2
- prefect/server/ui-v2/assets/{index-BU4yZRd3.js.map → index-CDwJvjUM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CRDz4nhM.js → index-CDyLkbVG.js} +2 -2
- prefect/server/ui-v2/assets/{index-CRDz4nhM.js.map → index-CDyLkbVG.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Cutg_A1j.js → index-ChIrfjIW.js} +2 -2
- prefect/server/ui-v2/assets/{index-Cutg_A1j.js.map → index-ChIrfjIW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BhALpenO.js → index-CzCSgCK-.js} +2 -2
- prefect/server/ui-v2/assets/{index-BhALpenO.js.map → index-CzCSgCK-.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Dg_duvDx.js → index-D5v9S-lB.js} +2 -2
- prefect/server/ui-v2/assets/{index-Dg_duvDx.js.map → index-D5v9S-lB.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DDiyFpIV.js → index-D6GJ4go1.js} +2 -2
- prefect/server/ui-v2/assets/{index-DDiyFpIV.js.map → index-D6GJ4go1.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-dSUEBAqg.js → index-DJyKqsFO.js} +2 -2
- prefect/server/ui-v2/assets/{index-dSUEBAqg.js.map → index-DJyKqsFO.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BO3SOwdV.js → index-DODEq1Pi.js} +2 -2
- prefect/server/ui-v2/assets/{index-BO3SOwdV.js.map → index-DODEq1Pi.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Dspw5HFj.js → index-DicK6p3K.js} +2 -2
- prefect/server/ui-v2/assets/{index-Dspw5HFj.js.map → index-DicK6p3K.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-VOOLxiSE.js → index-DqCPbST9.js} +2 -2
- prefect/server/ui-v2/assets/{index-VOOLxiSE.js.map → index-DqCPbST9.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BTPE3vs7.js → index-DxPoKag8.js} +2 -2
- prefect/server/ui-v2/assets/{index-BTPE3vs7.js.map → index-DxPoKag8.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Wfs7Cjew.js → index-h9-QgNjZ.js} +2 -2
- prefect/server/ui-v2/assets/{index-Wfs7Cjew.js.map → index-h9-QgNjZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-uvH5a3zO.js → index-tBdv6kBF.js} +2 -2
- prefect/server/ui-v2/assets/{index-uvH5a3zO.js.map → index-tBdv6kBF.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CgOsOj5t.js → index-udb79rgq.js} +2 -2
- prefect/server/ui-v2/assets/{index-CgOsOj5t.js.map → index-udb79rgq.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-gXz7BuJj.js → json-input-Dt1icmrn.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-gXz7BuJj.js.map → json-input-Dt1icmrn.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-CJPbLXwU.js → key._key-Cyh5MBX_.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-CJPbLXwU.js.map → key._key-Cyh5MBX_.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-wPid80zf.js → lazy-markdown-BwIwKFRF.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-wPid80zf.js.map → lazy-markdown-BwIwKFRF.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-DC63bGXK.js → login-DKXFVSwk.js} +2 -2
- prefect/server/ui-v2/assets/{login-DC63bGXK.js.map → login-DKXFVSwk.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-BhqrU6Eo.js → markdown-input-Dp0mBlkV.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-BhqrU6Eo.js.map → markdown-input-Dp0mBlkV.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-example-snippet-3jtXWQZN.js → python-example-snippet-BYwPjHI5.js} +3 -3
- prefect/server/ui-v2/assets/{python-example-snippet-3jtXWQZN.js.map → python-example-snippet-BYwPjHI5.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-ZVi-v324.js → python-input-y26XMqXw.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-ZVi-v324.js.map → python-input-y26XMqXw.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-BBMLpHGc.js → radio-group-D0van45v.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-BBMLpHGc.js.map → radio-group-D0van45v.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-BJXl8qkX.js → route-error-state-CGGpuCGN.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-BJXl8qkX.js.map → route-error-state-CGGpuCGN.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-BEqYjsM-.js → schema-form-2tg5SXM4.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-BEqYjsM-.js.map → schema-form-2tg5SXM4.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-l3xt3PWf.js → schema-form-input-string-format-datetime-CZt6AJ4z.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-l3xt3PWf.js.map → schema-form-input-string-format-datetime-CZt6AJ4z.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-txD0dR5Q.js → settings-DDUadk_N.js} +2 -2
- prefect/server/ui-v2/assets/{settings-txD0dR5Q.js.map → settings-DDUadk_N.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-DHPFdKZ2.js → sort-filter-D9p3cPx9.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-DHPFdKZ2.js.map → sort-filter-D9p3cPx9.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-ULfpXJXB.js → table-vo9Do8sA.js} +2 -2
- prefect/server/ui-v2/assets/{table-ULfpXJXB.js.map → table-vo9Do8sA.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-BLzMOTDb.js → tags-input-Ci2JQ-k3.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-BLzMOTDb.js.map → tags-input-Ci2JQ-k3.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-BpeKHk7g.js → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js} +2 -2
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-BpeKHk7g.js.map → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-CkOl9MJs.js → task-run._id-CjevSs79.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-CkOl9MJs.js.map → task-run._id-CjevSs79.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-udkz1lhh.js → task-run._id-D8QKG5UZ.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-udkz1lhh.js.map → task-run._id-D8QKG5UZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-runs-pagination-B7D5K_FM.js → task-runs-pagination-CifoSGct.js} +2 -2
- prefect/server/ui-v2/assets/{task-runs-pagination-B7D5K_FM.js.map → task-runs-pagination-CifoSGct.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-C4bdj7Jk.js → textarea-BAtfAxtV.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-C4bdj7Jk.js.map → textarea-BAtfAxtV.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-AdlSRQxZ.js → timezone-select-QlQTZSsF.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-AdlSRQxZ.js.map → timezone-select-QlQTZSsF.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-C-vxYz4l.js → toggle-group-BJN1vjEh.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-C-vxYz4l.js.map → toggle-group-BJN1vjEh.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Cqhaqtqe.js → use-delete-automation-confirmation-dialog-eOWJYPkD.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Cqhaqtqe.js.map → use-delete-automation-confirmation-dialog-eOWJYPkD.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-GjNhFxZe.js → use-delete-block-document-confirmation-dialog-BTwSeHRM.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-GjNhFxZe.js.map → use-delete-block-document-confirmation-dialog-BTwSeHRM.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DfwmswyR.js → use-flow-runs-selected-rows-BL_Gv9CC.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DfwmswyR.js.map → use-flow-runs-selected-rows-BL_Gv9CC.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BEBpG_5J.js → use-get-artifacts-flow-task-runs-TSCoomjQ.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BEBpG_5J.js.map → use-get-artifacts-flow-task-runs-TSCoomjQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-BYBRcDwC.js → use-quick-run-BMnCkwSv.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-BYBRcDwC.js.map → use-quick-run-BMnCkwSv.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-Bk97vOTm.js → use-stepper-C1wm66U2.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-Bk97vOTm.js.map → use-stepper-C1wm66U2.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-BQwGFLk5.js → utilities-DxRXxFOF.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-BQwGFLk5.js.map → utilities-DxRXxFOF.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-filter-Ddhp_M-L.js → work-pool-filter-PudrkZYj.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-Ddhp_M-L.js.map → work-pool-filter-PudrkZYj.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-DX3eV3R_.js → work-pool-queue-toggle-BAOrV_0R.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-DX3eV3R_.js.map → work-pool-queue-toggle-BAOrV_0R.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-BaRIsXBX.js → work-pool._workPoolName-BOM3849e.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-BaRIsXBX.js.map → work-pool._workPoolName-BOM3849e.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-dhS_Xz32.js → work-pool_._workPoolName.edit-CIhcG6yr.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-dhS_Xz32.js.map → work-pool_._workPoolName.edit-CIhcG6yr.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js.map → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-_Ez8e2dw.js → work-queue-icon-text-CP4yX3uM.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-_Ez8e2dw.js.map → work-queue-icon-text-CP4yX3uM.js.map} +1 -1
- prefect/server/ui-v2/index.html +1 -1
- prefect/settings/models/flows.py +1 -14
- prefect/settings/models/runner.py +6 -16
- prefect/task_engine.py +3 -1
- prefect/task_worker.py +1 -1
- prefect/tasks.py +2 -2
- prefect/testing/fixtures.py +5 -23
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/METADATA +1 -1
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/RECORD +213 -213
- prefect/server/ui-v2/assets/block-type-logo-DURScH8H.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-BrEOenqP.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-BbYKPK42.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js +0 -2
- prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js +0 -4
- prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js.map +0 -1
- prefect/server/ui-v2/assets/index-D5RdrxkU.js.map +0 -1
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/WHEEL +0 -0
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-dSUEBAqg.js","sources":["../../src/components/artifacts/artifacts-filter.tsx","../../src/components/artifacts/artifacts-header.tsx","../../src/components/artifacts/empty-state.tsx","../../src/components/artifacts/artifacts-page.tsx","../../src/routes/artifacts/index.tsx?tsr-split=component"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { pluralize } from \"@/utils\";\nimport { Icon } from \"../ui/icons\";\nimport { ToggleGroup, ToggleGroupItem } from \"../ui/toggle-group\";\nimport { Typography } from \"../ui/typography\";\nimport type { filterType } from \"./types\";\n\ntype ArtifactsFilterProps = {\n\tfilters: filterType[];\n\tonFilterChange: (newFilters: filterType[]) => void;\n\ttotalCount: number;\n\tsetDisplayMode: (mode: string) => void;\n\tdisplayMode: string;\n};\n\nconst artifactTypeOptions = [\n\t{ value: \"all\", label: \"All Types\" },\n\t{ value: \"markdown\", label: \"Markdown\" },\n\t{ value: \"progress\", label: \"Progress\" },\n\t{ value: \"image\", label: \"Image\" },\n\t{ value: \"table\", label: \"Table\" },\n] as const;\n\nexport const ArtifactsFilterComponent = ({\n\tfilters,\n\tonFilterChange,\n\ttotalCount,\n\tdisplayMode,\n\tsetDisplayMode,\n}: ArtifactsFilterProps) => {\n\tconst changeArtifactName = useCallback(\n\t\t(value: string) => {\n\t\t\tonFilterChange([\n\t\t\t\t...filters.filter((filter) => filter.id !== \"name\"),\n\t\t\t\t{ id: \"name\", label: \"Name\", value },\n\t\t\t]);\n\t\t},\n\t\t[filters, onFilterChange],\n\t);\n\n\tconst changeArtifactType = useCallback(\n\t\t(value: string) => {\n\t\t\tonFilterChange([\n\t\t\t\t...filters.filter((filter) => filter.id !== \"type\"),\n\t\t\t\t{ id: \"type\", label: \"Type\", value },\n\t\t\t]);\n\t\t},\n\t\t[filters, onFilterChange],\n\t);\n\n\tconst typeValue = useMemo(\n\t\t() => filters.find((val) => val.id === \"type\")?.value,\n\t\t[filters],\n\t);\n\n\tconst nameValue = useMemo(\n\t\t() => filters.find((val) => val.id === \"name\")?.value,\n\t\t[filters],\n\t);\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"artifact-filter\"\n\t\t\tclassName=\"flex justify-between items-center\"\n\t\t>\n\t\t\t<div>\n\t\t\t\t<Typography variant=\"body\" className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} {pluralize(totalCount, \"artifact\")}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t<SearchInput\n\t\t\t\t\tdata-testid=\"search-input\"\n\t\t\t\t\tdefaultValue={nameValue}\n\t\t\t\t\tplaceholder=\"Search artifacts\"\n\t\t\t\t\tonChange={(e) => changeArtifactName(e.target.value)}\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<Select\n\t\t\t\t\t\tdata-testid=\"type-select\"\n\t\t\t\t\t\tvalue={typeValue}\n\t\t\t\t\t\tonValueChange={changeArtifactType}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Artifact type\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Type\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{artifactTypeOptions.map(({ value, label }) => (\n\t\t\t\t\t\t\t\t<SelectItem key={value} value={value}>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<ToggleGroup\n\t\t\t\t\t\t\ttype=\"single\"\n\t\t\t\t\t\t\tdefaultValue={displayMode}\n\t\t\t\t\t\t\tonValueChange={(value: string) => setDisplayMode(value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ToggleGroupItem data-testid=\"grid-layout\" value=\"grid\">\n\t\t\t\t\t\t\t\t<Icon id=\"LayoutGrid\" />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t\t<ToggleGroupItem data-testid=\"list-layout\" value=\"list\">\n\t\t\t\t\t\t\t\t<Icon id=\"AlignJustify\" />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t</ToggleGroup>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\n\nexport const ArtifactsHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tArtifacts\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\t\t\t</div>\n\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t</div>\n\t);\n};\n","import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const ArtifactsEmptyState = () => (\n\t<EmptyState>\n\t\t<div className=\"flex items-center gap-3\">\n\t\t\t<EmptyStateIcon id=\"Image\" />\n\t\t</div>\n\t\t<EmptyStateTitle>Create an artifact to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tArtifacts are byproducts of your runs; they can be anything from a\n\t\t\tmarkdown string to a table.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"artifacts-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useMemo } from \"react\";\nimport type { Artifact } from \"@/api/artifacts\";\nimport { useLocalStorage } from \"@/hooks/use-local-storage\";\nimport { ArtifactCard } from \"./artifact-card\";\nimport { ArtifactsFilterComponent } from \"./artifacts-filter\";\nimport { ArtifactsHeader } from \"./artifacts-header\";\nimport { ArtifactsEmptyState } from \"./empty-state\";\nimport type { filterType } from \"./types\";\n\nexport type ArtifactsPageProps = {\n\tfilters: filterType[];\n\tonFilterChange: (newFilters: filterType[]) => void;\n\tartifactsCount: number;\n\tartifactsList: Artifact[];\n};\n\nexport const ArtifactsPage = ({\n\tfilters,\n\tonFilterChange,\n\tartifactsList,\n\tartifactsCount,\n}: ArtifactsPageProps) => {\n\tconst [displayMode, setDisplayMode] = useLocalStorage<string>(\n\t\t\"artifacts-grid-style\",\n\t\t\"grid\",\n\t);\n\n\tconst gridClass = useMemo(() => {\n\t\treturn displayMode === \"grid\"\n\t\t\t? \"grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4\"\n\t\t\t: \"grid-cols-1\";\n\t}, [displayMode]);\n\n\tconst artifactsListFiltered = useMemo(\n\t\t() =>\n\t\t\t// reduced vs set to preserve sort order\n\t\t\tartifactsList.reduce((acc, artifact) => {\n\t\t\t\tif (!acc.find((a) => a.key === artifact.key)) {\n\t\t\t\t\tacc.push(artifact);\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t}, [] as Artifact[]),\n\t\t[artifactsList],\n\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ArtifactsHeader />\n\t\t\t<ArtifactsFilterComponent\n\t\t\t\tfilters={filters}\n\t\t\t\tonFilterChange={onFilterChange}\n\t\t\t\ttotalCount={artifactsCount}\n\t\t\t\tsetDisplayMode={setDisplayMode}\n\t\t\t\tdisplayMode={displayMode}\n\t\t\t/>\n\n\t\t\t{artifactsListFiltered.length === 0 ? (\n\t\t\t\t<ArtifactsEmptyState />\n\t\t\t) : (\n\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t{artifactsListFiltered.map((artifact) => (\n\t\t\t\t\t\t<ArtifactCard key={artifact.id} artifact={artifact} />\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype ArtifactsFilter,\n\tbuildCountArtifactsQuery,\n\tbuildListArtifactsQuery,\n} from \"@/api/artifacts\";\nimport { ArtifactsPage } from \"@/components/artifacts/artifacts-page\";\nimport type { filterType } from \"@/components/artifacts/types\";\nimport useDebounceCallback from \"@/hooks/use-debounce-callback\";\n\n/**\n * Schema for validating URL search parameters for the artifacts 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\ttype: z.string().optional().catch(\"\"),\n\tname: z.string().optional().catch(\"\"),\n});\n\n/**\n * Builds filter parameters for artifacts query from search params\n *\n * @param search - Optional validated search parameters containing page and limit\n * @returns ArtifactsFilter with type and name\n *\n * @example\n * ```ts\n * const filter = buildFilterBody({ type: \"markdown\", name: \"my-dataset\" })\n * // Returns {\n * //\t\tartifacts: {\n * //\t\t\toperator: \"and_\",\n * //\t\t\ttype: { any_: [\"markdown\"] },\n * //\t\t\tkey: { like_: \"my-dataset\" }\n * //\t\t},\n * //\t\tsort: \"CREATED_DESC\",\n * //\t\toffset: 0\n * //}\n * ```\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\ttype: {\n\t\t\tany_: search?.type && search?.type !== \"all\" ? [search.type] : undefined, // Filter by artifact type\n\t\t},\n\t\tkey: {\n\t\t\tlike_: search?.name ?? \"\", // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: async ({ deps, context }) => {\n\t\tconst [artifactsCount, artifactsList] = await Promise.all([\n\t\t\tcontext.queryClient.ensureQueryData(buildCountArtifactsQuery(deps)),\n\t\t\tcontext.queryClient.ensureQueryData(buildListArtifactsQuery(deps)),\n\t\t]);\n\n\t\treturn { artifactsCount, artifactsList };\n\t},\n\twrapInSuspense: true,\n});\n\nconst useFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst filters = useMemo(\n\t\t() => [\n\t\t\t{ id: \"type\", label: \"Type\", value: search.type ?? \"all\" },\n\t\t\t{ id: \"name\", label: \"Name\", value: search.name },\n\t\t],\n\t\t[search.type, search.name],\n\t);\n\n\tconst onFilterChange = useDebounceCallback(\n\t\tuseCallback(\n\t\t\t(newFilters: filterType[]) => {\n\t\t\t\tif (!newFilters) return;\n\t\t\t\tvoid navigate({\n\t\t\t\t\tto: \".\",\n\t\t\t\t\tsearch: () =>\n\t\t\t\t\t\tnewFilters\n\t\t\t\t\t\t\t.filter((filter) => filter.value)\n\t\t\t\t\t\t\t.reduce(\n\t\t\t\t\t\t\t\t(prev, curr) => {\n\t\t\t\t\t\t\t\t\tif (!curr.value) return prev;\n\t\t\t\t\t\t\t\t\tprev[curr.id] = curr.value;\n\t\t\t\t\t\t\t\t\treturn prev;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{} as Record<string, string>,\n\t\t\t\t\t\t\t),\n\t\t\t\t\treplace: true,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[navigate],\n\t\t),\n\t\t400,\n\t);\n\n\treturn { filters, onFilterChange };\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst { filters, onFilterChange } = useFilter();\n\n\tconst [{ data: artifactsCount }, { data: artifactsList }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildCountArtifactsQuery(buildFilterBody(search)),\n\t\t\t\tbuildListArtifactsQuery(buildFilterBody(search)),\n\t\t\t],\n\t\t});\n\n\treturn (\n\t\t<ArtifactsPage\n\t\t\tfilters={filters}\n\t\t\tonFilterChange={onFilterChange}\n\t\t\tartifactsCount={artifactsCount}\n\t\t\tartifactsList={artifactsList}\n\t\t/>\n\t);\n}\n"],"names":["artifactTypeOptions","ArtifactsFilterComponent","filters","onFilterChange","totalCount","displayMode","setDisplayMode","changeArtifactName","useCallback","value","filter","changeArtifactType","typeValue","useMemo","val","nameValue","jsxs","jsx","Typography","pluralize","SearchInput","e","Select","SelectTrigger","SelectValue","SelectContent","label","SelectItem","ToggleGroup","ToggleGroupItem","Icon","ArtifactsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","DocsLink","ArtifactsEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","ArtifactsPage","artifactsList","artifactsCount","useLocalStorage","gridClass","artifactsListFiltered","acc","artifact","a","ArtifactCard","buildFilterBody","search","artifacts","operator","type","any_","undefined","key","like_","name","sort","offset","useFilter","Route","useSearch","navigate","useNavigate","id","useDebounceCallback","newFilters","to","reduce","prev","curr","replace","RouteComponent","data","useSuspenseQueries","queries","buildCountArtifactsQuery","buildListArtifactsQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-DJyKqsFO.js","sources":["../../src/components/artifacts/artifacts-filter.tsx","../../src/components/artifacts/artifacts-header.tsx","../../src/components/artifacts/empty-state.tsx","../../src/components/artifacts/artifacts-page.tsx","../../src/routes/artifacts/index.tsx?tsr-split=component"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { pluralize } from \"@/utils\";\nimport { Icon } from \"../ui/icons\";\nimport { ToggleGroup, ToggleGroupItem } from \"../ui/toggle-group\";\nimport { Typography } from \"../ui/typography\";\nimport type { filterType } from \"./types\";\n\ntype ArtifactsFilterProps = {\n\tfilters: filterType[];\n\tonFilterChange: (newFilters: filterType[]) => void;\n\ttotalCount: number;\n\tsetDisplayMode: (mode: string) => void;\n\tdisplayMode: string;\n};\n\nconst artifactTypeOptions = [\n\t{ value: \"all\", label: \"All Types\" },\n\t{ value: \"markdown\", label: \"Markdown\" },\n\t{ value: \"progress\", label: \"Progress\" },\n\t{ value: \"image\", label: \"Image\" },\n\t{ value: \"table\", label: \"Table\" },\n] as const;\n\nexport const ArtifactsFilterComponent = ({\n\tfilters,\n\tonFilterChange,\n\ttotalCount,\n\tdisplayMode,\n\tsetDisplayMode,\n}: ArtifactsFilterProps) => {\n\tconst changeArtifactName = useCallback(\n\t\t(value: string) => {\n\t\t\tonFilterChange([\n\t\t\t\t...filters.filter((filter) => filter.id !== \"name\"),\n\t\t\t\t{ id: \"name\", label: \"Name\", value },\n\t\t\t]);\n\t\t},\n\t\t[filters, onFilterChange],\n\t);\n\n\tconst changeArtifactType = useCallback(\n\t\t(value: string) => {\n\t\t\tonFilterChange([\n\t\t\t\t...filters.filter((filter) => filter.id !== \"type\"),\n\t\t\t\t{ id: \"type\", label: \"Type\", value },\n\t\t\t]);\n\t\t},\n\t\t[filters, onFilterChange],\n\t);\n\n\tconst typeValue = useMemo(\n\t\t() => filters.find((val) => val.id === \"type\")?.value,\n\t\t[filters],\n\t);\n\n\tconst nameValue = useMemo(\n\t\t() => filters.find((val) => val.id === \"name\")?.value,\n\t\t[filters],\n\t);\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"artifact-filter\"\n\t\t\tclassName=\"flex justify-between items-center\"\n\t\t>\n\t\t\t<div>\n\t\t\t\t<Typography variant=\"body\" className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount} {pluralize(totalCount, \"artifact\")}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t<SearchInput\n\t\t\t\t\tdata-testid=\"search-input\"\n\t\t\t\t\tdefaultValue={nameValue}\n\t\t\t\t\tplaceholder=\"Search artifacts\"\n\t\t\t\t\tonChange={(e) => changeArtifactName(e.target.value)}\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<Select\n\t\t\t\t\t\tdata-testid=\"type-select\"\n\t\t\t\t\t\tvalue={typeValue}\n\t\t\t\t\t\tonValueChange={changeArtifactType}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Artifact type\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Type\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t{artifactTypeOptions.map(({ value, label }) => (\n\t\t\t\t\t\t\t\t<SelectItem key={value} value={value}>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<ToggleGroup\n\t\t\t\t\t\t\ttype=\"single\"\n\t\t\t\t\t\t\tdefaultValue={displayMode}\n\t\t\t\t\t\t\tonValueChange={(value: string) => setDisplayMode(value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ToggleGroupItem data-testid=\"grid-layout\" value=\"grid\">\n\t\t\t\t\t\t\t\t<Icon id=\"LayoutGrid\" />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t\t<ToggleGroupItem data-testid=\"list-layout\" value=\"list\">\n\t\t\t\t\t\t\t\t<Icon id=\"AlignJustify\" />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t</ToggleGroup>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\n\nexport const ArtifactsHeader = () => {\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tArtifacts\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\t\t\t</div>\n\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t</div>\n\t);\n};\n","import { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport const ArtifactsEmptyState = () => (\n\t<EmptyState>\n\t\t<div className=\"flex items-center gap-3\">\n\t\t\t<EmptyStateIcon id=\"Image\" />\n\t\t</div>\n\t\t<EmptyStateTitle>Create an artifact to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tArtifacts are byproducts of your runs; they can be anything from a\n\t\t\tmarkdown string to a table.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<DocsLink id=\"artifacts-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useMemo } from \"react\";\nimport type { Artifact } from \"@/api/artifacts\";\nimport { useLocalStorage } from \"@/hooks/use-local-storage\";\nimport { ArtifactCard } from \"./artifact-card\";\nimport { ArtifactsFilterComponent } from \"./artifacts-filter\";\nimport { ArtifactsHeader } from \"./artifacts-header\";\nimport { ArtifactsEmptyState } from \"./empty-state\";\nimport type { filterType } from \"./types\";\n\nexport type ArtifactsPageProps = {\n\tfilters: filterType[];\n\tonFilterChange: (newFilters: filterType[]) => void;\n\tartifactsCount: number;\n\tartifactsList: Artifact[];\n};\n\nexport const ArtifactsPage = ({\n\tfilters,\n\tonFilterChange,\n\tartifactsList,\n\tartifactsCount,\n}: ArtifactsPageProps) => {\n\tconst [displayMode, setDisplayMode] = useLocalStorage<string>(\n\t\t\"artifacts-grid-style\",\n\t\t\"grid\",\n\t);\n\n\tconst gridClass = useMemo(() => {\n\t\treturn displayMode === \"grid\"\n\t\t\t? \"grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4\"\n\t\t\t: \"grid-cols-1\";\n\t}, [displayMode]);\n\n\tconst artifactsListFiltered = useMemo(\n\t\t() =>\n\t\t\t// reduced vs set to preserve sort order\n\t\t\tartifactsList.reduce((acc, artifact) => {\n\t\t\t\tif (!acc.find((a) => a.key === artifact.key)) {\n\t\t\t\t\tacc.push(artifact);\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t}, [] as Artifact[]),\n\t\t[artifactsList],\n\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ArtifactsHeader />\n\t\t\t<ArtifactsFilterComponent\n\t\t\t\tfilters={filters}\n\t\t\t\tonFilterChange={onFilterChange}\n\t\t\t\ttotalCount={artifactsCount}\n\t\t\t\tsetDisplayMode={setDisplayMode}\n\t\t\t\tdisplayMode={displayMode}\n\t\t\t/>\n\n\t\t\t{artifactsListFiltered.length === 0 ? (\n\t\t\t\t<ArtifactsEmptyState />\n\t\t\t) : (\n\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t{artifactsListFiltered.map((artifact) => (\n\t\t\t\t\t\t<ArtifactCard key={artifact.id} artifact={artifact} />\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype ArtifactsFilter,\n\tbuildCountArtifactsQuery,\n\tbuildListArtifactsQuery,\n} from \"@/api/artifacts\";\nimport { ArtifactsPage } from \"@/components/artifacts/artifacts-page\";\nimport type { filterType } from \"@/components/artifacts/types\";\nimport useDebounceCallback from \"@/hooks/use-debounce-callback\";\n\n/**\n * Schema for validating URL search parameters for the artifacts 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\ttype: z.string().optional().catch(\"\"),\n\tname: z.string().optional().catch(\"\"),\n});\n\n/**\n * Builds filter parameters for artifacts query from search params\n *\n * @param search - Optional validated search parameters containing page and limit\n * @returns ArtifactsFilter with type and name\n *\n * @example\n * ```ts\n * const filter = buildFilterBody({ type: \"markdown\", name: \"my-dataset\" })\n * // Returns {\n * //\t\tartifacts: {\n * //\t\t\toperator: \"and_\",\n * //\t\t\ttype: { any_: [\"markdown\"] },\n * //\t\t\tkey: { like_: \"my-dataset\" }\n * //\t\t},\n * //\t\tsort: \"CREATED_DESC\",\n * //\t\toffset: 0\n * //}\n * ```\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\ttype: {\n\t\t\tany_: search?.type && search?.type !== \"all\" ? [search.type] : undefined, // Filter by artifact type\n\t\t},\n\t\tkey: {\n\t\t\tlike_: search?.name ?? \"\", // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: async ({ deps, context }) => {\n\t\tconst [artifactsCount, artifactsList] = await Promise.all([\n\t\t\tcontext.queryClient.ensureQueryData(buildCountArtifactsQuery(deps)),\n\t\t\tcontext.queryClient.ensureQueryData(buildListArtifactsQuery(deps)),\n\t\t]);\n\n\t\treturn { artifactsCount, artifactsList };\n\t},\n\twrapInSuspense: true,\n});\n\nconst useFilter = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst filters = useMemo(\n\t\t() => [\n\t\t\t{ id: \"type\", label: \"Type\", value: search.type ?? \"all\" },\n\t\t\t{ id: \"name\", label: \"Name\", value: search.name },\n\t\t],\n\t\t[search.type, search.name],\n\t);\n\n\tconst onFilterChange = useDebounceCallback(\n\t\tuseCallback(\n\t\t\t(newFilters: filterType[]) => {\n\t\t\t\tif (!newFilters) return;\n\t\t\t\tvoid navigate({\n\t\t\t\t\tto: \".\",\n\t\t\t\t\tsearch: () =>\n\t\t\t\t\t\tnewFilters\n\t\t\t\t\t\t\t.filter((filter) => filter.value)\n\t\t\t\t\t\t\t.reduce(\n\t\t\t\t\t\t\t\t(prev, curr) => {\n\t\t\t\t\t\t\t\t\tif (!curr.value) return prev;\n\t\t\t\t\t\t\t\t\tprev[curr.id] = curr.value;\n\t\t\t\t\t\t\t\t\treturn prev;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{} as Record<string, string>,\n\t\t\t\t\t\t\t),\n\t\t\t\t\treplace: true,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[navigate],\n\t\t),\n\t\t400,\n\t);\n\n\treturn { filters, onFilterChange };\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst { filters, onFilterChange } = useFilter();\n\n\tconst [{ data: artifactsCount }, { data: artifactsList }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildCountArtifactsQuery(buildFilterBody(search)),\n\t\t\t\tbuildListArtifactsQuery(buildFilterBody(search)),\n\t\t\t],\n\t\t});\n\n\treturn (\n\t\t<ArtifactsPage\n\t\t\tfilters={filters}\n\t\t\tonFilterChange={onFilterChange}\n\t\t\tartifactsCount={artifactsCount}\n\t\t\tartifactsList={artifactsList}\n\t\t/>\n\t);\n}\n"],"names":["artifactTypeOptions","ArtifactsFilterComponent","filters","onFilterChange","totalCount","displayMode","setDisplayMode","changeArtifactName","useCallback","value","filter","changeArtifactType","typeValue","useMemo","val","nameValue","jsxs","jsx","Typography","pluralize","SearchInput","e","Select","SelectTrigger","SelectValue","SelectContent","label","SelectItem","ToggleGroup","ToggleGroupItem","Icon","ArtifactsHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","DocsLink","ArtifactsEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","ArtifactsPage","artifactsList","artifactsCount","useLocalStorage","gridClass","artifactsListFiltered","acc","artifact","a","ArtifactCard","buildFilterBody","search","artifacts","operator","type","any_","undefined","key","like_","name","sort","offset","useFilter","Route","useSearch","navigate","useNavigate","id","useDebounceCallback","newFilters","to","reduce","prev","curr","replace","RouteComponent","data","useSuspenseQueries","queries","buildCountArtifactsQuery","buildListArtifactsQuery"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./vendor-tanstack-BK8oseNA.js";import{S as C,a as S,b as D,aq as a,c as A,e as L}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as e}from"./vendor-tanstack-BK8oseNA.js";import{S as C,a as S,b as D,aq as a,c as A,e as L}from"./index-BvSl3DKP.js";const E={COMPLETED:"Completed",RUNNING:"Running",SCHEDULED:"Scheduled",PENDING:"Pending",FAILED:"Failed",CANCELLED:"Cancelled",CANCELLING:"Cancelling",CRASHED:"Crashed",PAUSED:"Paused"},N=["Scheduled","Late","Resuming","AwaitingRetry","AwaitingConcurrencySlot","Pending","Paused","Suspended","Running","Retrying","Completed","Cached","Cancelled","Cancelling","Crashed","Failed","TimedOut"],g={Scheduled:"SCHEDULED",Late:"SCHEDULED",Resuming:"SCHEDULED",AwaitingRetry:"SCHEDULED",AwaitingConcurrencySlot:"SCHEDULED",Pending:"PENDING",Paused:"PAUSED",Suspended:"PAUSED",Running:"RUNNING",Retrying:"RUNNING",Completed:"COMPLETED",Cached:"COMPLETED",Cancelled:"CANCELLED",Cancelling:"CANCELLING",Crashed:"CRASHED",Failed:"FAILED",TimedOut:"FAILED"},R=N.filter(t=>t!=="Scheduled"),u=["COMPLETED","FAILED","CANCELLED","CRASHED"],P=({value:t,onValueChange:l,placeholder:i="Select state",terminalOnly:c=!1,excludeState:s})=>{const d=Object.entries(E).filter(([n])=>!(c&&!u.includes(n)||s&&n===s));return e.jsxs(C,{value:t,onValueChange:l,children:[e.jsx(S,{"aria-label":"select state",className:"w-full",children:e.jsx(D,{placeholder:i,children:t&&e.jsx(a,{type:t,name:E[t]})})}),e.jsx(A,{className:"w-full min-w-[300px]",children:d.map(([n,r])=>e.jsx(L,{value:n,className:"flex items-center",children:e.jsx(a,{type:n,name:r})},n))})]})};export{E as R,P as S,N as a,g as b,R as c};
|
|
2
|
+
//# sourceMappingURL=index-DODEq1Pi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DODEq1Pi.js","sources":["../../src/api/flow-runs/constants.ts","../../src/components/ui/state-select/index.tsx"],"sourcesContent":["import type { components } from \"@/api/prefect\";\n\nexport const RUN_STATES = {\n\tCOMPLETED: \"Completed\",\n\tRUNNING: \"Running\",\n\tSCHEDULED: \"Scheduled\",\n\tPENDING: \"Pending\",\n\tFAILED: \"Failed\",\n\tCANCELLED: \"Cancelled\",\n\tCANCELLING: \"Cancelling\",\n\tCRASHED: \"Crashed\",\n\tPAUSED: \"Paused\",\n} as const satisfies Record<\n\tcomponents[\"schemas\"][\"StateType\"],\n\tCapitalize<Lowercase<components[\"schemas\"][\"StateType\"]>>\n>;\n\nexport type RunStates = keyof typeof RUN_STATES;\n\nexport type StateType = components[\"schemas\"][\"StateType\"];\n\n/**\n * All possible state names that can be used in automations.\n * This list is intentionally ordered by state type progression\n * to match the Vue implementation.\n */\nexport const STATE_NAMES = [\n\t\"Scheduled\",\n\t\"Late\",\n\t\"Resuming\",\n\t\"AwaitingRetry\",\n\t\"AwaitingConcurrencySlot\",\n\t\"Pending\",\n\t\"Paused\",\n\t\"Suspended\",\n\t\"Running\",\n\t\"Retrying\",\n\t\"Completed\",\n\t\"Cached\",\n\t\"Cancelled\",\n\t\"Cancelling\",\n\t\"Crashed\",\n\t\"Failed\",\n\t\"TimedOut\",\n] as const;\n\nexport type StateName = (typeof STATE_NAMES)[number];\n\n/**\n * Maps state names to their corresponding state types.\n * Multiple state names can map to the same state type.\n */\nexport const STATE_NAME_TO_TYPE: Record<StateName, StateType> = {\n\tScheduled: \"SCHEDULED\",\n\tLate: \"SCHEDULED\",\n\tResuming: \"SCHEDULED\",\n\tAwaitingRetry: \"SCHEDULED\",\n\tAwaitingConcurrencySlot: \"SCHEDULED\",\n\tPending: \"PENDING\",\n\tPaused: \"PAUSED\",\n\tSuspended: \"PAUSED\",\n\tRunning: \"RUNNING\",\n\tRetrying: \"RUNNING\",\n\tCompleted: \"COMPLETED\",\n\tCached: \"COMPLETED\",\n\tCancelled: \"CANCELLED\",\n\tCancelling: \"CANCELLING\",\n\tCrashed: \"CRASHED\",\n\tFailed: \"FAILED\",\n\tTimedOut: \"FAILED\",\n} as const;\n\n/**\n * State names that are not \"Scheduled\" - used for the \"All except scheduled\" convenience option.\n */\nexport const STATE_NAMES_WITHOUT_SCHEDULED = STATE_NAMES.filter(\n\t(name) => name !== \"Scheduled\",\n);\n","import { RUN_STATES } from \"@/api/flow-runs/constants\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype StateType = components[\"schemas\"][\"StateType\"];\n\nconst TERMINAL_STATES: StateType[] = [\n\t\"COMPLETED\",\n\t\"FAILED\",\n\t\"CANCELLED\",\n\t\"CRASHED\",\n];\n\nexport type StateSelectProps = {\n\tvalue?: StateType;\n\tonValueChange: (value: StateType) => void;\n\tplaceholder?: string;\n\tterminalOnly?: boolean;\n\texcludeState?: StateType;\n};\n\nexport const StateSelect = ({\n\tvalue,\n\tonValueChange,\n\tplaceholder = \"Select state\",\n\tterminalOnly = false,\n\texcludeState,\n}: StateSelectProps) => {\n\tconst stateEntries = Object.entries(RUN_STATES) as [StateType, string][];\n\n\tconst filteredStates = stateEntries.filter(([key]) => {\n\t\tif (terminalOnly && !TERMINAL_STATES.includes(key)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (excludeState && key === excludeState) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\n\treturn (\n\t\t<Select value={value} onValueChange={onValueChange}>\n\t\t\t<SelectTrigger aria-label=\"select state\" className=\"w-full\">\n\t\t\t\t<SelectValue placeholder={placeholder}>\n\t\t\t\t\t{value && <StateBadge type={value} name={RUN_STATES[value]} />}\n\t\t\t\t</SelectValue>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent className=\"w-full min-w-[300px]\">\n\t\t\t\t{filteredStates.map(([key, displayName]) => (\n\t\t\t\t\t<SelectItem key={key} value={key} className=\"flex items-center\">\n\t\t\t\t\t\t<StateBadge type={key} name={displayName} />\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n"],"names":["RUN_STATES","STATE_NAMES","STATE_NAME_TO_TYPE","STATE_NAMES_WITHOUT_SCHEDULED","name","TERMINAL_STATES","StateSelect","value","onValueChange","placeholder","terminalOnly","excludeState","filteredStates","key","jsxs","Select","jsx","SelectTrigger","SelectValue","StateBadge","SelectContent","displayName","SelectItem"],"mappings":"8HAEO,MAAMA,EAAa,CACzB,UAAW,YACX,QAAS,UACT,UAAW,YACX,QAAS,UACT,OAAQ,SACR,UAAW,YACX,WAAY,aACZ,QAAS,UACT,OAAQ,QACT,EAcaC,EAAc,CAC1B,YACA,OACA,WACA,gBACA,0BACA,UACA,SACA,YACA,UACA,WACA,YACA,SACA,YACA,aACA,UACA,SACA,UACD,EAQaC,EAAmD,CAC/D,UAAW,YACX,KAAM,YACN,SAAU,YACV,cAAe,YACf,wBAAyB,YACzB,QAAS,UACT,OAAQ,SACR,UAAW,SACX,QAAS,UACT,SAAU,UACV,UAAW,YACX,OAAQ,YACR,UAAW,YACX,WAAY,aACZ,QAAS,UACT,OAAQ,SACR,SAAU,QACX,EAKaC,EAAgCF,EAAY,OACvDG,GAASA,IAAS,WACpB,EChEMC,EAA+B,CACpC,YACA,SACA,YACA,SACD,EAUaC,EAAc,CAAC,CAC3B,MAAAC,EACA,cAAAC,EACA,YAAAC,EAAc,eACd,aAAAC,EAAe,GACf,aAAAC,CACD,IAAwB,CAGvB,MAAMC,EAFe,OAAO,QAAQZ,CAAU,EAEV,OAAO,CAAC,CAACa,CAAG,IAC3C,EAAAH,GAAgB,CAACL,EAAgB,SAASQ,CAAG,GAG7CF,GAAgBE,IAAQF,EAI5B,EAED,OACCG,EAAAA,KAACC,EAAA,CAAO,MAAAR,EAAc,cAAAC,EACrB,SAAA,CAAAQ,EAAAA,IAACC,GAAc,aAAW,eAAe,UAAU,SAClD,SAAAD,EAAAA,IAACE,GAAY,YAAAT,EACX,SAAAF,GAASS,MAACG,EAAA,CAAW,KAAMZ,EAAO,KAAMP,EAAWO,CAAK,EAAG,EAC7D,CAAA,CACD,EACAS,EAAAA,IAACI,EAAA,CAAc,UAAU,uBACvB,SAAAR,EAAe,IAAI,CAAC,CAACC,EAAKQ,CAAW,IACrCL,EAAAA,IAACM,EAAA,CAAqB,MAAOT,EAAK,UAAU,oBAC3C,SAAAG,EAAAA,IAACG,EAAA,CAAW,KAAMN,EAAK,KAAMQ,CAAA,CAAa,CAAA,EAD1BR,CAEjB,CACA,CAAA,CACF,CAAA,EACD,CAEF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t,E as h,s as D,r as u}from"./vendor-tanstack-BK8oseNA.js";import{E as S,t as d,v as C,w as v,x as w,D as j,bc as r,bd as b,be as N,ab as _}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as t,E as h,s as D,r as u}from"./vendor-tanstack-BK8oseNA.js";import{E as S,t as d,v as C,w as v,x as w,D as j,bc as r,bd as b,be as N,ab as _}from"./index-BvSl3DKP.js";import{D as E}from"./index-Bj0OOguP.js";import{D as k}from"./header-9rXZ4r39.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";import"./use-quick-run-BMnCkwSv.js";import"./use-delete-confirmation-dialog-CvQEyyhU.js";import"./data-table-Bw8TZx9D.js";import"./table-vo9Do8sA.js";import"./delete-confirmation-dialog-CTdWZlGM.js";import"./index-tBdv6kBF.js";import"./cronstrue-WDy4rv2V.js";import"./use-is-overflowing-Bv_2pq2B.js";import"./index-ChIrfjIW.js";import"./tags-input-Ci2JQ-k3.js";import"./dropdown-menu-CT-s-V7d.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:[b(),N(A(e))]}),g=m?.results??[],{data:y}=D(_({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-DicK6p3K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-Dspw5HFj.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-DicK6p3K.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{j as e,L as h,r as d,C as v,D,B as N,p as S,s as T}from"./vendor-tanstack-BK8oseNA.js";import{al as p,ak as f,bm as w,ac as I,ad as R,bn as _,ae as z,af as E,ah as M,ag as P,ai as A,aj as L,q as j,I as k,N as F,E as Q,t as q,v as H,w as V,x as $,D as O,B as G,h as U,O as J,bo as K,bp as W,bq as x}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as e,L as h,r as d,C as v,D,B as N,p as S,s as T}from"./vendor-tanstack-BK8oseNA.js";import{al as p,ak as f,bm as w,ac as I,ad as R,bn as _,ae as z,af as E,ah as M,ag as P,ai as A,aj as L,q as j,I as k,N as F,E as Q,t as q,v as H,w as V,x as $,D as O,B as G,h as U,O as J,bo as K,bp as W,bq as x}from"./index-BvSl3DKP.js";import{u as C,B as X}from"./use-delete-block-document-confirmation-dialog-BTwSeHRM.js";import{D as Y}from"./data-table-Bw8TZx9D.js";import{D as y}from"./delete-confirmation-dialog-CTdWZlGM.js";import{B as Z}from"./block-type-logo-WQNm0PzP.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";import"./dropdown-menu-CT-s-V7d.js";import"./use-delete-confirmation-dialog-CvQEyyhU.js";import"./table-vo9Do8sA.js";const ee=({blockDocument:a})=>{const{id:o,name:s,block_type:t,block_type_name:l}=a;return e.jsxs("div",{className:"flex gap-4 items-center",children:[t&&l&&e.jsx(Z,{size:"sm",logoUrl:t.logo_url,alt:`${l} logo`}),e.jsxs("div",{className:"flex flex-col",children:[s&&e.jsx(h,{to:"/blocks/block/$id",params:{id:o},children:e.jsx(p,{className:"font-semibold",children:s})}),l&&a.block_type?.slug&&e.jsx(h,{to:"/blocks/catalog/$slug",params:{slug:a.block_type.slug},children:e.jsx(p,{variant:"bodySmall",className:"text-muted-foreground",children:l})})]})]})},b=N(),se=({onDelete:a})=>[b.display({size:20,id:"select",header:({table:o})=>{let s=!1;return o.getIsAllRowsSelected()?s=!0:o.getIsSomePageRowsSelected()&&(s="indeterminate"),e.jsx(f,{checked:s,onCheckedChange:t=>o.toggleAllPageRowsSelected(!!t),"aria-label":"Select all"})},cell:({row:o})=>e.jsx(f,{checked:o.getIsSelected(),onCheckedChange:s=>o.toggleSelected(!!s),"aria-label":"Select row"}),enableSorting:!1,enableHiding:!1}),b.display({id:"block",header:"Block",cell:({row:o})=>e.jsx(ee,{blockDocument:o.original})}),b.display({id:"actions",cell:o=>{const s=o.row.original;return e.jsx("div",{className:"flex justify-end",children:e.jsx(X,{blockDocument:s,onDelete:()=>a(s)})})}})],oe=({blockDocuments:a,blockDocumentsCount:o,onPaginationChange:s,pagination:t,rowSelection:l,setRowSelection:i})=>{const[r,m]=C(),u=d.useCallback(c=>{let g=t;typeof c=="function"?g=c(t):g=c,s(g)},[t,s]),n=v({columns:se({onDelete:m}),data:a,defaultColumn:{maxSize:300},getCoreRowModel:D(),manualPagination:!0,onPaginationChange:u,rowCount:o,getRowId:c=>c.id,onRowSelectionChange:i,state:{pagination:t,rowSelection:l}});return e.jsxs(e.Fragment,{children:[e.jsx(Y,{table:n}),e.jsx(y,{...r})]})};function ae({selectedBlockTypesSlugs:a,onToggleBlockTypeSlug:o,onRemoveBlockTypeSlug:s}){return e.jsx(d.Suspense,{children:e.jsx(te,{selectedBlockTypesSlugs:a,onToggleBlockTypeSlug:o,onRemoveBlockTypeSlug:s})})}function te({selectedBlockTypesSlugs:a,onToggleBlockTypeSlug:o,onRemoveBlockTypeSlug:s}){const[t,l]=d.useState(""),i=d.useDeferredValue(t),{data:r}=S(w()),m=d.useMemo(()=>a.map(n=>r.find(c=>c.slug===n)).filter(Boolean),[r,a]),u=d.useMemo(()=>r.filter(n=>n.name.toLowerCase().includes(i.toLowerCase())),[r,i]);return e.jsxs(I,{children:[e.jsx(R,{selected:a.length>0,children:e.jsx("div",{className:"flex gap-1",children:a.length>0?m.map(n=>e.jsx(_,{tag:n.name,onRemove:()=>s(n.slug)},n.id)):"Select blocks"})}),e.jsxs(z,{children:[e.jsx(E,{value:t,onValueChange:l,placeholder:"Search for a block type..."}),e.jsx(M,{children:"No block type found"}),e.jsx(P,{children:e.jsx(A,{children:u.map(n=>e.jsx(L,{selected:a.includes(n.slug),onSelect:c=>{o(c),l("")},value:n.slug,children:n.name},n.id))})})]})]})}const le=({count:a,rowSelection:o,setRowSelection:s})=>{const[t,l]=C(),i=d.useMemo(()=>Object.keys(o),[o]);return i.length>0?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(p,{variant:"bodySmall",className:"text-muted-foreground",children:[i.length," selected"]}),e.jsx(j,{"aria-label":"Delete rows",size:"icon",variant:"secondary",onClick:()=>{l(i,{onSuccess:()=>s({})})},children:e.jsx(k,{id:"Trash2",className:"size-4"})})]}),e.jsx(y,{...t})]}):e.jsxs(p,{variant:"bodySmall",className:"text-muted-foreground",children:[a," ",F(a,"Block")]})},ne=()=>e.jsxs(Q,{children:[e.jsx(q,{id:"Box"}),e.jsx(H,{children:"Add a block to get started"}),e.jsx(V,{children:"Blocks securely store credentials and configuration to easily manage connections to external systems."}),e.jsxs($,{children:[e.jsx(h,{to:"/blocks/catalog",children:e.jsxs(j,{children:["Add Block ",e.jsx(k,{id:"Plus",className:"size-4 ml-2"})]})}),e.jsx(O,{id:"blocks-guide"})]})]}),ce=({allCount:a,blockDocuments:o=[],onSearch:s,search:t,blockTypeSlugsFilter:l,onToggleBlockTypeSlug:i,onRemoveBlockTypeSlug:r,pagination:m,onPaginationChange:u})=>{const[n,c]=d.useState({});return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(G,{children:e.jsx(U,{className:"text-xl font-semibold",children:"Blocks"})}),e.jsx(j,{size:"icon",className:"size-7",variant:"outline",children:e.jsx(h,{to:"/blocks/catalog",children:e.jsx(k,{id:"Plus",className:"size-4"})})})]}),a===0?e.jsx(ne,{}):e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(le,{rowSelection:n,setRowSelection:c,count:a}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ae,{selectedBlockTypesSlugs:l,onToggleBlockTypeSlug:i,onRemoveBlockTypeSlug:r}),e.jsx("div",{className:"min-w-56",children:e.jsx(J,{"aria-label":"search blocks",placeholder:"Search blocks",value:t,onChange:g=>s(g.target.value)})})]})]}),e.jsx(oe,{blockDocuments:o,rowSelection:n,setRowSelection:c,blockDocumentsCount:a,pagination:m,onPaginationChange:u})]})]})};function ve(){const[a,o]=ie(),[s,t]=re(),[l,i]=de(),{data:r}=S(K()),{data:m}=T(W({sort:"NAME_ASC",include_secrets:!1,block_documents:{name:{like_:a},operator:"and_",is_anonymous:{eq_:!1}},block_types:{slug:{any_:s.length>0?s:void 0}},offset:l.pageIndex*l.pageSize,limit:l.pageSize})),u=c=>{const g=s.filter(B=>B!==c);t(g)},n=c=>{if(s.includes(c))return u(c);t([...s,c])};return e.jsx(ce,{allCount:r,blockDocuments:m,onSearch:o,search:a,blockTypeSlugsFilter:s,onRemoveBlockTypeSlug:u,onToggleBlockTypeSlug:n,pagination:l,onPaginationChange:i})}function ie(){const{blockName:a}=x.useSearch(),o=x.useNavigate(),s=d.useCallback(l=>{o({to:".",search:i=>({...i,blockName:l}),replace:!0})},[o]);return[d.useMemo(()=>a??"",[a]),s]}function re(){const{blockTypes:a=[]}=x.useSearch(),o=x.useNavigate(),s=d.useCallback(t=>{o({to:".",search:l=>({...l,blockTypes:t}),replace:!0})},[o]);return[a,s]}function de(){const a=x.useSearch(),o=x.useNavigate(),s=(a.page??1)-1,t=a.limit??10,l=d.useMemo(()=>({pageIndex:s,pageSize:t}),[s,t]),i=d.useCallback(r=>{o({to:".",search:m=>({...m,page:r.pageIndex+1,limit:r.pageSize}),replace:!0})},[o]);return[l,i]}export{ve as component};
|
|
2
|
+
//# sourceMappingURL=index-DqCPbST9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-VOOLxiSE.js","sources":["../../src/components/blocks/block-document-data-table/block-document-cell.tsx","../../src/components/blocks/block-document-data-table/block-document-data-table.tsx","../../src/components/blocks/block-types-multi-select/block-types-multi-select.tsx","../../src/components/blocks/blocks-row-count/blocks-row-count.tsx","../../src/components/blocks/empty-state/empty-state.tsx","../../src/components/blocks/blocks-page.tsx","../../src/routes/blocks/index.tsx?tsr-split=component"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockTypeLogo } from \"@/components/block-type-logo/block-type-logo\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype BlockDocumentCellProps = {\n\tblockDocument: BlockDocument;\n};\n\nexport const BlockDocumentCell = ({\n\tblockDocument,\n}: BlockDocumentCellProps) => {\n\tconst { id, name, block_type, block_type_name } = blockDocument;\n\n\treturn (\n\t\t<div className=\"flex gap-4 items-center\">\n\t\t\t{block_type && block_type_name && (\n\t\t\t\t<BlockTypeLogo\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tlogoUrl={block_type.logo_url}\n\t\t\t\t\talt={`${block_type_name} logo`}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t{name && (\n\t\t\t\t\t<Link to=\"/blocks/block/$id\" params={{ id }}>\n\t\t\t\t\t\t<Typography className=\"font-semibold\">{name}</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t\t{block_type_name && blockDocument.block_type?.slug && (\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/blocks/catalog/$slug\"\n\t\t\t\t\t\tparams={{ slug: blockDocument.block_type.slug }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{block_type_name}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { CheckedState } from \"@radix-ui/react-checkbox\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockDocumentActionMenu } from \"@/components/blocks/block-document-action-menu\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { BlockDocumentCell } from \"./block-document-cell\";\n\nconst columnHelper = createColumnHelper<BlockDocument>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (blockDocument: BlockDocument) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tsize: 20,\n\t\tid: \"select\",\n\t\theader: ({ table }) => {\n\t\t\tlet checkedState: CheckedState = false;\n\t\t\tif (table.getIsAllRowsSelected()) {\n\t\t\t\tcheckedState = true;\n\t\t\t} else if (table.getIsSomePageRowsSelected()) {\n\t\t\t\tcheckedState = \"indeterminate\";\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={checkedState}\n\t\t\t\t\tonCheckedChange={(value) =>\n\t\t\t\t\t\ttable.toggleAllPageRowsSelected(Boolean(value))\n\t\t\t\t\t}\n\t\t\t\t\taria-label=\"Select all\"\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(Boolean(value))}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"block\",\n\t\theader: \"Block\",\n\t\tcell: ({ row }) => <BlockDocumentCell blockDocument={row.original} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => {\n\t\t\tconst cell = props.row.original;\n\t\t\treturn (\n\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t<BlockDocumentActionMenu\n\t\t\t\t\t\tblockDocument={cell}\n\t\t\t\t\t\tonDelete={() => onDelete(cell)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t}),\n];\n\nexport type BlockDocumentsDataTableProps = {\n\tblockDocumentsCount: number;\n\tblockDocuments: Array<BlockDocument>;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlockDocumentsDataTable = ({\n\tblockDocuments,\n\tblockDocumentsCount,\n\tonPaginationChange,\n\tpagination,\n\trowSelection,\n\tsetRowSelection,\n}: BlockDocumentsDataTableProps) => {\n\tconst [dialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tcolumns: createColumns({ onDelete: handleConfirmDelete }),\n\t\tdata: blockDocuments,\n\t\tdefaultColumn: { maxSize: 300 },\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: blockDocumentsCount,\n\t\tgetRowId: (row) => row.id,\n\t\tonRowSelectionChange: setRowSelection,\n\t\tstate: { pagination, rowSelection },\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<DataTable table={table} />\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n","\"use client\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\ttype BlockType,\n\tbuildListFilterBlockTypesQuery,\n} from \"@/api/block-types\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\n\ntype BlockTypesMultiSelectProps = {\n\tselectedBlockTypesSlugs: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeSlug: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeSlug: string) => void;\n};\n\nexport function BlockTypesMultiSelect({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<BlockTypesMultiSelectImplementation\n\t\t\t\tselectedBlockTypesSlugs={selectedBlockTypesSlugs}\n\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n}\n\nfunction BlockTypesMultiSelectImplementation({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: blockTypes } = useSuspenseQuery(\n\t\tbuildListFilterBlockTypesQuery(),\n\t);\n\n\tconst selectedBlockTypes = useMemo(() => {\n\t\treturn selectedBlockTypesSlugs\n\t\t\t.map((blockTypeSlug) =>\n\t\t\t\tblockTypes.find((blockType) => blockType.slug === blockTypeSlug),\n\t\t\t)\n\t\t\t.filter(Boolean) as Array<BlockType>;\n\t}, [blockTypes, selectedBlockTypesSlugs]);\n\n\tconst filteredData = useMemo(() => {\n\t\treturn blockTypes.filter((blockType) =>\n\t\t\tblockType.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [blockTypes, deferredSearch]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedBlockTypesSlugs.length > 0}>\n\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t{selectedBlockTypesSlugs.length > 0\n\t\t\t\t\t\t? selectedBlockTypes.map((blockType) => (\n\t\t\t\t\t\t\t\t<TagBadge\n\t\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\t\ttag={blockType.name}\n\t\t\t\t\t\t\t\t\tonRemove={() => onRemoveBlockTypeSlug(blockType.slug)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t: \"Select blocks\"}\n\t\t\t\t</div>\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search for a block type...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No block type found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredData.map((blockType) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\tselected={selectedBlockTypesSlugs.includes(blockType.slug)}\n\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\tonToggleBlockTypeSlug(value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={blockType.slug}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{blockType.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import type { OnChangeFn, RowSelectionState } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { pluralize } from \"@/utils\";\n\nexport type BlocksRowCountProps = {\n\tcount: number;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlocksRowCount = ({\n\tcount,\n\trowSelection,\n\tsetRowSelection,\n}: BlocksRowCountProps) => {\n\tconst [deleteConfirmationDialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\n\n\tconst selectedBlockIds = useMemo(\n\t\t() => Object.keys(rowSelection),\n\t\t[rowSelection],\n\t);\n\n\t// If has selected rows\n\tif (selectedBlockIds.length > 0)\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{selectedBlockIds.length} selected\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Delete rows\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\thandleConfirmDelete(selectedBlockIds, {\n\t\t\t\t\t\t\t\tonSuccess: () => setRowSelection({}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Trash2\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t</>\n\t\t);\n\n\treturn (\n\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t{count} {pluralize(count, \"Block\")}\n\t\t</Typography>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const BlocksEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Box\" />\n\t\t<EmptyStateTitle>Add a block to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tBlocks securely store credentials and configuration to easily manage\n\t\t\tconnections to external systems.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t<Button>\n\t\t\t\t\tAdd Block <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t\t</Button>\n\t\t\t</Link>\n\t\t\t<DocsLink id=\"blocks-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport type { PaginationState, RowSelectionState } from \"@tanstack/react-table\";\nimport { useState } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { Breadcrumb, BreadcrumbItem } from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { BlockDocumentsDataTable } from \"./block-document-data-table\";\nimport { BlockTypesMultiSelect } from \"./block-types-multi-select\";\nimport { BlocksRowCount } from \"./blocks-row-count\";\nimport { BlocksEmptyState } from \"./empty-state\";\n\ntype BlocksPageProps = {\n\tallCount: number;\n\tblockDocuments: Array<BlockDocument> | undefined;\n\tonSearch: (value?: string) => void;\n\tsearch: string;\n\tblockTypeSlugsFilter: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeIds: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeIds: string) => void;\n\tpagination: PaginationState;\n\tonPaginationChange: (paginationState: PaginationState) => void;\n};\n\nexport const BlocksPage = ({\n\tallCount,\n\tblockDocuments = [],\n\tonSearch,\n\tsearch,\n\tblockTypeSlugsFilter,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n\tpagination,\n\tonPaginationChange,\n}: BlocksPageProps) => {\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tBlocks\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</Breadcrumb>\n\t\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t\t</Link>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t{allCount === 0 ? (\n\t\t\t\t<BlocksEmptyState />\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<BlocksRowCount\n\t\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\t\tcount={allCount}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<BlockTypesMultiSelect\n\t\t\t\t\t\t\t\tselectedBlockTypesSlugs={blockTypeSlugsFilter}\n\t\t\t\t\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\t\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\t\taria-label=\"search blocks\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search blocks\"\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onSearch(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<BlockDocumentsDataTable\n\t\t\t\t\t\tblockDocuments={blockDocuments}\n\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\tblockDocumentsCount={allCount}\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type { PaginationState } from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype BlockDocumentsFilter,\n\tbuildCountAllBlockDocumentsQuery,\n\tbuildCountFilterBlockDocumentsQuery,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport { BlocksPage } from \"@/components/blocks/blocks-page\";\n\nconst searchParams = z.object({\n\tblockName: z.string().optional(),\n\tblockTypes: z.array(z.string()).optional(),\n\tpage: z.number().int().positive().optional().default(1).catch(1),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n});\n\nexport const Route = createFileRoute(\"/blocks/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloaderDeps: ({ search: { blockName, blockTypes, page, limit } }) => ({\n\t\tblockName,\n\t\tblockTypes,\n\t\tpage,\n\t\tlimit,\n\t}),\n\tloader: ({ deps, context: { queryClient } }) => {\n\t\t// ----- Critical data\n\t\tconst filter: BlockDocumentsFilter = {\n\t\t\tblock_types: { slug: { any_: deps.blockTypes } },\n\t\t\tblock_documents: {\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t\toperator: \"or_\",\n\t\t\t\tname: { like_: deps.blockName },\n\t\t\t},\n\t\t\tlimit: deps.limit,\n\t\t\toffset: deps.page,\n\t\t\tinclude_secrets: false,\n\t\t\tsort: \"NAME_ASC\",\n\t\t};\n\t\treturn Promise.all([\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockTypesQuery()),\n\t\t\t// All count query\n\t\t\tqueryClient.ensureQueryData(buildCountAllBlockDocumentsQuery()),\n\t\t\t// Filtered block document\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockDocumentsQuery(filter)),\n\t\t\t// Filtered count query\n\t\t\tqueryClient.ensureQueryData(buildCountFilterBlockDocumentsQuery(filter)),\n\t\t]);\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst [search, onSearch] = useSearch();\n\tconst [blockTypeSlugs, onSetBlockTypeSlugs] = useFilterByBlockTypes();\n\tconst [pagination, onPaginationChange] = usePagination();\n\n\tconst { data: allBlockDocumentsCount } = useSuspenseQuery(\n\t\tbuildCountAllBlockDocumentsQuery(),\n\t);\n\n\tconst { data: blockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery({\n\t\t\tsort: \"NAME_ASC\",\n\t\t\tinclude_secrets: false,\n\t\t\tblock_documents: {\n\t\t\t\tname: { like_: search },\n\t\t\t\toperator: \"and_\",\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t},\n\t\t\tblock_types: {\n\t\t\t\tslug: {\n\t\t\t\t\tany_: blockTypeSlugs.length > 0 ? blockTypeSlugs : undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\toffset: pagination.pageIndex * pagination.pageSize,\n\t\t\tlimit: pagination.pageSize,\n\t\t}),\n\t);\n\n\tconst handleRemoveBlockType = (id: string) => {\n\t\tconst newValue = blockTypeSlugs.filter((blockId) => blockId !== id);\n\t\tonSetBlockTypeSlugs(newValue);\n\t};\n\n\tconst handleToggleBlockType = (id: string) => {\n\t\t// Remove block id if its in the list\n\t\tif (blockTypeSlugs.includes(id)) {\n\t\t\treturn handleRemoveBlockType(id);\n\t\t}\n\t\t// Else add it to the list\n\t\tonSetBlockTypeSlugs([...blockTypeSlugs, id]);\n\t};\n\n\treturn (\n\t\t<BlocksPage\n\t\t\tallCount={allBlockDocumentsCount}\n\t\t\tblockDocuments={blockDocuments}\n\t\t\tonSearch={onSearch}\n\t\t\tsearch={search}\n\t\t\tblockTypeSlugsFilter={blockTypeSlugs}\n\t\t\tonRemoveBlockTypeSlug={handleRemoveBlockType}\n\t\t\tonToggleBlockTypeSlug={handleToggleBlockType}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t/>\n\t);\n}\n\nfunction useSearch() {\n\tconst { blockName } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSearch = useCallback(\n\t\t(value?: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockName: value,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\tconst search = useMemo(() => blockName ?? \"\", [blockName]);\n\treturn [search, onSearch] as const;\n}\n\nfunction useFilterByBlockTypes() {\n\tconst { blockTypes = [] } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSetBlockTypes = useCallback(\n\t\t(value?: Array<string>) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockTypes: value,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [blockTypes, onSetBlockTypes] as const;\n}\n\nfunction usePagination() {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// React Table uses 0-based pagination, so we need to subtract 1 from the page number\n\tconst pageIndex = (search.page ?? 1) - 1;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n}\n"],"names":["BlockDocumentCell","blockDocument","id","name","block_type","block_type_name","jsxs","jsx","BlockTypeLogo","Link","Typography","columnHelper","createColumnHelper","createColumns","onDelete","table","checkedState","Checkbox","value","row","props","cell","BlockDocumentActionMenu","BlockDocumentsDataTable","blockDocuments","blockDocumentsCount","onPaginationChange","pagination","rowSelection","setRowSelection","dialogState","handleConfirmDelete","useDeleteBlockDocumentConfirmationDialog","handlePaginationChange","useCallback","updater","newPagination","useReactTable","getCoreRowModel","Fragment","DataTable","DeleteConfirmationDialog","BlockTypesMultiSelect","selectedBlockTypesSlugs","onToggleBlockTypeSlug","onRemoveBlockTypeSlug","Suspense","BlockTypesMultiSelectImplementation","search","setSearch","useState","deferredSearch","useDeferredValue","blockTypes","useSuspenseQuery","buildListFilterBlockTypesQuery","selectedBlockTypes","useMemo","blockTypeSlug","blockType","filteredData","Combobox","ComboboxTrigger","TagBadge","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","ComboboxCommandGroup","ComboboxCommandItem","BlocksRowCount","count","deleteConfirmationDialogState","selectedBlockIds","Button","Icon","pluralize","BlocksEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","BlocksPage","allCount","onSearch","blockTypeSlugsFilter","Breadcrumb","BreadcrumbItem","SearchInput","e","RouteComponent","useSearch","blockTypeSlugs","onSetBlockTypeSlugs","useFilterByBlockTypes","usePagination","data","allBlockDocumentsCount","buildCountAllBlockDocumentsQuery","useQuery","buildListFilterBlockDocumentsQuery","sort","include_secrets","block_documents","like_","operator","is_anonymous","eq_","block_types","slug","any_","length","undefined","offset","pageIndex","pageSize","limit","handleRemoveBlockType","newValue","filter","blockId","handleToggleBlockType","includes","blockName","Route","navigate","useNavigate","to","prev","replace","onSetBlockTypes","page"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-DqCPbST9.js","sources":["../../src/components/blocks/block-document-data-table/block-document-cell.tsx","../../src/components/blocks/block-document-data-table/block-document-data-table.tsx","../../src/components/blocks/block-types-multi-select/block-types-multi-select.tsx","../../src/components/blocks/blocks-row-count/blocks-row-count.tsx","../../src/components/blocks/empty-state/empty-state.tsx","../../src/components/blocks/blocks-page.tsx","../../src/routes/blocks/index.tsx?tsr-split=component"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockTypeLogo } from \"@/components/block-type-logo/block-type-logo\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype BlockDocumentCellProps = {\n\tblockDocument: BlockDocument;\n};\n\nexport const BlockDocumentCell = ({\n\tblockDocument,\n}: BlockDocumentCellProps) => {\n\tconst { id, name, block_type, block_type_name } = blockDocument;\n\n\treturn (\n\t\t<div className=\"flex gap-4 items-center\">\n\t\t\t{block_type && block_type_name && (\n\t\t\t\t<BlockTypeLogo\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tlogoUrl={block_type.logo_url}\n\t\t\t\t\talt={`${block_type_name} logo`}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t{name && (\n\t\t\t\t\t<Link to=\"/blocks/block/$id\" params={{ id }}>\n\t\t\t\t\t\t<Typography className=\"font-semibold\">{name}</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t\t{block_type_name && blockDocument.block_type?.slug && (\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/blocks/catalog/$slug\"\n\t\t\t\t\t\tparams={{ slug: blockDocument.block_type.slug }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t{block_type_name}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { CheckedState } from \"@radix-ui/react-checkbox\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\ttype RowSelectionState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { BlockDocumentActionMenu } from \"@/components/blocks/block-document-action-menu\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { BlockDocumentCell } from \"./block-document-cell\";\n\nconst columnHelper = createColumnHelper<BlockDocument>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (blockDocument: BlockDocument) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tsize: 20,\n\t\tid: \"select\",\n\t\theader: ({ table }) => {\n\t\t\tlet checkedState: CheckedState = false;\n\t\t\tif (table.getIsAllRowsSelected()) {\n\t\t\t\tcheckedState = true;\n\t\t\t} else if (table.getIsSomePageRowsSelected()) {\n\t\t\t\tcheckedState = \"indeterminate\";\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={checkedState}\n\t\t\t\t\tonCheckedChange={(value) =>\n\t\t\t\t\t\ttable.toggleAllPageRowsSelected(Boolean(value))\n\t\t\t\t\t}\n\t\t\t\t\taria-label=\"Select all\"\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\tonCheckedChange={(value) => row.toggleSelected(Boolean(value))}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"block\",\n\t\theader: \"Block\",\n\t\tcell: ({ row }) => <BlockDocumentCell blockDocument={row.original} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => {\n\t\t\tconst cell = props.row.original;\n\t\t\treturn (\n\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t<BlockDocumentActionMenu\n\t\t\t\t\t\tblockDocument={cell}\n\t\t\t\t\t\tonDelete={() => onDelete(cell)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t}),\n];\n\nexport type BlockDocumentsDataTableProps = {\n\tblockDocumentsCount: number;\n\tblockDocuments: Array<BlockDocument>;\n\tpagination: PaginationState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlockDocumentsDataTable = ({\n\tblockDocuments,\n\tblockDocumentsCount,\n\tonPaginationChange,\n\tpagination,\n\trowSelection,\n\tsetRowSelection,\n}: BlockDocumentsDataTableProps) => {\n\tconst [dialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tcolumns: createColumns({ onDelete: handleConfirmDelete }),\n\t\tdata: blockDocuments,\n\t\tdefaultColumn: { maxSize: 300 },\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: blockDocumentsCount,\n\t\tgetRowId: (row) => row.id,\n\t\tonRowSelectionChange: setRowSelection,\n\t\tstate: { pagination, rowSelection },\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<DataTable table={table} />\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t</>\n\t);\n};\n","\"use client\";\n\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\ttype BlockType,\n\tbuildListFilterBlockTypesQuery,\n} from \"@/api/block-types\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\n\ntype BlockTypesMultiSelectProps = {\n\tselectedBlockTypesSlugs: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeSlug: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeSlug: string) => void;\n};\n\nexport function BlockTypesMultiSelect({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<BlockTypesMultiSelectImplementation\n\t\t\t\tselectedBlockTypesSlugs={selectedBlockTypesSlugs}\n\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n}\n\nfunction BlockTypesMultiSelectImplementation({\n\tselectedBlockTypesSlugs,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n}: BlockTypesMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: blockTypes } = useSuspenseQuery(\n\t\tbuildListFilterBlockTypesQuery(),\n\t);\n\n\tconst selectedBlockTypes = useMemo(() => {\n\t\treturn selectedBlockTypesSlugs\n\t\t\t.map((blockTypeSlug) =>\n\t\t\t\tblockTypes.find((blockType) => blockType.slug === blockTypeSlug),\n\t\t\t)\n\t\t\t.filter(Boolean) as Array<BlockType>;\n\t}, [blockTypes, selectedBlockTypesSlugs]);\n\n\tconst filteredData = useMemo(() => {\n\t\treturn blockTypes.filter((blockType) =>\n\t\t\tblockType.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [blockTypes, deferredSearch]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedBlockTypesSlugs.length > 0}>\n\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t{selectedBlockTypesSlugs.length > 0\n\t\t\t\t\t\t? selectedBlockTypes.map((blockType) => (\n\t\t\t\t\t\t\t\t<TagBadge\n\t\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\t\ttag={blockType.name}\n\t\t\t\t\t\t\t\t\tonRemove={() => onRemoveBlockTypeSlug(blockType.slug)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t: \"Select blocks\"}\n\t\t\t\t</div>\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search for a block type...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No block type found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredData.map((blockType) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={blockType.id}\n\t\t\t\t\t\t\t\tselected={selectedBlockTypesSlugs.includes(blockType.slug)}\n\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\tonToggleBlockTypeSlug(value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={blockType.slug}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{blockType.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import type { OnChangeFn, RowSelectionState } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { useDeleteBlockDocumentConfirmationDialog } from \"@/components/blocks/use-delete-block-document-confirmation-dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { pluralize } from \"@/utils\";\n\nexport type BlocksRowCountProps = {\n\tcount: number;\n\trowSelection: RowSelectionState;\n\tsetRowSelection: OnChangeFn<RowSelectionState>;\n};\nexport const BlocksRowCount = ({\n\tcount,\n\trowSelection,\n\tsetRowSelection,\n}: BlocksRowCountProps) => {\n\tconst [deleteConfirmationDialogState, handleConfirmDelete] =\n\t\tuseDeleteBlockDocumentConfirmationDialog();\n\n\tconst selectedBlockIds = useMemo(\n\t\t() => Object.keys(rowSelection),\n\t\t[rowSelection],\n\t);\n\n\t// If has selected rows\n\tif (selectedBlockIds.length > 0)\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{selectedBlockIds.length} selected\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Delete rows\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\thandleConfirmDelete(selectedBlockIds, {\n\t\t\t\t\t\t\t\tonSuccess: () => setRowSelection({}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Trash2\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t</>\n\t\t);\n\n\treturn (\n\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t{count} {pluralize(count, \"Block\")}\n\t\t</Typography>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Icon } from \"@/components/ui/icons\";\n\nexport const BlocksEmptyState = () => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Box\" />\n\t\t<EmptyStateTitle>Add a block to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tBlocks securely store credentials and configuration to easily manage\n\t\t\tconnections to external systems.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t<Button>\n\t\t\t\t\tAdd Block <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t\t</Button>\n\t\t\t</Link>\n\t\t\t<DocsLink id=\"blocks-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport type { PaginationState, RowSelectionState } from \"@tanstack/react-table\";\nimport { useState } from \"react\";\nimport type { BlockDocument } from \"@/api/block-documents\";\nimport { Breadcrumb, BreadcrumbItem } from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { BlockDocumentsDataTable } from \"./block-document-data-table\";\nimport { BlockTypesMultiSelect } from \"./block-types-multi-select\";\nimport { BlocksRowCount } from \"./blocks-row-count\";\nimport { BlocksEmptyState } from \"./empty-state\";\n\ntype BlocksPageProps = {\n\tallCount: number;\n\tblockDocuments: Array<BlockDocument> | undefined;\n\tonSearch: (value?: string) => void;\n\tsearch: string;\n\tblockTypeSlugsFilter: Array<string>;\n\tonToggleBlockTypeSlug: (blockTypeIds: string) => void;\n\tonRemoveBlockTypeSlug: (blockTypeIds: string) => void;\n\tpagination: PaginationState;\n\tonPaginationChange: (paginationState: PaginationState) => void;\n};\n\nexport const BlocksPage = ({\n\tallCount,\n\tblockDocuments = [],\n\tonSearch,\n\tsearch,\n\tblockTypeSlugsFilter,\n\tonToggleBlockTypeSlug,\n\tonRemoveBlockTypeSlug,\n\tpagination,\n\tonPaginationChange,\n}: BlocksPageProps) => {\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tBlocks\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</Breadcrumb>\n\t\t\t\t<Button size=\"icon\" className=\"size-7\" variant=\"outline\">\n\t\t\t\t\t<Link to=\"/blocks/catalog\">\n\t\t\t\t\t\t<Icon id=\"Plus\" className=\"size-4\" />\n\t\t\t\t\t</Link>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t{allCount === 0 ? (\n\t\t\t\t<BlocksEmptyState />\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<BlocksRowCount\n\t\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\t\tcount={allCount}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<BlockTypesMultiSelect\n\t\t\t\t\t\t\t\tselectedBlockTypesSlugs={blockTypeSlugsFilter}\n\t\t\t\t\t\t\t\tonToggleBlockTypeSlug={onToggleBlockTypeSlug}\n\t\t\t\t\t\t\t\tonRemoveBlockTypeSlug={onRemoveBlockTypeSlug}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"min-w-56\">\n\t\t\t\t\t\t\t\t<SearchInput\n\t\t\t\t\t\t\t\t\taria-label=\"search blocks\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search blocks\"\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onSearch(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<BlockDocumentsDataTable\n\t\t\t\t\t\tblockDocuments={blockDocuments}\n\t\t\t\t\t\trowSelection={rowSelection}\n\t\t\t\t\t\tsetRowSelection={setRowSelection}\n\t\t\t\t\t\tblockDocumentsCount={allCount}\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type { PaginationState } from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype BlockDocumentsFilter,\n\tbuildCountAllBlockDocumentsQuery,\n\tbuildCountFilterBlockDocumentsQuery,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport { BlocksPage } from \"@/components/blocks/blocks-page\";\n\nconst searchParams = z.object({\n\tblockName: z.string().optional(),\n\tblockTypes: z.array(z.string()).optional(),\n\tpage: z.number().int().positive().optional().default(1).catch(1),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n});\n\nexport const Route = createFileRoute(\"/blocks/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloaderDeps: ({ search: { blockName, blockTypes, page, limit } }) => ({\n\t\tblockName,\n\t\tblockTypes,\n\t\tpage,\n\t\tlimit,\n\t}),\n\tloader: ({ deps, context: { queryClient } }) => {\n\t\t// ----- Critical data\n\t\tconst filter: BlockDocumentsFilter = {\n\t\t\tblock_types: { slug: { any_: deps.blockTypes } },\n\t\t\tblock_documents: {\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t\toperator: \"or_\",\n\t\t\t\tname: { like_: deps.blockName },\n\t\t\t},\n\t\t\tlimit: deps.limit,\n\t\t\toffset: deps.page,\n\t\t\tinclude_secrets: false,\n\t\t\tsort: \"NAME_ASC\",\n\t\t};\n\t\treturn Promise.all([\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockTypesQuery()),\n\t\t\t// All count query\n\t\t\tqueryClient.ensureQueryData(buildCountAllBlockDocumentsQuery()),\n\t\t\t// Filtered block document\n\t\t\tqueryClient.ensureQueryData(buildListFilterBlockDocumentsQuery(filter)),\n\t\t\t// Filtered count query\n\t\t\tqueryClient.ensureQueryData(buildCountFilterBlockDocumentsQuery(filter)),\n\t\t]);\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst [search, onSearch] = useSearch();\n\tconst [blockTypeSlugs, onSetBlockTypeSlugs] = useFilterByBlockTypes();\n\tconst [pagination, onPaginationChange] = usePagination();\n\n\tconst { data: allBlockDocumentsCount } = useSuspenseQuery(\n\t\tbuildCountAllBlockDocumentsQuery(),\n\t);\n\n\tconst { data: blockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery({\n\t\t\tsort: \"NAME_ASC\",\n\t\t\tinclude_secrets: false,\n\t\t\tblock_documents: {\n\t\t\t\tname: { like_: search },\n\t\t\t\toperator: \"and_\",\n\t\t\t\tis_anonymous: { eq_: false },\n\t\t\t},\n\t\t\tblock_types: {\n\t\t\t\tslug: {\n\t\t\t\t\tany_: blockTypeSlugs.length > 0 ? blockTypeSlugs : undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\toffset: pagination.pageIndex * pagination.pageSize,\n\t\t\tlimit: pagination.pageSize,\n\t\t}),\n\t);\n\n\tconst handleRemoveBlockType = (id: string) => {\n\t\tconst newValue = blockTypeSlugs.filter((blockId) => blockId !== id);\n\t\tonSetBlockTypeSlugs(newValue);\n\t};\n\n\tconst handleToggleBlockType = (id: string) => {\n\t\t// Remove block id if its in the list\n\t\tif (blockTypeSlugs.includes(id)) {\n\t\t\treturn handleRemoveBlockType(id);\n\t\t}\n\t\t// Else add it to the list\n\t\tonSetBlockTypeSlugs([...blockTypeSlugs, id]);\n\t};\n\n\treturn (\n\t\t<BlocksPage\n\t\t\tallCount={allBlockDocumentsCount}\n\t\t\tblockDocuments={blockDocuments}\n\t\t\tonSearch={onSearch}\n\t\t\tsearch={search}\n\t\t\tblockTypeSlugsFilter={blockTypeSlugs}\n\t\t\tonRemoveBlockTypeSlug={handleRemoveBlockType}\n\t\t\tonToggleBlockTypeSlug={handleToggleBlockType}\n\t\t\tpagination={pagination}\n\t\t\tonPaginationChange={onPaginationChange}\n\t\t/>\n\t);\n}\n\nfunction useSearch() {\n\tconst { blockName } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSearch = useCallback(\n\t\t(value?: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockName: value,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\tconst search = useMemo(() => blockName ?? \"\", [blockName]);\n\treturn [search, onSearch] as const;\n}\n\nfunction useFilterByBlockTypes() {\n\tconst { blockTypes = [] } = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSetBlockTypes = useCallback(\n\t\t(value?: Array<string>) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tblockTypes: value,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [blockTypes, onSetBlockTypes] as const;\n}\n\nfunction usePagination() {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\t// React Table uses 0-based pagination, so we need to subtract 1 from the page number\n\tconst pageIndex = (search.page ?? 1) - 1;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tpage: newPagination.pageIndex + 1,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n}\n"],"names":["BlockDocumentCell","blockDocument","id","name","block_type","block_type_name","jsxs","jsx","BlockTypeLogo","Link","Typography","columnHelper","createColumnHelper","createColumns","onDelete","table","checkedState","Checkbox","value","row","props","cell","BlockDocumentActionMenu","BlockDocumentsDataTable","blockDocuments","blockDocumentsCount","onPaginationChange","pagination","rowSelection","setRowSelection","dialogState","handleConfirmDelete","useDeleteBlockDocumentConfirmationDialog","handlePaginationChange","useCallback","updater","newPagination","useReactTable","getCoreRowModel","Fragment","DataTable","DeleteConfirmationDialog","BlockTypesMultiSelect","selectedBlockTypesSlugs","onToggleBlockTypeSlug","onRemoveBlockTypeSlug","Suspense","BlockTypesMultiSelectImplementation","search","setSearch","useState","deferredSearch","useDeferredValue","blockTypes","useSuspenseQuery","buildListFilterBlockTypesQuery","selectedBlockTypes","useMemo","blockTypeSlug","blockType","filteredData","Combobox","ComboboxTrigger","TagBadge","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","ComboboxCommandGroup","ComboboxCommandItem","BlocksRowCount","count","deleteConfirmationDialogState","selectedBlockIds","Button","Icon","pluralize","BlocksEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","BlocksPage","allCount","onSearch","blockTypeSlugsFilter","Breadcrumb","BreadcrumbItem","SearchInput","e","RouteComponent","useSearch","blockTypeSlugs","onSetBlockTypeSlugs","useFilterByBlockTypes","usePagination","data","allBlockDocumentsCount","buildCountAllBlockDocumentsQuery","useQuery","buildListFilterBlockDocumentsQuery","sort","include_secrets","block_documents","like_","operator","is_anonymous","eq_","block_types","slug","any_","length","undefined","offset","pageIndex","pageSize","limit","handleRemoveBlockType","newValue","filter","blockId","handleToggleBlockType","includes","blockName","Route","navigate","useNavigate","to","prev","replace","onSetBlockTypes","page"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as s,L as r,p as n}from"./vendor-tanstack-BK8oseNA.js";import{E as l,t as m,v as c,w as d,x,q as p,I as u,D as j,br as g,al as h,C as f,B as A,g as y,h as b,bs as D}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as s,L as r,p as n}from"./vendor-tanstack-BK8oseNA.js";import{E as l,t as m,v as c,w as d,x,q as p,I as u,D as j,br as g,al as h,C as f,B as A,g as y,h as b,bs as D}from"./index-BvSl3DKP.js";import{D as N}from"./delete-confirmation-dialog-CTdWZlGM.js";import{u as v,A as S,a as E,b as B,c as C,d as L}from"./use-delete-automation-confirmation-dialog-eOWJYPkD.js";import{A as k}from"./automations-header-DrijTNGi.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";import"./work-queue-icon-text-CP4yX3uM.js";import"./index-ChIrfjIW.js";import"./dropdown-menu-CT-s-V7d.js";import"./use-delete-confirmation-dialog-CvQEyyhU.js";const I=()=>s.jsxs(l,{children:[s.jsx(m,{id:"Bot"}),s.jsx(c,{children:"Create an automation to get started"}),s.jsx(d,{children:"Automations bring reactivity to your data stack and let you configure triggers and actions based on events."}),s.jsxs(x,{children:[s.jsx(r,{to:"/automations/create",children:s.jsxs(p,{children:["Add Automation ",s.jsx(u,{id:"Plus",className:"size-4 ml-2"})]})}),s.jsx(j,{id:"automations-guide"})]})]}),T=()=>{const[e,i]=v(),{data:a}=n(g()),o=t=>i(t);return s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex flex-col gap-4",children:[s.jsx(k,{}),a.length===0?s.jsx(I,{}):s.jsxs("div",{className:"flex flex-col gap-4",children:[s.jsxs(h,{variant:"bodySmall",className:"text-muted-foreground",children:[a.length," ",`${a.length===1?"automation":"automations"}`]}),s.jsx("ul",{className:"flex flex-col gap-2",children:a.map(t=>s.jsx("li",{"aria-label":`automation item ${t.name}`,children:s.jsx($,{automation:t,onDelete:()=>o(t)})},t.id))})]})]}),s.jsx(N,{...e})]})},$=({automation:e,onDelete:i})=>s.jsxs(f,{className:"p-4 pt-5 flex flex-col gap-6",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx(w,{automation:e}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(S,{automation:e}),s.jsx(E,{id:e.id,onDelete:i})]})]}),s.jsxs("div",{className:"flex flex-col gap-4",children:[e.description&&s.jsx(B,{automation:e}),s.jsx(C,{automation:e}),s.jsx(L,{automation:e})]})]}),w=({automation:e})=>s.jsx(A,{children:s.jsx(y,{children:s.jsx(b,{className:"text-xl",children:s.jsx(D,{to:"/automations/automation/$id",params:{id:e.id},className:"text-lg",children:e.name})})})}),W=T;export{W as component};
|
|
2
|
+
//# sourceMappingURL=index-DxPoKag8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DxPoKag8.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 o}from"./vendor-tanstack-BK8oseNA.js";import{s as i}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{j as o}from"./vendor-tanstack-BK8oseNA.js";import{s as i}from"./index-BvSl3DKP.js";import{A as m}from"./automations-header-DrijTNGi.js";import{R as s}from"./route-error-state-CGGpuCGN.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";function j({error:t,reset:e}){const r=i(t,"Failed to load automations");if(r.type!=="server-error"&&r.type!=="client-error")throw t;return o.jsxs("div",{className:"flex flex-col gap-4",children:[o.jsx(m,{}),o.jsx(s,{error:r,onRetry:e})]})}export{j as errorComponent};
|
|
2
|
+
//# sourceMappingURL=index-h9-QgNjZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-h9-QgNjZ.js","sources":["../../src/routes/automations/index.tsx?tsr-split=errorComponent"],"sourcesContent":["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":["AutomationsErrorComponent","error","reset","serverError","categorizeError","type","jsxs","jsx","AutomationsHeader","RouteErrorState"],"mappings":"oXAQA,SAASA,EAA0B,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACzE,MAAMC,EAAcC,EAAgBH,EAAO,4BAA4B,EAIvE,GACCE,EAAYE,OAAS,gBACrBF,EAAYE,OAAS,eAErB,MAAMJ,EAGP,OACCK,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAiB,EAClBD,EAAAA,IAACE,EAAA,CAAgB,MAAON,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as m,j as e}from"./vendor-tanstack-BK8oseNA.js";import{c as u}from"./cronstrue-WDy4rv2V.js";import{aW as j,Q as f,T as p,H as i,U as g,bU as c,bR as l,bS as o,bT as d,ar as v,f as T}from"./index-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{r as m,j as e}from"./vendor-tanstack-BK8oseNA.js";import{c as u}from"./cronstrue-WDy4rv2V.js";import{aW as j,Q as f,T as p,H as i,U as g,bU as c,bR as l,bS as o,bT as d,ar as v,f as T}from"./index-BvSl3DKP.js";import{f as $,$ as S}from"./vendor-date-7GxEwcQM.js";import{u as w}from"./use-is-overflowing-Bv_2pq2B.js";const x=({schedule:a,...r})=>{const{schedule:n}=a;if("cron"in n)return e.jsx(y,{schedule:n,active:a.active,...r});if("interval"in n)return e.jsx(N,{schedule:n,active:a.active,...r});if("rrule"in n)return e.jsx(z,{schedule:n,active:a.active,...r})},y=({active:a,schedule:r,...n})=>{const t=u.toString(r.cron),s=`${a?"":"(Paused)"} ${t} (${r.timezone})`;return e.jsx(c,{children:e.jsxs(l,{children:[e.jsx(o,{children:e.jsx(i,{variant:"secondary",className:`${a?"":"opacity-50"}`,...n,children:e.jsx("span",{className:"truncate",children:t})})}),e.jsx(d,{children:s})]})})},N=({active:a,schedule:r,...n})=>{const t=`Every ${v(r.interval*1e3)}`;let s=`${a?"":"(Paused)"} ${t}`;return r.anchor_date&&(s+=` using ${$(new Date(r.anchor_date),"MMM do, yyyy 'at' hh:mm:ss aa")} (${r.timezone}) as the anchor date`),e.jsx(c,{children:e.jsxs(l,{children:[e.jsx(o,{children:e.jsx(i,{variant:"secondary",className:`${a?"":"opacity-50"}`,...n,children:e.jsx("span",{className:"truncate",children:t})})}),e.jsx(d,{children:s})]})})},z=({active:a,schedule:r,...n})=>{const t=S(r.rrule).toText(),s=T(t),h=`${a?"":"(Paused)"} ${s} (${r.timezone})`;return e.jsx(c,{children:e.jsxs(l,{children:[e.jsx(o,{children:e.jsx(i,{variant:"secondary",className:`${a?"":"opacity-50"}`,...n,children:e.jsx("span",{className:"truncate",children:s})})}),e.jsx(d,{children:h})]})})},P=({schedules:a,className:r})=>{const n=m.useRef(null),t=w(n);return!a||a.length===0?null:t?e.jsx("div",{className:j("flex flex-row gap-2 items-center no-wrap",r),children:e.jsxs(f,{children:[e.jsx(p,{children:e.jsxs(i,{variant:"secondary",className:"whitespace-nowrap",children:[a.length," schedules"]})}),e.jsx(g,{className:"flex flex-col flex-wrap gap-1 w-fit",children:a.map(s=>e.jsx(x,{schedule:s},s.id))})]})}):e.jsx("div",{className:"flex flex-row gap-2 items-center no-wrap",ref:n,children:a.map(s=>e.jsx(x,{schedule:s,className:"max-w-28"},s.id))})};export{P as S};
|
|
2
|
+
//# sourceMappingURL=index-tBdv6kBF.js.map
|