prefect 3.6.12__py3-none-any.whl → 3.6.13__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.
Files changed (266) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/_internal/compatibility/blocks.py +18 -0
  3. prefect/_internal/urls.py +29 -0
  4. prefect/_states.py +4 -1
  5. prefect/client/orchestration/_concurrency_limits/client.py +16 -16
  6. prefect/client/schemas/filters.py +24 -0
  7. prefect/client/subscriptions.py +1 -1
  8. prefect/events/clients.py +52 -13
  9. prefect/flow_engine.py +192 -10
  10. prefect/flows.py +61 -2
  11. prefect/results.py +262 -21
  12. prefect/runner/runner.py +29 -82
  13. prefect/runner/storage.py +6 -25
  14. prefect/server/schemas/filters.py +45 -0
  15. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js → artifact-card-CUEaRDGw.js} +2 -2
  16. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js.map → artifact-card-CUEaRDGw.js.map} +1 -1
  17. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js → artifact._id-Ca6VCUS0.js} +2 -2
  18. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js.map → artifact._id-Ca6VCUS0.js.map} +1 -1
  19. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js → automation-wizard-z26pICBl.js} +2 -2
  20. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js.map → automation-wizard-z26pICBl.js.map} +1 -1
  21. prefect/server/ui-v2/assets/automation._id-DuodjY5t.js +2 -0
  22. prefect/server/ui-v2/assets/{automation._id-IHh5QJwE.js.map → automation._id-DuodjY5t.js.map} +1 -1
  23. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js → automation_._id.edit-CcuJhc-y.js} +2 -2
  24. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js.map → automation_._id.edit-CcuJhc-y.js.map} +1 -1
  25. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js → automations-header-CgOWwuc6.js} +2 -2
  26. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js.map → automations-header-CgOWwuc6.js.map} +1 -1
  27. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js → base-job-template-form-section-DN9HyjM5.js} +2 -2
  28. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js.map → base-job-template-form-section-DN9HyjM5.js.map} +1 -1
  29. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js → block-type-details-rrToxL5r.js} +2 -2
  30. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js.map → block-type-details-rrToxL5r.js.map} +1 -1
  31. prefect/server/ui-v2/assets/block-type-logo-DURScH8H.js +2 -0
  32. prefect/server/ui-v2/assets/{block-type-logo-B31LJm5H.js.map → block-type-logo-DURScH8H.js.map} +1 -1
  33. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js → block._id-Bue6lnrN.js} +2 -2
  34. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js.map → block._id-Bue6lnrN.js.map} +1 -1
  35. prefect/server/ui-v2/assets/block_._id.edit-QY0OzN_b.js +2 -0
  36. prefect/server/ui-v2/assets/{block_._id.edit-CIhIBJrm.js.map → block_._id.edit-QY0OzN_b.js.map} +1 -1
  37. prefect/server/ui-v2/assets/catalog-CGjRGWv6.js +2 -0
  38. prefect/server/ui-v2/assets/{catalog-CfniU0UV.js.map → catalog-CGjRGWv6.js.map} +1 -1
  39. prefect/server/ui-v2/assets/catalog_._slug-BMFNZhEb.js +2 -0
  40. prefect/server/ui-v2/assets/{catalog_._slug-C9p86T4s.js.map → catalog_._slug-BMFNZhEb.js.map} +1 -1
  41. prefect/server/ui-v2/assets/catalog_._slug_.create-CuFA3kUC.js +2 -0
  42. prefect/server/ui-v2/assets/{catalog_._slug_.create-BhSunL__.js.map → catalog_._slug_.create-CuFA3kUC.js.map} +1 -1
  43. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js → collapsible-Ell2FjrX.js} +2 -2
  44. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js.map → collapsible-Ell2FjrX.js.map} +1 -1
  45. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js → concurrency-limit._id-Rr1ysUct.js} +2 -2
  46. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js.map → concurrency-limit._id-Rr1ysUct.js.map} +1 -1
  47. prefect/server/ui-v2/assets/{create-noFojqGL.js → create-CQK8-uO1.js} +2 -2
  48. prefect/server/ui-v2/assets/{create-noFojqGL.js.map → create-CQK8-uO1.js.map} +1 -1
  49. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js → create-ewA3uq_h.js} +2 -2
  50. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js.map → create-ewA3uq_h.js.map} +1 -1
  51. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js → data-table-Bx1uYX_M.js} +2 -2
  52. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js.map → data-table-Bx1uYX_M.js.map} +1 -1
  53. prefect/server/ui-v2/assets/delete-confirmation-dialog-CqKsUEj_.js +2 -0
  54. prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js.map → delete-confirmation-dialog-CqKsUEj_.js.map} +1 -1
  55. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js → deployment-action-header-Bz5COdER.js} +2 -2
  56. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js.map → deployment-action-header-Bz5COdER.js.map} +1 -1
  57. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js → deployment-form-CrlZlNoj.js} +3 -3
  58. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js.map → deployment-form-CrlZlNoj.js.map} +1 -1
  59. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js → deployment-links-D9ZR_vmp.js} +2 -2
  60. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js.map → deployment-links-D9ZR_vmp.js.map} +1 -1
  61. prefect/server/ui-v2/assets/deployment._id-BV0rSqba.js +2 -0
  62. prefect/server/ui-v2/assets/{deployment._id-DVmqclRz.js.map → deployment._id-BV0rSqba.js.map} +1 -1
  63. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js → deployment._id-DvHhx-qN.js} +2 -2
  64. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js.map → deployment._id-DvHhx-qN.js.map} +1 -1
  65. prefect/server/ui-v2/assets/deployment_._id.duplicate-BrEOenqP.js +2 -0
  66. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DVMjpk5m.js.map → deployment_._id.duplicate-BrEOenqP.js.map} +1 -1
  67. prefect/server/ui-v2/assets/deployment_._id.edit-BbYKPK42.js +2 -0
  68. prefect/server/ui-v2/assets/{deployment_._id.edit-Ck_P6KDn.js.map → deployment_._id.edit-BbYKPK42.js.map} +1 -1
  69. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js → deployment_._id.run-Dv7S_MJR.js} +2 -2
  70. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js.map → deployment_._id.run-Dv7S_MJR.js.map} +1 -1
  71. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js → dropdown-menu-e0Fqb6aw.js} +2 -2
  72. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js.map → dropdown-menu-e0Fqb6aw.js.map} +1 -1
  73. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js → event._eventDate._eventId-Cp4UmGqq.js} +2 -2
  74. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js.map → event._eventDate._eventId-Cp4UmGqq.js.map} +1 -1
  75. prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js +2 -0
  76. prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js.map +1 -0
  77. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js → flow-run._id-BOp38Pbq.js} +2 -2
  78. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js.map → flow-run._id-BOp38Pbq.js.map} +1 -1
  79. prefect/server/ui-v2/assets/flow-run._id-DJnTDEN_.js +2 -0
  80. prefect/server/ui-v2/assets/{flow-run._id-OL0YhyLW.js.map → flow-run._id-DJnTDEN_.js.map} +1 -1
  81. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js +4 -0
  82. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js.map +1 -0
  83. prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js +2 -0
  84. prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js.map +1 -0
  85. prefect/server/ui-v2/assets/flow._id-eCBL95rg.js +2 -0
  86. prefect/server/ui-v2/assets/{flow._id-DhrCicwR.js.map → flow._id-eCBL95rg.js.map} +1 -1
  87. prefect/server/ui-v2/assets/{form-BTub_PhK.js → form-DNerk3LS.js} +2 -2
  88. prefect/server/ui-v2/assets/{form-BTub_PhK.js.map → form-DNerk3LS.js.map} +1 -1
  89. prefect/server/ui-v2/assets/{header-6wmrKLU3.js → header-B0ejRncu.js} +2 -2
  90. prefect/server/ui-v2/assets/{header-6wmrKLU3.js.map → header-B0ejRncu.js.map} +1 -1
  91. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js → header-DwagHBlF.js} +2 -2
  92. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js.map → header-DwagHBlF.js.map} +1 -1
  93. prefect/server/ui-v2/assets/{header-B75eb688.js → header-huSvwxKI.js} +2 -2
  94. prefect/server/ui-v2/assets/{header-B75eb688.js.map → header-huSvwxKI.js.map} +1 -1
  95. prefect/server/ui-v2/assets/{index-DSaSov8V.js → index-BO3SOwdV.js} +2 -2
  96. prefect/server/ui-v2/assets/{index-DSaSov8V.js.map → index-BO3SOwdV.js.map} +1 -1
  97. prefect/server/ui-v2/assets/{index-DOkFJdYY.js → index-BTPE3vs7.js} +2 -2
  98. prefect/server/ui-v2/assets/{index-DOkFJdYY.js.map → index-BTPE3vs7.js.map} +1 -1
  99. prefect/server/ui-v2/assets/index-BU4yZRd3.js +2 -0
  100. prefect/server/ui-v2/assets/{index-Cs8eFQKw.js.map → index-BU4yZRd3.js.map} +1 -1
  101. prefect/server/ui-v2/assets/index-BhALpenO.js +2 -0
  102. prefect/server/ui-v2/assets/{index-qPlIYf3i.js.map → index-BhALpenO.js.map} +1 -1
  103. prefect/server/ui-v2/assets/index-BzN9bQeM.js +2 -0
  104. prefect/server/ui-v2/assets/{index-CT_nG86y.js.map → index-BzN9bQeM.js.map} +1 -1
  105. prefect/server/ui-v2/assets/{index-zpb5iSCL.js → index-CBhi1P9g.js} +2 -2
  106. prefect/server/ui-v2/assets/{index-zpb5iSCL.js.map → index-CBhi1P9g.js.map} +1 -1
  107. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js → index-CRDz4nhM.js} +2 -2
  108. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js.map → index-CRDz4nhM.js.map} +1 -1
  109. prefect/server/ui-v2/assets/index-CTnoa3Ho.js +2 -0
  110. prefect/server/ui-v2/assets/index-CTnoa3Ho.js.map +1 -0
  111. prefect/server/ui-v2/assets/{index-DzMGV8GV.js → index-CWkbSdxY.js} +2 -2
  112. prefect/server/ui-v2/assets/{index-DzMGV8GV.js.map → index-CWkbSdxY.js.map} +1 -1
  113. prefect/server/ui-v2/assets/index-CgOsOj5t.js +2 -0
  114. prefect/server/ui-v2/assets/{index-7ThYp9SY.js.map → index-CgOsOj5t.js.map} +1 -1
  115. prefect/server/ui-v2/assets/{index-CGWoVV2s.js → index-CnIJUujl.js} +2 -2
  116. prefect/server/ui-v2/assets/{index-CGWoVV2s.js.map → index-CnIJUujl.js.map} +1 -1
  117. prefect/server/ui-v2/assets/{index-D08xgmV0.js → index-Cutg_A1j.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-D08xgmV0.js.map → index-Cutg_A1j.js.map} +1 -1
  119. prefect/server/ui-v2/assets/index-D5RdrxkU.js +17 -0
  120. prefect/server/ui-v2/assets/index-D5RdrxkU.js.map +1 -0
  121. prefect/server/ui-v2/assets/{index-DfiNsXba.js → index-DDiyFpIV.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-DfiNsXba.js.map → index-DDiyFpIV.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-BA7ACCoL.js → index-DI2DC5gd.js} +2 -2
  124. prefect/server/ui-v2/assets/{index-BA7ACCoL.js.map → index-DI2DC5gd.js.map} +1 -1
  125. prefect/server/ui-v2/assets/index-Dg_duvDx.js +2 -0
  126. prefect/server/ui-v2/assets/{index-B_3f8Hcb.js.map → index-Dg_duvDx.js.map} +1 -1
  127. prefect/server/ui-v2/assets/index-Dspw5HFj.js +2 -0
  128. prefect/server/ui-v2/assets/{index-7-r4ia_S.js.map → index-Dspw5HFj.js.map} +1 -1
  129. prefect/server/ui-v2/assets/index-NY089eTx.css +1 -0
  130. prefect/server/ui-v2/assets/{index-DYOACRXY.js → index-VOOLxiSE.js} +2 -2
  131. prefect/server/ui-v2/assets/{index-DYOACRXY.js.map → index-VOOLxiSE.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{index-HGoNWFfP.js → index-Wfs7Cjew.js} +2 -2
  133. prefect/server/ui-v2/assets/{index-HGoNWFfP.js.map → index-Wfs7Cjew.js.map} +1 -1
  134. prefect/server/ui-v2/assets/index-dSUEBAqg.js +2 -0
  135. prefect/server/ui-v2/assets/{index-H6bwm6L6.js.map → index-dSUEBAqg.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{index-D3ILnEzm.js → index-uvH5a3zO.js} +2 -2
  137. prefect/server/ui-v2/assets/{index-D3ILnEzm.js.map → index-uvH5a3zO.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js → json-input-gXz7BuJj.js} +2 -2
  139. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js.map → json-input-gXz7BuJj.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js → key._key-CJPbLXwU.js} +2 -2
  141. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js.map → key._key-CJPbLXwU.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js → lazy-markdown-wPid80zf.js} +2 -2
  143. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js.map → lazy-markdown-wPid80zf.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{login-kqmT29n7.js → login-DC63bGXK.js} +2 -2
  145. prefect/server/ui-v2/assets/{login-kqmT29n7.js.map → login-DC63bGXK.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js → markdown-input-BhqrU6Eo.js} +2 -2
  147. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js.map → markdown-input-BhqrU6Eo.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js → python-example-snippet-3jtXWQZN.js} +3 -3
  149. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js.map → python-example-snippet-3jtXWQZN.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js → python-input-ZVi-v324.js} +2 -2
  151. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js.map → python-input-ZVi-v324.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js → radio-group-BBMLpHGc.js} +2 -2
  153. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js.map → radio-group-BBMLpHGc.js.map} +1 -1
  154. prefect/server/ui-v2/assets/route-error-state-BJXl8qkX.js +2 -0
  155. prefect/server/ui-v2/assets/{route-error-state-ALftyvGl.js.map → route-error-state-BJXl8qkX.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js → schema-form-BEqYjsM-.js} +2 -2
  157. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js.map → schema-form-BEqYjsM-.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js → schema-form-input-string-format-datetime-l3xt3PWf.js} +4 -4
  159. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js.map → schema-form-input-string-format-datetime-l3xt3PWf.js.map} +1 -1
  160. prefect/server/ui-v2/assets/settings-txD0dR5Q.js +2 -0
  161. prefect/server/ui-v2/assets/settings-txD0dR5Q.js.map +1 -0
  162. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js → sort-filter-DHPFdKZ2.js} +2 -2
  163. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js.map → sort-filter-DHPFdKZ2.js.map} +1 -1
  164. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js +2 -0
  165. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js.map +1 -0
  166. prefect/server/ui-v2/assets/table-ULfpXJXB.js +2 -0
  167. prefect/server/ui-v2/assets/table-ULfpXJXB.js.map +1 -0
  168. prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js +2 -0
  169. prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js.map +1 -0
  170. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-BpeKHk7g.js +2 -0
  171. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG3den1B.js.map → task-run-concurrency-limits-reset-dialog-BpeKHk7g.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js → task-run._id-CkOl9MJs.js} +3 -3
  173. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js.map → task-run._id-CkOl9MJs.js.map} +1 -1
  174. prefect/server/ui-v2/assets/task-run._id-udkz1lhh.js +2 -0
  175. prefect/server/ui-v2/assets/{task-run._id-CnIVqU6v.js.map → task-run._id-udkz1lhh.js.map} +1 -1
  176. prefect/server/ui-v2/assets/task-runs-pagination-B7D5K_FM.js +2 -0
  177. prefect/server/ui-v2/assets/{task-runs-pagination-DLSAz-Ur.js.map → task-runs-pagination-B7D5K_FM.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js → textarea-C4bdj7Jk.js} +2 -2
  179. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js.map → textarea-C4bdj7Jk.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js → timezone-select-AdlSRQxZ.js} +2 -2
  181. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js.map → timezone-select-AdlSRQxZ.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js → toggle-group-C-vxYz4l.js} +2 -2
  183. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js.map → toggle-group-C-vxYz4l.js.map} +1 -1
  184. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Cqhaqtqe.js +2 -0
  185. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Bzy2ML2T.js.map → use-delete-automation-confirmation-dialog-Cqhaqtqe.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js → use-delete-block-document-confirmation-dialog-GjNhFxZe.js} +2 -2
  187. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js.map → use-delete-block-document-confirmation-dialog-GjNhFxZe.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js → use-flow-runs-selected-rows-DfwmswyR.js} +2 -2
  189. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js.map → use-flow-runs-selected-rows-DfwmswyR.js.map} +1 -1
  190. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js → use-get-artifacts-flow-task-runs-BEBpG_5J.js} +2 -2
  191. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js.map → use-get-artifacts-flow-task-runs-BEBpG_5J.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js → use-quick-run-BYBRcDwC.js} +2 -2
  193. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js.map → use-quick-run-BYBRcDwC.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js → use-stepper-Bk97vOTm.js} +2 -2
  195. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js.map → use-stepper-Bk97vOTm.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js → utilities-BQwGFLk5.js} +2 -2
  197. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js.map → utilities-BQwGFLk5.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js → work-pool-filter-Ddhp_M-L.js} +2 -2
  199. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js.map → work-pool-filter-Ddhp_M-L.js.map} +1 -1
  200. prefect/server/ui-v2/assets/work-pool-queue-toggle-DX3eV3R_.js +2 -0
  201. prefect/server/ui-v2/assets/{work-pool-queue-toggle-D4eeo-hi.js.map → work-pool-queue-toggle-DX3eV3R_.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js → work-pool._workPoolName-BaRIsXBX.js} +2 -2
  203. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js.map → work-pool._workPoolName-BaRIsXBX.js.map} +1 -1
  204. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-dhS_Xz32.js +2 -0
  205. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CA0ePjCk.js.map → work-pool_._workPoolName.edit-dhS_Xz32.js.map} +1 -1
  206. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js} +2 -2
  207. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js.map → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js.map} +1 -1
  208. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js → work-queue-icon-text-_Ez8e2dw.js} +2 -2
  209. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js.map → work-queue-icon-text-_Ez8e2dw.js.map} +1 -1
  210. prefect/server/ui-v2/index.html +2 -2
  211. prefect/settings/models/flows.py +14 -1
  212. prefect/settings/models/runner.py +16 -6
  213. prefect/task_engine.py +17 -3
  214. prefect/task_worker.py +99 -17
  215. prefect/tasks.py +2 -2
  216. prefect/testing/fixtures.py +41 -6
  217. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/METADATA +1 -1
  218. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/RECORD +221 -220
  219. prefect/server/ui-v2/assets/automation._id-IHh5QJwE.js +0 -2
  220. prefect/server/ui-v2/assets/block-type-logo-B31LJm5H.js +0 -2
  221. prefect/server/ui-v2/assets/block_._id.edit-CIhIBJrm.js +0 -2
  222. prefect/server/ui-v2/assets/catalog-CfniU0UV.js +0 -2
  223. prefect/server/ui-v2/assets/catalog_._slug-C9p86T4s.js +0 -2
  224. prefect/server/ui-v2/assets/catalog_._slug_.create-BhSunL__.js +0 -2
  225. prefect/server/ui-v2/assets/delete-confirmation-dialog-COdZmNfa.js +0 -2
  226. prefect/server/ui-v2/assets/deployment._id-DVmqclRz.js +0 -2
  227. prefect/server/ui-v2/assets/deployment_._id.duplicate-DVMjpk5m.js +0 -2
  228. prefect/server/ui-v2/assets/deployment_._id.edit-Ck_P6KDn.js +0 -2
  229. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js +0 -2
  230. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js.map +0 -1
  231. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js +0 -4
  232. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js.map +0 -1
  233. prefect/server/ui-v2/assets/flow-run._id-OL0YhyLW.js +0 -2
  234. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js +0 -2
  235. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js.map +0 -1
  236. prefect/server/ui-v2/assets/flow._id-DhrCicwR.js +0 -2
  237. prefect/server/ui-v2/assets/index-7-r4ia_S.js +0 -2
  238. prefect/server/ui-v2/assets/index-7ThYp9SY.js +0 -2
  239. prefect/server/ui-v2/assets/index-B7zHzWQW.css +0 -1
  240. prefect/server/ui-v2/assets/index-B_3f8Hcb.js +0 -2
  241. prefect/server/ui-v2/assets/index-BiCd-Iuz.js +0 -2
  242. prefect/server/ui-v2/assets/index-BiCd-Iuz.js.map +0 -1
  243. prefect/server/ui-v2/assets/index-CT_nG86y.js +0 -2
  244. prefect/server/ui-v2/assets/index-Cs8eFQKw.js +0 -2
  245. prefect/server/ui-v2/assets/index-H6bwm6L6.js +0 -2
  246. prefect/server/ui-v2/assets/index-WYPZo52S.js +0 -17
  247. prefect/server/ui-v2/assets/index-WYPZo52S.js.map +0 -1
  248. prefect/server/ui-v2/assets/index-qPlIYf3i.js +0 -2
  249. prefect/server/ui-v2/assets/route-error-state-ALftyvGl.js +0 -2
  250. prefect/server/ui-v2/assets/settings-BL0X8cDU.js +0 -2
  251. prefect/server/ui-v2/assets/settings-BL0X8cDU.js.map +0 -1
  252. prefect/server/ui-v2/assets/table-CEAx-qHs.js +0 -2
  253. prefect/server/ui-v2/assets/table-CEAx-qHs.js.map +0 -1
  254. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js +0 -2
  255. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js.map +0 -1
  256. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CG3den1B.js +0 -2
  257. prefect/server/ui-v2/assets/task-run._id-CnIVqU6v.js +0 -2
  258. prefect/server/ui-v2/assets/task-runs-pagination-DLSAz-Ur.js +0 -2
  259. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Bzy2ML2T.js +0 -2
  260. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js +0 -2
  261. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js.map +0 -1
  262. prefect/server/ui-v2/assets/work-pool-queue-toggle-D4eeo-hi.js +0 -2
  263. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CA0ePjCk.js +0 -2
  264. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/WHEEL +0 -0
  265. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/entry_points.txt +0 -0
  266. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index-DYOACRXY.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-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,2 +1,2 @@
1
- import{j as o}from"./vendor-tanstack-BK8oseNA.js";import{r as i}from"./index-WYPZo52S.js";import{A as m}from"./automations-header-C6aUe5Tw.js";import{R as s}from"./route-error-state-ALftyvGl.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-HGoNWFfP.js.map
1
+ import{j as o}from"./vendor-tanstack-BK8oseNA.js";import{s as i}from"./index-D5RdrxkU.js";import{A as m}from"./automations-header-CgOWwuc6.js";import{R as s}from"./route-error-state-BJXl8qkX.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-Wfs7Cjew.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-HGoNWFfP.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
+ {"version":3,"file":"index-Wfs7Cjew.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"}
@@ -0,0 +1,2 @@
1
+ import{r as c,j as e,E as h}from"./vendor-tanstack-BK8oseNA.js";import{al as j,N as b,O as v,S,a as A,b as C,c as N,e as T,I as x,B as E,g as k,h as I,D as y,E as D,t as M,v as V,w as L,x as w,au as B,bt as p,bu as R,bv as _}from"./index-D5RdrxkU.js";import{A as G}from"./artifact-card-CUEaRDGw.js";import{T as Q,a as f}from"./toggle-group-C-vxYz4l.js";import{u as F}from"./use-debounce-callback-ClAx-Wwx.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"./lazy-markdown-wPid80zf.js";const O=[{value:"all",label:"All Types"},{value:"markdown",label:"Markdown"},{value:"progress",label:"Progress"},{value:"image",label:"Image"},{value:"table",label:"Table"}],P=({filters:a,onFilterChange:s,totalCount:r,displayMode:o,setDisplayMode:i})=>{const l=c.useCallback(t=>{s([...a.filter(u=>u.id!=="name"),{id:"name",label:"Name",value:t}])},[a,s]),d=c.useCallback(t=>{s([...a.filter(u=>u.id!=="type"),{id:"type",label:"Type",value:t}])},[a,s]),m=c.useMemo(()=>a.find(t=>t.id==="type")?.value,[a]),n=c.useMemo(()=>a.find(t=>t.id==="name")?.value,[a]);return e.jsxs("div",{"data-testid":"artifact-filter",className:"flex justify-between items-center",children:[e.jsx("div",{children:e.jsxs(j,{variant:"body",className:"text-sm text-muted-foreground",children:[r," ",b(r,"artifact")]})}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx(v,{"data-testid":"search-input",defaultValue:n,placeholder:"Search artifacts",onChange:t=>l(t.target.value)}),e.jsxs("div",{className:"flex gap-4",children:[e.jsxs(S,{"data-testid":"type-select",value:m,onValueChange:d,children:[e.jsx(A,{"aria-label":"Artifact type",children:e.jsx(C,{placeholder:"Type"})}),e.jsx(N,{children:O.map(({value:t,label:u})=>e.jsx(T,{value:t,children:u},t))})]}),e.jsx("div",{children:e.jsxs(Q,{type:"single",defaultValue:o,onValueChange:t=>i(t),children:[e.jsx(f,{"data-testid":"grid-layout",value:"grid",children:e.jsx(x,{id:"LayoutGrid"})}),e.jsx(f,{"data-testid":"list-layout",value:"list",children:e.jsx(x,{id:"AlignJustify"})})]})})]})]})]})},q=()=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(E,{children:e.jsx(k,{children:e.jsx(I,{className:"text-xl font-semibold",children:"Artifacts"})})})}),e.jsx(y,{id:"artifacts-guide",label:"Documentation"})]}),z=()=>e.jsxs(D,{children:[e.jsx("div",{className:"flex items-center gap-3",children:e.jsx(M,{id:"Image"})}),e.jsx(V,{children:"Create an artifact to get started"}),e.jsx(L,{children:"Artifacts are byproducts of your runs; they can be anything from a markdown string to a table."}),e.jsx(w,{children:e.jsx(y,{id:"artifacts-guide"})})]}),H=({filters:a,onFilterChange:s,artifactsList:r,artifactsCount:o})=>{const[i,l]=B("artifacts-grid-style","grid"),d=c.useMemo(()=>i==="grid"?"grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4":"grid-cols-1",[i]),m=c.useMemo(()=>r.reduce((n,t)=>(n.find(u=>u.key===t.key)||n.push(t),n),[]),[r]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(q,{}),e.jsx(P,{filters:a,onFilterChange:s,totalCount:o,setDisplayMode:l,displayMode:i}),m.length===0?e.jsx(z,{}):e.jsx("div",{className:d,children:m.map(n=>e.jsx(G,{artifact:n},n.id))})]})},g=a=>({artifacts:{operator:"and_",type:{any_:a?.type&&a?.type!=="all"?[a.type]:void 0},key:{like_:a?.name??""}},sort:"CREATED_DESC",offset:0}),J=()=>{const a=p.useSearch(),s=p.useNavigate(),r=c.useMemo(()=>[{id:"type",label:"Type",value:a.type??"all"},{id:"name",label:"Name",value:a.name}],[a.type,a.name]),o=F(c.useCallback(i=>{i&&s({to:".",search:()=>i.filter(l=>l.value).reduce((l,d)=>(d.value&&(l[d.id]=d.value),l),{}),replace:!0})},[s]),400);return{filters:r,onFilterChange:o}};function ie(){const a=p.useSearch(),{filters:s,onFilterChange:r}=J(),[{data:o},{data:i}]=h({queries:[R(g(a)),_(g(a))]});return e.jsx(H,{filters:s,onFilterChange:r,artifactsCount:o,artifactsList:i})}export{ie as component};
2
+ //# sourceMappingURL=index-dSUEBAqg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-H6bwm6L6.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-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,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{aU as j,O as f,Q as p,G as i,T as g,bS as c,bP as l,bQ as o,bR as d,aq as v,f as T}from"./index-WYPZo52S.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})]})})},E=({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{E as S};
2
- //# sourceMappingURL=index-D3ILnEzm.js.map
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-D5RdrxkU.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-uvH5a3zO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-D3ILnEzm.js","sources":["../../src/components/ui/schedule-badge/index.tsx"],"sourcesContent":["import cronstrue from \"cronstrue\";\nimport { format } from \"date-fns\";\nimport humanizeDuration from \"humanize-duration\";\nimport { useRef } from \"react\";\nimport { rrulestr } from \"rrule\";\nimport type { components } from \"@/api/prefect\";\nimport { Badge, type BadgeProps } from \"@/components/ui/badge\";\nimport {\n\tHoverCard,\n\tHoverCardContent,\n\tHoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useIsOverflowing } from \"@/hooks/use-is-overflowing\";\nimport { capitalize, cn } from \"@/utils\";\n\ntype DeploymentSchedule = components[\"schemas\"][\"DeploymentSchedule\"];\ntype CronSchedule = components[\"schemas\"][\"CronSchedule\"];\ntype IntervalSchedule = components[\"schemas\"][\"IntervalSchedule\"];\ntype RRuleSchedule = components[\"schemas\"][\"RRuleSchedule\"];\n\ntype ScheduleBadgeProps = BadgeProps & {\n\tschedule: DeploymentSchedule;\n};\n\nexport const ScheduleBadge = ({ schedule, ...props }: ScheduleBadgeProps) => {\n\tconst { schedule: innerSchedule } = schedule;\n\tif (\"cron\" in innerSchedule) {\n\t\treturn (\n\t\t\t<CronScheduleBadge\n\t\t\t\tschedule={innerSchedule}\n\t\t\t\tactive={schedule.active}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (\"interval\" in innerSchedule) {\n\t\treturn (\n\t\t\t<IntervalScheduleBadge\n\t\t\t\tschedule={innerSchedule}\n\t\t\t\tactive={schedule.active}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (\"rrule\" in innerSchedule) {\n\t\treturn (\n\t\t\t<RRuleScheduleBadge\n\t\t\t\tschedule={innerSchedule}\n\t\t\t\tactive={schedule.active}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t}\n};\n\nconst CronScheduleBadge = ({\n\tactive,\n\tschedule,\n\t...props\n}: BadgeProps & {\n\tactive: boolean;\n\tschedule: CronSchedule;\n}) => {\n\tconst scheduleText = cronstrue.toString(schedule.cron);\n\tconst detailedScheduleText = `${active ? \"\" : \"(Paused)\"} ${scheduleText} (${schedule.timezone})`;\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tclassName={`${!active ? \"opacity-50\" : \"\"}`}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"truncate\">{scheduleText}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{detailedScheduleText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\nconst IntervalScheduleBadge = ({\n\tactive,\n\tschedule,\n\t...props\n}: BadgeProps & {\n\tactive: boolean;\n\tschedule: IntervalSchedule;\n}) => {\n\tconst scheduleText = `Every ${humanizeDuration(schedule.interval * 1000)}`;\n\tlet detailedScheduleText = `${active ? \"\" : \"(Paused)\"} ${scheduleText}`;\n\tif (schedule.anchor_date) {\n\t\tdetailedScheduleText += ` using ${format(\n\t\t\tnew Date(schedule.anchor_date),\n\t\t\t\"MMM do, yyyy 'at' hh:mm:ss aa\",\n\t\t)} (${schedule.timezone}) as the anchor date`;\n\t}\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tclassName={`${!active ? \"opacity-50\" : \"\"}`}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"truncate\">{scheduleText}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{detailedScheduleText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\nconst RRuleScheduleBadge = ({\n\tactive,\n\tschedule,\n\t...props\n}: BadgeProps & {\n\tactive: boolean;\n\tschedule: RRuleSchedule;\n}) => {\n\tconst scheduleText = rrulestr(schedule.rrule).toText();\n\tconst capitalizedScheduleText = capitalize(scheduleText);\n\tconst detailedScheduleText = `${active ? \"\" : \"(Paused)\"} ${capitalizedScheduleText} (${schedule.timezone})`;\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tclassName={`${!active ? \"opacity-50\" : \"\"}`}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"truncate\">{capitalizedScheduleText}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{detailedScheduleText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\nexport const ScheduleBadgeGroup = ({\n\tschedules,\n\tclassName,\n}: {\n\tschedules: DeploymentSchedule[];\n\tclassName?: string;\n}) => {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst isOverflowing = useIsOverflowing(containerRef);\n\tif (!schedules || schedules.length === 0) return null;\n\n\tif (isOverflowing) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\"flex flex-row gap-2 items-center no-wrap\", className)}\n\t\t\t>\n\t\t\t\t<HoverCard>\n\t\t\t\t\t<HoverCardTrigger>\n\t\t\t\t\t\t<Badge variant=\"secondary\" className=\"whitespace-nowrap\">\n\t\t\t\t\t\t\t{schedules.length} schedules\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t</HoverCardTrigger>\n\t\t\t\t\t<HoverCardContent className=\"flex flex-col flex-wrap gap-1 w-fit\">\n\t\t\t\t\t\t{schedules.map((schedule) => (\n\t\t\t\t\t\t\t<ScheduleBadge key={schedule.id} schedule={schedule} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</HoverCardContent>\n\t\t\t\t</HoverCard>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"flex flex-row gap-2 items-center no-wrap\"\n\t\t\tref={containerRef}\n\t\t>\n\t\t\t{schedules.map((schedule) => (\n\t\t\t\t<ScheduleBadge\n\t\t\t\t\tkey={schedule.id}\n\t\t\t\t\tschedule={schedule}\n\t\t\t\t\tclassName=\"max-w-28\"\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n"],"names":["ScheduleBadge","schedule","props","innerSchedule","jsx","CronScheduleBadge","IntervalScheduleBadge","RRuleScheduleBadge","active","scheduleText","cronstrue","detailedScheduleText","TooltipProvider","jsxs","Tooltip","TooltipTrigger","Badge","TooltipContent","humanizeDuration","format","rrulestr","capitalizedScheduleText","capitalize","ScheduleBadgeGroup","schedules","className","containerRef","useRef","isOverflowing","useIsOverflowing","cn","HoverCard","HoverCardTrigger","HoverCardContent"],"mappings":"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"}
1
+ {"version":3,"file":"index-uvH5a3zO.js","sources":["../../src/components/ui/schedule-badge/index.tsx"],"sourcesContent":["import cronstrue from \"cronstrue\";\nimport { format } from \"date-fns\";\nimport humanizeDuration from \"humanize-duration\";\nimport { useRef } from \"react\";\nimport { rrulestr } from \"rrule\";\nimport type { components } from \"@/api/prefect\";\nimport { Badge, type BadgeProps } from \"@/components/ui/badge\";\nimport {\n\tHoverCard,\n\tHoverCardContent,\n\tHoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useIsOverflowing } from \"@/hooks/use-is-overflowing\";\nimport { capitalize, cn } from \"@/utils\";\n\ntype DeploymentSchedule = components[\"schemas\"][\"DeploymentSchedule\"];\ntype CronSchedule = components[\"schemas\"][\"CronSchedule\"];\ntype IntervalSchedule = components[\"schemas\"][\"IntervalSchedule\"];\ntype RRuleSchedule = components[\"schemas\"][\"RRuleSchedule\"];\n\ntype ScheduleBadgeProps = BadgeProps & {\n\tschedule: DeploymentSchedule;\n};\n\nexport const ScheduleBadge = ({ schedule, ...props }: ScheduleBadgeProps) => {\n\tconst { schedule: innerSchedule } = schedule;\n\tif (\"cron\" in innerSchedule) {\n\t\treturn (\n\t\t\t<CronScheduleBadge\n\t\t\t\tschedule={innerSchedule}\n\t\t\t\tactive={schedule.active}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (\"interval\" in innerSchedule) {\n\t\treturn (\n\t\t\t<IntervalScheduleBadge\n\t\t\t\tschedule={innerSchedule}\n\t\t\t\tactive={schedule.active}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (\"rrule\" in innerSchedule) {\n\t\treturn (\n\t\t\t<RRuleScheduleBadge\n\t\t\t\tschedule={innerSchedule}\n\t\t\t\tactive={schedule.active}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t}\n};\n\nconst CronScheduleBadge = ({\n\tactive,\n\tschedule,\n\t...props\n}: BadgeProps & {\n\tactive: boolean;\n\tschedule: CronSchedule;\n}) => {\n\tconst scheduleText = cronstrue.toString(schedule.cron);\n\tconst detailedScheduleText = `${active ? \"\" : \"(Paused)\"} ${scheduleText} (${schedule.timezone})`;\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tclassName={`${!active ? \"opacity-50\" : \"\"}`}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"truncate\">{scheduleText}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{detailedScheduleText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\nconst IntervalScheduleBadge = ({\n\tactive,\n\tschedule,\n\t...props\n}: BadgeProps & {\n\tactive: boolean;\n\tschedule: IntervalSchedule;\n}) => {\n\tconst scheduleText = `Every ${humanizeDuration(schedule.interval * 1000)}`;\n\tlet detailedScheduleText = `${active ? \"\" : \"(Paused)\"} ${scheduleText}`;\n\tif (schedule.anchor_date) {\n\t\tdetailedScheduleText += ` using ${format(\n\t\t\tnew Date(schedule.anchor_date),\n\t\t\t\"MMM do, yyyy 'at' hh:mm:ss aa\",\n\t\t)} (${schedule.timezone}) as the anchor date`;\n\t}\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tclassName={`${!active ? \"opacity-50\" : \"\"}`}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"truncate\">{scheduleText}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{detailedScheduleText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\nconst RRuleScheduleBadge = ({\n\tactive,\n\tschedule,\n\t...props\n}: BadgeProps & {\n\tactive: boolean;\n\tschedule: RRuleSchedule;\n}) => {\n\tconst scheduleText = rrulestr(schedule.rrule).toText();\n\tconst capitalizedScheduleText = capitalize(scheduleText);\n\tconst detailedScheduleText = `${active ? \"\" : \"(Paused)\"} ${capitalizedScheduleText} (${schedule.timezone})`;\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tclassName={`${!active ? \"opacity-50\" : \"\"}`}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"truncate\">{capitalizedScheduleText}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{detailedScheduleText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\nexport const ScheduleBadgeGroup = ({\n\tschedules,\n\tclassName,\n}: {\n\tschedules: DeploymentSchedule[];\n\tclassName?: string;\n}) => {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst isOverflowing = useIsOverflowing(containerRef);\n\tif (!schedules || schedules.length === 0) return null;\n\n\tif (isOverflowing) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\"flex flex-row gap-2 items-center no-wrap\", className)}\n\t\t\t>\n\t\t\t\t<HoverCard>\n\t\t\t\t\t<HoverCardTrigger>\n\t\t\t\t\t\t<Badge variant=\"secondary\" className=\"whitespace-nowrap\">\n\t\t\t\t\t\t\t{schedules.length} schedules\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t</HoverCardTrigger>\n\t\t\t\t\t<HoverCardContent className=\"flex flex-col flex-wrap gap-1 w-fit\">\n\t\t\t\t\t\t{schedules.map((schedule) => (\n\t\t\t\t\t\t\t<ScheduleBadge key={schedule.id} schedule={schedule} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</HoverCardContent>\n\t\t\t\t</HoverCard>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"flex flex-row gap-2 items-center no-wrap\"\n\t\t\tref={containerRef}\n\t\t>\n\t\t\t{schedules.map((schedule) => (\n\t\t\t\t<ScheduleBadge\n\t\t\t\t\tkey={schedule.id}\n\t\t\t\t\tschedule={schedule}\n\t\t\t\t\tclassName=\"max-w-28\"\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n"],"names":["ScheduleBadge","schedule","props","innerSchedule","jsx","CronScheduleBadge","IntervalScheduleBadge","RRuleScheduleBadge","active","scheduleText","cronstrue","detailedScheduleText","TooltipProvider","jsxs","Tooltip","TooltipTrigger","Badge","TooltipContent","humanizeDuration","format","rrulestr","capitalizedScheduleText","capitalize","ScheduleBadgeGroup","schedules","className","containerRef","useRef","isOverflowing","useIsOverflowing","cn","HoverCard","HoverCardTrigger","HoverCardContent"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{c as g,r as c,j as o}from"./vendor-tanstack-BK8oseNA.js";import{u as x,j as b,E as j}from"./vendor-codemirror-CXN7nd_v.js";import{z as v,aU as C,p as w,I as y,x as E}from"./index-WYPZo52S.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";const N=[b(),j.lineWrapping],z=g.forwardRef(({className:l,value:s,onChange:p,copy:u=!1,onBlur:I,disabled:r,hideLineNumbers:h=!1,...f},i)=>{const e=c.useRef(null),{resolvedTheme:m}=v();let n;r&&(n={lineNumbers:!h,highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1});const{setContainer:a}=x({container:e.current,extensions:N,value:s,onChange:p,indentWithTab:!1,editable:!r,basicSetup:n,theme:m==="dark"?"dark":"light",height:"100%"});c.useEffect(()=>{e.current&&a(e.current)},[a]);const d=t=>{E.success("Copied to clipboard"),navigator.clipboard.writeText(t)};return o.jsx("div",{className:C("rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative",l),ref:t=>{e.current=t,typeof i=="function"?i(t):i&&(i.current=t)},...f,children:u&&s&&o.jsx(w,{onClick:()=>d(s),variant:"ghost",size:"icon",className:"absolute top-0 right-0 z-10","aria-label":"copy",children:o.jsx(y,{id:"Copy",className:"size-2"})})})});z.displayName="JsonInput";export{z as JsonInput};
2
- //# sourceMappingURL=json-input-9UPGqxTw.js.map
1
+ import{c as g,r as c,j as o}from"./vendor-tanstack-BK8oseNA.js";import{u as x,j as b,E as j}from"./vendor-codemirror-CXN7nd_v.js";import{z as v,aW as y,q as C,I as w,y as E}from"./index-D5RdrxkU.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";const N=[b(),j.lineWrapping],z=g.forwardRef(({className:l,value:s,onChange:u,copy:p=!1,onBlur:I,disabled:r,hideLineNumbers:h=!1,...f},i)=>{const e=c.useRef(null),{resolvedTheme:m}=v();let n;r&&(n={lineNumbers:!h,highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1});const{setContainer:a}=x({container:e.current,extensions:N,value:s,onChange:u,indentWithTab:!1,editable:!r,basicSetup:n,theme:m==="dark"?"dark":"light",height:"100%"});c.useEffect(()=>{e.current&&a(e.current)},[a]);const d=t=>{E.success("Copied to clipboard"),navigator.clipboard.writeText(t)};return o.jsx("div",{className:y("rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative",l),ref:t=>{e.current=t,typeof i=="function"?i(t):i&&(i.current=t)},...f,children:p&&s&&o.jsx(C,{onClick:()=>d(s),variant:"ghost",size:"icon",className:"absolute top-0 right-0 z-10","aria-label":"copy",children:o.jsx(w,{id:"Copy",className:"size-2"})})})});z.displayName="JsonInput";export{z as JsonInput};
2
+ //# sourceMappingURL=json-input-gXz7BuJj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-input-9UPGqxTw.js","sources":["../../src/components/ui/json-input.tsx"],"sourcesContent":["import { json } from \"@codemirror/lang-json\";\nimport {\n\ttype BasicSetupOptions,\n\tEditorView,\n\tuseCodeMirror,\n} from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport React, { useEffect, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/utils\";\nimport { Button } from \"./button\";\nimport { Icon } from \"./icons\";\n\nconst extensions = [json(), EditorView.lineWrapping];\n\ntype JsonInputProps = React.ComponentProps<\"div\"> & {\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tonBlur?: () => void;\n\tdisabled?: boolean;\n\tclassName?: string;\n\thideLineNumbers?: boolean;\n\tcopy?: boolean;\n};\n\n// the JsonInput's types for onChange are probably wrong but this makes it work\nexport type JsonInputOnChange = React.FormEventHandler<HTMLDivElement> &\n\t((value: string) => void);\n\nexport const JsonInput = React.forwardRef<HTMLDivElement, JsonInputProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tcopy = false,\n\t\t\tonBlur,\n\t\t\tdisabled,\n\t\t\thideLineNumbers = false,\n\t\t\t...props\n\t\t},\n\t\tforwardedRef,\n\t) => {\n\t\tconst editor = useRef<HTMLDivElement | null>(null);\n\t\tconst { resolvedTheme } = useTheme();\n\t\t// Setting `basicSetup` messes up the tab order. We only change the basic setup\n\t\t// if the input is disabled, so we leave it undefined to maintain the tab order.\n\t\tlet basicSetup: BasicSetupOptions | undefined;\n\t\tif (disabled) {\n\t\t\tbasicSetup = {\n\t\t\t\tlineNumbers: !hideLineNumbers,\n\t\t\t\thighlightActiveLine: false,\n\t\t\t\tfoldGutter: false,\n\t\t\t\thighlightActiveLineGutter: false,\n\t\t\t};\n\t\t}\n\t\tconst { setContainer } = useCodeMirror({\n\t\t\tcontainer: editor.current,\n\t\t\textensions,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tonBlur,\n\t\t\tindentWithTab: false,\n\t\t\teditable: !disabled,\n\t\t\tbasicSetup,\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t\theight: \"100%\",\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\tif (editor.current) {\n\t\t\t\tsetContainer(editor.current);\n\t\t\t}\n\t\t}, [setContainer]);\n\n\t\tconst handleCopy = (_value: string) => {\n\t\t\ttoast.success(\"Copied to clipboard\");\n\t\t\tvoid navigator.clipboard.writeText(_value);\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t\tif (typeof forwardedRef === \"function\") {\n\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{copy && value && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleCopy(value)}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nJsonInput.displayName = \"JsonInput\";\n"],"names":["extensions","json","EditorView","JsonInput","React","className","value","onChange","copy","onBlur","disabled","hideLineNumbers","props","forwardedRef","editor","useRef","resolvedTheme","useTheme","basicSetup","setContainer","useCodeMirror","useEffect","handleCopy","_value","toast","jsx","cn","node","Button","Icon"],"mappings":"wXAaA,MAAMA,EAAa,CAACC,IAAQC,EAAW,YAAY,EAgBtCC,EAAYC,EAAM,WAC9B,CACC,CACC,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,GACP,OAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,GAClB,GAAGC,CAAA,EAEJC,IACI,CACJ,MAAMC,EAASC,EAAAA,OAA8B,IAAI,EAC3C,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAG1B,IAAIC,EACAR,IACHQ,EAAa,CACZ,YAAa,CAACP,EACd,oBAAqB,GACrB,WAAY,GACZ,0BAA2B,EAAA,GAG7B,KAAM,CAAE,aAAAQ,CAAA,EAAiBC,EAAc,CACtC,UAAWN,EAAO,QAClB,WAAAd,EACA,MAAAM,EACA,SAAAC,EAEA,cAAe,GACf,SAAU,CAACG,EACX,WAAAQ,EACA,MAAOF,IAAkB,OAAS,OAAS,QAC3C,OAAQ,MAAA,CACR,EAEDK,EAAAA,UAAU,IAAM,CACXP,EAAO,SACVK,EAAaL,EAAO,OAAO,CAE7B,EAAG,CAACK,CAAY,CAAC,EAEjB,MAAMG,EAAcC,GAAmB,CACtCC,EAAM,QAAQ,qBAAqB,EAC9B,UAAU,UAAU,UAAUD,CAAM,CAC1C,EAEA,OACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,8HACArB,CAAA,EAED,IAAMsB,GAAS,CACdb,EAAO,QAAUa,EACb,OAAOd,GAAiB,WAC3BA,EAAac,CAAI,EACPd,IACVA,EAAa,QAAUc,EAEzB,EACC,GAAGf,EAEH,YAAQN,GACRmB,EAAAA,IAACG,EAAA,CACA,QAAS,IAAMN,EAAWhB,CAAK,EAC/B,QAAQ,QACR,KAAK,OACL,UAAU,8BACV,aAAW,OAEX,SAAAmB,EAAAA,IAACI,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAIJ,CACD,EAEA1B,EAAU,YAAc"}
1
+ {"version":3,"file":"json-input-gXz7BuJj.js","sources":["../../src/components/ui/json-input.tsx"],"sourcesContent":["import { json } from \"@codemirror/lang-json\";\nimport {\n\ttype BasicSetupOptions,\n\tEditorView,\n\tuseCodeMirror,\n} from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport React, { useEffect, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/utils\";\nimport { Button } from \"./button\";\nimport { Icon } from \"./icons\";\n\nconst extensions = [json(), EditorView.lineWrapping];\n\ntype JsonInputProps = React.ComponentProps<\"div\"> & {\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tonBlur?: () => void;\n\tdisabled?: boolean;\n\tclassName?: string;\n\thideLineNumbers?: boolean;\n\tcopy?: boolean;\n};\n\n// the JsonInput's types for onChange are probably wrong but this makes it work\nexport type JsonInputOnChange = React.FormEventHandler<HTMLDivElement> &\n\t((value: string) => void);\n\nexport const JsonInput = React.forwardRef<HTMLDivElement, JsonInputProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tcopy = false,\n\t\t\tonBlur,\n\t\t\tdisabled,\n\t\t\thideLineNumbers = false,\n\t\t\t...props\n\t\t},\n\t\tforwardedRef,\n\t) => {\n\t\tconst editor = useRef<HTMLDivElement | null>(null);\n\t\tconst { resolvedTheme } = useTheme();\n\t\t// Setting `basicSetup` messes up the tab order. We only change the basic setup\n\t\t// if the input is disabled, so we leave it undefined to maintain the tab order.\n\t\tlet basicSetup: BasicSetupOptions | undefined;\n\t\tif (disabled) {\n\t\t\tbasicSetup = {\n\t\t\t\tlineNumbers: !hideLineNumbers,\n\t\t\t\thighlightActiveLine: false,\n\t\t\t\tfoldGutter: false,\n\t\t\t\thighlightActiveLineGutter: false,\n\t\t\t};\n\t\t}\n\t\tconst { setContainer } = useCodeMirror({\n\t\t\tcontainer: editor.current,\n\t\t\textensions,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tonBlur,\n\t\t\tindentWithTab: false,\n\t\t\teditable: !disabled,\n\t\t\tbasicSetup,\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t\theight: \"100%\",\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\tif (editor.current) {\n\t\t\t\tsetContainer(editor.current);\n\t\t\t}\n\t\t}, [setContainer]);\n\n\t\tconst handleCopy = (_value: string) => {\n\t\t\ttoast.success(\"Copied to clipboard\");\n\t\t\tvoid navigator.clipboard.writeText(_value);\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t\tif (typeof forwardedRef === \"function\") {\n\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{copy && value && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleCopy(value)}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nJsonInput.displayName = \"JsonInput\";\n"],"names":["extensions","json","EditorView","JsonInput","React","className","value","onChange","copy","onBlur","disabled","hideLineNumbers","props","forwardedRef","editor","useRef","resolvedTheme","useTheme","basicSetup","setContainer","useCodeMirror","useEffect","handleCopy","_value","toast","jsx","cn","node","Button","Icon"],"mappings":"wXAaA,MAAMA,EAAa,CAACC,IAAQC,EAAW,YAAY,EAgBtCC,EAAYC,EAAM,WAC9B,CACC,CACC,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,GACP,OAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,GAClB,GAAGC,CAAA,EAEJC,IACI,CACJ,MAAMC,EAASC,EAAAA,OAA8B,IAAI,EAC3C,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAG1B,IAAIC,EACAR,IACHQ,EAAa,CACZ,YAAa,CAACP,EACd,oBAAqB,GACrB,WAAY,GACZ,0BAA2B,EAAA,GAG7B,KAAM,CAAE,aAAAQ,CAAA,EAAiBC,EAAc,CACtC,UAAWN,EAAO,QAClB,WAAAd,EACA,MAAAM,EACA,SAAAC,EAEA,cAAe,GACf,SAAU,CAACG,EACX,WAAAQ,EACA,MAAOF,IAAkB,OAAS,OAAS,QAC3C,OAAQ,MAAA,CACR,EAEDK,EAAAA,UAAU,IAAM,CACXP,EAAO,SACVK,EAAaL,EAAO,OAAO,CAE7B,EAAG,CAACK,CAAY,CAAC,EAEjB,MAAMG,EAAcC,GAAmB,CACtCC,EAAM,QAAQ,qBAAqB,EAC9B,UAAU,UAAU,UAAUD,CAAM,CAC1C,EAEA,OACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,8HACArB,CAAA,EAED,IAAMsB,GAAS,CACdb,EAAO,QAAUa,EACb,OAAOd,GAAiB,WAC3BA,EAAac,CAAI,EACPd,IACVA,EAAa,QAAUc,EAEzB,EACC,GAAGf,EAEH,YAAQN,GACRmB,EAAAA,IAACG,EAAA,CACA,QAAS,IAAMN,EAAWhB,CAAK,EAC/B,QAAQ,QACR,KAAK,OACL,UAAU,8BACV,aAAW,OAEX,SAAAmB,EAAAA,IAACI,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAIJ,CACD,EAEA1B,EAAU,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as e,r as c,L as i,p as m}from"./vendor-tanstack-BK8oseNA.js";import{aU as n,D as x,I as f,ak as r,B as p,g as h,h as o,bq as b,bz as j,C as v,aK as g,dr as y,bt as N}from"./index-WYPZo52S.js";import{u as w}from"./use-get-artifacts-flow-task-runs-DZeBiVd9.js";import{L as k}from"./lazy-markdown-BHwIrC8E.js";import{az as C,aA as _,aB as T,aC as z,aD as M,aE as L}from"./vendor-radix-CznP1SOq.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";function A({className:t,...s}){return e.jsx(C,{"data-slot":"menubar",className:n("bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",t),...s})}function B({...t}){return e.jsx(_,{"data-slot":"menubar-menu",...t})}function D({...t}){return e.jsx(L,{"data-slot":"menubar-portal",...t})}function E({className:t,...s}){return e.jsx(T,{"data-slot":"menubar-trigger",className:n("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",t),...s})}function I({className:t,align:s="start",alignOffset:a=-4,sideOffset:d=8,...u}){return e.jsx(D,{children:e.jsx(z,{"data-slot":"menubar-content",align:s,alignOffset:a,sideOffset:d,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md",t),...u})})}function R({className:t,inset:s,variant:a="default",...d}){return e.jsx(M,{"data-slot":"menubar-item","data-inset":s,"data-variant":a,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t),...d})}const S=({artifactKey:t,pageHeader:s})=>{const a=c.useCallback(()=>{navigator.clipboard.writeText(t)},[t]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(F,{artifactKey:t}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(x,{id:"artifacts-guide",label:"Documentation"}),e.jsx(A,{children:e.jsxs(B,{children:[e.jsx(E,{className:"px-1",children:e.jsx(f,{id:"EllipsisVertical"})}),e.jsx(I,{children:e.jsx(R,{onClick:a,children:"Copy Id"})})]})})]})]}),s&&e.jsxs("div",{className:"",children:[e.jsx(r,{variant:"h2",className:"my-4 font-bold prose lg:prose-xl",children:e.jsx(k,{children:s})}),e.jsx("hr",{})]})]})},F=({artifactKey:t})=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{children:e.jsxs(h,{children:[e.jsx(o,{children:e.jsx(b,{to:"/artifacts",className:"text-xl font-semibold",children:"Artifacts"})}),e.jsx(j,{}),e.jsx(o,{className:"text-xl font-semibold",children:t})]})})}),$=({artifact:t})=>{const s=c.useMemo(()=>t.id?.split("-")[0],[t.id]);return e.jsxs(v,{"data-testid":`timeline-card-${t.id}`,className:"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow",children:[e.jsx(i,{to:"/artifacts/artifact/$id",params:{id:t.id??""},children:e.jsx(r,{variant:"body",className:"font-bold text-blue-700 hover:underline",children:s})}),t.flow_run&&e.jsxs(r,{variant:"bodySmall",children:["Flow run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/flow-run/$id",params:{id:t.flow_run_id??""},children:t.flow_run?.name})]}),t.task_run&&e.jsxs(r,{variant:"bodySmall",children:["Task run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/task-run/$id",params:{id:t.task_run_id??""},children:t.task_run?.name})]})]})},P=({artifact:t})=>{const[s,a]=g(t.created??"","dateTime").split(" at ");return e.jsxs("div",{"data-testid":`timeline-row-${t.id}`,className:"flex",children:[e.jsxs("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px"},children:[e.jsx(r,{variant:"body",children:a}),e.jsx(r,{variant:"bodySmall",className:"text-muted-foreground",children:s})]}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200",children:e.jsx("div",{className:"size-4 rounded-full bg-white my-5 mx-auto border-2",style:{margin:"20px calc(50% + 2px)"}})})}),e.jsx("div",{className:"grow mt-1",children:e.jsx($,{artifact:t})})]})},H=({artifacts:t})=>e.jsxs("div",{children:[t.map(s=>e.jsx(P,{artifact:s},s.id)),e.jsxs("div",{className:"flex border-b",children:[e.jsx("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px",height:"88px"}}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200 pt-3",children:e.jsx("div",{className:"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center",style:{margin:"20px calc(50% - 6px)"},children:e.jsx("div",{className:"size-4 rounded-full border-2 border-black relative"})})})}),e.jsx("div",{style:{padding:"33px 0 0 5px"},children:e.jsxs(r,{variant:"bodyLarge",children:["Created ",e.jsx("span",{className:"font-bold",children:t[0].key})]})})]})]}),K=({artifactKey:t,artifacts:s})=>e.jsxs("div",{children:[e.jsx(S,{artifactKey:t,pageHeader:s[0]?.description??void 0}),e.jsx(H,{artifacts:s})]}),l=t=>({artifacts:{operator:"and_",key:{like_:t}},sort:"CREATED_DESC",offset:0});function Y(){const{key:t}=y.useParams(),{data:s}=m(N(l(t))),a=w(l(t));return e.jsx("div",{children:e.jsx(K,{artifactKey:t,artifacts:a??s})})}export{Y as component};
2
- //# sourceMappingURL=key._key-CTFfXO_k.js.map
1
+ import{j as e,r as c,L as i,p as m}from"./vendor-tanstack-BK8oseNA.js";import{aW as n,D as x,I as f,al as r,B as p,g as h,h as o,bs as b,bB as j,C as v,aM as g,dt as y,bv as N}from"./index-D5RdrxkU.js";import{u as w}from"./use-get-artifacts-flow-task-runs-BEBpG_5J.js";import{L as k}from"./lazy-markdown-wPid80zf.js";import{az as C,aA as _,aB as M,aC as T,aD as z,aE as B}from"./vendor-radix-CznP1SOq.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";function L({className:t,...s}){return e.jsx(C,{"data-slot":"menubar",className:n("bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",t),...s})}function A({...t}){return e.jsx(_,{"data-slot":"menubar-menu",...t})}function D({...t}){return e.jsx(B,{"data-slot":"menubar-portal",...t})}function E({className:t,...s}){return e.jsx(M,{"data-slot":"menubar-trigger",className:n("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",t),...s})}function I({className:t,align:s="start",alignOffset:a=-4,sideOffset:d=8,...u}){return e.jsx(D,{children:e.jsx(T,{"data-slot":"menubar-content",align:s,alignOffset:a,sideOffset:d,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md",t),...u})})}function R({className:t,inset:s,variant:a="default",...d}){return e.jsx(z,{"data-slot":"menubar-item","data-inset":s,"data-variant":a,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t),...d})}const S=({artifactKey:t,pageHeader:s})=>{const a=c.useCallback(()=>{navigator.clipboard.writeText(t)},[t]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(F,{artifactKey:t}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(x,{id:"artifacts-guide",label:"Documentation"}),e.jsx(L,{children:e.jsxs(A,{children:[e.jsx(E,{className:"px-1",children:e.jsx(f,{id:"EllipsisVertical"})}),e.jsx(I,{children:e.jsx(R,{onClick:a,children:"Copy Id"})})]})})]})]}),s&&e.jsxs("div",{className:"",children:[e.jsx(r,{variant:"h2",className:"my-4 font-bold prose lg:prose-xl",children:e.jsx(k,{children:s})}),e.jsx("hr",{})]})]})},F=({artifactKey:t})=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{children:e.jsxs(h,{children:[e.jsx(o,{children:e.jsx(b,{to:"/artifacts",className:"text-xl font-semibold",children:"Artifacts"})}),e.jsx(j,{}),e.jsx(o,{className:"text-xl font-semibold",children:t})]})})}),$=({artifact:t})=>{const s=c.useMemo(()=>t.id?.split("-")[0],[t.id]);return e.jsxs(v,{"data-testid":`timeline-card-${t.id}`,className:"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow",children:[e.jsx(i,{to:"/artifacts/artifact/$id",params:{id:t.id??""},children:e.jsx(r,{variant:"body",className:"font-bold text-blue-700 hover:underline",children:s})}),t.flow_run&&e.jsxs(r,{variant:"bodySmall",children:["Flow run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/flow-run/$id",params:{id:t.flow_run_id??""},children:t.flow_run?.name})]}),t.task_run&&e.jsxs(r,{variant:"bodySmall",children:["Task run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/task-run/$id",params:{id:t.task_run_id??""},children:t.task_run?.name})]})]})},P=({artifact:t})=>{const[s,a]=g(t.created??"","dateTime").split(" at ");return e.jsxs("div",{"data-testid":`timeline-row-${t.id}`,className:"flex",children:[e.jsxs("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px"},children:[e.jsx(r,{variant:"body",children:a}),e.jsx(r,{variant:"bodySmall",className:"text-muted-foreground",children:s})]}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200",children:e.jsx("div",{className:"size-4 rounded-full bg-white my-5 mx-auto border-2",style:{margin:"20px calc(50% + 2px)"}})})}),e.jsx("div",{className:"grow mt-1",children:e.jsx($,{artifact:t})})]})},H=({artifacts:t})=>e.jsxs("div",{children:[t.map(s=>e.jsx(P,{artifact:s},s.id)),e.jsxs("div",{className:"flex border-b",children:[e.jsx("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px",height:"88px"}}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200 pt-3",children:e.jsx("div",{className:"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center",style:{margin:"20px calc(50% - 6px)"},children:e.jsx("div",{className:"size-4 rounded-full border-2 border-black relative"})})})}),e.jsx("div",{style:{padding:"33px 0 0 5px"},children:e.jsxs(r,{variant:"bodyLarge",children:["Created ",e.jsx("span",{className:"font-bold",children:t[0].key})]})})]})]}),Q=({artifactKey:t,artifacts:s})=>e.jsxs("div",{children:[e.jsx(S,{artifactKey:t,pageHeader:s[0]?.description??void 0}),e.jsx(H,{artifacts:s})]}),l=t=>({artifacts:{operator:"and_",key:{like_:t}},sort:"CREATED_DESC",offset:0});function Y(){const{key:t}=y.useParams(),{data:s}=m(N(l(t))),a=w(l(t));return e.jsx("div",{children:e.jsx(Q,{artifactKey:t,artifacts:a??s})})}export{Y as component};
2
+ //# sourceMappingURL=key._key-CJPbLXwU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"key._key-CTFfXO_k.js","sources":["../../src/components/ui/menubar.tsx","../../src/components/artifacts/key/artifacts-key-header.tsx","../../src/components/artifacts/key/timeline/timelineCard.tsx","../../src/components/artifacts/key/timeline/timelineRow.tsx","../../src/components/artifacts/key/timeline/timelineContainer.tsx","../../src/components/artifacts/key/artifacts-key-page.tsx","../../src/routes/artifacts/key.$key.tsx?tsr-split=component"],"sourcesContent":["import * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Menubar({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n\treturn (\n\t\t<MenubarPrimitive.Root\n\t\t\tdata-slot=\"menubar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarMenu({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n\treturn <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nfunction MenubarGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n\treturn <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nfunction MenubarPortal({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n\treturn <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nfunction MenubarRadioGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n\t);\n}\n\nfunction MenubarTrigger({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n\treturn (\n\t\t<MenubarPrimitive.Trigger\n\t\t\tdata-slot=\"menubar-trigger\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarContent({\n\tclassName,\n\talign = \"start\",\n\talignOffset = -4,\n\tsideOffset = 8,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n\treturn (\n\t\t<MenubarPortal>\n\t\t\t<MenubarPrimitive.Content\n\t\t\t\tdata-slot=\"menubar-content\"\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</MenubarPortal>\n\t);\n}\n\nfunction MenubarItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Item\n\t\t\tdata-slot=\"menubar-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<MenubarPrimitive.CheckboxItem\n\t\t\tdata-slot=\"menubar-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.CheckboxItem>\n\t);\n}\n\nfunction MenubarRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioItem\n\t\t\tdata-slot=\"menubar-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.RadioItem>\n\t);\n}\n\nfunction MenubarLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Label\n\t\t\tdata-slot=\"menubar-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n\treturn (\n\t\t<MenubarPrimitive.Separator\n\t\t\tdata-slot=\"menubar-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"menubar-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSub({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n\treturn <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nfunction MenubarSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.SubTrigger\n\t\t\tdata-slot=\"menubar-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n\t\t</MenubarPrimitive.SubTrigger>\n\t);\n}\n\nfunction MenubarSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n\treturn (\n\t\t<MenubarPrimitive.SubContent\n\t\t\tdata-slot=\"menubar-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tMenubar,\n\tMenubarPortal,\n\tMenubarMenu,\n\tMenubarTrigger,\n\tMenubarContent,\n\tMenubarGroup,\n\tMenubarSeparator,\n\tMenubarLabel,\n\tMenubarItem,\n\tMenubarShortcut,\n\tMenubarCheckboxItem,\n\tMenubarRadioGroup,\n\tMenubarRadioItem,\n\tMenubarSub,\n\tMenubarSubTrigger,\n\tMenubarSubContent,\n};\n","import { useCallback } from \"react\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport {\n\tMenubar,\n\tMenubarContent,\n\tMenubarItem,\n\tMenubarMenu,\n\tMenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype ArtifactsKeyHeaderProps = {\n\tartifactKey: string;\n\tpageHeader?: string;\n};\n\nexport const ArtifactsKeyHeader = ({\n\tartifactKey,\n\tpageHeader,\n}: ArtifactsKeyHeaderProps) => {\n\tconst handleCopyId = useCallback(() => {\n\t\tvoid navigator.clipboard.writeText(artifactKey);\n\t}, [artifactKey]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Header artifactKey={artifactKey} />\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t\t\t{/* <Button variant=\"outline\" className=\"px-1\"><Icon id=\"EllipsisVertical\" /></Button> */}\n\t\t\t\t\t<Menubar>\n\t\t\t\t\t\t<MenubarMenu>\n\t\t\t\t\t\t\t<MenubarTrigger className=\"px-1\">\n\t\t\t\t\t\t\t\t<Icon id=\"EllipsisVertical\" />\n\t\t\t\t\t\t\t</MenubarTrigger>\n\t\t\t\t\t\t\t<MenubarContent>\n\t\t\t\t\t\t\t\t<MenubarItem onClick={handleCopyId}>Copy Id</MenubarItem>\n\t\t\t\t\t\t\t</MenubarContent>\n\t\t\t\t\t\t</MenubarMenu>\n\t\t\t\t\t</Menubar>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{pageHeader && (\n\t\t\t\t<div className=\"\">\n\t\t\t\t\t<Typography variant=\"h2\" className=\"my-4 font-bold prose lg:prose-xl\">\n\t\t\t\t\t\t<LazyMarkdown>{pageHeader}</LazyMarkdown>\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<hr />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nconst Header = ({ artifactKey }: ArtifactsKeyHeaderProps) => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbLink to=\"/artifacts\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t{artifactKey}\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Card } from \"@/components/ui/card\";\nimport { Typography } from \"@/components/ui/typography\";\n\nexport type ArtifactTimelineCardProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactTimelineCard = ({\n\tartifact,\n}: ArtifactTimelineCardProps) => {\n\tconst artifactTitle = useMemo(() => {\n\t\treturn artifact.id?.split(\"-\")[0];\n\t}, [artifact.id]);\n\n\treturn (\n\t\t<Card\n\t\t\tdata-testid={`timeline-card-${artifact.id}`}\n\t\t\tclassName=\"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow\"\n\t\t>\n\t\t\t<Link to=\"/artifacts/artifact/$id\" params={{ id: artifact.id ?? \"\" }}>\n\t\t\t\t<Typography\n\t\t\t\t\tvariant=\"body\"\n\t\t\t\t\tclassName=\"font-bold text-blue-700 hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{artifactTitle}\n\t\t\t\t</Typography>\n\t\t\t</Link>\n\t\t\t{artifact.flow_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tFlow run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/flow-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.flow_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t\t{artifact.task_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tTask run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/task-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.task_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t</Card>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { formatDate } from \"@/utils/date\";\nimport { ArtifactTimelineCard } from \"./timelineCard\";\n\nexport type TimelineRowProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const TimelineRow = ({ artifact }: TimelineRowProps) => {\n\tconst [date, time] = formatDate(artifact.created ?? \"\", \"dateTime\").split(\n\t\t\" at \",\n\t);\n\treturn (\n\t\t<div data-testid={`timeline-row-${artifact.id}`} className=\"flex\">\n\t\t\t<div\n\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\tstyle={{ width: \"128px\" }}\n\t\t\t>\n\t\t\t\t<Typography variant=\"body\">{time}</Typography>\n\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t{date}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"size-4 rounded-full bg-white my-5 mx-auto border-2\"\n\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% + 2px)\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"grow mt-1\">\n\t\t\t\t<ArtifactTimelineCard artifact={artifact} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TimelineRow } from \"./timelineRow\";\n\nexport type TimelineContainerProps = {\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const TimelineContainer = ({ artifacts }: TimelineContainerProps) => {\n\treturn (\n\t\t<div>\n\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t<TimelineRow key={artifact.id} artifact={artifact} />\n\t\t\t))}\n\t\t\t<div className=\"flex border-b\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\t\tstyle={{ width: \"128px\", height: \"88px\" }}\n\t\t\t\t/>\n\t\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200 pt-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center\"\n\t\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% - 6px)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"size-4 rounded-full border-2 border-black relative\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ padding: \"33px 0 0 5px\" }}>\n\t\t\t\t\t<Typography variant=\"bodyLarge\">\n\t\t\t\t\t\tCreated <span className=\"font-bold\">{artifacts[0].key}</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactsKeyHeader } from \"./artifacts-key-header\";\nimport { TimelineContainer } from \"./timeline/timelineContainer\";\n\ntype ArtifactsKeyPageProps = {\n\tartifactKey: string;\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const ArtifactsKeyPage = ({\n\tartifactKey,\n\tartifacts,\n}: ArtifactsKeyPageProps) => {\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyHeader\n\t\t\t\tartifactKey={artifactKey}\n\t\t\t\tpageHeader={artifacts[0]?.description ?? undefined}\n\t\t\t/>\n\t\t\t<TimelineContainer artifacts={artifacts} />\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { type ArtifactsFilter, buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { useFilterArtifactsFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { ArtifactsKeyPage } from \"@/components/artifacts/key/artifacts-key-page\";\n\nconst buildFilterBody = (key: string): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\tkey: {\n\t\t\tlike_: key, // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/key/$key\")({\n\tcomponent: RouteComponent,\n\tloader: async ({ context, params }) => {\n\t\tconst { key } = params;\n\n\t\tconst artifacts = await context.queryClient.ensureQueryData(\n\t\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t\t);\n\n\t\treturn { artifacts };\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst { key } = Route.useParams();\n\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t);\n\n\tconst artifactWithMetadata = useFilterArtifactsFlowTaskRuns(\n\t\tbuildFilterBody(key),\n\t);\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyPage\n\t\t\t\tartifactKey={key} // can't use \"key\" as it is a reserved word\n\t\t\t\tartifacts={artifactWithMetadata ?? artifacts}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["Menubar","className","props","jsx","MenubarPrimitive.Root","cn","MenubarMenu","MenubarPrimitive.Menu","MenubarPortal","MenubarPrimitive.Portal","MenubarTrigger","MenubarPrimitive.Trigger","MenubarContent","align","alignOffset","sideOffset","MenubarPrimitive.Content","MenubarItem","inset","variant","MenubarPrimitive.Item","ArtifactsKeyHeader","artifactKey","pageHeader","handleCopyId","useCallback","jsxs","Fragment","Header","DocsLink","Icon","Typography","LazyMarkdown","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","ArtifactTimelineCard","artifact","artifactTitle","useMemo","Card","Link","TimelineRow","date","time","formatDate","TimelineContainer","artifacts","ArtifactsKeyPage","buildFilterBody","key","operator","like_","sort","offset","RouteComponent","Route","useParams","data","useSuspenseQuery","buildListArtifactsQuery","artifactWithMetadata","useFilterArtifactsFlowTaskRuns"],"mappings":"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"}
1
+ {"version":3,"file":"key._key-CJPbLXwU.js","sources":["../../src/components/ui/menubar.tsx","../../src/components/artifacts/key/artifacts-key-header.tsx","../../src/components/artifacts/key/timeline/timelineCard.tsx","../../src/components/artifacts/key/timeline/timelineRow.tsx","../../src/components/artifacts/key/timeline/timelineContainer.tsx","../../src/components/artifacts/key/artifacts-key-page.tsx","../../src/routes/artifacts/key.$key.tsx?tsr-split=component"],"sourcesContent":["import * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Menubar({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n\treturn (\n\t\t<MenubarPrimitive.Root\n\t\t\tdata-slot=\"menubar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarMenu({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n\treturn <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nfunction MenubarGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n\treturn <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nfunction MenubarPortal({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n\treturn <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nfunction MenubarRadioGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n\t);\n}\n\nfunction MenubarTrigger({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n\treturn (\n\t\t<MenubarPrimitive.Trigger\n\t\t\tdata-slot=\"menubar-trigger\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarContent({\n\tclassName,\n\talign = \"start\",\n\talignOffset = -4,\n\tsideOffset = 8,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n\treturn (\n\t\t<MenubarPortal>\n\t\t\t<MenubarPrimitive.Content\n\t\t\t\tdata-slot=\"menubar-content\"\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</MenubarPortal>\n\t);\n}\n\nfunction MenubarItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Item\n\t\t\tdata-slot=\"menubar-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<MenubarPrimitive.CheckboxItem\n\t\t\tdata-slot=\"menubar-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.CheckboxItem>\n\t);\n}\n\nfunction MenubarRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioItem\n\t\t\tdata-slot=\"menubar-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.RadioItem>\n\t);\n}\n\nfunction MenubarLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Label\n\t\t\tdata-slot=\"menubar-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n\treturn (\n\t\t<MenubarPrimitive.Separator\n\t\t\tdata-slot=\"menubar-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"menubar-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSub({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n\treturn <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nfunction MenubarSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.SubTrigger\n\t\t\tdata-slot=\"menubar-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n\t\t</MenubarPrimitive.SubTrigger>\n\t);\n}\n\nfunction MenubarSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n\treturn (\n\t\t<MenubarPrimitive.SubContent\n\t\t\tdata-slot=\"menubar-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tMenubar,\n\tMenubarPortal,\n\tMenubarMenu,\n\tMenubarTrigger,\n\tMenubarContent,\n\tMenubarGroup,\n\tMenubarSeparator,\n\tMenubarLabel,\n\tMenubarItem,\n\tMenubarShortcut,\n\tMenubarCheckboxItem,\n\tMenubarRadioGroup,\n\tMenubarRadioItem,\n\tMenubarSub,\n\tMenubarSubTrigger,\n\tMenubarSubContent,\n};\n","import { useCallback } from \"react\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport {\n\tMenubar,\n\tMenubarContent,\n\tMenubarItem,\n\tMenubarMenu,\n\tMenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype ArtifactsKeyHeaderProps = {\n\tartifactKey: string;\n\tpageHeader?: string;\n};\n\nexport const ArtifactsKeyHeader = ({\n\tartifactKey,\n\tpageHeader,\n}: ArtifactsKeyHeaderProps) => {\n\tconst handleCopyId = useCallback(() => {\n\t\tvoid navigator.clipboard.writeText(artifactKey);\n\t}, [artifactKey]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Header artifactKey={artifactKey} />\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t\t\t{/* <Button variant=\"outline\" className=\"px-1\"><Icon id=\"EllipsisVertical\" /></Button> */}\n\t\t\t\t\t<Menubar>\n\t\t\t\t\t\t<MenubarMenu>\n\t\t\t\t\t\t\t<MenubarTrigger className=\"px-1\">\n\t\t\t\t\t\t\t\t<Icon id=\"EllipsisVertical\" />\n\t\t\t\t\t\t\t</MenubarTrigger>\n\t\t\t\t\t\t\t<MenubarContent>\n\t\t\t\t\t\t\t\t<MenubarItem onClick={handleCopyId}>Copy Id</MenubarItem>\n\t\t\t\t\t\t\t</MenubarContent>\n\t\t\t\t\t\t</MenubarMenu>\n\t\t\t\t\t</Menubar>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{pageHeader && (\n\t\t\t\t<div className=\"\">\n\t\t\t\t\t<Typography variant=\"h2\" className=\"my-4 font-bold prose lg:prose-xl\">\n\t\t\t\t\t\t<LazyMarkdown>{pageHeader}</LazyMarkdown>\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<hr />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nconst Header = ({ artifactKey }: ArtifactsKeyHeaderProps) => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbLink to=\"/artifacts\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t{artifactKey}\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Card } from \"@/components/ui/card\";\nimport { Typography } from \"@/components/ui/typography\";\n\nexport type ArtifactTimelineCardProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactTimelineCard = ({\n\tartifact,\n}: ArtifactTimelineCardProps) => {\n\tconst artifactTitle = useMemo(() => {\n\t\treturn artifact.id?.split(\"-\")[0];\n\t}, [artifact.id]);\n\n\treturn (\n\t\t<Card\n\t\t\tdata-testid={`timeline-card-${artifact.id}`}\n\t\t\tclassName=\"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow\"\n\t\t>\n\t\t\t<Link to=\"/artifacts/artifact/$id\" params={{ id: artifact.id ?? \"\" }}>\n\t\t\t\t<Typography\n\t\t\t\t\tvariant=\"body\"\n\t\t\t\t\tclassName=\"font-bold text-blue-700 hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{artifactTitle}\n\t\t\t\t</Typography>\n\t\t\t</Link>\n\t\t\t{artifact.flow_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tFlow run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/flow-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.flow_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t\t{artifact.task_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tTask run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/task-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.task_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t</Card>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { formatDate } from \"@/utils/date\";\nimport { ArtifactTimelineCard } from \"./timelineCard\";\n\nexport type TimelineRowProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const TimelineRow = ({ artifact }: TimelineRowProps) => {\n\tconst [date, time] = formatDate(artifact.created ?? \"\", \"dateTime\").split(\n\t\t\" at \",\n\t);\n\treturn (\n\t\t<div data-testid={`timeline-row-${artifact.id}`} className=\"flex\">\n\t\t\t<div\n\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\tstyle={{ width: \"128px\" }}\n\t\t\t>\n\t\t\t\t<Typography variant=\"body\">{time}</Typography>\n\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t{date}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"size-4 rounded-full bg-white my-5 mx-auto border-2\"\n\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% + 2px)\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"grow mt-1\">\n\t\t\t\t<ArtifactTimelineCard artifact={artifact} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TimelineRow } from \"./timelineRow\";\n\nexport type TimelineContainerProps = {\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const TimelineContainer = ({ artifacts }: TimelineContainerProps) => {\n\treturn (\n\t\t<div>\n\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t<TimelineRow key={artifact.id} artifact={artifact} />\n\t\t\t))}\n\t\t\t<div className=\"flex border-b\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\t\tstyle={{ width: \"128px\", height: \"88px\" }}\n\t\t\t\t/>\n\t\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200 pt-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center\"\n\t\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% - 6px)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"size-4 rounded-full border-2 border-black relative\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ padding: \"33px 0 0 5px\" }}>\n\t\t\t\t\t<Typography variant=\"bodyLarge\">\n\t\t\t\t\t\tCreated <span className=\"font-bold\">{artifacts[0].key}</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactsKeyHeader } from \"./artifacts-key-header\";\nimport { TimelineContainer } from \"./timeline/timelineContainer\";\n\ntype ArtifactsKeyPageProps = {\n\tartifactKey: string;\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const ArtifactsKeyPage = ({\n\tartifactKey,\n\tartifacts,\n}: ArtifactsKeyPageProps) => {\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyHeader\n\t\t\t\tartifactKey={artifactKey}\n\t\t\t\tpageHeader={artifacts[0]?.description ?? undefined}\n\t\t\t/>\n\t\t\t<TimelineContainer artifacts={artifacts} />\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { type ArtifactsFilter, buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { useFilterArtifactsFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { ArtifactsKeyPage } from \"@/components/artifacts/key/artifacts-key-page\";\n\nconst buildFilterBody = (key: string): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\tkey: {\n\t\t\tlike_: key, // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/key/$key\")({\n\tcomponent: RouteComponent,\n\tloader: async ({ context, params }) => {\n\t\tconst { key } = params;\n\n\t\tconst artifacts = await context.queryClient.ensureQueryData(\n\t\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t\t);\n\n\t\treturn { artifacts };\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst { key } = Route.useParams();\n\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t);\n\n\tconst artifactWithMetadata = useFilterArtifactsFlowTaskRuns(\n\t\tbuildFilterBody(key),\n\t);\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyPage\n\t\t\t\tartifactKey={key} // can't use \"key\" as it is a reserved word\n\t\t\t\tartifacts={artifactWithMetadata ?? artifacts}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["Menubar","className","props","jsx","MenubarPrimitive.Root","cn","MenubarMenu","MenubarPrimitive.Menu","MenubarPortal","MenubarPrimitive.Portal","MenubarTrigger","MenubarPrimitive.Trigger","MenubarContent","align","alignOffset","sideOffset","MenubarPrimitive.Content","MenubarItem","inset","variant","MenubarPrimitive.Item","ArtifactsKeyHeader","artifactKey","pageHeader","handleCopyId","useCallback","jsxs","Fragment","Header","DocsLink","Icon","Typography","LazyMarkdown","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","ArtifactTimelineCard","artifact","artifactTitle","useMemo","Card","Link","TimelineRow","date","time","formatDate","TimelineContainer","artifacts","ArtifactsKeyPage","buildFilterBody","key","operator","like_","sort","offset","RouteComponent","Route","useParams","data","useSuspenseQuery","buildListArtifactsQuery","artifactWithMetadata","useFilterArtifactsFlowTaskRuns"],"mappings":"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"}