prefect 3.7.7.dev1__py3-none-any.whl → 3.7.7.dev2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/server/ui-v2/assets/{artifact._id-CvC9D7wd.js → artifact._id-C4vG8kN1.js} +2 -2
  3. prefect/server/ui-v2/assets/{artifact._id-CvC9D7wd.js.map → artifact._id-C4vG8kN1.js.map} +1 -1
  4. prefect/server/ui-v2/assets/{artifacts-Dj7_GReW.js → artifacts-C94H1frM.js} +2 -2
  5. prefect/server/ui-v2/assets/{artifacts-Dj7_GReW.js.map → artifacts-C94H1frM.js.map} +1 -1
  6. prefect/server/ui-v2/assets/{automation-wizard-DcLWpov2.js → automation-wizard-DHwU3ycN.js} +2 -2
  7. prefect/server/ui-v2/assets/{automation-wizard-DcLWpov2.js.map → automation-wizard-DHwU3ycN.js.map} +1 -1
  8. prefect/server/ui-v2/assets/{automation._id-DJP3B0_R.js → automation._id-DVj5sQsY.js} +2 -2
  9. prefect/server/ui-v2/assets/{automation._id-DJP3B0_R.js.map → automation._id-DVj5sQsY.js.map} +1 -1
  10. prefect/server/ui-v2/assets/{automation_._id.edit-C3ejJMs9.js → automation_._id.edit-k_rZNDO5.js} +2 -2
  11. prefect/server/ui-v2/assets/{automation_._id.edit-C3ejJMs9.js.map → automation_._id.edit-k_rZNDO5.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automations-DTeYY2gG.js → automations-DEbtnaKI.js} +2 -2
  13. prefect/server/ui-v2/assets/{automations-DTeYY2gG.js.map → automations-DEbtnaKI.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automations-DRdhvKg1.js → automations-DXpkq-mg.js} +2 -2
  15. prefect/server/ui-v2/assets/{automations-DRdhvKg1.js.map → automations-DXpkq-mg.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{automations-header-BfH1tGDD.js → automations-header-Bnufh1Se.js} +2 -2
  17. prefect/server/ui-v2/assets/{automations-header-BfH1tGDD.js.map → automations-header-Bnufh1Se.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{automations-wizard-C5ilCMki.js → automations-wizard-DIhcWuKm.js} +2 -2
  19. prefect/server/ui-v2/assets/{automations-wizard-C5ilCMki.js.map → automations-wizard-DIhcWuKm.js.map} +1 -1
  20. prefect/server/ui-v2/assets/{base-job-template-form-section-BBsYkgl7.js → base-job-template-form-section-xk-gbxny.js} +2 -2
  21. prefect/server/ui-v2/assets/{base-job-template-form-section-BBsYkgl7.js.map → base-job-template-form-section-xk-gbxny.js.map} +1 -1
  22. prefect/server/ui-v2/assets/{block-type-details-DQGYSOH7.js → block-type-details-Dq_SyCWm.js} +2 -2
  23. prefect/server/ui-v2/assets/{block-type-details-DQGYSOH7.js.map → block-type-details-Dq_SyCWm.js.map} +1 -1
  24. prefect/server/ui-v2/assets/{block._id-JFuPWZjB.js → block._id-7jcwcanq.js} +2 -2
  25. prefect/server/ui-v2/assets/{block._id-JFuPWZjB.js.map → block._id-7jcwcanq.js.map} +1 -1
  26. prefect/server/ui-v2/assets/{block_._id.edit-CT6zF6Qt.js → block_._id.edit-CuQ59RzS.js} +2 -2
  27. prefect/server/ui-v2/assets/{block_._id.edit-CT6zF6Qt.js.map → block_._id.edit-CuQ59RzS.js.map} +1 -1
  28. prefect/server/ui-v2/assets/{blocks-Cd0m4EfT.js → blocks-D5uMj6X5.js} +2 -2
  29. prefect/server/ui-v2/assets/{blocks-Cd0m4EfT.js.map → blocks-D5uMj6X5.js.map} +1 -1
  30. prefect/server/ui-v2/assets/{catalog-yXcYknca.js → catalog-DBnpD4_R.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog-yXcYknca.js.map → catalog-DBnpD4_R.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{catalog_._slug-DEdV7aJO.js → catalog_._slug-DwC2yZo9.js} +2 -2
  33. prefect/server/ui-v2/assets/{catalog_._slug-DEdV7aJO.js.map → catalog_._slug-DwC2yZo9.js.map} +1 -1
  34. prefect/server/ui-v2/assets/{catalog_._slug_.create-Cw3bAEtW.js → catalog_._slug_.create-pWiWaBhm.js} +2 -2
  35. prefect/server/ui-v2/assets/{catalog_._slug_.create-Cw3bAEtW.js.map → catalog_._slug_.create-pWiWaBhm.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{concurrency-limit._id-D8pyKyoW.js → concurrency-limit._id-C1JAbeF7.js} +2 -2
  37. prefect/server/ui-v2/assets/{concurrency-limit._id-D8pyKyoW.js.map → concurrency-limit._id-C1JAbeF7.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{concurrency-limits-BYn4ykE4.js → concurrency-limits-CiuVe4lC.js} +2 -2
  39. prefect/server/ui-v2/assets/{concurrency-limits-BYn4ykE4.js.map → concurrency-limits-CiuVe4lC.js.map} +1 -1
  40. prefect/server/ui-v2/assets/{create-ig87nGxO.js → create-B8bILmAp.js} +2 -2
  41. prefect/server/ui-v2/assets/{create-ig87nGxO.js.map → create-B8bILmAp.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{create-CdWLmSB4.js → create-DC_F9Vc2.js} +2 -2
  43. prefect/server/ui-v2/assets/{create-CdWLmSB4.js.map → create-DC_F9Vc2.js.map} +1 -1
  44. prefect/server/ui-v2/assets/cron-input-B9vmWBhI.js +2 -0
  45. prefect/server/ui-v2/assets/cron-input-B9vmWBhI.js.map +1 -0
  46. prefect/server/ui-v2/assets/{data-table-CJI7zUp6.js → data-table-C_Co3B-8.js} +2 -2
  47. prefect/server/ui-v2/assets/{data-table-CJI7zUp6.js.map → data-table-C_Co3B-8.js.map} +1 -1
  48. prefect/server/ui-v2/assets/{data-table-DXU0vIEv.js → data-table-hPoc29Gc.js} +2 -2
  49. prefect/server/ui-v2/assets/{data-table-DXU0vIEv.js.map → data-table-hPoc29Gc.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment-form-CvSb6cqI.js → deployment-form-CrL1aiF2.js} +3 -3
  51. prefect/server/ui-v2/assets/{deployment-form-CvSb6cqI.js.map → deployment-form-CrL1aiF2.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment-links-B0jisTFF.js → deployment-links-CtiX6W-O.js} +2 -2
  53. prefect/server/ui-v2/assets/{deployment-links-B0jisTFF.js.map → deployment-links-CtiX6W-O.js.map} +1 -1
  54. prefect/server/ui-v2/assets/deployment._id-8DHzBBqN.js +2 -0
  55. prefect/server/ui-v2/assets/deployment._id-8DHzBBqN.js.map +1 -0
  56. prefect/server/ui-v2/assets/{deployment_._id.duplicate-B8e6Ya5I.js → deployment_._id.duplicate-P68wrx5d.js} +2 -2
  57. prefect/server/ui-v2/assets/{deployment_._id.duplicate-B8e6Ya5I.js.map → deployment_._id.duplicate-P68wrx5d.js.map} +1 -1
  58. prefect/server/ui-v2/assets/{deployment_._id.edit-vmboLagO.js → deployment_._id.edit-BmCwRQfG.js} +2 -2
  59. prefect/server/ui-v2/assets/{deployment_._id.edit-vmboLagO.js.map → deployment_._id.edit-BmCwRQfG.js.map} +1 -1
  60. prefect/server/ui-v2/assets/{deployment_._id.run-BOl8qa7i.js → deployment_._id.run-Bqnf9Hd8.js} +2 -2
  61. prefect/server/ui-v2/assets/{deployment_._id.run-BOl8qa7i.js.map → deployment_._id.run-Bqnf9Hd8.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{deployments-D83aOGMF.js → deployments-B5DW6oSd.js} +2 -2
  63. prefect/server/ui-v2/assets/{deployments-D83aOGMF.js.map → deployments-B5DW6oSd.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{deployments-CX5hliTs.js → deployments-vfpjs2Zu.js} +2 -2
  65. prefect/server/ui-v2/assets/{deployments-CX5hliTs.js.map → deployments-vfpjs2Zu.js.map} +1 -1
  66. prefect/server/ui-v2/assets/{event-resource-display-B02lbxEu.js → event-resource-display-Bb5tg3Sp.js} +2 -2
  67. prefect/server/ui-v2/assets/{event-resource-display-B02lbxEu.js.map → event-resource-display-Bb5tg3Sp.js.map} +1 -1
  68. prefect/server/ui-v2/assets/{event._eventDate._eventId-D5R_Tip1.js → event._eventDate._eventId-DSEdek1y.js} +2 -2
  69. prefect/server/ui-v2/assets/{event._eventDate._eventId-D5R_Tip1.js.map → event._eventDate._eventId-DSEdek1y.js.map} +1 -1
  70. prefect/server/ui-v2/assets/{events-CfHognbB.js → events-Ba2H0nXG.js} +2 -2
  71. prefect/server/ui-v2/assets/{events-CfHognbB.js.map → events-Ba2H0nXG.js.map} +1 -1
  72. prefect/server/ui-v2/assets/{events-timeline-CUfMkwNn.js → events-timeline-BcJ4EZ3S.js} +2 -2
  73. prefect/server/ui-v2/assets/{events-timeline-CUfMkwNn.js.map → events-timeline-BcJ4EZ3S.js.map} +1 -1
  74. prefect/server/ui-v2/assets/{flow-run-graph-VFelzUre.js → flow-run-graph-C7Yv3ssM.js} +2 -2
  75. prefect/server/ui-v2/assets/{flow-run-graph-VFelzUre.js.map → flow-run-graph-C7Yv3ssM.js.map} +1 -1
  76. prefect/server/ui-v2/assets/{flow-run._id-V6dh4HEr.js → flow-run._id-CuDYZEu4.js} +2 -2
  77. prefect/server/ui-v2/assets/{flow-run._id-V6dh4HEr.js.map → flow-run._id-CuDYZEu4.js.map} +1 -1
  78. prefect/server/ui-v2/assets/{flow-run._id-BPMZSc34.js → flow-run._id-MIyYC3qx.js} +3 -3
  79. prefect/server/ui-v2/assets/{flow-run._id-BPMZSc34.js.map → flow-run._id-MIyYC3qx.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{flow._id-Ya-MbB-A.js → flow._id-BRbwflJa.js} +2 -2
  81. prefect/server/ui-v2/assets/{flow._id-Ya-MbB-A.js.map → flow._id-BRbwflJa.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{flow._id-ChO0AT4g.js → flow._id-XXB9UBEF.js} +2 -2
  83. prefect/server/ui-v2/assets/{flow._id-ChO0AT4g.js.map → flow._id-XXB9UBEF.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{flows-B1pmiHy1.js → flows-GKacvQcS.js} +2 -2
  85. prefect/server/ui-v2/assets/{flows-B1pmiHy1.js.map → flows-GKacvQcS.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{header-CMall7TM.js → header-BmLqNPjl.js} +2 -2
  87. prefect/server/ui-v2/assets/{header-CMall7TM.js.map → header-BmLqNPjl.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{header-CPwmMCfV.js → header-C1Kl0PQt.js} +2 -2
  89. prefect/server/ui-v2/assets/{header-CPwmMCfV.js.map → header-C1Kl0PQt.js.map} +1 -1
  90. prefect/server/ui-v2/assets/{header-B-Jr45on.js → header-DLLIG_v_.js} +2 -2
  91. prefect/server/ui-v2/assets/{header-B-Jr45on.js.map → header-DLLIG_v_.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-Dfg8_v13.js → index-DpPA2bX1.js} +4 -4
  93. prefect/server/ui-v2/assets/{index-Dfg8_v13.js.map → index-DpPA2bX1.js.map} +1 -1
  94. prefect/server/ui-v2/assets/{json-input-g2zqyU-e.js → json-input-Ck4wcenx.js} +2 -2
  95. prefect/server/ui-v2/assets/{json-input-g2zqyU-e.js.map → json-input-Ck4wcenx.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{key._key-B8fzQQdo.js → key._key-DZrY5Jq5.js} +2 -2
  97. prefect/server/ui-v2/assets/{key._key-B8fzQQdo.js.map → key._key-DZrY5Jq5.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{lazy-markdown-CPeCBpJW.js → lazy-markdown-CCDNtAxT.js} +2 -2
  99. prefect/server/ui-v2/assets/{lazy-markdown-CPeCBpJW.js.map → lazy-markdown-CCDNtAxT.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{login-BcRA2EHI.js → login-BeT_TSuo.js} +2 -2
  101. prefect/server/ui-v2/assets/{login-BcRA2EHI.js.map → login-BeT_TSuo.js.map} +1 -1
  102. prefect/server/ui-v2/assets/{markdown-input-CFB0YIcS.js → markdown-input-4x3dDfbx.js} +2 -2
  103. prefect/server/ui-v2/assets/{markdown-input-CFB0YIcS.js.map → markdown-input-4x3dDfbx.js.map} +1 -1
  104. prefect/server/ui-v2/assets/{python-example-snippet-CpPSBbSu.js → python-example-snippet-BxNh5JeI.js} +3 -3
  105. prefect/server/ui-v2/assets/{python-example-snippet-CpPSBbSu.js.map → python-example-snippet-BxNh5JeI.js.map} +1 -1
  106. prefect/server/ui-v2/assets/{python-input-B0w_ZBn8.js → python-input-WU0VDfRW.js} +2 -2
  107. prefect/server/ui-v2/assets/{python-input-B0w_ZBn8.js.map → python-input-WU0VDfRW.js.map} +1 -1
  108. prefect/server/ui-v2/assets/{runs-ChXa7yZa.js → runs-BJ5vg2mD.js} +2 -2
  109. prefect/server/ui-v2/assets/{runs-ChXa7yZa.js.map → runs-BJ5vg2mD.js.map} +1 -1
  110. prefect/server/ui-v2/assets/{runs-IavZO_6E.js → runs-CDLtNNwI.js} +2 -2
  111. prefect/server/ui-v2/assets/{runs-IavZO_6E.js.map → runs-CDLtNNwI.js.map} +1 -1
  112. prefect/server/ui-v2/assets/schedule-badge-CMgyQe0S.js +2 -0
  113. prefect/server/ui-v2/assets/schedule-badge-CMgyQe0S.js.map +1 -0
  114. prefect/server/ui-v2/assets/{schema-form-BJNJST-o.js → schema-form-Dj8aocnY.js} +2 -2
  115. prefect/server/ui-v2/assets/{schema-form-BJNJST-o.js.map → schema-form-Dj8aocnY.js.map} +1 -1
  116. prefect/server/ui-v2/assets/{settings-Cz1mG0GQ.js → settings-DnjyoScP.js} +2 -2
  117. prefect/server/ui-v2/assets/{settings-Cz1mG0GQ.js.map → settings-DnjyoScP.js.map} +1 -1
  118. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-DZnKL-7A.js → task-run-concurrency-limits-reset-dialog-C9Cd2k_x.js} +2 -2
  119. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-DZnKL-7A.js.map → task-run-concurrency-limits-reset-dialog-C9Cd2k_x.js.map} +1 -1
  120. prefect/server/ui-v2/assets/{task-run._id-CpSER9zt.js → task-run._id-Bh4SxXPB.js} +2 -2
  121. prefect/server/ui-v2/assets/{task-run._id-CpSER9zt.js.map → task-run._id-Bh4SxXPB.js.map} +1 -1
  122. prefect/server/ui-v2/assets/{timezone-select-Bi-WOpCS.js → timezone-select-C5FfG9pp.js} +2 -2
  123. prefect/server/ui-v2/assets/{timezone-select-Bi-WOpCS.js.map → timezone-select-C5FfG9pp.js.map} +1 -1
  124. prefect/server/ui-v2/assets/{toggle-group-DB15HEhM.js → toggle-group-_u3r2CNw.js} +2 -2
  125. prefect/server/ui-v2/assets/{toggle-group-DB15HEhM.js.map → toggle-group-_u3r2CNw.js.map} +1 -1
  126. prefect/server/ui-v2/assets/{trigger-details-BRf3bDuk.js → trigger-details-CHNjlEuw.js} +2 -2
  127. prefect/server/ui-v2/assets/{trigger-details-BRf3bDuk.js.map → trigger-details-CHNjlEuw.js.map} +1 -1
  128. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-wir-0ubo.js → use-delete-automation-confirmation-dialog-BughSutx.js} +2 -2
  129. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-wir-0ubo.js.map → use-delete-automation-confirmation-dialog-BughSutx.js.map} +1 -1
  130. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DPKgdtpw.js → use-delete-block-document-confirmation-dialog-CKHqokBH.js} +2 -2
  131. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DPKgdtpw.js.map → use-delete-block-document-confirmation-dialog-CKHqokBH.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{use-delete-deployment-confirmation-dialog-B_AJiTmZ.js → use-delete-deployment-confirmation-dialog-C3ycZNgq.js} +2 -2
  133. prefect/server/ui-v2/assets/{use-delete-deployment-confirmation-dialog-B_AJiTmZ.js.map → use-delete-deployment-confirmation-dialog-C3ycZNgq.js.map} +1 -1
  134. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DQ51zDlU.js → use-get-artifacts-flow-task-runs-DhfQBVCF.js} +2 -2
  135. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DQ51zDlU.js.map → use-get-artifacts-flow-task-runs-DhfQBVCF.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{use-page-size-preference-C0q3FINA.js → use-page-size-preference-h2fMa3uB.js} +2 -2
  137. prefect/server/ui-v2/assets/{use-page-size-preference-C0q3FINA.js.map → use-page-size-preference-h2fMa3uB.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{use-resource-options-m2pSGdd2.js → use-resource-options-D89EKwub.js} +2 -2
  139. prefect/server/ui-v2/assets/{use-resource-options-m2pSGdd2.js.map → use-resource-options-D89EKwub.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{variables-Df9Q-dLJ.js → variables-CNffa7fL.js} +2 -2
  141. prefect/server/ui-v2/assets/{variables-Df9Q-dLJ.js.map → variables-CNffa7fL.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{variables-D-TjMKiJ.js → variables-CuEJhTIi.js} +2 -2
  143. prefect/server/ui-v2/assets/{variables-D-TjMKiJ.js.map → variables-CuEJhTIi.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{work-pool-queue-form-BEpAZWIp.js → work-pool-queue-form-D2p9bV5H.js} +2 -2
  145. prefect/server/ui-v2/assets/{work-pool-queue-form-BEpAZWIp.js.map → work-pool-queue-form-D2p9bV5H.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{work-pool-queue-toggle-CBfscGJp.js → work-pool-queue-toggle-mpNXNH8j.js} +2 -2
  147. prefect/server/ui-v2/assets/{work-pool-queue-toggle-CBfscGJp.js.map → work-pool-queue-toggle-mpNXNH8j.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{work-pool._workPoolName-DCXgpSCe.js → work-pool._workPoolName-yitWW_tk.js} +2 -2
  149. prefect/server/ui-v2/assets/{work-pool._workPoolName-DCXgpSCe.js.map → work-pool._workPoolName-yitWW_tk.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-BIa1sOkh.js → work-pool_._workPoolName.edit-D0nx4Eah.js} +2 -2
  151. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-BIa1sOkh.js.map → work-pool_._workPoolName.edit-D0nx4Eah.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-Dh2u5Y0o.js → work-pool_._workPoolName.queue._workQueueName-DBjFQl5l.js} +2 -2
  153. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-Dh2u5Y0o.js.map → work-pool_._workPoolName.queue._workQueueName-DBjFQl5l.js.map} +1 -1
  154. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-qOdBvgyE.js → work-pool_._workPoolName.queue.create-D66B3TgZ.js} +2 -2
  155. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-qOdBvgyE.js.map → work-pool_._workPoolName.queue.create-D66B3TgZ.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-BgZl6_uT.js → work-pool_._workPoolName.queue_._workQueueName.edit-BhfkkDyJ.js} +2 -2
  157. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-BgZl6_uT.js.map → work-pool_._workPoolName.queue_._workQueueName.edit-BhfkkDyJ.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{work-pools-Bq2vZmNj.js → work-pools-CGC3mSny.js} +2 -2
  159. prefect/server/ui-v2/assets/{work-pools-Bq2vZmNj.js.map → work-pools-CGC3mSny.js.map} +1 -1
  160. prefect/server/ui-v2/assets/{work-pools-CWXqZi1F.js → work-pools-CfA9RMA9.js} +2 -2
  161. prefect/server/ui-v2/assets/{work-pools-CWXqZi1F.js.map → work-pools-CfA9RMA9.js.map} +1 -1
  162. prefect/server/ui-v2/assets/{work-queue-icon-text-DLn6cbFo.js → work-queue-icon-text-9KRWnE0A.js} +2 -2
  163. prefect/server/ui-v2/assets/{work-queue-icon-text-DLn6cbFo.js.map → work-queue-icon-text-9KRWnE0A.js.map} +1 -1
  164. prefect/server/ui-v2/assets/{work-queue-select-DAzbmdf7.js → work-queue-select-CLtC0i-b.js} +2 -2
  165. prefect/server/ui-v2/assets/{work-queue-select-DAzbmdf7.js.map → work-queue-select-CLtC0i-b.js.map} +1 -1
  166. prefect/server/ui-v2/index.html +1 -1
  167. {prefect-3.7.7.dev1.dist-info → prefect-3.7.7.dev2.dist-info}/METADATA +1 -1
  168. {prefect-3.7.7.dev1.dist-info → prefect-3.7.7.dev2.dist-info}/RECORD +171 -169
  169. prefect/server/ui-v2/assets/deployment._id-BSE3AI6Y.js +0 -2
  170. prefect/server/ui-v2/assets/deployment._id-BSE3AI6Y.js.map +0 -1
  171. prefect/server/ui-v2/assets/schedule-badge-D8UB32Kt.js +0 -2
  172. prefect/server/ui-v2/assets/schedule-badge-D8UB32Kt.js.map +0 -1
  173. {prefect-3.7.7.dev1.dist-info → prefect-3.7.7.dev2.dist-info}/WHEEL +0 -0
  174. {prefect-3.7.7.dev1.dist-info → prefect-3.7.7.dev2.dist-info}/entry_points.txt +0 -0
  175. {prefect-3.7.7.dev1.dist-info → prefect-3.7.7.dev2.dist-info}/licenses/LICENSE +0 -0
prefect/_build_info.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Generated by versioningit
2
- __version__ = "3.7.7.dev1"
3
- __build_date__ = "2026-06-30 09:16:04.447526+00:00"
4
- __git_commit__ = "5bbc9f513a41a6666809839555361663a8f0383b"
2
+ __version__ = "3.7.7.dev2"
3
+ __build_date__ = "2026-07-02 09:11:30.092077+00:00"
4
+ __git_commit__ = "ab6a0dc6d01900814612a11dc41d0d80c9549112"
5
5
  __dirty__ = False
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,o as n,r,s as i}from"./vendor-codemirror-Bs7Yv0L9.js";import{_ as a,a as o,g as s,i as c,j as l,o as u,r as d}from"./vendor-tanstack-CghpeqA9.js";import{g as f,h as p,t as m,u as h}from"./button-D1nS4G4b.js";import{n as g}from"./dist-BWGcVrLy.js";import{n as _}from"./input-BaSLpSlc.js";import{t as v}from"./tag-badge-DTVaiChx.js";import{Ar as y,Dr as b,Er as x,K as S,Kr as C,Ln as w,Or as T,Tr as E,cr as D,ir as O,jr as k,lr as A,m as j,or as M,sr as N}from"./index-Dfg8_v13.js";import{t as P}from"./key-value-C2vDi3xo.js";import{n as F}from"./use-get-artifacts-flow-task-runs-DQ51zDlU.js";import{t as I}from"./lazy-markdown-CPeCBpJW.js";import{t as L}from"./data-table-CJI7zUp6.js";var R=e(i(),1),z=n(),B=({artifact:e})=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[e.key?(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-xl font-semibold truncate block`,title:e.key,children:e.key})}),(0,z.jsx)(y,{}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}):(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[e.flow_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/flow-run/$id`,params:{id:e.flow_run_id??``},className:`text-xl font-semibold truncate block`,title:e.flow_run.name,children:e.flow_run.name})}),(0,z.jsx)(y,{})]}),e.task_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/task-run/$id`,params:{id:e.task_run_id??``},className:`text-xl font-semibold truncate block`,title:e.task_run.name,children:e.task_run.name})}),(0,z.jsx)(y,{})]}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}),(0,z.jsx)(O,{id:`artifacts-guide`,label:`Documentation`})]}),e.description&&(0,z.jsx)(`div`,{className:`text-sm text-muted-foreground my-2`,children:(0,z.jsx)(I,{children:e.description})}),(0,z.jsx)(`hr`,{})]}),V=({artifact:e})=>{let[n,i]=(0,R.useState)(!1),a=()=>{i(e=>!e)},o=(0,R.useRef)(null),{resolvedTheme:s}=C(),{setContainer:c}=r({container:o.current,extensions:[t.lineWrapping],value:String(e.data),indentWithTab:!1,editable:!0,basicSetup:{highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1},theme:s===`dark`?`dark`:`light`});(0,R.useEffect)(()=>{o.current&&c(o.current)},[c]);let l=e=>{g.success(`Copied to clipboard`),navigator.clipboard.writeText(e)};return(0,z.jsxs)(`div`,{className:`flex flex-col justify-center items-center`,children:[(0,z.jsxs)(m,{"data-testid":`show-raw-data-button`,variant:`outline`,onClick:a,className:`my-4`,children:[n?`Hide`:`Show`,` Raw Data`]}),(0,z.jsx)(`div`,{className:`rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative`,style:{display:n?`block`:`none`},ref:e=>{o.current=e},"data-testid":`raw-data-display`,children:(0,z.jsx)(m,{onClick:()=>l(e.data),variant:`ghost`,size:`icon`,className:`absolute top-0 right-0 z-10`,"aria-label":`copy`,children:(0,z.jsx)(f,{id:`Copy`,className:`size-2`})})})]})},ee=s(`/artifacts/artifact/$id`),H=({artifact:e,artifactContent:t,detailsContent:n})=>{let{tab:r}=ee.useSearch(),i=U(e,t,n);return(0,z.jsxs)(M,{defaultValue:`Artifact`,value:r,children:[(0,z.jsx)(D,{children:i.map(({value:e,hiddenOnDesktop:t,LinkComponent:n})=>(0,z.jsx)(n,{className:p(t&&`lg:hidden`)},e))}),i.map(({value:e,ViewComponent:t})=>(0,z.jsx)(t,{},e))]})};function U(e,t,n){return(0,R.useMemo)(()=>{let r=[];return r.push({value:`Artifact`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Artifact`},children:(0,z.jsx)(A,{value:`Artifact`,className:e,children:`Artifact`})}),ViewComponent:()=>(0,z.jsxs)(N,{value:`Artifact`,children:[t,(0,z.jsx)(V,{artifact:e})]})}),r.push({value:`Details`,hiddenOnDesktop:!0,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Details`},children:(0,z.jsx)(A,{value:`Details`,className:e,children:`Details`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Details`,children:n})}),r.push({value:`Raw`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Raw`},children:(0,z.jsx)(A,{value:`Raw`,className:e,children:`Raw`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Raw`,children:(0,z.jsx)(W,{artifact:e})})}),r},[e,t,n])}function W({artifact:e}){return(0,z.jsx)(`pre`,{className:`whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm`,children:typeof e.data==`string`?e.data:JSON.stringify(e.data,null,2)})}var G=({url:e})=>(0,z.jsxs)(`div`,{"data-testid":e,className:`prose dark:prose-invert mt-2`,children:[(0,z.jsx)(`img`,{"data-testid":`image-${e}`,src:e,alt:`artifact-image`,className:`w-full`}),(0,z.jsxs)(`p`,{className:`text-lg`,children:[`Image URL:`,` `,(0,z.jsx)(`a`,{className:`text-link hover:text-link-hover hover:underline`,target:`_blank`,href:e,rel:`noreferrer`,children:e})]})]}),K=({markdown:e})=>(0,z.jsx)(`div`,{"data-testid":`markdown-display`,className:`mt-4 prose dark:prose-invert`,children:(0,z.jsx)(I,{children:e})}),q=({progress:e})=>(0,z.jsxs)(`p`,{"data-testid":`progress-display`,className:`text-lg`,children:[`Progress: `,e,`%`]}),J=c(),Y=({tableData:e})=>{let t=(0,R.useMemo)(()=>JSON.parse(e),[e]),n=(0,R.useMemo)(()=>Object.keys(t[0]??{}),[t]),[r,i]=(0,R.useState)(``),a=(0,R.useMemo)(()=>n.map(e=>J.display({id:e,header:()=>e,cell:({row:t})=>{let n=String(t.original[e]??``);return(0,z.jsx)(`span`,{className:`truncate block`,title:n,children:n})}})),[n]),s=d({data:(0,R.useMemo)(()=>r?t.filter(e=>Object.values(e).some(e=>String(e).toLowerCase().includes(r.toLowerCase()))):t,[r,t]),columns:a,getCoreRowModel:o(),getPaginationRowModel:u(),initialState:{pagination:{pageIndex:0,pageSize:10}}});return(0,z.jsxs)(`div`,{"data-testid":`table-display`,className:`mt-4`,children:[(0,z.jsx)(`div`,{className:`flex flex-row justify-end items-center mb-2`,children:(0,z.jsx)(_,{placeholder:`Search`,value:r,onChange:e=>i(e.target.value)})}),(0,z.jsx)(L,{table:s})]})},X=({artifact:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-base font-semibold`,children:`Artifact`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Key`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.key??`None`})}),(0,z.jsx)(P,{label:`Type`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.type??`None`})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{children:t??`None`})})]})]})},Z=e(k(),1),Q=({flowRun:e})=>{let t=(0,R.useMemo)(()=>e.start_time?h(e.start_time,`dateTime`):null,[e.start_time]),n=(0,R.useMemo)(()=>e.estimated_run_time?(0,Z.default)(Math.ceil(e.estimated_run_time)*1e3):null,[e.estimated_run_time]),r=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),i=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Flow Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Start time`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Calendar`,className:`inline w-4 mr-2`}),t??`None`]})}),(0,z.jsx)(P,{label:`Duration`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Clock`,className:`inline w-4 mr-2`}),n??`None`]})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:r??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:i??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})}),(0,z.jsx)(P,{label:`State Message`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.state?.message??`None`})})]})]})},$=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return e.key||t||n?(0,z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[e.key&&(0,z.jsx)(P,{label:`Artifact`,value:(0,z.jsx)(a,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-link hover:text-link-hover hover:underline`,children:e.key})}),t&&(0,z.jsx)(P,{label:`Flow Run`,value:(0,z.jsx)(a,{to:`/runs/flow-run/$id`,params:{id:t.id},className:`text-link hover:text-link-hover hover:underline`,children:t.name})}),n&&(0,z.jsx)(P,{label:`Task Run`,value:(0,z.jsx)(a,{to:`/runs/task-run/$id`,params:{id:n.id},className:`text-link hover:text-link-hover hover:underline`,children:n.name})}),(0,z.jsx)(`hr`,{className:`mt-2 border-border`})]}):null},te=({taskRun:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),n=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Task Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:t??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:n??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})})]})]})},ne=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4 pt-4`,children:[(0,z.jsx)($,{artifact:e}),(0,z.jsx)(X,{artifact:e}),(t||n)&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),t&&(0,z.jsx)(Q,{flowRun:t}),t&&n&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),n&&(0,z.jsx)(te,{taskRun:n})]})},re=({artifact:e})=>{let t=(0,R.useMemo)(()=>{switch(e.type){case`markdown`:case`link`:return(0,z.jsx)(K,{markdown:e.data});case`image`:return(0,z.jsx)(G,{url:e.data});case`progress`:return(0,z.jsx)(q,{progress:e.data});case`table`:return(0,z.jsx)(Y,{tableData:e.data});default:return(0,z.jsx)(`pre`,{children:JSON.stringify(e.data,null,2)})}},[e]),n=(0,z.jsx)(ne,{artifact:e});return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,z.jsx)(B,{artifact:e}),(0,z.jsxs)(`div`,{className:`flex flex-col lg:flex-row lg:gap-6`,children:[(0,z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,z.jsx)(H,{artifact:e,artifactContent:t,detailsContent:n})}),(0,z.jsx)(w,{children:n})]})]})},ie=function(){let{id:e}=j.useParams(),{data:t}=l(S(e));return(0,z.jsx)(re,{artifact:F(e)??t})};export{ie as component};
2
- //# sourceMappingURL=artifact._id-CvC9D7wd.js.map
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,o as n,r,s as i}from"./vendor-codemirror-Bs7Yv0L9.js";import{_ as a,a as o,g as s,i as c,j as l,o as u,r as d}from"./vendor-tanstack-CghpeqA9.js";import{g as f,h as p,t as m,u as h}from"./button-D1nS4G4b.js";import{n as g}from"./dist-BWGcVrLy.js";import{n as _}from"./input-BaSLpSlc.js";import{t as v}from"./tag-badge-DTVaiChx.js";import{Ar as y,Dr as b,Er as x,K as S,Kr as C,Ln as w,Or as T,Tr as E,cr as D,ir as O,jr as k,lr as A,m as j,or as M,sr as N}from"./index-DpPA2bX1.js";import{t as P}from"./key-value-C2vDi3xo.js";import{n as F}from"./use-get-artifacts-flow-task-runs-DhfQBVCF.js";import{t as I}from"./lazy-markdown-CCDNtAxT.js";import{t as L}from"./data-table-C_Co3B-8.js";var R=e(i(),1),z=n(),B=({artifact:e})=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[e.key?(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-xl font-semibold truncate block`,title:e.key,children:e.key})}),(0,z.jsx)(y,{}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}):(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[e.flow_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/flow-run/$id`,params:{id:e.flow_run_id??``},className:`text-xl font-semibold truncate block`,title:e.flow_run.name,children:e.flow_run.name})}),(0,z.jsx)(y,{})]}),e.task_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/task-run/$id`,params:{id:e.task_run_id??``},className:`text-xl font-semibold truncate block`,title:e.task_run.name,children:e.task_run.name})}),(0,z.jsx)(y,{})]}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}),(0,z.jsx)(O,{id:`artifacts-guide`,label:`Documentation`})]}),e.description&&(0,z.jsx)(`div`,{className:`text-sm text-muted-foreground my-2`,children:(0,z.jsx)(I,{children:e.description})}),(0,z.jsx)(`hr`,{})]}),V=({artifact:e})=>{let[n,i]=(0,R.useState)(!1),a=()=>{i(e=>!e)},o=(0,R.useRef)(null),{resolvedTheme:s}=C(),{setContainer:c}=r({container:o.current,extensions:[t.lineWrapping],value:String(e.data),indentWithTab:!1,editable:!0,basicSetup:{highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1},theme:s===`dark`?`dark`:`light`});(0,R.useEffect)(()=>{o.current&&c(o.current)},[c]);let l=e=>{g.success(`Copied to clipboard`),navigator.clipboard.writeText(e)};return(0,z.jsxs)(`div`,{className:`flex flex-col justify-center items-center`,children:[(0,z.jsxs)(m,{"data-testid":`show-raw-data-button`,variant:`outline`,onClick:a,className:`my-4`,children:[n?`Hide`:`Show`,` Raw Data`]}),(0,z.jsx)(`div`,{className:`rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative`,style:{display:n?`block`:`none`},ref:e=>{o.current=e},"data-testid":`raw-data-display`,children:(0,z.jsx)(m,{onClick:()=>l(e.data),variant:`ghost`,size:`icon`,className:`absolute top-0 right-0 z-10`,"aria-label":`copy`,children:(0,z.jsx)(f,{id:`Copy`,className:`size-2`})})})]})},ee=s(`/artifacts/artifact/$id`),H=({artifact:e,artifactContent:t,detailsContent:n})=>{let{tab:r}=ee.useSearch(),i=U(e,t,n);return(0,z.jsxs)(M,{defaultValue:`Artifact`,value:r,children:[(0,z.jsx)(D,{children:i.map(({value:e,hiddenOnDesktop:t,LinkComponent:n})=>(0,z.jsx)(n,{className:p(t&&`lg:hidden`)},e))}),i.map(({value:e,ViewComponent:t})=>(0,z.jsx)(t,{},e))]})};function U(e,t,n){return(0,R.useMemo)(()=>{let r=[];return r.push({value:`Artifact`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Artifact`},children:(0,z.jsx)(A,{value:`Artifact`,className:e,children:`Artifact`})}),ViewComponent:()=>(0,z.jsxs)(N,{value:`Artifact`,children:[t,(0,z.jsx)(V,{artifact:e})]})}),r.push({value:`Details`,hiddenOnDesktop:!0,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Details`},children:(0,z.jsx)(A,{value:`Details`,className:e,children:`Details`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Details`,children:n})}),r.push({value:`Raw`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Raw`},children:(0,z.jsx)(A,{value:`Raw`,className:e,children:`Raw`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Raw`,children:(0,z.jsx)(W,{artifact:e})})}),r},[e,t,n])}function W({artifact:e}){return(0,z.jsx)(`pre`,{className:`whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm`,children:typeof e.data==`string`?e.data:JSON.stringify(e.data,null,2)})}var G=({url:e})=>(0,z.jsxs)(`div`,{"data-testid":e,className:`prose dark:prose-invert mt-2`,children:[(0,z.jsx)(`img`,{"data-testid":`image-${e}`,src:e,alt:`artifact-image`,className:`w-full`}),(0,z.jsxs)(`p`,{className:`text-lg`,children:[`Image URL:`,` `,(0,z.jsx)(`a`,{className:`text-link hover:text-link-hover hover:underline`,target:`_blank`,href:e,rel:`noreferrer`,children:e})]})]}),K=({markdown:e})=>(0,z.jsx)(`div`,{"data-testid":`markdown-display`,className:`mt-4 prose dark:prose-invert`,children:(0,z.jsx)(I,{children:e})}),q=({progress:e})=>(0,z.jsxs)(`p`,{"data-testid":`progress-display`,className:`text-lg`,children:[`Progress: `,e,`%`]}),J=c(),Y=({tableData:e})=>{let t=(0,R.useMemo)(()=>JSON.parse(e),[e]),n=(0,R.useMemo)(()=>Object.keys(t[0]??{}),[t]),[r,i]=(0,R.useState)(``),a=(0,R.useMemo)(()=>n.map(e=>J.display({id:e,header:()=>e,cell:({row:t})=>{let n=String(t.original[e]??``);return(0,z.jsx)(`span`,{className:`truncate block`,title:n,children:n})}})),[n]),s=d({data:(0,R.useMemo)(()=>r?t.filter(e=>Object.values(e).some(e=>String(e).toLowerCase().includes(r.toLowerCase()))):t,[r,t]),columns:a,getCoreRowModel:o(),getPaginationRowModel:u(),initialState:{pagination:{pageIndex:0,pageSize:10}}});return(0,z.jsxs)(`div`,{"data-testid":`table-display`,className:`mt-4`,children:[(0,z.jsx)(`div`,{className:`flex flex-row justify-end items-center mb-2`,children:(0,z.jsx)(_,{placeholder:`Search`,value:r,onChange:e=>i(e.target.value)})}),(0,z.jsx)(L,{table:s})]})},X=({artifact:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-base font-semibold`,children:`Artifact`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Key`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.key??`None`})}),(0,z.jsx)(P,{label:`Type`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.type??`None`})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{children:t??`None`})})]})]})},Z=e(k(),1),Q=({flowRun:e})=>{let t=(0,R.useMemo)(()=>e.start_time?h(e.start_time,`dateTime`):null,[e.start_time]),n=(0,R.useMemo)(()=>e.estimated_run_time?(0,Z.default)(Math.ceil(e.estimated_run_time)*1e3):null,[e.estimated_run_time]),r=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),i=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Flow Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Start time`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Calendar`,className:`inline w-4 mr-2`}),t??`None`]})}),(0,z.jsx)(P,{label:`Duration`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Clock`,className:`inline w-4 mr-2`}),n??`None`]})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:r??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:i??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})}),(0,z.jsx)(P,{label:`State Message`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.state?.message??`None`})})]})]})},$=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return e.key||t||n?(0,z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[e.key&&(0,z.jsx)(P,{label:`Artifact`,value:(0,z.jsx)(a,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-link hover:text-link-hover hover:underline`,children:e.key})}),t&&(0,z.jsx)(P,{label:`Flow Run`,value:(0,z.jsx)(a,{to:`/runs/flow-run/$id`,params:{id:t.id},className:`text-link hover:text-link-hover hover:underline`,children:t.name})}),n&&(0,z.jsx)(P,{label:`Task Run`,value:(0,z.jsx)(a,{to:`/runs/task-run/$id`,params:{id:n.id},className:`text-link hover:text-link-hover hover:underline`,children:n.name})}),(0,z.jsx)(`hr`,{className:`mt-2 border-border`})]}):null},te=({taskRun:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),n=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Task Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:t??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:n??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})})]})]})},ne=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4 pt-4`,children:[(0,z.jsx)($,{artifact:e}),(0,z.jsx)(X,{artifact:e}),(t||n)&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),t&&(0,z.jsx)(Q,{flowRun:t}),t&&n&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),n&&(0,z.jsx)(te,{taskRun:n})]})},re=({artifact:e})=>{let t=(0,R.useMemo)(()=>{switch(e.type){case`markdown`:case`link`:return(0,z.jsx)(K,{markdown:e.data});case`image`:return(0,z.jsx)(G,{url:e.data});case`progress`:return(0,z.jsx)(q,{progress:e.data});case`table`:return(0,z.jsx)(Y,{tableData:e.data});default:return(0,z.jsx)(`pre`,{children:JSON.stringify(e.data,null,2)})}},[e]),n=(0,z.jsx)(ne,{artifact:e});return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,z.jsx)(B,{artifact:e}),(0,z.jsxs)(`div`,{className:`flex flex-col lg:flex-row lg:gap-6`,children:[(0,z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,z.jsx)(H,{artifact:e,artifactContent:t,detailsContent:n})}),(0,z.jsx)(w,{children:n})]})]})},ie=function(){let{id:e}=j.useParams(),{data:t}=l(S(e));return(0,z.jsx)(re,{artifact:F(e)??t})};export{ie as component};
2
+ //# sourceMappingURL=artifact._id-C4vG8kN1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact._id-CvC9D7wd.js","names":["useSuspenseQuery","buildGetArtifactQuery","useGetArtifactFlowTaskRuns","ArtifactDetailPage","Route","SplitComponent","RouteComponent","id","useParams","data","artifact","artifactWithMetadata","component"],"sources":["../../src/components/artifacts/artifact/artifact-detail-header.tsx","../../src/components/artifacts/artifact/artifact-raw-data-display.tsx","../../src/components/artifacts/artifact/artifact-detail-tabs.tsx","../../src/components/artifacts/artifact/detail-image.tsx","../../src/components/artifacts/artifact/detail-markdown.tsx","../../src/components/artifacts/artifact/detail-progress.tsx","../../src/components/artifacts/artifact/detail-table.tsx","../../src/components/artifacts/artifact/metadata-sidebar/artifact-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/flow-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/links-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/task-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/index.tsx","../../src/components/artifacts/artifact/artifact-detail-page.tsx","../../src/routes/artifacts/artifact.$id.tsx?tsr-split=component"],"sourcesContent":["import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type ArtifactDetailHeaderProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailHeader = ({\n\tartifact,\n}: ArtifactDetailHeaderProps) => {\n\tconst header = artifact.key ? (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\ttitle={artifact.key}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t) : (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t{artifact.flow_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.flow_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.flow_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{artifact.task_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.task_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.task_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{header}\n\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t</div>\n\t\t\t{artifact.description && (\n\t\t\t\t<div className=\"text-sm text-muted-foreground my-2\">\n\t\t\t\t\t<LazyMarkdown>{artifact.description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<hr />\n\t\t</>\n\t);\n};\n","import { EditorView, useCodeMirror } from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype ArtifactDataDisplayProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDataDisplay = ({ artifact }: ArtifactDataDisplayProps) => {\n\tconst [showData, setShowData] = useState(false);\n\n\tconst toggleShowData = () => {\n\t\tsetShowData((val) => !val);\n\t};\n\n\tconst editor = useRef<HTMLDivElement | null>(null);\n\tconst { resolvedTheme } = useTheme();\n\tconst basicSetup = {\n\t\thighlightActiveLine: false,\n\t\tfoldGutter: false,\n\t\thighlightActiveLineGutter: false,\n\t};\n\tconst { setContainer } = useCodeMirror({\n\t\tcontainer: editor.current,\n\t\textensions: [EditorView.lineWrapping],\n\t\tvalue: String(artifact.data),\n\t\tindentWithTab: false,\n\t\teditable: true,\n\t\tbasicSetup,\n\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t});\n\n\tuseEffect(() => {\n\t\tif (editor.current) {\n\t\t\tsetContainer(editor.current);\n\t\t}\n\t}, [setContainer]);\n\n\tconst handleCopy = (_value: string) => {\n\t\ttoast.success(\"Copied to clipboard\");\n\t\tvoid navigator.clipboard.writeText(_value);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col justify-center items-center\">\n\t\t\t<Button\n\t\t\t\tdata-testid=\"show-raw-data-button\"\n\t\t\t\tvariant={\"outline\"}\n\t\t\t\tonClick={toggleShowData}\n\t\t\t\tclassName=\"my-4\"\n\t\t\t>\n\t\t\t\t{showData ? \"Hide\" : \"Show\"} Raw Data\n\t\t\t</Button>\n\n\t\t\t<div\n\t\t\t\tclassName=\"rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\"\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: showData ? \"block\" : \"none\",\n\t\t\t\t}}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t}}\n\t\t\t\tdata-testid=\"raw-data-display\"\n\t\t\t>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => handleCopy(artifact.data as string)}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { getRouteApi, Link } from \"@tanstack/react-router\";\nimport { type JSX, type ReactNode, useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { ArtifactDetailTabOptions } from \"@/routes/artifacts/artifact.$id\";\nimport { cn } from \"@/utils\";\n\nimport { ArtifactDataDisplay } from \"./artifact-raw-data-display\";\n\nconst routeApi = getRouteApi(\"/artifacts/artifact/$id\");\n\ntype TabOption = {\n\tvalue: ArtifactDetailTabOptions;\n\thiddenOnDesktop?: boolean;\n\tLinkComponent: (props: { className?: string }) => JSX.Element;\n\tViewComponent: () => JSX.Element;\n};\n\ntype ArtifactDetailTabsProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n\tartifactContent: ReactNode;\n\tdetailsContent: ReactNode;\n};\n\nexport const ArtifactDetailTabs = ({\n\tartifact,\n\tartifactContent,\n\tdetailsContent,\n}: ArtifactDetailTabsProps) => {\n\tconst { tab } = routeApi.useSearch();\n\n\tconst tabOptions = useBuildTabOptions(\n\t\tartifact,\n\t\tartifactContent,\n\t\tdetailsContent,\n\t);\n\n\treturn (\n\t\t<Tabs defaultValue=\"Artifact\" value={tab}>\n\t\t\t<TabsList>\n\t\t\t\t{tabOptions.map(({ value, hiddenOnDesktop, LinkComponent }) => (\n\t\t\t\t\t<LinkComponent\n\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\tclassName={cn(hiddenOnDesktop && \"lg:hidden\")}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</TabsList>\n\t\t\t{tabOptions.map(({ value, ViewComponent }) => (\n\t\t\t\t<ViewComponent key={value} />\n\t\t\t))}\n\t\t</Tabs>\n\t);\n};\n\nfunction useBuildTabOptions(\n\tartifact: ArtifactWithFlowRunAndTaskRun,\n\tartifactContent: ReactNode,\n\tdetailsContent: ReactNode,\n): Array<TabOption> {\n\treturn useMemo(() => {\n\t\tconst tabs: Array<TabOption> = [];\n\n\t\ttabs.push({\n\t\t\tvalue: \"Artifact\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Artifact\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Artifact\" className={className}>\n\t\t\t\t\t\tArtifact\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Artifact\">\n\t\t\t\t\t{artifactContent}\n\t\t\t\t\t<ArtifactDataDisplay artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Details\",\n\t\t\thiddenOnDesktop: true,\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Details\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Details\" className={className}>\n\t\t\t\t\t\tDetails\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Raw\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Raw\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Raw\" className={className}>\n\t\t\t\t\t\tRaw\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Raw\">\n\t\t\t\t\t<ArtifactRawData artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\treturn tabs;\n\t}, [artifact, artifactContent, detailsContent]);\n}\n\nfunction ArtifactRawData({\n\tartifact,\n}: {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n}) {\n\treturn (\n\t\t<pre className=\"whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm\">\n\t\t\t{typeof artifact.data === \"string\"\n\t\t\t\t? artifact.data\n\t\t\t\t: JSON.stringify(artifact.data, null, 2)}\n\t\t</pre>\n\t);\n}\n","export type DetailImageProps = {\n\turl: string;\n};\n\nexport const DetailImage = ({ url }: DetailImageProps) => {\n\treturn (\n\t\t<div data-testid={url} className=\"prose dark:prose-invert mt-2\">\n\t\t\t<img\n\t\t\t\tdata-testid={`image-${url}`}\n\t\t\t\tsrc={url}\n\t\t\t\talt=\"artifact-image\"\n\t\t\t\tclassName=\"w-full\"\n\t\t\t/>\n\n\t\t\t<p className=\"text-lg\">\n\t\t\t\tImage URL:{\" \"}\n\t\t\t\t<a\n\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\thref={url}\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t>\n\t\t\t\t\t{url}\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type DetailMarkdownProps = {\n\tmarkdown: string;\n};\n\nexport const DetailMarkdown = ({ markdown }: DetailMarkdownProps) => {\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"markdown-display\"\n\t\t\tclassName=\"mt-4 prose dark:prose-invert\"\n\t\t>\n\t\t\t<LazyMarkdown>{markdown}</LazyMarkdown>\n\t\t</div>\n\t);\n};\n","export type DetailProgressProps = {\n\tprogress: number;\n};\n\nexport const DetailProgress = ({ progress }: DetailProgressProps) => {\n\treturn (\n\t\t<p data-testid=\"progress-display\" className=\"text-lg\">\n\t\t\tProgress: {progress}%\n\t\t</p>\n\t);\n};\n","import {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useMemo, useState } from \"react\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\n\nexport type DetailTableProps = {\n\ttableData: string;\n};\n\nconst columnHelper = createColumnHelper<Record<string, string>>();\n\nexport const DetailTable = ({ tableData }: DetailTableProps) => {\n\tconst rows = useMemo(\n\t\t() => JSON.parse(tableData) as Record<string, string>[],\n\t\t[tableData],\n\t);\n\tconst headers = useMemo(() => Object.keys(rows[0] ?? {}), [rows]);\n\tconst [input, setInput] = useState<string>(\"\");\n\n\tconst columns = useMemo(\n\t\t() =>\n\t\t\theaders.map((header) =>\n\t\t\t\tcolumnHelper.display({\n\t\t\t\t\tid: header,\n\t\t\t\t\theader: () => header,\n\t\t\t\t\tcell: ({ row }) => {\n\t\t\t\t\t\tconst value = String(row.original[header] ?? \"\");\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span className=\"truncate block\" title={value}>\n\t\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t[headers],\n\t);\n\n\tconst filteredRows = useMemo(() => {\n\t\tif (!input) return rows;\n\t\treturn rows.filter((row) =>\n\t\t\tObject.values(row).some((value) =>\n\t\t\t\tString(value).toLowerCase().includes(input.toLowerCase()),\n\t\t\t),\n\t\t);\n\t}, [input, rows]);\n\n\tconst table = useReactTable({\n\t\tdata: filteredRows,\n\t\tcolumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(),\n\t\tinitialState: { pagination: { pageIndex: 0, pageSize: 10 } },\n\t});\n\n\treturn (\n\t\t<div data-testid=\"table-display\" className=\"mt-4\">\n\t\t\t<div className=\"flex flex-row justify-end items-center mb-2\">\n\t\t\t\t<SearchInput\n\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { formatDate } from \"@/utils/date\";\n\ntype ArtifactSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactSection = ({ artifact }: ArtifactSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!artifact.created) return null;\n\t\treturn formatDate(artifact.created, \"dateTime\");\n\t}, [artifact.created]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-base font-semibold\">Artifact</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Key\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.key ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Type\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.type ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span>{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import humanizeDuration from \"humanize-duration\";\nimport { useMemo } from \"react\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype FlowRunSectionProps = {\n\tflowRun: FlowRun;\n};\n\nexport const FlowRunSection = ({ flowRun }: FlowRunSectionProps) => {\n\tconst startTime = useMemo(() => {\n\t\tif (!flowRun.start_time) return null;\n\t\treturn formatDate(flowRun.start_time, \"dateTime\");\n\t}, [flowRun.start_time]);\n\n\tconst duration = useMemo(() => {\n\t\tif (!flowRun.estimated_run_time) return null;\n\t\treturn humanizeDuration(Math.ceil(flowRun.estimated_run_time) * 1000);\n\t}, [flowRun.estimated_run_time]);\n\n\tconst createdDate = useMemo(() => {\n\t\tif (!flowRun.created) return null;\n\t\treturn formatDate(flowRun.created, \"dateTime\");\n\t}, [flowRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!flowRun.updated) return null;\n\t\treturn formatDate(flowRun.updated, \"dateTime\");\n\t}, [flowRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Flow Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Start time\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{startTime ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Clock\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{duration ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\tflowRun.tags && flowRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{flowRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\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) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"State Message\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono\">\n\t\t\t\t\t\t\t{flowRun.state?.message ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\n\ntype LinksSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const LinksSection = ({ artifact }: LinksSectionProps) => {\n\tconst { flow_run, task_run } = artifact;\n\tconst hasLinks = artifact.key || flow_run || task_run;\n\n\tif (!hasLinks) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t{artifact.key && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Artifact\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{flow_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Flow Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: flow_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{flow_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{task_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Task Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: task_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{task_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<hr className=\"mt-2 border-border\" />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype TaskRunSectionProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunSection = ({ taskRun }: TaskRunSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!taskRun.created) return null;\n\t\treturn formatDate(taskRun.created, \"dateTime\");\n\t}, [taskRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!taskRun.updated) return null;\n\t\treturn formatDate(taskRun.updated, \"dateTime\");\n\t}, [taskRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Task Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\ttaskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\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) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactSection } from \"./artifact-section\";\nimport { FlowRunSection } from \"./flow-run-section\";\nimport { LinksSection } from \"./links-section\";\nimport { TaskRunSection } from \"./task-run-section\";\n\nexport type MetadataSidebarProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const MetadataSidebar = ({ artifact }: MetadataSidebarProps) => {\n\tconst { flow_run, task_run } = artifact;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4 pt-4\">\n\t\t\t<LinksSection artifact={artifact} />\n\n\t\t\t<ArtifactSection artifact={artifact} />\n\n\t\t\t{(flow_run || task_run) && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{flow_run && <FlowRunSection flowRun={flow_run} />}\n\n\t\t\t{flow_run && task_run && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{task_run && <TaskRunSection taskRun={task_run} />}\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { LayoutWellSidebar } from \"@/components/ui/layout-well\";\nimport { ArtifactDetailHeader } from \"./artifact-detail-header\";\nimport { ArtifactDetailTabs } from \"./artifact-detail-tabs\";\nimport { DetailImage } from \"./detail-image\";\nimport { DetailMarkdown } from \"./detail-markdown\";\nimport { DetailProgress } from \"./detail-progress\";\nimport { DetailTable } from \"./detail-table\";\nimport { MetadataSidebar } from \"./metadata-sidebar\";\n\nexport type ArtifactDetailPageProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailPage = ({ artifact }: ArtifactDetailPageProps) => {\n\tconst artifactContent = useMemo(() => {\n\t\tswitch (artifact.type) {\n\t\t\tcase \"markdown\":\n\t\t\tcase \"link\":\n\t\t\t\treturn <DetailMarkdown markdown={artifact.data as string} />;\n\t\t\tcase \"image\":\n\t\t\t\treturn <DetailImage url={artifact.data as string} />;\n\t\t\tcase \"progress\":\n\t\t\t\treturn <DetailProgress progress={artifact.data as number} />;\n\t\t\tcase \"table\":\n\t\t\t\treturn <DetailTable tableData={artifact.data as string} />;\n\t\t\tdefault:\n\t\t\t\treturn <pre>{JSON.stringify(artifact.data, null, 2)}</pre>;\n\t\t}\n\t}, [artifact]);\n\n\tconst sidebarContent = <MetadataSidebar artifact={artifact} />;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ArtifactDetailHeader artifact={artifact} />\n\t\t\t<div className=\"flex flex-col lg:flex-row lg:gap-6\">\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<ArtifactDetailTabs\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tartifactContent={artifactContent}\n\t\t\t\t\t\tdetailsContent={sidebarContent}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<LayoutWellSidebar>{sidebarContent}</LayoutWellSidebar>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { useGetArtifactFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { ArtifactDetailPage } from \"@/components/artifacts/artifact/artifact-detail-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the Artifact Detail page\n * @property {\"Artifact\" | \"Details\" | \"Raw\"} tab used to designate which tab view to display\n */\nconst searchParams = z.object({\n\ttab: z.enum([\"Artifact\", \"Details\", \"Raw\"]).default(\"Artifact\"),\n});\n\nexport type ArtifactDetailTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nexport const Route = createFileRoute(\"/artifacts/artifact/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: function RouteComponent() {\n\t\tconst { id } = Route.useParams();\n\n\t\tconst { data: artifact } = useSuspenseQuery(buildGetArtifactQuery(id));\n\n\t\tconst artifactWithMetadata = useGetArtifactFlowTaskRuns(id);\n\n\t\treturn <ArtifactDetailPage artifact={artifactWithMetadata ?? artifact} />;\n\t},\n\tloader: async ({ context, params }) => {\n\t\tconst { id } = params;\n\n\t\tconst artifact = await context.queryClient.ensureQueryData(\n\t\t\tbuildGetArtifactQuery(id),\n\t\t);\n\n\t\treturn { artifact };\n\t},\n\terrorComponent: function ArtifactDetailErrorComponent({\n\t\terror,\n\t\treset,\n\t}: ErrorComponentProps) {\n\t\tconst serverError = categorizeError(error, \"Failed to load artifact\");\n\t\tif (\n\t\t\tserverError.type !== \"server-error\" &&\n\t\t\tserverError.type !== \"client-error\"\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-2xl font-semibold\">Artifact</h1>\n\t\t\t\t</div>\n\t\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t\t</div>\n\t\t);\n\t},\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifact._id-C4vG8kN1.js","names":["useSuspenseQuery","buildGetArtifactQuery","useGetArtifactFlowTaskRuns","ArtifactDetailPage","Route","SplitComponent","RouteComponent","id","useParams","data","artifact","artifactWithMetadata","component"],"sources":["../../src/components/artifacts/artifact/artifact-detail-header.tsx","../../src/components/artifacts/artifact/artifact-raw-data-display.tsx","../../src/components/artifacts/artifact/artifact-detail-tabs.tsx","../../src/components/artifacts/artifact/detail-image.tsx","../../src/components/artifacts/artifact/detail-markdown.tsx","../../src/components/artifacts/artifact/detail-progress.tsx","../../src/components/artifacts/artifact/detail-table.tsx","../../src/components/artifacts/artifact/metadata-sidebar/artifact-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/flow-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/links-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/task-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/index.tsx","../../src/components/artifacts/artifact/artifact-detail-page.tsx","../../src/routes/artifacts/artifact.$id.tsx?tsr-split=component"],"sourcesContent":["import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type ArtifactDetailHeaderProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailHeader = ({\n\tartifact,\n}: ArtifactDetailHeaderProps) => {\n\tconst header = artifact.key ? (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\ttitle={artifact.key}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t) : (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t{artifact.flow_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.flow_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.flow_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{artifact.task_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.task_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.task_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{header}\n\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t</div>\n\t\t\t{artifact.description && (\n\t\t\t\t<div className=\"text-sm text-muted-foreground my-2\">\n\t\t\t\t\t<LazyMarkdown>{artifact.description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<hr />\n\t\t</>\n\t);\n};\n","import { EditorView, useCodeMirror } from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype ArtifactDataDisplayProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDataDisplay = ({ artifact }: ArtifactDataDisplayProps) => {\n\tconst [showData, setShowData] = useState(false);\n\n\tconst toggleShowData = () => {\n\t\tsetShowData((val) => !val);\n\t};\n\n\tconst editor = useRef<HTMLDivElement | null>(null);\n\tconst { resolvedTheme } = useTheme();\n\tconst basicSetup = {\n\t\thighlightActiveLine: false,\n\t\tfoldGutter: false,\n\t\thighlightActiveLineGutter: false,\n\t};\n\tconst { setContainer } = useCodeMirror({\n\t\tcontainer: editor.current,\n\t\textensions: [EditorView.lineWrapping],\n\t\tvalue: String(artifact.data),\n\t\tindentWithTab: false,\n\t\teditable: true,\n\t\tbasicSetup,\n\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t});\n\n\tuseEffect(() => {\n\t\tif (editor.current) {\n\t\t\tsetContainer(editor.current);\n\t\t}\n\t}, [setContainer]);\n\n\tconst handleCopy = (_value: string) => {\n\t\ttoast.success(\"Copied to clipboard\");\n\t\tvoid navigator.clipboard.writeText(_value);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col justify-center items-center\">\n\t\t\t<Button\n\t\t\t\tdata-testid=\"show-raw-data-button\"\n\t\t\t\tvariant={\"outline\"}\n\t\t\t\tonClick={toggleShowData}\n\t\t\t\tclassName=\"my-4\"\n\t\t\t>\n\t\t\t\t{showData ? \"Hide\" : \"Show\"} Raw Data\n\t\t\t</Button>\n\n\t\t\t<div\n\t\t\t\tclassName=\"rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\"\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: showData ? \"block\" : \"none\",\n\t\t\t\t}}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t}}\n\t\t\t\tdata-testid=\"raw-data-display\"\n\t\t\t>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => handleCopy(artifact.data as string)}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { getRouteApi, Link } from \"@tanstack/react-router\";\nimport { type JSX, type ReactNode, useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { ArtifactDetailTabOptions } from \"@/routes/artifacts/artifact.$id\";\nimport { cn } from \"@/utils\";\n\nimport { ArtifactDataDisplay } from \"./artifact-raw-data-display\";\n\nconst routeApi = getRouteApi(\"/artifacts/artifact/$id\");\n\ntype TabOption = {\n\tvalue: ArtifactDetailTabOptions;\n\thiddenOnDesktop?: boolean;\n\tLinkComponent: (props: { className?: string }) => JSX.Element;\n\tViewComponent: () => JSX.Element;\n};\n\ntype ArtifactDetailTabsProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n\tartifactContent: ReactNode;\n\tdetailsContent: ReactNode;\n};\n\nexport const ArtifactDetailTabs = ({\n\tartifact,\n\tartifactContent,\n\tdetailsContent,\n}: ArtifactDetailTabsProps) => {\n\tconst { tab } = routeApi.useSearch();\n\n\tconst tabOptions = useBuildTabOptions(\n\t\tartifact,\n\t\tartifactContent,\n\t\tdetailsContent,\n\t);\n\n\treturn (\n\t\t<Tabs defaultValue=\"Artifact\" value={tab}>\n\t\t\t<TabsList>\n\t\t\t\t{tabOptions.map(({ value, hiddenOnDesktop, LinkComponent }) => (\n\t\t\t\t\t<LinkComponent\n\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\tclassName={cn(hiddenOnDesktop && \"lg:hidden\")}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</TabsList>\n\t\t\t{tabOptions.map(({ value, ViewComponent }) => (\n\t\t\t\t<ViewComponent key={value} />\n\t\t\t))}\n\t\t</Tabs>\n\t);\n};\n\nfunction useBuildTabOptions(\n\tartifact: ArtifactWithFlowRunAndTaskRun,\n\tartifactContent: ReactNode,\n\tdetailsContent: ReactNode,\n): Array<TabOption> {\n\treturn useMemo(() => {\n\t\tconst tabs: Array<TabOption> = [];\n\n\t\ttabs.push({\n\t\t\tvalue: \"Artifact\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Artifact\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Artifact\" className={className}>\n\t\t\t\t\t\tArtifact\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Artifact\">\n\t\t\t\t\t{artifactContent}\n\t\t\t\t\t<ArtifactDataDisplay artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Details\",\n\t\t\thiddenOnDesktop: true,\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Details\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Details\" className={className}>\n\t\t\t\t\t\tDetails\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Raw\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Raw\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Raw\" className={className}>\n\t\t\t\t\t\tRaw\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Raw\">\n\t\t\t\t\t<ArtifactRawData artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\treturn tabs;\n\t}, [artifact, artifactContent, detailsContent]);\n}\n\nfunction ArtifactRawData({\n\tartifact,\n}: {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n}) {\n\treturn (\n\t\t<pre className=\"whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm\">\n\t\t\t{typeof artifact.data === \"string\"\n\t\t\t\t? artifact.data\n\t\t\t\t: JSON.stringify(artifact.data, null, 2)}\n\t\t</pre>\n\t);\n}\n","export type DetailImageProps = {\n\turl: string;\n};\n\nexport const DetailImage = ({ url }: DetailImageProps) => {\n\treturn (\n\t\t<div data-testid={url} className=\"prose dark:prose-invert mt-2\">\n\t\t\t<img\n\t\t\t\tdata-testid={`image-${url}`}\n\t\t\t\tsrc={url}\n\t\t\t\talt=\"artifact-image\"\n\t\t\t\tclassName=\"w-full\"\n\t\t\t/>\n\n\t\t\t<p className=\"text-lg\">\n\t\t\t\tImage URL:{\" \"}\n\t\t\t\t<a\n\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\thref={url}\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t>\n\t\t\t\t\t{url}\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type DetailMarkdownProps = {\n\tmarkdown: string;\n};\n\nexport const DetailMarkdown = ({ markdown }: DetailMarkdownProps) => {\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"markdown-display\"\n\t\t\tclassName=\"mt-4 prose dark:prose-invert\"\n\t\t>\n\t\t\t<LazyMarkdown>{markdown}</LazyMarkdown>\n\t\t</div>\n\t);\n};\n","export type DetailProgressProps = {\n\tprogress: number;\n};\n\nexport const DetailProgress = ({ progress }: DetailProgressProps) => {\n\treturn (\n\t\t<p data-testid=\"progress-display\" className=\"text-lg\">\n\t\t\tProgress: {progress}%\n\t\t</p>\n\t);\n};\n","import {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useMemo, useState } from \"react\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\n\nexport type DetailTableProps = {\n\ttableData: string;\n};\n\nconst columnHelper = createColumnHelper<Record<string, string>>();\n\nexport const DetailTable = ({ tableData }: DetailTableProps) => {\n\tconst rows = useMemo(\n\t\t() => JSON.parse(tableData) as Record<string, string>[],\n\t\t[tableData],\n\t);\n\tconst headers = useMemo(() => Object.keys(rows[0] ?? {}), [rows]);\n\tconst [input, setInput] = useState<string>(\"\");\n\n\tconst columns = useMemo(\n\t\t() =>\n\t\t\theaders.map((header) =>\n\t\t\t\tcolumnHelper.display({\n\t\t\t\t\tid: header,\n\t\t\t\t\theader: () => header,\n\t\t\t\t\tcell: ({ row }) => {\n\t\t\t\t\t\tconst value = String(row.original[header] ?? \"\");\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span className=\"truncate block\" title={value}>\n\t\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t[headers],\n\t);\n\n\tconst filteredRows = useMemo(() => {\n\t\tif (!input) return rows;\n\t\treturn rows.filter((row) =>\n\t\t\tObject.values(row).some((value) =>\n\t\t\t\tString(value).toLowerCase().includes(input.toLowerCase()),\n\t\t\t),\n\t\t);\n\t}, [input, rows]);\n\n\tconst table = useReactTable({\n\t\tdata: filteredRows,\n\t\tcolumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(),\n\t\tinitialState: { pagination: { pageIndex: 0, pageSize: 10 } },\n\t});\n\n\treturn (\n\t\t<div data-testid=\"table-display\" className=\"mt-4\">\n\t\t\t<div className=\"flex flex-row justify-end items-center mb-2\">\n\t\t\t\t<SearchInput\n\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { formatDate } from \"@/utils/date\";\n\ntype ArtifactSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactSection = ({ artifact }: ArtifactSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!artifact.created) return null;\n\t\treturn formatDate(artifact.created, \"dateTime\");\n\t}, [artifact.created]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-base font-semibold\">Artifact</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Key\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.key ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Type\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.type ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span>{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import humanizeDuration from \"humanize-duration\";\nimport { useMemo } from \"react\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype FlowRunSectionProps = {\n\tflowRun: FlowRun;\n};\n\nexport const FlowRunSection = ({ flowRun }: FlowRunSectionProps) => {\n\tconst startTime = useMemo(() => {\n\t\tif (!flowRun.start_time) return null;\n\t\treturn formatDate(flowRun.start_time, \"dateTime\");\n\t}, [flowRun.start_time]);\n\n\tconst duration = useMemo(() => {\n\t\tif (!flowRun.estimated_run_time) return null;\n\t\treturn humanizeDuration(Math.ceil(flowRun.estimated_run_time) * 1000);\n\t}, [flowRun.estimated_run_time]);\n\n\tconst createdDate = useMemo(() => {\n\t\tif (!flowRun.created) return null;\n\t\treturn formatDate(flowRun.created, \"dateTime\");\n\t}, [flowRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!flowRun.updated) return null;\n\t\treturn formatDate(flowRun.updated, \"dateTime\");\n\t}, [flowRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Flow Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Start time\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{startTime ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Clock\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{duration ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\tflowRun.tags && flowRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{flowRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\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) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"State Message\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono\">\n\t\t\t\t\t\t\t{flowRun.state?.message ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\n\ntype LinksSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const LinksSection = ({ artifact }: LinksSectionProps) => {\n\tconst { flow_run, task_run } = artifact;\n\tconst hasLinks = artifact.key || flow_run || task_run;\n\n\tif (!hasLinks) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t{artifact.key && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Artifact\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{flow_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Flow Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: flow_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{flow_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{task_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Task Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: task_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{task_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<hr className=\"mt-2 border-border\" />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype TaskRunSectionProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunSection = ({ taskRun }: TaskRunSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!taskRun.created) return null;\n\t\treturn formatDate(taskRun.created, \"dateTime\");\n\t}, [taskRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!taskRun.updated) return null;\n\t\treturn formatDate(taskRun.updated, \"dateTime\");\n\t}, [taskRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Task Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\ttaskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\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) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactSection } from \"./artifact-section\";\nimport { FlowRunSection } from \"./flow-run-section\";\nimport { LinksSection } from \"./links-section\";\nimport { TaskRunSection } from \"./task-run-section\";\n\nexport type MetadataSidebarProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const MetadataSidebar = ({ artifact }: MetadataSidebarProps) => {\n\tconst { flow_run, task_run } = artifact;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4 pt-4\">\n\t\t\t<LinksSection artifact={artifact} />\n\n\t\t\t<ArtifactSection artifact={artifact} />\n\n\t\t\t{(flow_run || task_run) && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{flow_run && <FlowRunSection flowRun={flow_run} />}\n\n\t\t\t{flow_run && task_run && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{task_run && <TaskRunSection taskRun={task_run} />}\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { LayoutWellSidebar } from \"@/components/ui/layout-well\";\nimport { ArtifactDetailHeader } from \"./artifact-detail-header\";\nimport { ArtifactDetailTabs } from \"./artifact-detail-tabs\";\nimport { DetailImage } from \"./detail-image\";\nimport { DetailMarkdown } from \"./detail-markdown\";\nimport { DetailProgress } from \"./detail-progress\";\nimport { DetailTable } from \"./detail-table\";\nimport { MetadataSidebar } from \"./metadata-sidebar\";\n\nexport type ArtifactDetailPageProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailPage = ({ artifact }: ArtifactDetailPageProps) => {\n\tconst artifactContent = useMemo(() => {\n\t\tswitch (artifact.type) {\n\t\t\tcase \"markdown\":\n\t\t\tcase \"link\":\n\t\t\t\treturn <DetailMarkdown markdown={artifact.data as string} />;\n\t\t\tcase \"image\":\n\t\t\t\treturn <DetailImage url={artifact.data as string} />;\n\t\t\tcase \"progress\":\n\t\t\t\treturn <DetailProgress progress={artifact.data as number} />;\n\t\t\tcase \"table\":\n\t\t\t\treturn <DetailTable tableData={artifact.data as string} />;\n\t\t\tdefault:\n\t\t\t\treturn <pre>{JSON.stringify(artifact.data, null, 2)}</pre>;\n\t\t}\n\t}, [artifact]);\n\n\tconst sidebarContent = <MetadataSidebar artifact={artifact} />;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ArtifactDetailHeader artifact={artifact} />\n\t\t\t<div className=\"flex flex-col lg:flex-row lg:gap-6\">\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<ArtifactDetailTabs\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tartifactContent={artifactContent}\n\t\t\t\t\t\tdetailsContent={sidebarContent}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<LayoutWellSidebar>{sidebarContent}</LayoutWellSidebar>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { useGetArtifactFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { ArtifactDetailPage } from \"@/components/artifacts/artifact/artifact-detail-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the Artifact Detail page\n * @property {\"Artifact\" | \"Details\" | \"Raw\"} tab used to designate which tab view to display\n */\nconst searchParams = z.object({\n\ttab: z.enum([\"Artifact\", \"Details\", \"Raw\"]).default(\"Artifact\"),\n});\n\nexport type ArtifactDetailTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nexport const Route = createFileRoute(\"/artifacts/artifact/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: function RouteComponent() {\n\t\tconst { id } = Route.useParams();\n\n\t\tconst { data: artifact } = useSuspenseQuery(buildGetArtifactQuery(id));\n\n\t\tconst artifactWithMetadata = useGetArtifactFlowTaskRuns(id);\n\n\t\treturn <ArtifactDetailPage artifact={artifactWithMetadata ?? artifact} />;\n\t},\n\tloader: async ({ context, params }) => {\n\t\tconst { id } = params;\n\n\t\tconst artifact = await context.queryClient.ensureQueryData(\n\t\t\tbuildGetArtifactQuery(id),\n\t\t);\n\n\t\treturn { artifact };\n\t},\n\terrorComponent: function ArtifactDetailErrorComponent({\n\t\terror,\n\t\treset,\n\t}: ErrorComponentProps) {\n\t\tconst serverError = categorizeError(error, \"Failed to load artifact\");\n\t\tif (\n\t\t\tserverError.type !== \"server-error\" &&\n\t\t\tserverError.type !== \"client-error\"\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-2xl font-semibold\">Artifact</h1>\n\t\t\t\t</div>\n\t\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t\t</div>\n\t\t);\n\t},\n});\n"],"mappings":"owBAeA,GAAA,CAAA,6qDCHa,GAAuB,CAAE,cAAyC,CAC9E,GAAM,CAAC,EAAU,IAAA,EAAA,EAAA,SAAA,CAAwB,EAAK,EAExC,MAAuB,CAC5B,EAAa,GAAQ,CAAC,CAAG,CAC1B,EAEM,GAAA,EAAA,EAAA,OAAA,CAAuC,IAAI,EAC3C,CAAE,iBAAkB,EAAS,EAM7B,CAAE,gBAAiB,EAAc,CACtC,UAAW,EAAO,QAClB,WAAY,CAAC,EAAW,YAAY,EACpC,MAAO,OAAO,EAAS,IAAI,EAC3B,cAAe,GACf,SAAU,GACV,WAAA,CAVA,oBAAqB,GACrB,WAAY,GACZ,0BAA2B,EAQ3B,EACA,MAAO,IAAkB,OAAS,OAAS,OAC5C,CAAC,GAED,EAAA,EAAA,UAAA,KAAgB,CACX,EAAO,SACV,EAAa,EAAO,OAAO,CAE7B,EAAG,CAAC,CAAY,CAAC,EAEjB,IAAM,EAAc,GAAmB,CACtC,EAAM,QAAQ,qBAAqB,EACnC,UAAe,UAAU,UAAU,CAAM,CAC1C,EAEA,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qDAAf,EACC,EAAA,EAAA,KAAA,CAAC,EAAD,CACC,cAAY,uBACZ,QAAS,UACT,QAAS,EACT,UAAU,gBAJX,CAME,EAAW,OAAS,OAAO,WACrB,KAER,EAAA,EAAA,IAAA,CAAC,MAAD,CACC,UAAU,8GACV,MAAO,CACN,QAAS,EAAW,QAAU,MAC/B,EACA,IAAM,GAAS,CACd,EAAO,QAAU,CAClB,EACA,cAAY,6BAEZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,YAAe,EAAW,EAAS,IAAc,EACjD,QAAQ,QACR,KAAK,OACL,UAAU,8BACV,aAAW,iBAEX,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,OAAO,UAAU,QAAU,CAAA,CAC7B,CAAA,CACJ,CAAA,CACD,GAEP,ECvEM,GAAW,EAAY,yBAAyB,EAezC,GAAsB,CAClC,WACA,kBACA,oBAC8B,CAC9B,GAAM,CAAE,OAAQ,GAAS,UAAU,EAE7B,EAAa,EAClB,EACA,EACA,CACD,EAEA,OACC,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,aAAa,WAAW,MAAO,WAArC,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SACE,EAAW,KAAK,CAAE,QAAO,kBAAiB,oBAC1C,EAAA,EAAA,IAAA,CAAC,EAAD,CAEC,UAAW,EAAG,GAAmB,WAAW,CAC5C,EAFK,CAEL,CACD,CACQ,CAAA,EACT,EAAW,KAAK,CAAE,QAAO,oBACzB,EAAA,EAAA,IAAA,CAAC,EAAD,CAA4B,EAAR,CAAQ,CAC5B,CACI,GAER,EAEA,SAAS,EACR,EACA,EACA,EACmB,CACnB,OAAA,EAAA,EAAA,QAAA,KAAqB,CACpB,IAAM,EAAyB,CAAC,EAkDhC,OAhDA,EAAK,KAAK,CACT,MAAO,WACP,eAAgB,CAAE,gBACjB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,IAAI,OAAQ,CAAE,IAAK,UAAW,YACtC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,MAAM,WAAsB,qBAAW,UAEvC,CAAA,CACR,CAAA,EAEP,mBACC,EAAA,EAAA,KAAA,CAAC,EAAD,CAAa,MAAM,oBAAnB,CACE,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAA+B,UAAW,CAAA,CAC9B,GAEf,CAAC,EAED,EAAK,KAAK,CACT,MAAO,UACP,gBAAiB,GACjB,eAAgB,CAAE,gBACjB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,IAAI,OAAQ,CAAE,IAAK,SAAU,YACrC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,MAAM,UAAqB,qBAAW,SAEtC,CAAA,CACR,CAAA,EAEP,mBACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,MAAM,mBAAW,CAA4B,CAAA,CAE5D,CAAC,EAED,EAAK,KAAK,CACT,MAAO,MACP,eAAgB,CAAE,gBACjB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,IAAI,OAAQ,CAAE,IAAK,KAAM,YACjC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,MAAM,MAAiB,qBAAW,KAElC,CAAA,CACR,CAAA,EAEP,mBACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,MAAM,gBAClB,EAAA,EAAA,IAAA,CAAC,EAAD,CAA2B,UAAW,CAAA,CAC1B,CAAA,CAEf,CAAC,EAEM,CACR,EAAG,CAAC,EAAU,EAAiB,CAAc,CAAC,CAC/C,CAEA,SAAS,EAAgB,CACxB,YAGE,CACF,OACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,kFACb,OAAO,EAAS,MAAS,SACvB,EAAS,KACT,KAAK,UAAU,EAAS,KAAM,KAAM,CAAC,CACpC,CAAA,CAEP,CC1HA,IAAa,GAAe,CAAE,UAE5B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,cAAa,EAAK,UAAU,wCAAjC,EACC,EAAA,EAAA,IAAA,CAAC,MAAD,CACC,cAAa,SAAS,IACtB,IAAK,EACL,IAAI,iBACJ,UAAU,QACV,CAAA,GAED,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAU,mBAAb,CAAuB,aACX,KACX,EAAA,EAAA,IAAA,CAAC,IAAD,CACC,UAAU,kDACV,OAAO,SACP,KAAM,EACN,IAAI,sBAEH,CACC,CAAA,CACD,GACC,ICnBM,GAAkB,CAAE,eAE/B,EAAA,EAAA,IAAA,CAAC,MAAD,CACC,cAAY,mBACZ,UAAU,yCAEV,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAe,CAAuB,CAAA,CAClC,CAAA,ECTM,GAAkB,CAAE,eAE/B,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,cAAY,mBAAmB,UAAU,mBAA5C,CAAsD,aAC1C,EAAS,GAClB,ICMC,EAAe,EAA2C,EAEnD,GAAe,CAAE,eAAkC,CAC/D,IAAM,GAAA,EAAA,EAAA,QAAA,KACC,KAAK,MAAM,CAAS,EAC1B,CAAC,CAAS,CACX,EACM,GAAA,EAAA,EAAA,QAAA,KAAwB,OAAO,KAAK,EAAK,IAAM,CAAC,CAAC,EAAG,CAAC,CAAI,CAAC,EAC1D,CAAC,EAAO,IAAA,EAAA,EAAA,SAAA,CAA6B,EAAE,EAEvC,GAAA,EAAA,EAAA,QAAA,KAEJ,EAAQ,IAAK,GACZ,EAAa,QAAQ,CACpB,GAAI,EACJ,WAAc,EACd,MAAO,CAAE,SAAU,CAClB,IAAM,EAAQ,OAAO,EAAI,SAAS,IAAW,EAAE,EAC/C,OACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,iBAAiB,MAAO,WACtC,CACI,CAAA,CAER,CACD,CAAC,CACF,EACD,CAAC,CAAO,CACT,EAWM,EAAQ,EAAc,CAC3B,MAAA,EAAA,EAAA,QAAA,KATK,EACE,EAAK,OAAQ,GACnB,OAAO,OAAO,CAAG,CAAC,CAAC,KAAM,GACxB,OAAO,CAAK,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,EAAM,YAAY,CAAC,CACzD,CACD,EALmB,EAMjB,CAAC,EAAO,CAAI,CAGR,EACN,UACA,gBAAiB,EAAgB,EACjC,sBAAuB,EAAsB,EAC7C,aAAc,CAAE,WAAY,CAAE,UAAW,EAAG,SAAU,EAAG,CAAE,CAC5D,CAAC,EAED,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,cAAY,gBAAgB,UAAU,gBAA3C,EACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,wDACd,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,YAAY,SACZ,MAAO,EACP,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,CACxC,CAAA,CACG,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkB,OAAQ,CAAA,CACtB,GAEP,EC/Da,GAAmB,CAAE,cAAqC,CACtE,IAAM,GAAA,EAAA,EAAA,QAAA,KACA,EAAS,QACP,EAAW,EAAS,QAAS,UAAU,EADhB,KAE5B,CAAC,EAAS,OAAO,CAAC,EAErB,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,mCAA0B,UAAW,CAAA,GAElD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oCAAf,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,MACN,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAa,EAAS,KAAO,MAAa,CAAA,CACjE,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,OACN,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAa,EAAS,MAAQ,MAAa,CAAA,CAClE,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,UACN,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAe,MAAa,CAAA,CAC1C,CAAA,CACG,GACD,GAEP,aCzBa,GAAkB,CAAE,aAAmC,CACnE,IAAM,GAAA,EAAA,EAAA,QAAA,KACA,EAAQ,WACN,EAAW,EAAQ,WAAY,UAAU,EADhB,KAE9B,CAAC,EAAQ,UAAU,CAAC,EAEjB,GAAA,EAAA,EAAA,QAAA,KACA,EAAQ,oBACb,EAAA,EAAA,QAAA,CAAwB,KAAK,KAAK,EAAQ,kBAAkB,EAAI,GAAI,EAD5B,KAEtC,CAAC,EAAQ,kBAAkB,CAAC,EAEzB,GAAA,EAAA,EAAA,QAAA,KACA,EAAQ,QACN,EAAW,EAAQ,QAAS,UAAU,EADhB,KAE3B,CAAC,EAAQ,OAAO,CAAC,EAEd,GAAA,EAAA,EAAA,QAAA,KACA,EAAQ,QACN,EAAW,EAAQ,QAAS,UAAU,EADhB,KAE3B,CAAC,EAAQ,OAAO,CAAC,EAEpB,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,6BAAoB,UAAW,CAAA,GAE5C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oCAAf,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,aACN,OACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,uCAAhB,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,WAAW,UAAU,iBAAmB,CAAA,EAChD,GAAa,MACT,GAEP,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,WACN,OACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,uCAAhB,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,QAAQ,UAAU,iBAAmB,CAAA,EAC7C,GAAY,MACR,GAEP,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,UACN,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAa,GAAe,MAAa,CAAA,CAChE,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,eACN,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAa,GAAe,MAAa,CAAA,CAChE,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,OACN,MACC,EAAQ,MAAQ,EAAQ,KAAK,OAAS,GACrC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,0BACb,EAAQ,KAAK,IAAK,IAClB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAyB,KAAM,EAAhB,CAAgB,CAC/B,CACG,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAY,MAAU,CAAA,CAGxC,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,gBACN,OACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBACd,EAAQ,OAAO,SAAW,MACtB,CAAA,CAEP,CAAA,CACG,GACD,GAEP,ECtFa,GAAgB,CAAE,cAAkC,CAChE,GAAM,CAAE,WAAU,YAAa,EAO/B,OANiB,EAAS,KAAO,GAAY,GAO5C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,+BAAf,CACE,EAAS,MACT,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,WACN,OACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,GAAG,sBACH,OAAQ,CAAE,IAAK,EAAS,GAAI,EAC5B,UAAU,2DAET,EAAS,GACL,CAAA,CAEP,CAAA,EAGD,IACA,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,WACN,OACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,GAAG,qBACH,OAAQ,CAAE,GAAI,EAAS,EAAG,EAC1B,UAAU,2DAET,EAAS,IACL,CAAA,CAEP,CAAA,EAGD,IACA,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,WACN,OACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,GAAG,qBACH,OAAQ,CAAE,GAAI,EAAS,EAAG,EAC1B,UAAU,2DAET,EAAS,IACL,CAAA,CAEP,CAAA,GAGF,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,oBAAsB,CAAA,CAChC,IAnDE,IAqDT,ECxDa,IAAkB,CAAE,aAAmC,CACnE,IAAM,GAAA,EAAA,EAAA,QAAA,KACA,EAAQ,QACN,EAAW,EAAQ,QAAS,UAAU,EADhB,KAE3B,CAAC,EAAQ,OAAO,CAAC,EAEd,GAAA,EAAA,EAAA,QAAA,KACA,EAAQ,QACN,EAAW,EAAQ,QAAS,UAAU,EADhB,KAE3B,CAAC,EAAQ,OAAO,CAAC,EAEpB,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,6BAAoB,UAAW,CAAA,GAE5C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oCAAf,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,UACN,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAa,GAAe,MAAa,CAAA,CAChE,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,eACN,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAa,GAAe,MAAa,CAAA,CAChE,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,MAAM,OACN,MACC,EAAQ,MAAQ,EAAQ,KAAK,OAAS,GACrC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,0BACb,EAAQ,KAAK,IAAK,IAClB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAyB,KAAM,EAAhB,CAAgB,CAC/B,CACG,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAY,MAAU,CAAA,CAGxC,CAAA,CACG,GACD,GAEP,EC3Ca,IAAmB,CAAE,cAAqC,CACtE,GAAM,CAAE,WAAU,YAAa,EAE/B,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oCAAf,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAwB,UAAW,CAAA,GAEnC,EAAA,EAAA,IAAA,CAAC,EAAD,CAA2B,UAAW,CAAA,GAEpC,GAAY,KAAa,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,oBAAsB,CAAA,EAE9D,IAAY,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,QAAS,CAAW,CAAA,EAEhD,GAAY,IAAY,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,oBAAsB,CAAA,EAE5D,IAAY,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,QAAS,CAAW,CAAA,CAC7C,GAEP,ECba,IAAsB,CAAE,cAAwC,CAC5E,IAAM,GAAA,EAAA,EAAA,QAAA,KAAgC,CACrC,OAAQ,EAAS,KAAjB,CACC,IAAK,WACL,IAAK,OACJ,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,SAAU,EAAS,IAAiB,CAAA,EAC5D,IAAK,QACJ,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,IAAK,EAAS,IAAiB,CAAA,EACpD,IAAK,WACJ,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,SAAU,EAAS,IAAiB,CAAA,EAC5D,IAAK,QACJ,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,UAAW,EAAS,IAAiB,CAAA,EAC1D,QACC,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,SAAM,KAAK,UAAU,EAAS,KAAM,KAAM,CAAC,CAAO,CAAA,CAC3D,CACD,EAAG,CAAC,CAAQ,CAAC,EAEP,GAAiB,EAAA,EAAA,IAAA,CAAC,GAAD,CAA2B,UAAW,CAAA,EAE7D,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,+BAAf,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgC,UAAW,CAAA,GAC3C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,8CAAf,EACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,2BACd,EAAA,EAAA,IAAA,CAAC,EAAD,CACW,WACO,kBACjB,eAAgB,CAChB,CAAA,CACG,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAoB,CAAkC,CAAA,CAClD,GACD,GAEP,ECtCAK,GAYY,UAA0B,CACpC,GAAM,CAAEE,MAAOH,EAAMI,UAAU,EAEzB,CAAEC,KAAMC,GAAaV,EAAiBC,EAAsBM,CAAE,CAAC,EAIrE,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAoB,SAFEL,EAA2BK,CAEnBI,GAAwBD,CAAS,CAAA,CACvE"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{o as t,s as n}from"./vendor-codemirror-Bs7Yv0L9.js";import{k as r}from"./vendor-tanstack-CghpeqA9.js";import{g as i,o as a}from"./button-D1nS4G4b.js";import{i as o,n as s,o as c,s as l,t as u}from"./select-Cvo9G-Ih.js";import{n as d}from"./input-BaSLpSlc.js";import{$n as f,Er as p,G as m,Jr as h,Or as g,Tr as _,W as v,Y as y,Z as b,er as x,ir as S,nr as C,rr as w,tr as T}from"./index-Dfg8_v13.js";import{t as E}from"./use-debounce-callback-OMnDBqjj.js";import{n as D,r as O,t as k}from"./toggle-group-DB15HEhM.js";var A=e(n(),1),j=t(),M=[{value:`all`,label:`All Types`},{value:`markdown`,label:`Markdown`},{value:`progress`,label:`Progress`},{value:`image`,label:`Image`},{value:`table`,label:`Table`}],N=({filters:e,onFilterChange:t,totalCount:n,displayMode:r,setDisplayMode:f})=>{let p=(0,A.useCallback)(n=>{t([...e.filter(e=>e.id!==`name`),{id:`name`,label:`Name`,value:n}])},[e,t]),m=(0,A.useCallback)(n=>{t([...e.filter(e=>e.id!==`type`),{id:`type`,label:`Type`,value:n}])},[e,t]),h=(0,A.useMemo)(()=>e.find(e=>e.id===`type`)?.value,[e]),g=(0,A.useMemo)(()=>e.find(e=>e.id===`name`)?.value,[e]);return(0,j.jsxs)(`div`,{"data-testid":`artifact-filter`,className:`flex justify-between items-center`,children:[(0,j.jsx)(`div`,{children:(0,j.jsxs)(`p`,{className:`text-base text-sm text-muted-foreground`,children:[n.toLocaleString(),` `,a(n,`artifact`)]})}),(0,j.jsxs)(`div`,{className:`flex gap-4`,children:[(0,j.jsx)(d,{"data-testid":`search-input`,defaultValue:g,placeholder:`Search artifacts`,onChange:e=>p(e.target.value)}),(0,j.jsxs)(`div`,{className:`flex gap-4`,children:[(0,j.jsxs)(u,{"data-testid":`type-select`,value:h,onValueChange:m,children:[(0,j.jsx)(c,{"aria-label":`Artifact type`,children:(0,j.jsx)(l,{placeholder:`Type`})}),(0,j.jsx)(s,{children:M.map(({value:e,label:t})=>(0,j.jsx)(o,{value:e,children:t},e))})]}),(0,j.jsx)(`div`,{children:(0,j.jsxs)(k,{type:`single`,defaultValue:r,onValueChange:e=>f(e),children:[(0,j.jsx)(D,{"data-testid":`grid-layout`,value:`grid`,children:(0,j.jsx)(i,{id:`LayoutGrid`})}),(0,j.jsx)(D,{"data-testid":`list-layout`,value:`list`,children:(0,j.jsx)(i,{id:`AlignJustify`})})]})})]})]})]})},P=()=>(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,j.jsx)(_,{children:(0,j.jsx)(g,{children:(0,j.jsx)(p,{className:`text-xl font-semibold`,children:`Artifacts`})})})}),(0,j.jsx)(S,{id:`artifacts-guide`,label:`Documentation`})]}),F=()=>(0,j.jsxs)(f,{children:[(0,j.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,j.jsx)(C,{id:`Image`})}),(0,j.jsx)(w,{children:`Create an artifact to get started`}),(0,j.jsx)(T,{children:`Artifacts are byproducts of your runs; they can be anything from a markdown string to a table.`}),(0,j.jsx)(x,{children:(0,j.jsx)(S,{id:`artifacts-guide`})})]}),I=({filters:e,onFilterChange:t,artifactsList:n,artifactsCount:r})=>{let[i,a]=h(`artifacts-grid-style`,`grid`),o=(0,A.useMemo)(()=>i===`grid`?`grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4`:`grid-cols-1`,[i]);return(0,j.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,j.jsx)(P,{}),(0,j.jsx)(N,{filters:e,onFilterChange:t,totalCount:r,setDisplayMode:a,displayMode:i}),n.length===0?(0,j.jsx)(F,{}):(0,j.jsx)(`div`,{className:o,children:n.map(e=>(0,j.jsx)(O,{artifact:e},e.id))})]})},L=()=>{let e=v.useSearch(),t=v.useNavigate();return{filters:(0,A.useMemo)(()=>[{id:`type`,label:`Type`,value:e.type??`all`},{id:`name`,label:`Name`,value:e.name}],[e.type,e.name]),onFilterChange:E((0,A.useCallback)(e=>{e&&t({to:`.`,search:()=>e.filter(e=>e.value).reduce((e,t)=>(t.value&&(e[t.id]=t.value),e),{}),replace:!0})},[t]),400)}},R=function(){let e=v.useSearch(),{filters:t,onFilterChange:n}=L(),[{data:i},{data:a}]=r({queries:[m(b(e)),y(b(e))]});return(0,j.jsx)(I,{filters:t,onFilterChange:n,artifactsCount:i,artifactsList:a})};export{R as component};
2
- //# sourceMappingURL=artifacts-Dj7_GReW.js.map
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{o as t,s as n}from"./vendor-codemirror-Bs7Yv0L9.js";import{k as r}from"./vendor-tanstack-CghpeqA9.js";import{g as i,o as a}from"./button-D1nS4G4b.js";import{i as o,n as s,o as c,s as l,t as u}from"./select-Cvo9G-Ih.js";import{n as d}from"./input-BaSLpSlc.js";import{$n as f,Er as p,G as m,Jr as h,Or as g,Tr as _,W as v,Y as y,Z as b,er as x,ir as S,nr as C,rr as w,tr as T}from"./index-DpPA2bX1.js";import{t as E}from"./use-debounce-callback-OMnDBqjj.js";import{n as D,r as O,t as k}from"./toggle-group-_u3r2CNw.js";var A=e(n(),1),j=t(),M=[{value:`all`,label:`All Types`},{value:`markdown`,label:`Markdown`},{value:`progress`,label:`Progress`},{value:`image`,label:`Image`},{value:`table`,label:`Table`}],N=({filters:e,onFilterChange:t,totalCount:n,displayMode:r,setDisplayMode:f})=>{let p=(0,A.useCallback)(n=>{t([...e.filter(e=>e.id!==`name`),{id:`name`,label:`Name`,value:n}])},[e,t]),m=(0,A.useCallback)(n=>{t([...e.filter(e=>e.id!==`type`),{id:`type`,label:`Type`,value:n}])},[e,t]),h=(0,A.useMemo)(()=>e.find(e=>e.id===`type`)?.value,[e]),g=(0,A.useMemo)(()=>e.find(e=>e.id===`name`)?.value,[e]);return(0,j.jsxs)(`div`,{"data-testid":`artifact-filter`,className:`flex justify-between items-center`,children:[(0,j.jsx)(`div`,{children:(0,j.jsxs)(`p`,{className:`text-base text-sm text-muted-foreground`,children:[n.toLocaleString(),` `,a(n,`artifact`)]})}),(0,j.jsxs)(`div`,{className:`flex gap-4`,children:[(0,j.jsx)(d,{"data-testid":`search-input`,defaultValue:g,placeholder:`Search artifacts`,onChange:e=>p(e.target.value)}),(0,j.jsxs)(`div`,{className:`flex gap-4`,children:[(0,j.jsxs)(u,{"data-testid":`type-select`,value:h,onValueChange:m,children:[(0,j.jsx)(c,{"aria-label":`Artifact type`,children:(0,j.jsx)(l,{placeholder:`Type`})}),(0,j.jsx)(s,{children:M.map(({value:e,label:t})=>(0,j.jsx)(o,{value:e,children:t},e))})]}),(0,j.jsx)(`div`,{children:(0,j.jsxs)(k,{type:`single`,defaultValue:r,onValueChange:e=>f(e),children:[(0,j.jsx)(D,{"data-testid":`grid-layout`,value:`grid`,children:(0,j.jsx)(i,{id:`LayoutGrid`})}),(0,j.jsx)(D,{"data-testid":`list-layout`,value:`list`,children:(0,j.jsx)(i,{id:`AlignJustify`})})]})})]})]})]})},P=()=>(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,j.jsx)(_,{children:(0,j.jsx)(g,{children:(0,j.jsx)(p,{className:`text-xl font-semibold`,children:`Artifacts`})})})}),(0,j.jsx)(S,{id:`artifacts-guide`,label:`Documentation`})]}),F=()=>(0,j.jsxs)(f,{children:[(0,j.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,j.jsx)(C,{id:`Image`})}),(0,j.jsx)(w,{children:`Create an artifact to get started`}),(0,j.jsx)(T,{children:`Artifacts are byproducts of your runs; they can be anything from a markdown string to a table.`}),(0,j.jsx)(x,{children:(0,j.jsx)(S,{id:`artifacts-guide`})})]}),I=({filters:e,onFilterChange:t,artifactsList:n,artifactsCount:r})=>{let[i,a]=h(`artifacts-grid-style`,`grid`),o=(0,A.useMemo)(()=>i===`grid`?`grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4`:`grid-cols-1`,[i]);return(0,j.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,j.jsx)(P,{}),(0,j.jsx)(N,{filters:e,onFilterChange:t,totalCount:r,setDisplayMode:a,displayMode:i}),n.length===0?(0,j.jsx)(F,{}):(0,j.jsx)(`div`,{className:o,children:n.map(e=>(0,j.jsx)(O,{artifact:e},e.id))})]})},L=()=>{let e=v.useSearch(),t=v.useNavigate();return{filters:(0,A.useMemo)(()=>[{id:`type`,label:`Type`,value:e.type??`all`},{id:`name`,label:`Name`,value:e.name}],[e.type,e.name]),onFilterChange:E((0,A.useCallback)(e=>{e&&t({to:`.`,search:()=>e.filter(e=>e.value).reduce((e,t)=>(t.value&&(e[t.id]=t.value),e),{}),replace:!0})},[t]),400)}},R=function(){let e=v.useSearch(),{filters:t,onFilterChange:n}=L(),[{data:i},{data:a}]=r({queries:[m(b(e)),y(b(e))]});return(0,j.jsx)(I,{filters:t,onFilterChange:n,artifactsCount:i,artifactsList:a})};export{R as component};
2
+ //# sourceMappingURL=artifacts-C94H1frM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts-Dj7_GReW.js","names":["useSuspenseQueries","useCallback","useMemo","buildCountLatestArtifactsQuery","buildListLatestArtifactsQuery","ArtifactsPage","useDebounceCallback","Route","useFilter","search","useSearch","navigate","useNavigate","filters","id","label","value","type","name","onFilterChange","newFilters","filterType","to","filter","reduce","prev","curr","Record","replace","SplitComponent","RouteComponent","data","artifactsCount","artifactsList","queries","buildFilterBody","component"],"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 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<p className=\"text-base text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount.toLocaleString()} {pluralize(totalCount, \"artifact\")}\n\t\t\t\t</p>\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 { ArtifactCollection } 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: ArtifactCollection[];\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\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{artifactsList.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{artifactsList.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 type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype ArtifactCollectionsFilter,\n\tbuildCountLatestArtifactsQuery,\n\tbuildListLatestArtifactsQuery,\n} from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { ArtifactsPage } from \"@/components/artifacts/artifacts-page\";\nimport type { filterType } from \"@/components/artifacts/types\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\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: { exists_: true, like_: \"my-dataset\" }\n * //\t\t},\n * //\t\toffset: 0\n * //}\n * ```\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): ArtifactCollectionsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\",\n\t\ttype: {\n\t\t\tany_: search?.type && search?.type !== \"all\" ? [search.type] : undefined,\n\t\t},\n\t\tkey: {\n\t\t\texists_: true,\n\t\t\tlike_: search?.name ?? \"\",\n\t\t},\n\t},\n\tsort: \"ID_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: function RouteComponent() {\n\t\tconst search = Route.useSearch();\n\t\tconst { filters, onFilterChange } = useFilter();\n\n\t\tconst [{ data: artifactsCount }, { data: artifactsList }] =\n\t\t\tuseSuspenseQueries({\n\t\t\t\tqueries: [\n\t\t\t\t\tbuildCountLatestArtifactsQuery(buildFilterBody(search)),\n\t\t\t\t\tbuildListLatestArtifactsQuery(buildFilterBody(search)),\n\t\t\t\t],\n\t\t\t});\n\n\t\treturn (\n\t\t\t<ArtifactsPage\n\t\t\t\tfilters={filters}\n\t\t\t\tonFilterChange={onFilterChange}\n\t\t\t\tartifactsCount={artifactsCount}\n\t\t\t\tartifactsList={artifactsList}\n\t\t\t/>\n\t\t);\n\t},\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: ({ deps, context }) => {\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountLatestArtifactsQuery(deps),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(buildListLatestArtifactsQuery(deps));\n\t},\n\terrorComponent: function ArtifactsErrorComponent({\n\t\terror,\n\t\treset,\n\t}: ErrorComponentProps) {\n\t\tconst serverError = categorizeError(error, \"Failed to load artifacts\");\n\t\tif (\n\t\t\tserverError.type !== \"server-error\" &&\n\t\t\tserverError.type !== \"client-error\"\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-2xl font-semibold\">Artifacts</h1>\n\t\t\t\t</div>\n\t\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t\t</div>\n\t\t);\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\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"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts-C94H1frM.js","names":["useSuspenseQueries","useCallback","useMemo","buildCountLatestArtifactsQuery","buildListLatestArtifactsQuery","ArtifactsPage","useDebounceCallback","Route","useFilter","search","useSearch","navigate","useNavigate","filters","id","label","value","type","name","onFilterChange","newFilters","filterType","to","filter","reduce","prev","curr","Record","replace","SplitComponent","RouteComponent","data","artifactsCount","artifactsList","queries","buildFilterBody","component"],"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 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<p className=\"text-base text-sm text-muted-foreground\">\n\t\t\t\t\t{totalCount.toLocaleString()} {pluralize(totalCount, \"artifact\")}\n\t\t\t\t</p>\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 { ArtifactCollection } 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: ArtifactCollection[];\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\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{artifactsList.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{artifactsList.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 type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport {\n\ttype ArtifactCollectionsFilter,\n\tbuildCountLatestArtifactsQuery,\n\tbuildListLatestArtifactsQuery,\n} from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { ArtifactsPage } from \"@/components/artifacts/artifacts-page\";\nimport type { filterType } from \"@/components/artifacts/types\";\nimport { PrefectLoading } from \"@/components/ui/loading\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\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: { exists_: true, like_: \"my-dataset\" }\n * //\t\t},\n * //\t\toffset: 0\n * //}\n * ```\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): ArtifactCollectionsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\",\n\t\ttype: {\n\t\t\tany_: search?.type && search?.type !== \"all\" ? [search.type] : undefined,\n\t\t},\n\t\tkey: {\n\t\t\texists_: true,\n\t\t\tlike_: search?.name ?? \"\",\n\t\t},\n\t},\n\tsort: \"ID_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: function RouteComponent() {\n\t\tconst search = Route.useSearch();\n\t\tconst { filters, onFilterChange } = useFilter();\n\n\t\tconst [{ data: artifactsCount }, { data: artifactsList }] =\n\t\t\tuseSuspenseQueries({\n\t\t\t\tqueries: [\n\t\t\t\t\tbuildCountLatestArtifactsQuery(buildFilterBody(search)),\n\t\t\t\t\tbuildListLatestArtifactsQuery(buildFilterBody(search)),\n\t\t\t\t],\n\t\t\t});\n\n\t\treturn (\n\t\t\t<ArtifactsPage\n\t\t\t\tfilters={filters}\n\t\t\t\tonFilterChange={onFilterChange}\n\t\t\t\tartifactsCount={artifactsCount}\n\t\t\t\tartifactsList={artifactsList}\n\t\t\t/>\n\t\t);\n\t},\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: ({ deps, context }) => {\n\t\tvoid context.queryClient.prefetchQuery(\n\t\t\tbuildCountLatestArtifactsQuery(deps),\n\t\t);\n\t\tvoid context.queryClient.prefetchQuery(buildListLatestArtifactsQuery(deps));\n\t},\n\terrorComponent: function ArtifactsErrorComponent({\n\t\terror,\n\t\treset,\n\t}: ErrorComponentProps) {\n\t\tconst serverError = categorizeError(error, \"Failed to load artifacts\");\n\t\tif (\n\t\t\tserverError.type !== \"server-error\" &&\n\t\t\tserverError.type !== \"client-error\"\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-2xl font-semibold\">Artifacts</h1>\n\t\t\t\t</div>\n\t\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t\t</div>\n\t\t);\n\t},\n\twrapInSuspense: true,\n\tpendingComponent: PrefectLoading,\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"],"mappings":"olBAsBM,EAAsB,CAC3B,CAAE,MAAO,MAAO,MAAO,WAAY,EACnC,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,QAAS,MAAO,OAAQ,EACjC,CAAE,MAAO,QAAS,MAAO,OAAQ,CAClC,EAEa,GAA4B,CACxC,UACA,iBACA,aACA,cACA,oBAC2B,CAC3B,IAAM,GAAA,EAAA,EAAA,YAAA,CACJ,GAAkB,CAClB,EAAe,CACd,GAAG,EAAQ,OAAQ,GAAW,EAAO,KAAO,MAAM,EAClD,CAAE,GAAI,OAAQ,MAAO,OAAQ,OAAM,CACpC,CAAC,CACF,EACA,CAAC,EAAS,CAAc,CACzB,EAEM,GAAA,EAAA,EAAA,YAAA,CACJ,GAAkB,CAClB,EAAe,CACd,GAAG,EAAQ,OAAQ,GAAW,EAAO,KAAO,MAAM,EAClD,CAAE,GAAI,OAAQ,MAAO,OAAQ,OAAM,CACpC,CAAC,CACF,EACA,CAAC,EAAS,CAAc,CACzB,EAEM,GAAA,EAAA,EAAA,QAAA,KACC,EAAQ,KAAM,GAAQ,EAAI,KAAO,MAAM,CAAC,EAAE,MAChD,CAAC,CAAO,CACT,EAEM,GAAA,EAAA,EAAA,QAAA,KACC,EAAQ,KAAM,GAAQ,EAAI,KAAO,MAAM,CAAC,EAAE,MAChD,CAAC,CAAO,CACT,EACA,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CACC,cAAY,kBACZ,UAAU,6CAFX,EAIC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,UACC,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAU,mDAAb,CACE,EAAW,eAAe,EAAE,IAAE,EAAU,EAAY,UAAU,CAC7D,GACC,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACC,cAAY,eACZ,aAAc,EACd,YAAY,mBACZ,SAAW,GAAM,EAAmB,EAAE,OAAO,KAAK,CAClD,CAAA,GAED,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,EACC,EAAA,EAAA,KAAA,CAAC,EAAD,CACC,cAAY,cACZ,MAAO,EACP,cAAe,WAHhB,EAKC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAe,aAAW,0BACzB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,YAAY,MAAQ,CAAA,CACnB,CAAA,GACf,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SACE,EAAoB,KAAK,CAAE,QAAO,YAClC,EAAA,EAAA,IAAA,CAAC,EAAD,CAA+B,iBAC7B,CACU,EAFK,CAEL,CACZ,CACa,CAAA,CACR,KACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,UACC,EAAA,EAAA,KAAA,CAAC,EAAD,CACC,KAAK,SACL,aAAc,EACd,cAAgB,GAAkB,EAAe,CAAK,WAHvD,EAKC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,cAAY,cAAc,MAAM,iBAChD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,YAAc,CAAA,CACP,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,cAAY,cAAc,MAAM,iBAChD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,cAAgB,CAAA,CACT,CAAA,CACL,GACT,CAAA,CACD,GACD,GACD,GAEP,EChHa,OAEX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,6CAAf,EACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oCACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,UAAU,iCAAwB,WAElC,CAAA,CACD,CAAA,CACL,CAAA,CACR,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAG,kBAAkB,MAAM,eAAiB,CAAA,CAClD,ICXM,OACZ,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oCACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,GAAG,OAAS,CAAA,CACxB,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAiB,mCAAkD,CAAA,GACnE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,SAAuB,gGAGA,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAG,iBAAmB,CAAA,CACd,CAAA,CACR,CAAA,CAAA,ECNA,GAAiB,CAC7B,UACA,iBACA,gBACA,oBACyB,CACzB,GAAM,CAAC,EAAa,GAAkB,EACrC,uBACA,MACD,EAEM,GAAA,EAAA,EAAA,QAAA,KACE,IAAgB,OACpB,uDACA,cACD,CAAC,CAAW,CAAC,EAEhB,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,+BAAf,EACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkB,CAAA,GAClB,EAAA,EAAA,IAAA,CAAC,EAAD,CACU,UACO,iBAChB,WAAY,EACI,iBACH,aACb,CAAA,EAEA,EAAc,SAAW,GACzB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAsB,CAAA,GAEtB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,WACd,EAAc,IAAK,IACnB,EAAA,EAAA,IAAA,CAAC,EAAD,CAA0C,UAAW,EAAlC,EAAS,EAAyB,CACrD,CACG,CAAA,CAEF,GAEP,EC+DMQ,MAAkB,CACvB,IAAMC,EAASF,EAAMG,UAAU,EACzBC,EAAWJ,EAAMK,YAAY,EAmCnC,MAAO,CAAEC,SAAAA,EAAAA,EAAAA,QAAAA,KAhCF,CACL,CAAEC,GAAI,OAAQC,MAAO,OAAQC,MAAOP,EAAOQ,MAAQ,KAAM,EACzD,CAAEH,GAAI,OAAQC,MAAO,OAAQC,MAAOP,EAAOS,IAAK,CAAC,EAElD,CAACT,EAAOQ,KAAMR,EAAOS,IAAI,CA4BjBL,EAASM,eAzBKb,GAAAA,EAAAA,EAAAA,YAAAA,CAEpBc,GAA6B,CACxBA,GACL,EAAc,CACbE,GAAI,IACJb,WACCW,EACEG,OAAQA,GAAWA,EAAOP,KAAK,CAAC,CAChCQ,QACCC,EAAMC,KACDA,EAAKV,QACVS,EAAKC,EAAKZ,IAAMY,EAAKV,OADGS,GAIzB,CAAC,CACF,EACFG,QAAS,EACV,CAAC,CACF,EACA,CAACjB,CAAQ,CACV,EACA,GAGiBQ,CAAe,CAClC,EAAEU,EA1FU,UAA0B,CACpC,IAAMpB,EAASF,EAAMG,UAAU,EACzB,CAAEG,UAASM,kBAAmBX,EAAU,EAExC,CAAC,CAAEuB,KAAMC,GAAkB,CAAED,KAAME,IACxCjC,EAAmB,CAClBkC,QAAS,CACR/B,EAA+BgC,EAAgB1B,CAAM,CAAC,EACtDL,EAA8B+B,EAAgB1B,CAAM,CAAC,CAAC,CAExD,CAAC,EAEF,OACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACUI,UACOM,iBACAa,iBACDC,eAAc,CAAA,CAGhC"}