prefect 3.6.14.dev3__py3-none-any.whl → 3.6.14.dev4__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 (251) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/futures.py +17 -4
  3. prefect/runner/runner.py +113 -29
  4. prefect/server/ui-v2/assets/{artifact-card-CNabu-6j.js → artifact-card-DmR_0bKj.js} +2 -2
  5. prefect/server/ui-v2/assets/{artifact-card-CNabu-6j.js.map → artifact-card-DmR_0bKj.js.map} +1 -1
  6. prefect/server/ui-v2/assets/{artifact._id-Emkhr_0h.js → artifact._id-BF4365i6.js} +2 -2
  7. prefect/server/ui-v2/assets/{artifact._id-Emkhr_0h.js.map → artifact._id-BF4365i6.js.map} +1 -1
  8. prefect/server/ui-v2/assets/{automation-schema-CRKJHa4q.js → automation-schema-crrFcHTg.js} +2 -2
  9. prefect/server/ui-v2/assets/{automation-schema-CRKJHa4q.js.map → automation-schema-crrFcHTg.js.map} +1 -1
  10. prefect/server/ui-v2/assets/{automation-wizard-Cej8aik5.js → automation-wizard-DMI3p_HA.js} +2 -2
  11. prefect/server/ui-v2/assets/{automation-wizard-Cej8aik5.js.map → automation-wizard-DMI3p_HA.js.map} +1 -1
  12. prefect/server/ui-v2/assets/automation._id-C_ZATYDQ.js +2 -0
  13. prefect/server/ui-v2/assets/{automation._id-Bm1T3_NO.js.map → automation._id-C_ZATYDQ.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automation_._id.edit-C5NIVfxR.js → automation_._id.edit-Dkc09fFA.js} +2 -2
  15. prefect/server/ui-v2/assets/{automation_._id.edit-C5NIVfxR.js.map → automation_._id.edit-Dkc09fFA.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{automations-header-CdJSlWw8.js → automations-header-H_FW9LY7.js} +2 -2
  17. prefect/server/ui-v2/assets/{automations-header-CdJSlWw8.js.map → automations-header-H_FW9LY7.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{base-job-template-form-section-DX_X28oU.js → base-job-template-form-section-CVnxwfEi.js} +2 -2
  19. prefect/server/ui-v2/assets/{base-job-template-form-section-DX_X28oU.js.map → base-job-template-form-section-CVnxwfEi.js.map} +1 -1
  20. prefect/server/ui-v2/assets/{block-type-details-BcpcwaJS.js → block-type-details-BIzTWlfj.js} +2 -2
  21. prefect/server/ui-v2/assets/{block-type-details-BcpcwaJS.js.map → block-type-details-BIzTWlfj.js.map} +1 -1
  22. prefect/server/ui-v2/assets/block-type-logo-B3XAhRSL.js +2 -0
  23. prefect/server/ui-v2/assets/{block-type-logo-ox5VqJuy.js.map → block-type-logo-B3XAhRSL.js.map} +1 -1
  24. prefect/server/ui-v2/assets/{block._id-BD6wu3yC.js → block._id-Bj0YEdv1.js} +2 -2
  25. prefect/server/ui-v2/assets/{block._id-BD6wu3yC.js.map → block._id-Bj0YEdv1.js.map} +1 -1
  26. prefect/server/ui-v2/assets/{block_._id.edit-aneXPzUW.js → block_._id.edit-C7sUQ8mQ.js} +2 -2
  27. prefect/server/ui-v2/assets/{block_._id.edit-aneXPzUW.js.map → block_._id.edit-C7sUQ8mQ.js.map} +1 -1
  28. prefect/server/ui-v2/assets/{catalog-C7ttFKuv.js → catalog-Cywf-iho.js} +2 -2
  29. prefect/server/ui-v2/assets/{catalog-C7ttFKuv.js.map → catalog-Cywf-iho.js.map} +1 -1
  30. prefect/server/ui-v2/assets/{catalog_._slug-CrcphBbo.js → catalog_._slug-qLWMRQt3.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog_._slug-CrcphBbo.js.map → catalog_._slug-qLWMRQt3.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{catalog_._slug_.create-Dd7ATIKq.js → catalog_._slug_.create-LslFlpde.js} +2 -2
  33. prefect/server/ui-v2/assets/{catalog_._slug_.create-Dd7ATIKq.js.map → catalog_._slug_.create-LslFlpde.js.map} +1 -1
  34. prefect/server/ui-v2/assets/{collapsible-D5U2XK4R.js → collapsible-BszH-EeY.js} +2 -2
  35. prefect/server/ui-v2/assets/{collapsible-D5U2XK4R.js.map → collapsible-BszH-EeY.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{concurrency-limit._id-D-xV_tiF.js → concurrency-limit._id-Dam_Ftkw.js} +2 -2
  37. prefect/server/ui-v2/assets/{concurrency-limit._id-D-xV_tiF.js.map → concurrency-limit._id-Dam_Ftkw.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{create-Da7OBOa5.js → create-B11nNTmT.js} +2 -2
  39. prefect/server/ui-v2/assets/{create-Da7OBOa5.js.map → create-B11nNTmT.js.map} +1 -1
  40. prefect/server/ui-v2/assets/create-B8EFPjmO.js +2 -0
  41. prefect/server/ui-v2/assets/{create-CiMo25er.js.map → create-B8EFPjmO.js.map} +1 -1
  42. prefect/server/ui-v2/assets/cronstrue-IJcBJ9tZ.js +2 -0
  43. prefect/server/ui-v2/assets/cronstrue-IJcBJ9tZ.js.map +1 -0
  44. prefect/server/ui-v2/assets/{data-table-Bfa8_ZJd.js → data-table-C1eRvlXV.js} +2 -2
  45. prefect/server/ui-v2/assets/{data-table-Bfa8_ZJd.js.map → data-table-C1eRvlXV.js.map} +1 -1
  46. prefect/server/ui-v2/assets/{delete-confirmation-dialog-D18TITKv.js → delete-confirmation-dialog-DCmC1ZTD.js} +2 -2
  47. prefect/server/ui-v2/assets/{delete-confirmation-dialog-D18TITKv.js.map → delete-confirmation-dialog-DCmC1ZTD.js.map} +1 -1
  48. prefect/server/ui-v2/assets/deployment-action-header-WD51TIyE.js +2 -0
  49. prefect/server/ui-v2/assets/{deployment-action-header-AamGn0qI.js.map → deployment-action-header-WD51TIyE.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment-form-QIRH-pew.js → deployment-form-FaqDdnNa.js} +3 -3
  51. prefect/server/ui-v2/assets/{deployment-form-QIRH-pew.js.map → deployment-form-FaqDdnNa.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment-links-yTRvIDd3.js → deployment-links-CLax44tW.js} +2 -2
  53. prefect/server/ui-v2/assets/{deployment-links-yTRvIDd3.js.map → deployment-links-CLax44tW.js.map} +1 -1
  54. prefect/server/ui-v2/assets/{deployment._id-CCBPOCfw.js → deployment._id-CbWiylvh.js} +2 -2
  55. prefect/server/ui-v2/assets/{deployment._id-CCBPOCfw.js.map → deployment._id-CbWiylvh.js.map} +1 -1
  56. prefect/server/ui-v2/assets/{deployment._id-m4luvPWl.js → deployment._id-DrtOyhFC.js} +2 -2
  57. prefect/server/ui-v2/assets/{deployment._id-m4luvPWl.js.map → deployment._id-DrtOyhFC.js.map} +1 -1
  58. prefect/server/ui-v2/assets/deployment_._id.duplicate-CqlNWQfz.js +2 -0
  59. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DFjSeYn4.js.map → deployment_._id.duplicate-CqlNWQfz.js.map} +1 -1
  60. prefect/server/ui-v2/assets/deployment_._id.edit-CbvCe2YU.js +2 -0
  61. prefect/server/ui-v2/assets/{deployment_._id.edit-5-mFOphJ.js.map → deployment_._id.edit-CbvCe2YU.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{deployment_._id.run-CwVe5hPJ.js → deployment_._id.run-BnIFeR-d.js} +2 -2
  63. prefect/server/ui-v2/assets/{deployment_._id.run-CwVe5hPJ.js.map → deployment_._id.run-BnIFeR-d.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{dropdown-menu-g64QiYKu.js → dropdown-menu-Bhox1zoa.js} +2 -2
  65. prefect/server/ui-v2/assets/{dropdown-menu-g64QiYKu.js.map → dropdown-menu-Bhox1zoa.js.map} +1 -1
  66. prefect/server/ui-v2/assets/{event-resource-display-BqqHFc0B.js → event-resource-display-65B76oFV.js} +2 -2
  67. prefect/server/ui-v2/assets/{event-resource-display-BqqHFc0B.js.map → event-resource-display-65B76oFV.js.map} +1 -1
  68. prefect/server/ui-v2/assets/{event._eventDate._eventId-BR0eukkm.js → event._eventDate._eventId-CxPjH2H7.js} +2 -2
  69. prefect/server/ui-v2/assets/{event._eventDate._eventId-BR0eukkm.js.map → event._eventDate._eventId-CxPjH2H7.js.map} +1 -1
  70. prefect/server/ui-v2/assets/{flow-run-graph-kZfaIevn.js → flow-run-graph-ZOatFLjv.js} +2 -2
  71. prefect/server/ui-v2/assets/{flow-run-graph-kZfaIevn.js.map → flow-run-graph-ZOatFLjv.js.map} +1 -1
  72. prefect/server/ui-v2/assets/flow-run._id-1RC-URiA.js +2 -0
  73. prefect/server/ui-v2/assets/{flow-run._id-Caq--9Lr.js.map → flow-run._id-1RC-URiA.js.map} +1 -1
  74. prefect/server/ui-v2/assets/flow-run._id-CDFeuz16.js +2 -0
  75. prefect/server/ui-v2/assets/{flow-run._id-DiA0_X5m.js.map → flow-run._id-CDFeuz16.js.map} +1 -1
  76. prefect/server/ui-v2/assets/{flow-run._id-BX0UeXTj.js → flow-run._id-U6rzXfvR.js} +4 -4
  77. prefect/server/ui-v2/assets/{flow-run._id-BX0UeXTj.js.map → flow-run._id-U6rzXfvR.js.map} +1 -1
  78. prefect/server/ui-v2/assets/{flow-runs-pagination-CoZZ-ed_.js → flow-runs-pagination-D_d5hdM0.js} +2 -2
  79. prefect/server/ui-v2/assets/{flow-runs-pagination-CoZZ-ed_.js.map → flow-runs-pagination-D_d5hdM0.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{flow._id-nRzTWzLb.js → flow._id-DkeN8TLS.js} +2 -2
  81. prefect/server/ui-v2/assets/{flow._id-nRzTWzLb.js.map → flow._id-DkeN8TLS.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{form-CdcF42XZ.js → form-CJfDUosd.js} +2 -2
  83. prefect/server/ui-v2/assets/{form-CdcF42XZ.js.map → form-CJfDUosd.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-DijI5Lcu.js → header-C5liWcfp.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-DijI5Lcu.js.map → header-C5liWcfp.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{header-DkJo9Uge.js → header-MZZX5lQ8.js} +2 -2
  87. prefect/server/ui-v2/assets/{header-DkJo9Uge.js.map → header-MZZX5lQ8.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{header-DV0gMQER.js → header-vYbWNFdK.js} +2 -2
  89. prefect/server/ui-v2/assets/{header-DV0gMQER.js.map → header-vYbWNFdK.js.map} +1 -1
  90. prefect/server/ui-v2/assets/{index-VUajxmNL.js → index-4xVLy12E.js} +2 -2
  91. prefect/server/ui-v2/assets/{index-VUajxmNL.js.map → index-4xVLy12E.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-KlV75baW.js → index-5fQrQZ3K.js} +2 -2
  93. prefect/server/ui-v2/assets/{index-KlV75baW.js.map → index-5fQrQZ3K.js.map} +1 -1
  94. prefect/server/ui-v2/assets/index-7bWZ2Znt.js +2 -0
  95. prefect/server/ui-v2/assets/{index-CqvGvZOq.js.map → index-7bWZ2Znt.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-Chtop8D8.js → index-BOVwKiXn.js} +2 -2
  97. prefect/server/ui-v2/assets/{index-Chtop8D8.js.map → index-BOVwKiXn.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{index-BZ9TDxSy.js → index-BPmw935P.js} +2 -2
  99. prefect/server/ui-v2/assets/{index-BZ9TDxSy.js.map → index-BPmw935P.js.map} +1 -1
  100. prefect/server/ui-v2/assets/index-BR6bwuK4.js +2 -0
  101. prefect/server/ui-v2/assets/{index-BCKNs_w7.js.map → index-BR6bwuK4.js.map} +1 -1
  102. prefect/server/ui-v2/assets/{index-DYKO0qOd.js → index-B_3WKH2_.js} +2 -2
  103. prefect/server/ui-v2/assets/{index-DYKO0qOd.js.map → index-B_3WKH2_.js.map} +1 -1
  104. prefect/server/ui-v2/assets/{index-BV3WqCCv.js → index-BgOHAC5L.js} +2 -2
  105. prefect/server/ui-v2/assets/{index-BV3WqCCv.js.map → index-BgOHAC5L.js.map} +1 -1
  106. prefect/server/ui-v2/assets/{index-CUZXozY8.js → index-Bmd9p_xN.js} +2 -2
  107. prefect/server/ui-v2/assets/{index-CUZXozY8.js.map → index-Bmd9p_xN.js.map} +1 -1
  108. prefect/server/ui-v2/assets/{index-faXvGo5k.js → index-BmdTLblr.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-faXvGo5k.js.map → index-BmdTLblr.js.map} +1 -1
  110. prefect/server/ui-v2/assets/{index-Cuh3BwlA.js → index-CCCwtbSq.js} +2 -2
  111. prefect/server/ui-v2/assets/{index-Cuh3BwlA.js.map → index-CCCwtbSq.js.map} +1 -1
  112. prefect/server/ui-v2/assets/{index-yTjygRmH.js → index-CbJNJTr8.js} +2 -2
  113. prefect/server/ui-v2/assets/{index-yTjygRmH.js.map → index-CbJNJTr8.js.map} +1 -1
  114. prefect/server/ui-v2/assets/index-CcyfsgGP.js +2 -0
  115. prefect/server/ui-v2/assets/{index-BijfHkUE.js.map → index-CcyfsgGP.js.map} +1 -1
  116. prefect/server/ui-v2/assets/{index-AXV1ellj.js → index-CfHvTOAO.js} +2 -2
  117. prefect/server/ui-v2/assets/{index-AXV1ellj.js.map → index-CfHvTOAO.js.map} +1 -1
  118. prefect/server/ui-v2/assets/{index-BGZtCgRR.js → index-ClXbR8i0.js} +2 -2
  119. prefect/server/ui-v2/assets/{index-BGZtCgRR.js.map → index-ClXbR8i0.js.map} +1 -1
  120. prefect/server/ui-v2/assets/{index-BfuGBXBN.js → index-Cyw9YHlj.js} +2 -2
  121. prefect/server/ui-v2/assets/{index-BfuGBXBN.js.map → index-Cyw9YHlj.js.map} +1 -1
  122. prefect/server/ui-v2/assets/{index-BZqccBpn.js → index-DLuXqHi9.js} +6 -6
  123. prefect/server/ui-v2/assets/index-DLuXqHi9.js.map +1 -0
  124. prefect/server/ui-v2/assets/{index-BmUvoLOK.js → index-DeeA9nPM.js} +2 -2
  125. prefect/server/ui-v2/assets/{index-BmUvoLOK.js.map → index-DeeA9nPM.js.map} +1 -1
  126. prefect/server/ui-v2/assets/index-MeJBhX-C.js +2 -0
  127. prefect/server/ui-v2/assets/{index-CUJoNEgb.js.map → index-MeJBhX-C.js.map} +1 -1
  128. prefect/server/ui-v2/assets/{index-DO_c3_A_.js → index-enqoJV8x.js} +2 -2
  129. prefect/server/ui-v2/assets/{index-DO_c3_A_.js.map → index-enqoJV8x.js.map} +1 -1
  130. prefect/server/ui-v2/assets/{json-input-DFgWdLGv.js → json-input-CJ1Ipjax.js} +2 -2
  131. prefect/server/ui-v2/assets/{json-input-DFgWdLGv.js.map → json-input-CJ1Ipjax.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{key._key-CpeWM0mN.js → key._key-B0wb5Umi.js} +2 -2
  133. prefect/server/ui-v2/assets/{key._key-CpeWM0mN.js.map → key._key-B0wb5Umi.js.map} +1 -1
  134. prefect/server/ui-v2/assets/{lazy-markdown-Bzi0YUUV.js → lazy-markdown-sP3PYQgB.js} +3 -3
  135. prefect/server/ui-v2/assets/{lazy-markdown-Bzi0YUUV.js.map → lazy-markdown-sP3PYQgB.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{login-CM0nuDdd.js → login-DNY0o3XU.js} +2 -2
  137. prefect/server/ui-v2/assets/{login-CM0nuDdd.js.map → login-DNY0o3XU.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{markdown-input-CGOAnaWz.js → markdown-input-Bos2JYXW.js} +2 -2
  139. prefect/server/ui-v2/assets/{markdown-input-CGOAnaWz.js.map → markdown-input-Bos2JYXW.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{python-example-snippet-CyJ28Tm-.js → python-example-snippet-CWSJRd48.js} +3 -3
  141. prefect/server/ui-v2/assets/{python-example-snippet-CyJ28Tm-.js.map → python-example-snippet-CWSJRd48.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{python-input-D8_x22t4.js → python-input-Bu4995lK.js} +2 -2
  143. prefect/server/ui-v2/assets/{python-input-D8_x22t4.js.map → python-input-Bu4995lK.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{radio-group-Dgu38qwz.js → radio-group-C0D0oLYd.js} +2 -2
  145. prefect/server/ui-v2/assets/{radio-group-Dgu38qwz.js.map → radio-group-C0D0oLYd.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{route-error-state-CVHTggxQ.js → route-error-state-DzKu_Iw_.js} +2 -2
  147. prefect/server/ui-v2/assets/{route-error-state-CVHTggxQ.js.map → route-error-state-DzKu_Iw_.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{schema-form-DqRLX--T.js → schema-form-BD95b0iS.js} +2 -2
  149. prefect/server/ui-v2/assets/schema-form-BD95b0iS.js.map +1 -0
  150. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DuEmswz-.js → schema-form-input-string-format-datetime-DyDs1jNl.js} +4 -4
  151. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DuEmswz-.js.map → schema-form-input-string-format-datetime-DyDs1jNl.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{settings-CtKmYnoo.js → settings-a90cwhBe.js} +2 -2
  153. prefect/server/ui-v2/assets/{settings-CtKmYnoo.js.map → settings-a90cwhBe.js.map} +1 -1
  154. prefect/server/ui-v2/assets/{sort-filter-BNQ6rjAG.js → sort-filter-CCltjs1E.js} +2 -2
  155. prefect/server/ui-v2/assets/{sort-filter-BNQ6rjAG.js.map → sort-filter-CCltjs1E.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{table-CJS-5Aky.js → table-CrPymfJD.js} +2 -2
  157. prefect/server/ui-v2/assets/{table-CJS-5Aky.js.map → table-CrPymfJD.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{tags-input-CDvuqe9B.js → tags-input-BdNYl8nS.js} +2 -2
  159. prefect/server/ui-v2/assets/{tags-input-CDvuqe9B.js.map → tags-input-BdNYl8nS.js.map} +1 -1
  160. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-DMqNFEVn.js → task-run-concurrency-limits-reset-dialog-B4bdiAgf.js} +2 -2
  161. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-DMqNFEVn.js.map → task-run-concurrency-limits-reset-dialog-B4bdiAgf.js.map} +1 -1
  162. prefect/server/ui-v2/assets/{task-run._id-CV5t0LR0.js → task-run._id-BQac40_I.js} +3 -3
  163. prefect/server/ui-v2/assets/{task-run._id-CV5t0LR0.js.map → task-run._id-BQac40_I.js.map} +1 -1
  164. prefect/server/ui-v2/assets/task-run._id-BzeMfM08.js +2 -0
  165. prefect/server/ui-v2/assets/{task-run._id-CiVsXKpy.js.map → task-run._id-BzeMfM08.js.map} +1 -1
  166. prefect/server/ui-v2/assets/task-runs-pagination-WFGIqR6p.js +2 -0
  167. prefect/server/ui-v2/assets/{task-runs-pagination-DGjxL4DO.js.map → task-runs-pagination-WFGIqR6p.js.map} +1 -1
  168. prefect/server/ui-v2/assets/{textarea-Mne2s-1n.js → textarea-CGFflH-n.js} +2 -2
  169. prefect/server/ui-v2/assets/{textarea-Mne2s-1n.js.map → textarea-CGFflH-n.js.map} +1 -1
  170. prefect/server/ui-v2/assets/{timezone-select-CPBtT8tA.js → timezone-select-ClE9nfKA.js} +2 -2
  171. prefect/server/ui-v2/assets/{timezone-select-CPBtT8tA.js.map → timezone-select-ClE9nfKA.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{toggle-group-CvPe0UY1.js → toggle-group-Dnv_LMnU.js} +2 -2
  173. prefect/server/ui-v2/assets/{toggle-group-CvPe0UY1.js.map → toggle-group-Dnv_LMnU.js.map} +1 -1
  174. prefect/server/ui-v2/assets/{use-debounce-callback-Dcf0d0U7.js → use-debounce-callback-CVfZS_LP.js} +2 -2
  175. prefect/server/ui-v2/assets/{use-debounce-callback-Dcf0d0U7.js.map → use-debounce-callback-CVfZS_LP.js.map} +1 -1
  176. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DnRkM1Cj.js → use-delete-automation-confirmation-dialog-CRGV6wvn.js} +2 -2
  177. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DnRkM1Cj.js.map → use-delete-automation-confirmation-dialog-CRGV6wvn.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CMHtwDvb.js → use-delete-block-document-confirmation-dialog-DNMP_gtr.js} +2 -2
  179. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CMHtwDvb.js.map → use-delete-block-document-confirmation-dialog-DNMP_gtr.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{use-delete-confirmation-dialog-Bka9YDdO.js → use-delete-confirmation-dialog-C5d6hPL-.js} +2 -2
  181. prefect/server/ui-v2/assets/{use-delete-confirmation-dialog-Bka9YDdO.js.map → use-delete-confirmation-dialog-C5d6hPL-.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DB4pe2_m.js → use-flow-runs-selected-rows-D3-TVsRL.js} +2 -2
  183. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DB4pe2_m.js.map → use-flow-runs-selected-rows-D3-TVsRL.js.map} +1 -1
  184. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DUPrB7V9.js → use-get-artifacts-flow-task-runs-I3Wb9fOV.js} +2 -2
  185. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DUPrB7V9.js.map → use-get-artifacts-flow-task-runs-I3Wb9fOV.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{use-is-overflowing-Cc-Qm0vx.js → use-is-overflowing-CyVH32I2.js} +2 -2
  187. prefect/server/ui-v2/assets/{use-is-overflowing-Cc-Qm0vx.js.map → use-is-overflowing-CyVH32I2.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{use-page-title-ELpQMkBC.js → use-page-title-CImKMV-D.js} +2 -2
  189. prefect/server/ui-v2/assets/{use-page-title-ELpQMkBC.js.map → use-page-title-CImKMV-D.js.map} +1 -1
  190. prefect/server/ui-v2/assets/use-quick-run-Be-i6Tzi.js +2 -0
  191. prefect/server/ui-v2/assets/{use-quick-run-uAasMmAv.js.map → use-quick-run-Be-i6Tzi.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{use-state-favicon-CzOUYzQe.js → use-state-favicon-DtW_I9k3.js} +2 -2
  193. prefect/server/ui-v2/assets/{use-state-favicon-CzOUYzQe.js.map → use-state-favicon-DtW_I9k3.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{use-stepper-DvHmfROo.js → use-stepper-BSvi_u_j.js} +2 -2
  195. prefect/server/ui-v2/assets/{use-stepper-DvHmfROo.js.map → use-stepper-BSvi_u_j.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{utilities-XA-1-LhA.js → utilities-BCBDUmEl.js} +2 -2
  197. prefect/server/ui-v2/assets/{utilities-XA-1-LhA.js.map → utilities-BCBDUmEl.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{vendor-codemirror-Dn73yRFx.js → vendor-codemirror-OTxfneaa.js} +2 -2
  199. prefect/server/ui-v2/assets/{vendor-codemirror-Dn73yRFx.js.map → vendor-codemirror-OTxfneaa.js.map} +1 -1
  200. prefect/server/ui-v2/assets/{vendor-date-Bxa7CHB1.js → vendor-date-CRz8gtWZ.js} +2 -2
  201. prefect/server/ui-v2/assets/{vendor-date-Bxa7CHB1.js.map → vendor-date-CRz8gtWZ.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{vendor-forms-mroZAMaw.js → vendor-forms-D-iybWES.js} +2 -2
  203. prefect/server/ui-v2/assets/{vendor-forms-mroZAMaw.js.map → vendor-forms-D-iybWES.js.map} +1 -1
  204. prefect/server/ui-v2/assets/{vendor-markdown-BV905mMk.js → vendor-markdown-TdbL8FCd.js} +2 -2
  205. prefect/server/ui-v2/assets/{vendor-markdown-BV905mMk.js.map → vendor-markdown-TdbL8FCd.js.map} +1 -1
  206. prefect/server/ui-v2/assets/{vendor-radix-CP6hQtRc.js → vendor-radix-DRMjKWJW.js} +5 -5
  207. prefect/server/ui-v2/assets/{vendor-radix-CP6hQtRc.js.map → vendor-radix-DRMjKWJW.js.map} +1 -1
  208. prefect/server/ui-v2/assets/{vendor-recharts-BOcghvr2.js → vendor-recharts-BGjDGXVf.js} +2 -2
  209. prefect/server/ui-v2/assets/{vendor-recharts-BOcghvr2.js.map → vendor-recharts-BGjDGXVf.js.map} +1 -1
  210. prefect/server/ui-v2/assets/{vendor-tanstack-CLpbOGYv.js → vendor-tanstack-CWDKYA_B.js} +2 -2
  211. prefect/server/ui-v2/assets/{vendor-tanstack-CLpbOGYv.js.map → vendor-tanstack-CWDKYA_B.js.map} +1 -1
  212. prefect/server/ui-v2/assets/{work-pool-filter-D4DI4Hd5.js → work-pool-filter-BuJB9elW.js} +2 -2
  213. prefect/server/ui-v2/assets/{work-pool-filter-D4DI4Hd5.js.map → work-pool-filter-BuJB9elW.js.map} +1 -1
  214. prefect/server/ui-v2/assets/{work-pool-queue-toggle--tVsqhDi.js → work-pool-queue-toggle-DP2ONU28.js} +2 -2
  215. prefect/server/ui-v2/assets/{work-pool-queue-toggle--tVsqhDi.js.map → work-pool-queue-toggle-DP2ONU28.js.map} +1 -1
  216. prefect/server/ui-v2/assets/{work-pool._workPoolName-Ba0XSN4m.js → work-pool._workPoolName-BjhJe3F4.js} +2 -2
  217. prefect/server/ui-v2/assets/{work-pool._workPoolName-Ba0XSN4m.js.map → work-pool._workPoolName-BjhJe3F4.js.map} +1 -1
  218. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-lHDf1Aih.js +2 -0
  219. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CeYLESXS.js.map → work-pool_._workPoolName.edit-lHDf1Aih.js.map} +1 -1
  220. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CHvlnO-U.js → work-pool_._workPoolName.queue._workQueueName-CLthz7sB.js} +2 -2
  221. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CHvlnO-U.js.map → work-pool_._workPoolName.queue._workQueueName-CLthz7sB.js.map} +1 -1
  222. prefect/server/ui-v2/assets/{work-queue-icon-text-DnQAtUi_.js → work-queue-icon-text-4iEAtZOh.js} +2 -2
  223. prefect/server/ui-v2/assets/{work-queue-icon-text-DnQAtUi_.js.map → work-queue-icon-text-4iEAtZOh.js.map} +1 -1
  224. prefect/server/ui-v2/assets/{zod-cc-7bk3x.js → zod-CjGf5GIv.js} +2 -2
  225. prefect/server/ui-v2/assets/{zod-cc-7bk3x.js.map → zod-CjGf5GIv.js.map} +1 -1
  226. prefect/server/ui-v2/index.html +6 -6
  227. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/METADATA +2 -2
  228. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/RECORD +231 -231
  229. prefect/server/ui-v2/assets/automation._id-Bm1T3_NO.js +0 -2
  230. prefect/server/ui-v2/assets/block-type-logo-ox5VqJuy.js +0 -2
  231. prefect/server/ui-v2/assets/create-CiMo25er.js +0 -2
  232. prefect/server/ui-v2/assets/cronstrue-CeanGOEE.js +0 -2
  233. prefect/server/ui-v2/assets/cronstrue-CeanGOEE.js.map +0 -1
  234. prefect/server/ui-v2/assets/deployment-action-header-AamGn0qI.js +0 -2
  235. prefect/server/ui-v2/assets/deployment_._id.duplicate-DFjSeYn4.js +0 -2
  236. prefect/server/ui-v2/assets/deployment_._id.edit-5-mFOphJ.js +0 -2
  237. prefect/server/ui-v2/assets/flow-run._id-Caq--9Lr.js +0 -2
  238. prefect/server/ui-v2/assets/flow-run._id-DiA0_X5m.js +0 -2
  239. prefect/server/ui-v2/assets/index-BCKNs_w7.js +0 -2
  240. prefect/server/ui-v2/assets/index-BZqccBpn.js.map +0 -1
  241. prefect/server/ui-v2/assets/index-BijfHkUE.js +0 -2
  242. prefect/server/ui-v2/assets/index-CUJoNEgb.js +0 -2
  243. prefect/server/ui-v2/assets/index-CqvGvZOq.js +0 -2
  244. prefect/server/ui-v2/assets/schema-form-DqRLX--T.js.map +0 -1
  245. prefect/server/ui-v2/assets/task-run._id-CiVsXKpy.js +0 -2
  246. prefect/server/ui-v2/assets/task-runs-pagination-DGjxL4DO.js +0 -2
  247. prefect/server/ui-v2/assets/use-quick-run-uAasMmAv.js +0 -2
  248. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CeYLESXS.js +0 -2
  249. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/WHEEL +0 -0
  250. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/entry_points.txt +0 -0
  251. {prefect-3.6.14.dev3.dist-info → prefect-3.6.14.dev4.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index-DO_c3_A_.js","sources":["../../src/components/events/events-line-chart/events-line-chart.tsx","../../src/components/events/events-line-chart/interactive-events-chart.tsx","../../src/components/events/events-resource-filter/events-resource-filter.tsx","../../src/components/events/events-timeline/events-timeline.tsx","../../src/components/events/events-type-filter/events-type-filter.tsx","../../src/components/events/events-page/use-events-pagination.ts","../../src/components/events/events-page/events-page.tsx","../../src/routes/events/index.tsx?tsr-split=component"],"sourcesContent":["import { format } from \"date-fns\";\nimport { forwardRef, useImperativeHandle, useMemo, useRef } from \"react\";\nimport { Area, AreaChart, XAxis, YAxis } from \"recharts\";\nimport type { EventsCount } from \"@/api/events\";\nimport { ChartContainer, ChartTooltip } from \"@/components/ui/chart\";\nimport { cn } from \"@/utils\";\n\ntype ChartDataPoint = {\n\ttime: number;\n\tcount: number;\n\tlabel: string;\n};\n\ntype EventsTooltipProps = {\n\tactive?: boolean;\n\tpayload?: Array<{ payload?: ChartDataPoint }>;\n};\n\nconst EventsTooltipContent = ({ active, payload }: EventsTooltipProps) => {\n\tif (!active || !payload || !payload.length) return null;\n\n\tconst firstPayloadItem = payload[0];\n\tconst point = firstPayloadItem?.payload;\n\n\tif (\n\t\t!point ||\n\t\ttypeof point.time !== \"number\" ||\n\t\ttypeof point.count !== \"number\"\n\t) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"bg-popover border rounded-lg p-2 shadow-md\">\n\t\t\t<div className=\"text-sm font-medium\">{point.count} events</div>\n\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t{format(new Date(point.time), \"PPp\")}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport type EventsLineChartProps = {\n\tdata: EventsCount[];\n\tclassName?: string;\n\t/** Whether to show the X-axis with time labels (default: true) */\n\tshowAxis?: boolean;\n\t/** Date range start for chart display */\n\tstartDate?: Date;\n\t/** Date range end for chart display */\n\tendDate?: Date;\n\t/** Called when mouse hovers over chart with timestamp */\n\tonCursorChange?: (timestamp: Date | null) => void;\n};\n\nexport type EventsLineChartRef = {\n\tclearSelection: () => void;\n};\n\nconst chartConfig = {\n\tcount: {\n\t\tlabel: \"Events\",\n\t\tcolor: \"hsl(262.1 83.3% 57.8%)\",\n\t},\n};\n\nexport const EventsLineChart = forwardRef<\n\tEventsLineChartRef,\n\tEventsLineChartProps\n>(function EventsLineChart(\n\t{ data, className, showAxis = true, startDate, endDate, onCursorChange },\n\tref,\n) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tuseImperativeHandle(ref, () => ({\n\t\tclearSelection: () => {\n\t\t\t// Selection clearing logic handled by parent\n\t\t},\n\t}));\n\n\tconst chartData = useMemo(() => {\n\t\tconst points = data.map((item) => ({\n\t\t\ttime: new Date(item.start_time).getTime(),\n\t\t\tcount: item.count,\n\t\t\tlabel: item.label,\n\t\t}));\n\n\t\t// Ensure we have boundary points at startDate and endDate so the line\n\t\t// extends across the full chart width (matching Vue implementation)\n\t\tif (startDate && endDate) {\n\t\t\tconst startTime = startDate.getTime();\n\t\t\tconst endTime = endDate.getTime();\n\n\t\t\t// Add start boundary point if not present\n\t\t\tif (points.length === 0 || points[0].time > startTime) {\n\t\t\t\tpoints.unshift({ time: startTime, count: 0, label: \"\" });\n\t\t\t}\n\n\t\t\t// Add end boundary point if not present\n\t\t\tif (points.length === 0 || points[points.length - 1].time < endTime) {\n\t\t\t\tpoints.push({ time: endTime, count: 0, label: \"\" });\n\t\t\t}\n\t\t}\n\n\t\treturn points;\n\t}, [data, startDate, endDate]);\n\n\tconst handleMouseMove = (state: { activeLabel?: string | number }) => {\n\t\tif (state.activeLabel !== undefined && onCursorChange) {\n\t\t\tconst timestamp =\n\t\t\t\ttypeof state.activeLabel === \"number\"\n\t\t\t\t\t? state.activeLabel\n\t\t\t\t\t: Number(state.activeLabel);\n\t\t\tif (!Number.isNaN(timestamp)) {\n\t\t\t\tonCursorChange(new Date(timestamp));\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleMouseLeave = () => {\n\t\tonCursorChange?.(null);\n\t};\n\n\treturn (\n\t\t<div ref={containerRef} className={cn(\"relative\", className)}>\n\t\t\t<ChartContainer\n\t\t\t\tconfig={chartConfig}\n\t\t\t\tclassName=\"h-full w-[calc(100%+3rem)] -mx-6\"\n\t\t\t>\n\t\t\t\t<AreaChart\n\t\t\t\t\tdata={chartData}\n\t\t\t\t\tmargin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id=\"eventsGradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\tstopColor=\"var(--color-count)\"\n\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\tstopColor=\"var(--color-count)\"\n\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<XAxis\n\t\t\t\t\t\tdataKey=\"time\"\n\t\t\t\t\t\ttickFormatter={(value: number) => format(new Date(value), \"HH:mm\")}\n\t\t\t\t\t\ttick={{ fontSize: 12 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\tdomain={[\"dataMin\", \"dataMax\"]}\n\t\t\t\t\t\thide={!showAxis}\n\t\t\t\t\t/>\n\t\t\t\t\t<YAxis hide domain={[0, (max: number) => Math.max(1, max)]} />\n\t\t\t\t\t<ChartTooltip content={<EventsTooltipContent />} />\n\t\t\t\t\t<Area\n\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\tdataKey=\"count\"\n\t\t\t\t\t\tstroke=\"var(--color-count)\"\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\tfill=\"url(#eventsGradient)\"\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t/>\n\t\t\t\t</AreaChart>\n\t\t\t</ChartContainer>\n\t\t</div>\n\t);\n});\n","import type { EventsCount } from \"@/api/events\";\nimport { cn } from \"@/utils\";\nimport { EventsLineChart } from \"./events-line-chart\";\n\nexport type InteractiveEventsChartProps = {\n\tdata: EventsCount[];\n\tclassName?: string;\n\tstartDate: Date;\n\tendDate: Date;\n};\n\n/**\n * Interactive wrapper around EventsLineChart.\n */\nexport function InteractiveEventsChart({\n\tdata,\n\tclassName,\n\tstartDate,\n\tendDate,\n}: InteractiveEventsChartProps) {\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<EventsLineChart\n\t\t\t\tdata={data}\n\t\t\t\tclassName=\"h-full w-full\"\n\t\t\t\tshowAxis={false}\n\t\t\t\tstartDate={startDate}\n\t\t\t\tendDate={endDate}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\ttype ResourceOption,\n\tuseResourceOptions,\n} from \"./use-resource-options\";\n\nexport type EventsResourceFilterProps = {\n\tselectedResourceIds: string[];\n\tonResourceIdsChange: (resourceIds: string[]) => void;\n};\n\nconst RESOURCE_TYPE_DISPLAY_NAMES: Record<ResourceOption[\"type\"], string> = {\n\tautomation: \"Automation\",\n\tblock: \"Block\",\n\tdeployment: \"Deployment\",\n\tflow: \"Flow\",\n\t\"work-pool\": \"Work Pool\",\n\t\"work-queue\": \"Work Queue\",\n};\n\nexport function EventsResourceFilter(props: EventsResourceFilterProps) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<EventsResourceFilterImplementation {...props} />\n\t\t</Suspense>\n\t);\n}\n\nfunction EventsResourceFilterImplementation({\n\tselectedResourceIds,\n\tonResourceIdsChange,\n}: EventsResourceFilterProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { resourceOptions } = useResourceOptions();\n\n\tconst filteredOptions = useMemo(() => {\n\t\tif (!deferredSearch) {\n\t\t\treturn resourceOptions;\n\t\t}\n\t\treturn resourceOptions.filter((option) =>\n\t\t\toption.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [resourceOptions, deferredSearch]);\n\n\tconst groupedOptions = useMemo(() => {\n\t\tconst groups: Record<ResourceOption[\"type\"], ResourceOption[]> = {\n\t\t\tautomation: [],\n\t\t\tblock: [],\n\t\t\tdeployment: [],\n\t\t\tflow: [],\n\t\t\t\"work-pool\": [],\n\t\t\t\"work-queue\": [],\n\t\t};\n\n\t\tfor (const option of filteredOptions) {\n\t\t\tgroups[option.type].push(option);\n\t\t}\n\n\t\treturn groups;\n\t}, [filteredOptions]);\n\n\tconst handleToggleResource = (resourceId: string) => {\n\t\tconst isSelected = selectedResourceIds.includes(resourceId);\n\t\tif (isSelected) {\n\t\t\tonResourceIdsChange(\n\t\t\t\tselectedResourceIds.filter((id) => id !== resourceId),\n\t\t\t);\n\t\t} else {\n\t\t\tonResourceIdsChange([...selectedResourceIds, resourceId]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\taria-label=\"Filter by resource\"\n\t\t\t\tselected={selectedResourceIds.length > 0}\n\t\t\t>\n\t\t\t\t{selectedResourceIds.length > 0\n\t\t\t\t\t? `${selectedResourceIds.length} resource${selectedResourceIds.length === 1 ? \"\" : \"s\"} selected`\n\t\t\t\t\t: \"All resources\"}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search resources...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No resources found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t{(\n\t\t\t\t\t\tObject.entries(groupedOptions) as [\n\t\t\t\t\t\t\tResourceOption[\"type\"],\n\t\t\t\t\t\t\tResourceOption[],\n\t\t\t\t\t\t][]\n\t\t\t\t\t).map(([type, options]) =>\n\t\t\t\t\t\toptions.length > 0 ? (\n\t\t\t\t\t\t\t<ComboboxCommandGroup\n\t\t\t\t\t\t\t\tkey={type}\n\t\t\t\t\t\t\t\theading={RESOURCE_TYPE_DISPLAY_NAMES[type]}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{options.map((option) => (\n\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\tkey={option.resourceId}\n\t\t\t\t\t\t\t\t\t\tvalue={option.resourceId}\n\t\t\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(option.resourceId)}\n\t\t\t\t\t\t\t\t\t\tonSelect={handleToggleResource}\n\t\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{option.name}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t) : null,\n\t\t\t\t\t)}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { Link } from \"@tanstack/react-router\";\nimport { format } from \"date-fns\";\nimport { ChevronDown } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { components } from \"@/api/prefect\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardHeader } from \"@/components/ui/card\";\nimport {\n\tCollapsible,\n\tCollapsibleContent,\n\tCollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { JsonView } from \"@/components/ui/json-view\";\nimport { cn } from \"@/utils\";\nimport {\n\tEventResourceDisplay,\n\tEventResourceLink,\n} from \"../event-resource-display\";\nimport {\n\tparseResourceType,\n\tRESOURCE_ICONS,\n\tRESOURCE_TYPE_LABELS,\n} from \"../event-resource-display/resource-types\";\nimport { formatEventLabel } from \"./utilities\";\n\ntype Event = components[\"schemas\"][\"ReceivedEvent\"];\n\ntype EventsTimelineProps = {\n\tevents: Event[];\n\tclassName?: string;\n};\n\ntype EventTimelineItemProps = {\n\tevent: Event;\n\tisLast: boolean;\n};\n\nfunction EventTimestamp({ occurred }: { occurred: string }) {\n\tconst date = new Date(occurred);\n\tconst formattedTime = format(date, \"h:mm:ss a\");\n\tconst formattedDate = format(date, \"MMM do, yyyy\");\n\n\treturn (\n\t\t<div className=\"flex flex-col text-right text-sm w-24 shrink-0\">\n\t\t\t<span>{formattedTime}</span>\n\t\t\t<span className=\"text-xs text-muted-foreground\">{formattedDate}</span>\n\t\t</div>\n\t);\n}\n\nfunction TimelinePoint({ event, isLast }: { event: Event; isLast: boolean }) {\n\tconst resourceId = event.resource[\"prefect.resource.id\"] || \"\";\n\tconst resourceType = parseResourceType(resourceId);\n\tconst iconId = RESOURCE_ICONS[resourceType];\n\n\treturn (\n\t\t<div className=\"relative flex items-start justify-center w-10 h-full\">\n\t\t\t{/* Vertical line - extends from top to bottom, hidden for last item below the icon */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute left-1/2 w-px -translate-x-1/2 bg-border\",\n\t\t\t\t\tisLast ? \"top-0 h-5\" : \"top-0 bottom-0\",\n\t\t\t\t)}\n\t\t\t\tstyle={{ top: \"-1rem\", bottom: isLast ? \"auto\" : \"-1rem\" }}\n\t\t\t/>\n\t\t\t{/* Icon circle */}\n\t\t\t<div className=\"relative flex items-center justify-center w-10 h-10 rounded-full bg-background border border-border\">\n\t\t\t\t<Icon id={iconId} className=\"h-5 w-5 text-muted-foreground\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/**\n * Formats a Date object as YYYY-MM-DD for use in route parameters.\n */\nfunction formatRouteDate(date: Date): string {\n\tconst year = date.getFullYear();\n\tconst month = String(date.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getDate()).padStart(2, \"0\");\n\treturn `${year}-${month}-${day}`;\n}\n\nfunction EventNameWithPrefixes({\n\teventId,\n\teventName,\n\toccurred,\n}: {\n\teventId: string;\n\teventName: string;\n\toccurred: string;\n}) {\n\tconst label = formatEventLabel(eventName);\n\tconst eventDate = formatRouteDate(new Date(occurred));\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t<Link\n\t\t\t\tto=\"/events/event/$eventDate/$eventId\"\n\t\t\t\tparams={{ eventDate, eventId }}\n\t\t\t\tclassName=\"text-left font-medium hover:underline\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</Link>\n\t\t\t<span className=\"text-xs text-muted-foreground font-mono\">\n\t\t\t\t{eventName}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n\nfunction getResourceRole(resource: Record<string, string>): string | undefined {\n\treturn resource[\"prefect.resource.role\"];\n}\n\nfunction getResourceId(resource: Record<string, string>): string {\n\treturn resource[\"prefect.resource.id\"] || \"\";\n}\n\nfunction getResourceName(resource: Record<string, string>): string | null {\n\treturn (\n\t\tresource[\"prefect.resource.name\"] ||\n\t\tresource[\"prefect.name\"] ||\n\t\tresource[\"prefect-cloud.name\"] ||\n\t\tnull\n\t);\n}\n\nfunction EventRelatedResources({\n\trelated,\n}: {\n\trelated: components[\"schemas\"][\"RelatedResource\"][];\n}) {\n\tif (!related || related.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Separate tags from other resources\n\tconst tags: components[\"schemas\"][\"RelatedResource\"][] = [];\n\tconst resources: components[\"schemas\"][\"RelatedResource\"][] = [];\n\n\tfor (const resource of related) {\n\t\tconst role = getResourceRole(resource);\n\t\tif (role === \"tag\") {\n\t\t\ttags.push(resource);\n\t\t} else {\n\t\t\tresources.push(resource);\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<span className=\"text-sm font-medium\">Related Resources</span>\n\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t{resources.map((resource) => {\n\t\t\t\t\tconst resourceId = getResourceId(resource);\n\t\t\t\t\tconst resourceName = getResourceName(resource);\n\t\t\t\t\tconst displayText = resourceName || resourceId;\n\t\t\t\t\tconst resourceType = parseResourceType(resourceId);\n\t\t\t\t\tconst typeLabel = RESOURCE_TYPE_LABELS[resourceType];\n\t\t\t\t\tconst iconId = RESOURCE_ICONS[resourceType];\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<EventResourceLink\n\t\t\t\t\t\t\tkey={resourceId}\n\t\t\t\t\t\t\tresource={resource}\n\t\t\t\t\t\t\trelatedResources={related}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{typeLabel && <span>{typeLabel}</span>}\n\t\t\t\t\t\t\t<Icon id={iconId} className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t<span>{displayText}</span>\n\t\t\t\t\t\t</EventResourceLink>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{tags.length > 0 && (\n\t\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t\t{tags.map((tag) => {\n\t\t\t\t\t\t\tconst tagId = getResourceId(tag);\n\t\t\t\t\t\t\tconst tagName = getResourceName(tag) || tagId.split(\".\").pop();\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Badge key={tagId} variant=\"secondary\">\n\t\t\t\t\t\t\t\t\t{tagName}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction EventTimelineItem({ event, isLast }: EventTimelineItemProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\n\treturn (\n\t\t<div className=\"grid grid-cols-[6rem_2.5rem_1fr] gap-4 items-start py-4\">\n\t\t\t{/* Date column */}\n\t\t\t<EventTimestamp occurred={event.occurred} />\n\n\t\t\t{/* Point column with icon and vertical line */}\n\t\t\t<TimelinePoint event={event} isLast={isLast} />\n\n\t\t\t{/* Content column */}\n\t\t\t<Collapsible open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t\t<Card className=\"py-4\">\n\t\t\t\t\t<CardHeader className=\"py-0\">\n\t\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t<EventNameWithPrefixes\n\t\t\t\t\t\t\t\teventId={event.id}\n\t\t\t\t\t\t\t\teventName={event.event}\n\t\t\t\t\t\t\t\toccurred={event.occurred}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<EventResourceDisplay event={event} />\n\t\t\t\t\t\t\t{event.related && event.related.length > 0 && (\n\t\t\t\t\t\t\t\t<EventRelatedResources related={event.related} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<div className=\"px-6 pt-2\">\n\t\t\t\t\t\t<CollapsibleTrigger asChild>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName=\"w-full justify-center gap-2 text-muted-foreground\"\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tisOpen ? \"Collapse event details\" : \"Expand event details\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"h-4 w-4 transition-transform duration-200\",\n\t\t\t\t\t\t\t\t\t\tisOpen && \"rotate-180\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className=\"text-xs\">\n\t\t\t\t\t\t\t\t\t{isOpen ? \"Hide raw event\" : \"Show raw event\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</CollapsibleTrigger>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CollapsibleContent>\n\t\t\t\t\t\t<CardContent className=\"pt-4\">\n\t\t\t\t\t\t\t<JsonView\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(event, null, 2)}\n\t\t\t\t\t\t\t\tclassName=\"max-h-96 overflow-auto\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</CollapsibleContent>\n\t\t\t\t</Card>\n\t\t\t</Collapsible>\n\t\t</div>\n\t);\n}\n\nexport function EventsTimeline({ events, className }: EventsTimelineProps) {\n\tif (!events || events.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<ol className={cn(\"list-none p-0 m-0\", className)}>\n\t\t\t{events.map((event, index) => (\n\t\t\t\t<li key={event.id}>\n\t\t\t\t\t<EventTimelineItem\n\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\tisLast={index === events.length - 1}\n\t\t\t\t\t/>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ol>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildEventsCountQuery, type EventsCountFilter } from \"@/api/events\";\nimport { getEventPrefixes } from \"@/components/events/events-timeline/utilities\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { Typography } from \"@/components/ui/typography\";\n\nconst MAX_EVENT_TYPES_DISPLAYED = 2;\n\nexport type EventsTypeFilterProps = {\n\tfilter: EventsCountFilter;\n\tselectedEventTypes: string[];\n\tonEventTypesChange: (eventTypes: string[]) => void;\n};\n\nexport function EventsTypeFilter({\n\tfilter,\n\tselectedEventTypes,\n\tonEventTypesChange,\n}: EventsTypeFilterProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: eventCounts = [] } = useQuery(\n\t\tbuildEventsCountQuery(\"event\", filter),\n\t);\n\n\tconst eventTypeOptions = useMemo(() => {\n\t\tconst prefixSet = new Set<string>();\n\n\t\tfor (const eventCount of eventCounts) {\n\t\t\tconst prefixes = getEventPrefixes(eventCount.value);\n\t\t\tfor (const prefix of prefixes) {\n\t\t\t\tprefixSet.add(prefix);\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(prefixSet).sort();\n\t}, [eventCounts]);\n\n\tconst filteredOptions = useMemo(() => {\n\t\tif (!deferredSearch) {\n\t\t\treturn eventTypeOptions;\n\t\t}\n\t\treturn eventTypeOptions.filter((option) =>\n\t\t\toption.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [eventTypeOptions, deferredSearch]);\n\n\tconst handleSelectEventType = (eventType: string) => {\n\t\tconst isSelected = selectedEventTypes.includes(eventType);\n\t\tif (isSelected) {\n\t\t\tonEventTypesChange(\n\t\t\t\tselectedEventTypes.filter((type) => type !== eventType),\n\t\t\t);\n\t\t} else {\n\t\t\tonEventTypesChange([...selectedEventTypes, eventType]);\n\t\t}\n\t};\n\n\tconst handleClearAll = () => {\n\t\tonEventTypesChange([]);\n\t};\n\n\tconst renderSelectedEventTypes = () => {\n\t\tif (selectedEventTypes.length === 0) {\n\t\t\treturn \"All event types\";\n\t\t}\n\n\t\tconst visible = selectedEventTypes.slice(0, MAX_EVENT_TYPES_DISPLAYED);\n\t\tconst extraCount = selectedEventTypes.length - MAX_EVENT_TYPES_DISPLAYED;\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\taria-label=\"Filter by event type\"\n\t\t\t\tselected={selectedEventTypes.length === 0}\n\t\t\t>\n\t\t\t\t{renderSelectedEventTypes()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search event types...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No event types found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\taria-label=\"All event types\"\n\t\t\t\t\t\t\tonSelect={handleClearAll}\n\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\tvalue=\"__all__\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Checkbox checked={selectedEventTypes.length === 0} />\n\t\t\t\t\t\t\tAll event types\n\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t{filteredOptions.map((eventType) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={eventType}\n\t\t\t\t\t\t\t\taria-label={eventType}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelectEventType(eventType)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={eventType}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Checkbox checked={selectedEventTypes.includes(eventType)} />\n\t\t\t\t\t\t\t\t{eventType}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n\tbuildEventsNextPageQuery,\n\tbuildFilterEventsQuery,\n\ttype Event,\n\ttype EventsFilter,\n} from \"@/api/events\";\n\nconst PAGE_SIZE = 50;\n\ntype UseEventsPaginationOptions = {\n\tfilter: EventsFilter;\n};\n\ntype UseEventsPaginationReturn = {\n\tevents: Event[];\n\tcurrentPage: number;\n\ttotalPages: number;\n\ttotal: number;\n\tisLoadingNextPage: boolean;\n\tgoToPage: (page: number) => void;\n\tgoToNextPage: () => void;\n\tgoToPreviousPage: () => void;\n};\n\n/**\n * Hook for cursor-based pagination of events using a token vault pattern.\n *\n * The backend uses cursor-based pagination where each page response includes\n * a `next_page` URL containing a token to fetch the next page. This hook\n * manages these tokens in a \"vault\" (a Map) to enable bidirectional navigation.\n *\n * Key features:\n * - `tokenVault[n]` contains the token to fetch page `n+1`\n * - Clears token vault when filter changes (detected via JSON.stringify comparison)\n * - Stores next page tokens from API responses as they're received\n * - Uses `useQuery` for both the first page and subsequent pages\n *\n * @param options - Configuration options\n * @param options.filter - The events filter to apply\n * @returns Pagination state and navigation functions\n *\n * @example\n * ```tsx\n * const {\n * events,\n * currentPage,\n * totalPages,\n * isLoadingNextPage,\n * goToPage,\n * goToNextPage,\n * goToPreviousPage,\n * } = useEventsPagination({ filter: myFilter });\n * ```\n */\nexport function useEventsPagination({\n\tfilter,\n}: UseEventsPaginationOptions): UseEventsPaginationReturn {\n\tconst [currentPage, setCurrentPage] = useState(1);\n\tconst tokenVault = useRef<Map<number, string>>(new Map());\n\tconst previousFilterRef = useRef<string>(JSON.stringify(filter));\n\n\t// Reset pagination when filter changes\n\tuseEffect(() => {\n\t\tconst currentFilterString = JSON.stringify(filter);\n\t\tif (previousFilterRef.current !== currentFilterString) {\n\t\t\ttokenVault.current.clear();\n\t\t\tsetCurrentPage(1);\n\t\t\tpreviousFilterRef.current = currentFilterString;\n\t\t}\n\t}, [filter]);\n\n\t// First page query - always fetches the first page\n\tconst firstPageQuery = useQuery(buildFilterEventsQuery(filter));\n\n\t// Store the next_page token from first page response\n\tuseEffect(() => {\n\t\tif (firstPageQuery.data?.next_page) {\n\t\t\ttokenVault.current.set(1, firstPageQuery.data.next_page);\n\t\t}\n\t}, [firstPageQuery.data?.next_page]);\n\n\t// Get the token for the current page (if not page 1)\n\tconst currentPageToken =\n\t\tcurrentPage > 1 ? tokenVault.current.get(currentPage - 1) : null;\n\n\t// Subsequent page query - only enabled when we have a token and not on page 1\n\tconst nextPageQuery = useQuery({\n\t\t...buildEventsNextPageQuery(currentPageToken ?? \"\"),\n\t\tenabled: currentPage > 1 && !!currentPageToken,\n\t});\n\n\t// Store the next_page token from subsequent page responses\n\tuseEffect(() => {\n\t\tif (nextPageQuery.data?.next_page && currentPage > 1) {\n\t\t\ttokenVault.current.set(currentPage, nextPageQuery.data.next_page);\n\t\t}\n\t}, [nextPageQuery.data?.next_page, currentPage]);\n\n\t// Calculate total pages from the first page total count\n\tconst total = firstPageQuery.data?.total ?? 0;\n\tconst totalPages = Math.ceil(total / PAGE_SIZE);\n\n\t// Determine current events based on which page we're on\n\tconst events =\n\t\tcurrentPage === 1\n\t\t\t? (firstPageQuery.data?.events ?? [])\n\t\t\t: (nextPageQuery.data?.events ?? firstPageQuery.data?.events ?? []);\n\n\tconst isLoadingNextPage = currentPage > 1 && nextPageQuery.isLoading;\n\n\tconst goToPage = (page: number) => {\n\t\tif (page < 1 || page > totalPages) return;\n\t\tif (page > 1 && !tokenVault.current.has(page - 1)) {\n\t\t\treturn;\n\t\t}\n\t\tsetCurrentPage(page);\n\t};\n\n\tconst goToNextPage = () => {\n\t\tif (currentPage < totalPages && tokenVault.current.has(currentPage)) {\n\t\t\tsetCurrentPage(currentPage + 1);\n\t\t}\n\t};\n\n\tconst goToPreviousPage = () => {\n\t\tif (currentPage > 1) {\n\t\t\tsetCurrentPage(currentPage - 1);\n\t\t}\n\t};\n\n\treturn {\n\t\tevents,\n\t\tcurrentPage,\n\t\ttotalPages,\n\t\ttotal,\n\t\tisLoadingNextPage,\n\t\tgoToPage,\n\t\tgoToNextPage,\n\t\tgoToPreviousPage,\n\t};\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { buildEventsHistoryQuery } from \"@/api/events\";\nimport {\n\tbuildEventsCountFilterFromSearch,\n\tbuildEventsFilterFromSearch,\n\ttype EventsSearchParams,\n\tgetDateRangeFromSearch,\n} from \"@/api/events/filters\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport {\n\ttype DateRangeSelectValue,\n\tRichDateRangeSelector,\n} from \"@/components/ui/date-range-select\";\nimport {\n\tEmptyState,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n\tPagination,\n\tPaginationContent,\n\tPaginationItem,\n\tPaginationNextButton,\n\tPaginationPreviousButton,\n} from \"@/components/ui/pagination\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { cn } from \"@/utils\";\nimport { InteractiveEventsChart } from \"../events-line-chart\";\nimport { EventsResourceFilter } from \"../events-resource-filter\";\nimport { EventsTimeline } from \"../events-timeline\";\nimport { EventsTypeFilter } from \"../events-type-filter\";\nimport { useEventsPagination } from \"./use-events-pagination\";\n\nexport type EventsPageProps = {\n\tsearch: EventsSearchParams;\n\tonSearchChange: (search: Partial<EventsSearchParams>) => void;\n};\n\nexport function EventsPage({ search, onSearchChange }: EventsPageProps) {\n\t// Get the date range using the same logic as the route loader\n\t// This ensures query keys match and prevents infinite Suspense retries\n\tconst dateRange = getDateRangeFromSearch(search);\n\n\tconst eventsFilter = buildEventsFilterFromSearch(search);\n\tconst countFilter = buildEventsCountFilterFromSearch({\n\t\t...search,\n\t\trangeType: \"range\",\n\t\tstart: dateRange.from,\n\t\tend: dateRange.to,\n\t});\n\n\t// Create separate filter for type dropdown (without event filter)\n\t// This ensures all event types are shown regardless of current selection\n\tconst countFilterForTypeDropdown = buildEventsCountFilterFromSearch({\n\t\tresource: search.resource,\n\t\trangeType: \"range\",\n\t\tstart: dateRange.from,\n\t\tend: dateRange.to,\n\t});\n\n\t// Pagination\n\tconst {\n\t\tevents,\n\t\tcurrentPage,\n\t\ttotalPages,\n\t\tisLoadingNextPage,\n\t\tgoToNextPage,\n\t\tgoToPreviousPage,\n\t} = useEventsPagination({ filter: eventsFilter });\n\n\t// Chart histogram data\n\tconst { data: historyData } = useQuery(buildEventsHistoryQuery(countFilter));\n\n\t// Handlers - using correct property names that match EventsSearchParams\n\tconst handleResourceIdsChange = (resourceIds: string[]) => {\n\t\tonSearchChange({ resource: resourceIds });\n\t};\n\n\tconst handleEventTypesChange = (eventPrefixes: string[]) => {\n\t\tonSearchChange({ event: eventPrefixes });\n\t};\n\n\tconst handleDateRangeChange = (value: DateRangeSelectValue) => {\n\t\tif (value?.type === \"span\") {\n\t\t\tonSearchChange({ rangeType: \"span\", seconds: value.seconds });\n\t\t} else if (value?.type === \"range\") {\n\t\t\tonSearchChange({\n\t\t\t\trangeType: \"range\",\n\t\t\t\tstart: value.startDate.toISOString(),\n\t\t\t\tend: value.endDate.toISOString(),\n\t\t\t});\n\t\t}\n\t};\n\n\t// Sticky chart behavior\n\tconst [isChartSticky, setIsChartSticky] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst handleScroll = () => {\n\t\t\t// Chart becomes sticky when scrolled past 100px\n\t\t\tsetIsChartSticky(window.scrollY > 100);\n\t\t};\n\n\t\twindow.addEventListener(\"scroll\", handleScroll);\n\t\treturn () => window.removeEventListener(\"scroll\", handleScroll);\n\t}, []);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Breadcrumb>\n\t\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\t\tEvent Feed\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t\t</Breadcrumb>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Filters */}\n\t\t\t<div className=\"grid grid-cols-1 gap-4 sm:grid-cols-[2fr_1fr]\">\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t<Label>Resource</Label>\n\t\t\t\t\t<Suspense fallback={<Skeleton className=\"h-10 w-full\" />}>\n\t\t\t\t\t\t<EventsResourceFilter\n\t\t\t\t\t\t\tselectedResourceIds={search.resource ?? []}\n\t\t\t\t\t\t\tonResourceIdsChange={handleResourceIdsChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t<Label>Events</Label>\n\t\t\t\t\t<Suspense fallback={<Skeleton className=\"h-10 w-full\" />}>\n\t\t\t\t\t\t<EventsTypeFilter\n\t\t\t\t\t\t\tfilter={countFilterForTypeDropdown}\n\t\t\t\t\t\t\tselectedEventTypes={search.event ?? []}\n\t\t\t\t\t\t\tonEventTypesChange={handleEventTypesChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Chart - sticky when scrolling */}\n\t\t\t<Card\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"sticky top-0 z-10 transition-shadow\",\n\t\t\t\t\tisChartSticky && \"shadow-lg\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CardContent className=\"pt-6\">\n\t\t\t\t\t<InteractiveEventsChart\n\t\t\t\t\t\tdata={historyData ?? []}\n\t\t\t\t\t\tclassName=\"h-32\"\n\t\t\t\t\t\tstartDate={new Date(dateRange.from)}\n\t\t\t\t\t\tendDate={new Date(dateRange.to)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex justify-center pt-3\">\n\t\t\t\t\t\t<RichDateRangeSelector\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\tsearch.rangeType === \"range\" && search.start && search.end\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"range\",\n\t\t\t\t\t\t\t\t\t\t\tstartDate: new Date(search.start),\n\t\t\t\t\t\t\t\t\t\t\tendDate: new Date(search.end),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: { type: \"span\", seconds: search.seconds ?? -86400 }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonValueChange={handleDateRangeChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\n\t\t\t{/* Events timeline or empty state */}\n\t\t\t{events.length === 0 ? (\n\t\t\t\t<EmptyState>\n\t\t\t\t\t<EmptyStateIcon id=\"Calendar\" />\n\t\t\t\t\t<EmptyStateTitle>No events found</EmptyStateTitle>\n\t\t\t\t\t<EmptyStateDescription>\n\t\t\t\t\t\tNo events match your current filters. Try adjusting your date range\n\t\t\t\t\t\tor filters.\n\t\t\t\t\t</EmptyStateDescription>\n\t\t\t\t</EmptyState>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<EventsTimeline events={events} />\n\n\t\t\t\t\t{/* Pagination */}\n\t\t\t\t\t{totalPages > 1 && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-center gap-2\">\n\t\t\t\t\t\t\t<Pagination>\n\t\t\t\t\t\t\t\t<PaginationContent>\n\t\t\t\t\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t\t\t\t\t<PaginationPreviousButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToPreviousPage}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={currentPage <= 1}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"px-2\">\n\t\t\t\t\t\t\t\t\t\t\tPage {currentPage} of {totalPages}\n\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t\t\t\t\t<PaginationNextButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToNextPage}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={currentPage >= totalPages}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t\t\t\t</PaginationContent>\n\t\t\t\t\t\t\t</Pagination>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{isLoadingNextPage && (\n\t\t\t\t\t\t<div className=\"flex justify-center py-4\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { Suspense } from \"react\";\nimport { z } from \"zod\";\nimport { buildEventsHistoryQuery, buildFilterEventsQuery } from \"@/api/events\";\nimport {\n\tbuildEventsCountFilterFromSearch,\n\tbuildEventsFilterFromSearch,\n\ttype EventsSearchParams,\n} from \"@/api/events/filters\";\nimport { EventsPage } from \"@/components/events/events-page\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\n/**\n * Schema for validating URL search parameters for the events page.\n * Uses existing parameter names (resource, event) for compatibility with API infrastructure.\n */\nconst searchParams = z.object({\n\tresource: z.array(z.string()).optional(),\n\tevent: z.array(z.string()).optional(),\n\trangeType: z.enum([\"span\", \"range\"]).optional().default(\"span\"),\n\tseconds: z.number().optional().default(-86400),\n\tstart: z.string().optional(),\n\tend: z.string().optional(),\n\torder: z.enum([\"ASC\", \"DESC\"]).optional(),\n});\n\n/**\n * Skeleton component shown while the events page is loading.\n * Displays placeholder elements for header, filters, chart, and timeline.\n */\nfunction EventsPageSkeleton() {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t{/* Header skeleton */}\n\t\t\t<Skeleton className=\"h-8 w-48\" />\n\t\t\t{/* Filters skeleton */}\n\t\t\t<div className=\"flex flex-wrap gap-4\">\n\t\t\t\t<Skeleton className=\"h-10 w-48\" />\n\t\t\t\t<Skeleton className=\"h-10 w-48\" />\n\t\t\t\t<Skeleton className=\"h-10 w-48\" />\n\t\t\t</div>\n\t\t\t{/* Chart area skeleton */}\n\t\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t\t{/* Timeline area skeleton */}\n\t\t\t<Skeleton className=\"h-64 w-full\" />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/events/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tloaderDeps: ({ search }) => search,\n\twrapInSuspense: true,\n\tpendingComponent: EventsPageSkeleton,\n\tloader: ({ deps: search, context: { queryClient } }) => {\n\t\tconst eventsFilter = buildEventsFilterFromSearch(search);\n\t\tconst countFilter = buildEventsCountFilterFromSearch(search);\n\n\t\t// Prefetch queries without blocking route loading\n\t\tvoid queryClient.prefetchQuery(buildFilterEventsQuery(eventsFilter));\n\t\tvoid queryClient.prefetchQuery(buildEventsHistoryQuery(countFilter));\n\t},\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst handleSearchChange = (updates: Partial<EventsSearchParams>) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({ ...prev, ...updates }),\n\t\t\treplace: true,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Suspense fallback={<EventsPageSkeleton />}>\n\t\t\t<EventsPage search={search} onSearchChange={handleSearchChange} />\n\t\t</Suspense>\n\t);\n}\n"],"names":["EventsTooltipContent","active","payload","point","jsxs","jsx","format","chartConfig","EventsLineChart","forwardRef","data","className","showAxis","startDate","endDate","onCursorChange","ref","containerRef","useRef","useImperativeHandle","chartData","useMemo","points","item","startTime","endTime","handleMouseMove","state","timestamp","handleMouseLeave","cn","ChartContainer","AreaChart","XAxis","value","YAxis","max","ChartTooltip","Area","InteractiveEventsChart","RESOURCE_TYPE_DISPLAY_NAMES","EventsResourceFilter","props","Suspense","EventsResourceFilterImplementation","selectedResourceIds","onResourceIdsChange","search","setSearch","useState","deferredSearch","useDeferredValue","resourceOptions","useResourceOptions","filteredOptions","option","groupedOptions","groups","handleToggleResource","resourceId","isSelected","id","Combobox","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","type","options","ComboboxCommandGroup","ComboboxCommandItem","EventTimestamp","occurred","date","formattedTime","formattedDate","TimelinePoint","event","isLast","resourceType","parseResourceType","iconId","RESOURCE_ICONS","Icon","formatRouteDate","year","month","day","EventNameWithPrefixes","eventId","eventName","label","formatEventLabel","eventDate","Link","getResourceRole","resource","getResourceId","getResourceName","EventRelatedResources","related","tags","resources","displayText","typeLabel","RESOURCE_TYPE_LABELS","EventResourceLink","tag","tagId","tagName","Badge","EventTimelineItem","isOpen","setIsOpen","Collapsible","Card","CardHeader","EventResourceDisplay","CollapsibleTrigger","Button","ChevronDown","CollapsibleContent","CardContent","JsonView","EventsTimeline","events","index","MAX_EVENT_TYPES_DISPLAYED","EventsTypeFilter","filter","selectedEventTypes","onEventTypesChange","eventCounts","useQuery","buildEventsCountQuery","eventTypeOptions","prefixSet","eventCount","prefixes","getEventPrefixes","prefix","handleSelectEventType","eventType","handleClearAll","renderSelectedEventTypes","visible","extraCount","Typography","Checkbox","PAGE_SIZE","useEventsPagination","currentPage","setCurrentPage","tokenVault","previousFilterRef","useEffect","currentFilterString","firstPageQuery","buildFilterEventsQuery","currentPageToken","nextPageQuery","buildEventsNextPageQuery","total","totalPages","isLoadingNextPage","page","EventsPage","onSearchChange","dateRange","getDateRangeFromSearch","eventsFilter","buildEventsFilterFromSearch","countFilter","buildEventsCountFilterFromSearch","countFilterForTypeDropdown","goToNextPage","goToPreviousPage","historyData","buildEventsHistoryQuery","handleResourceIdsChange","resourceIds","handleEventTypesChange","eventPrefixes","handleDateRangeChange","isChartSticky","setIsChartSticky","handleScroll","Breadcrumb","BreadcrumbList","BreadcrumbItem","Label","Skeleton","RichDateRangeSelector","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","Fragment","Pagination","PaginationContent","PaginationItem","PaginationPreviousButton","PaginationNextButton","EventsPageSkeleton","RouteComponent","Route","useSearch","navigate","useNavigate","handleSearchChange","updates","to","prev","replace"],"mappings":"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"}
1
+ {"version":3,"file":"index-enqoJV8x.js","sources":["../../src/components/events/events-line-chart/events-line-chart.tsx","../../src/components/events/events-line-chart/interactive-events-chart.tsx","../../src/components/events/events-resource-filter/events-resource-filter.tsx","../../src/components/events/events-timeline/events-timeline.tsx","../../src/components/events/events-type-filter/events-type-filter.tsx","../../src/components/events/events-page/use-events-pagination.ts","../../src/components/events/events-page/events-page.tsx","../../src/routes/events/index.tsx?tsr-split=component"],"sourcesContent":["import { format } from \"date-fns\";\nimport { forwardRef, useImperativeHandle, useMemo, useRef } from \"react\";\nimport { Area, AreaChart, XAxis, YAxis } from \"recharts\";\nimport type { EventsCount } from \"@/api/events\";\nimport { ChartContainer, ChartTooltip } from \"@/components/ui/chart\";\nimport { cn } from \"@/utils\";\n\ntype ChartDataPoint = {\n\ttime: number;\n\tcount: number;\n\tlabel: string;\n};\n\ntype EventsTooltipProps = {\n\tactive?: boolean;\n\tpayload?: Array<{ payload?: ChartDataPoint }>;\n};\n\nconst EventsTooltipContent = ({ active, payload }: EventsTooltipProps) => {\n\tif (!active || !payload || !payload.length) return null;\n\n\tconst firstPayloadItem = payload[0];\n\tconst point = firstPayloadItem?.payload;\n\n\tif (\n\t\t!point ||\n\t\ttypeof point.time !== \"number\" ||\n\t\ttypeof point.count !== \"number\"\n\t) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"bg-popover border rounded-lg p-2 shadow-md\">\n\t\t\t<div className=\"text-sm font-medium\">{point.count} events</div>\n\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t{format(new Date(point.time), \"PPp\")}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport type EventsLineChartProps = {\n\tdata: EventsCount[];\n\tclassName?: string;\n\t/** Whether to show the X-axis with time labels (default: true) */\n\tshowAxis?: boolean;\n\t/** Date range start for chart display */\n\tstartDate?: Date;\n\t/** Date range end for chart display */\n\tendDate?: Date;\n\t/** Called when mouse hovers over chart with timestamp */\n\tonCursorChange?: (timestamp: Date | null) => void;\n};\n\nexport type EventsLineChartRef = {\n\tclearSelection: () => void;\n};\n\nconst chartConfig = {\n\tcount: {\n\t\tlabel: \"Events\",\n\t\tcolor: \"hsl(262.1 83.3% 57.8%)\",\n\t},\n};\n\nexport const EventsLineChart = forwardRef<\n\tEventsLineChartRef,\n\tEventsLineChartProps\n>(function EventsLineChart(\n\t{ data, className, showAxis = true, startDate, endDate, onCursorChange },\n\tref,\n) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tuseImperativeHandle(ref, () => ({\n\t\tclearSelection: () => {\n\t\t\t// Selection clearing logic handled by parent\n\t\t},\n\t}));\n\n\tconst chartData = useMemo(() => {\n\t\tconst points = data.map((item) => ({\n\t\t\ttime: new Date(item.start_time).getTime(),\n\t\t\tcount: item.count,\n\t\t\tlabel: item.label,\n\t\t}));\n\n\t\t// Ensure we have boundary points at startDate and endDate so the line\n\t\t// extends across the full chart width (matching Vue implementation)\n\t\tif (startDate && endDate) {\n\t\t\tconst startTime = startDate.getTime();\n\t\t\tconst endTime = endDate.getTime();\n\n\t\t\t// Add start boundary point if not present\n\t\t\tif (points.length === 0 || points[0].time > startTime) {\n\t\t\t\tpoints.unshift({ time: startTime, count: 0, label: \"\" });\n\t\t\t}\n\n\t\t\t// Add end boundary point if not present\n\t\t\tif (points.length === 0 || points[points.length - 1].time < endTime) {\n\t\t\t\tpoints.push({ time: endTime, count: 0, label: \"\" });\n\t\t\t}\n\t\t}\n\n\t\treturn points;\n\t}, [data, startDate, endDate]);\n\n\tconst handleMouseMove = (state: { activeLabel?: string | number }) => {\n\t\tif (state.activeLabel !== undefined && onCursorChange) {\n\t\t\tconst timestamp =\n\t\t\t\ttypeof state.activeLabel === \"number\"\n\t\t\t\t\t? state.activeLabel\n\t\t\t\t\t: Number(state.activeLabel);\n\t\t\tif (!Number.isNaN(timestamp)) {\n\t\t\t\tonCursorChange(new Date(timestamp));\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleMouseLeave = () => {\n\t\tonCursorChange?.(null);\n\t};\n\n\treturn (\n\t\t<div ref={containerRef} className={cn(\"relative\", className)}>\n\t\t\t<ChartContainer\n\t\t\t\tconfig={chartConfig}\n\t\t\t\tclassName=\"h-full w-[calc(100%+3rem)] -mx-6\"\n\t\t\t>\n\t\t\t\t<AreaChart\n\t\t\t\t\tdata={chartData}\n\t\t\t\t\tmargin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id=\"eventsGradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\t\t\t\tstopColor=\"var(--color-count)\"\n\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\t\t\t\tstopColor=\"var(--color-count)\"\n\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<XAxis\n\t\t\t\t\t\tdataKey=\"time\"\n\t\t\t\t\t\ttickFormatter={(value: number) => format(new Date(value), \"HH:mm\")}\n\t\t\t\t\t\ttick={{ fontSize: 12 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\tdomain={[\"dataMin\", \"dataMax\"]}\n\t\t\t\t\t\thide={!showAxis}\n\t\t\t\t\t/>\n\t\t\t\t\t<YAxis hide domain={[0, (max: number) => Math.max(1, max)]} />\n\t\t\t\t\t<ChartTooltip content={<EventsTooltipContent />} />\n\t\t\t\t\t<Area\n\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\tdataKey=\"count\"\n\t\t\t\t\t\tstroke=\"var(--color-count)\"\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\tfill=\"url(#eventsGradient)\"\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t/>\n\t\t\t\t</AreaChart>\n\t\t\t</ChartContainer>\n\t\t</div>\n\t);\n});\n","import type { EventsCount } from \"@/api/events\";\nimport { cn } from \"@/utils\";\nimport { EventsLineChart } from \"./events-line-chart\";\n\nexport type InteractiveEventsChartProps = {\n\tdata: EventsCount[];\n\tclassName?: string;\n\tstartDate: Date;\n\tendDate: Date;\n};\n\n/**\n * Interactive wrapper around EventsLineChart.\n */\nexport function InteractiveEventsChart({\n\tdata,\n\tclassName,\n\tstartDate,\n\tendDate,\n}: InteractiveEventsChartProps) {\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<EventsLineChart\n\t\t\t\tdata={data}\n\t\t\t\tclassName=\"h-full w-full\"\n\t\t\t\tshowAxis={false}\n\t\t\t\tstartDate={startDate}\n\t\t\t\tendDate={endDate}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { Suspense, useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\ttype ResourceOption,\n\tuseResourceOptions,\n} from \"./use-resource-options\";\n\nexport type EventsResourceFilterProps = {\n\tselectedResourceIds: string[];\n\tonResourceIdsChange: (resourceIds: string[]) => void;\n};\n\nconst RESOURCE_TYPE_DISPLAY_NAMES: Record<ResourceOption[\"type\"], string> = {\n\tautomation: \"Automation\",\n\tblock: \"Block\",\n\tdeployment: \"Deployment\",\n\tflow: \"Flow\",\n\t\"work-pool\": \"Work Pool\",\n\t\"work-queue\": \"Work Queue\",\n};\n\nexport function EventsResourceFilter(props: EventsResourceFilterProps) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<EventsResourceFilterImplementation {...props} />\n\t\t</Suspense>\n\t);\n}\n\nfunction EventsResourceFilterImplementation({\n\tselectedResourceIds,\n\tonResourceIdsChange,\n}: EventsResourceFilterProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { resourceOptions } = useResourceOptions();\n\n\tconst filteredOptions = useMemo(() => {\n\t\tif (!deferredSearch) {\n\t\t\treturn resourceOptions;\n\t\t}\n\t\treturn resourceOptions.filter((option) =>\n\t\t\toption.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [resourceOptions, deferredSearch]);\n\n\tconst groupedOptions = useMemo(() => {\n\t\tconst groups: Record<ResourceOption[\"type\"], ResourceOption[]> = {\n\t\t\tautomation: [],\n\t\t\tblock: [],\n\t\t\tdeployment: [],\n\t\t\tflow: [],\n\t\t\t\"work-pool\": [],\n\t\t\t\"work-queue\": [],\n\t\t};\n\n\t\tfor (const option of filteredOptions) {\n\t\t\tgroups[option.type].push(option);\n\t\t}\n\n\t\treturn groups;\n\t}, [filteredOptions]);\n\n\tconst handleToggleResource = (resourceId: string) => {\n\t\tconst isSelected = selectedResourceIds.includes(resourceId);\n\t\tif (isSelected) {\n\t\t\tonResourceIdsChange(\n\t\t\t\tselectedResourceIds.filter((id) => id !== resourceId),\n\t\t\t);\n\t\t} else {\n\t\t\tonResourceIdsChange([...selectedResourceIds, resourceId]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\taria-label=\"Filter by resource\"\n\t\t\t\tselected={selectedResourceIds.length > 0}\n\t\t\t>\n\t\t\t\t{selectedResourceIds.length > 0\n\t\t\t\t\t? `${selectedResourceIds.length} resource${selectedResourceIds.length === 1 ? \"\" : \"s\"} selected`\n\t\t\t\t\t: \"All resources\"}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search resources...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No resources found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t{(\n\t\t\t\t\t\tObject.entries(groupedOptions) as [\n\t\t\t\t\t\t\tResourceOption[\"type\"],\n\t\t\t\t\t\t\tResourceOption[],\n\t\t\t\t\t\t][]\n\t\t\t\t\t).map(([type, options]) =>\n\t\t\t\t\t\toptions.length > 0 ? (\n\t\t\t\t\t\t\t<ComboboxCommandGroup\n\t\t\t\t\t\t\t\tkey={type}\n\t\t\t\t\t\t\t\theading={RESOURCE_TYPE_DISPLAY_NAMES[type]}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{options.map((option) => (\n\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\tkey={option.resourceId}\n\t\t\t\t\t\t\t\t\t\tvalue={option.resourceId}\n\t\t\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(option.resourceId)}\n\t\t\t\t\t\t\t\t\t\tonSelect={handleToggleResource}\n\t\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{option.name}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t) : null,\n\t\t\t\t\t)}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { Link } from \"@tanstack/react-router\";\nimport { format } from \"date-fns\";\nimport { ChevronDown } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { components } from \"@/api/prefect\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardHeader } from \"@/components/ui/card\";\nimport {\n\tCollapsible,\n\tCollapsibleContent,\n\tCollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { JsonView } from \"@/components/ui/json-view\";\nimport { cn } from \"@/utils\";\nimport {\n\tEventResourceDisplay,\n\tEventResourceLink,\n} from \"../event-resource-display\";\nimport {\n\tparseResourceType,\n\tRESOURCE_ICONS,\n\tRESOURCE_TYPE_LABELS,\n} from \"../event-resource-display/resource-types\";\nimport { formatEventLabel } from \"./utilities\";\n\ntype Event = components[\"schemas\"][\"ReceivedEvent\"];\n\ntype EventsTimelineProps = {\n\tevents: Event[];\n\tclassName?: string;\n};\n\ntype EventTimelineItemProps = {\n\tevent: Event;\n\tisLast: boolean;\n};\n\nfunction EventTimestamp({ occurred }: { occurred: string }) {\n\tconst date = new Date(occurred);\n\tconst formattedTime = format(date, \"h:mm:ss a\");\n\tconst formattedDate = format(date, \"MMM do, yyyy\");\n\n\treturn (\n\t\t<div className=\"flex flex-col text-right text-sm w-24 shrink-0\">\n\t\t\t<span>{formattedTime}</span>\n\t\t\t<span className=\"text-xs text-muted-foreground\">{formattedDate}</span>\n\t\t</div>\n\t);\n}\n\nfunction TimelinePoint({ event, isLast }: { event: Event; isLast: boolean }) {\n\tconst resourceId = event.resource[\"prefect.resource.id\"] || \"\";\n\tconst resourceType = parseResourceType(resourceId);\n\tconst iconId = RESOURCE_ICONS[resourceType];\n\n\treturn (\n\t\t<div className=\"relative flex items-start justify-center w-10 h-full\">\n\t\t\t{/* Vertical line - extends from top to bottom, hidden for last item below the icon */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute left-1/2 w-px -translate-x-1/2 bg-border\",\n\t\t\t\t\tisLast ? \"top-0 h-5\" : \"top-0 bottom-0\",\n\t\t\t\t)}\n\t\t\t\tstyle={{ top: \"-1rem\", bottom: isLast ? \"auto\" : \"-1rem\" }}\n\t\t\t/>\n\t\t\t{/* Icon circle */}\n\t\t\t<div className=\"relative flex items-center justify-center w-10 h-10 rounded-full bg-background border border-border\">\n\t\t\t\t<Icon id={iconId} className=\"h-5 w-5 text-muted-foreground\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/**\n * Formats a Date object as YYYY-MM-DD for use in route parameters.\n */\nfunction formatRouteDate(date: Date): string {\n\tconst year = date.getFullYear();\n\tconst month = String(date.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getDate()).padStart(2, \"0\");\n\treturn `${year}-${month}-${day}`;\n}\n\nfunction EventNameWithPrefixes({\n\teventId,\n\teventName,\n\toccurred,\n}: {\n\teventId: string;\n\teventName: string;\n\toccurred: string;\n}) {\n\tconst label = formatEventLabel(eventName);\n\tconst eventDate = formatRouteDate(new Date(occurred));\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t<Link\n\t\t\t\tto=\"/events/event/$eventDate/$eventId\"\n\t\t\t\tparams={{ eventDate, eventId }}\n\t\t\t\tclassName=\"text-left font-medium hover:underline\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</Link>\n\t\t\t<span className=\"text-xs text-muted-foreground font-mono\">\n\t\t\t\t{eventName}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n\nfunction getResourceRole(resource: Record<string, string>): string | undefined {\n\treturn resource[\"prefect.resource.role\"];\n}\n\nfunction getResourceId(resource: Record<string, string>): string {\n\treturn resource[\"prefect.resource.id\"] || \"\";\n}\n\nfunction getResourceName(resource: Record<string, string>): string | null {\n\treturn (\n\t\tresource[\"prefect.resource.name\"] ||\n\t\tresource[\"prefect.name\"] ||\n\t\tresource[\"prefect-cloud.name\"] ||\n\t\tnull\n\t);\n}\n\nfunction EventRelatedResources({\n\trelated,\n}: {\n\trelated: components[\"schemas\"][\"RelatedResource\"][];\n}) {\n\tif (!related || related.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Separate tags from other resources\n\tconst tags: components[\"schemas\"][\"RelatedResource\"][] = [];\n\tconst resources: components[\"schemas\"][\"RelatedResource\"][] = [];\n\n\tfor (const resource of related) {\n\t\tconst role = getResourceRole(resource);\n\t\tif (role === \"tag\") {\n\t\t\ttags.push(resource);\n\t\t} else {\n\t\t\tresources.push(resource);\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<span className=\"text-sm font-medium\">Related Resources</span>\n\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t{resources.map((resource) => {\n\t\t\t\t\tconst resourceId = getResourceId(resource);\n\t\t\t\t\tconst resourceName = getResourceName(resource);\n\t\t\t\t\tconst displayText = resourceName || resourceId;\n\t\t\t\t\tconst resourceType = parseResourceType(resourceId);\n\t\t\t\t\tconst typeLabel = RESOURCE_TYPE_LABELS[resourceType];\n\t\t\t\t\tconst iconId = RESOURCE_ICONS[resourceType];\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<EventResourceLink\n\t\t\t\t\t\t\tkey={resourceId}\n\t\t\t\t\t\t\tresource={resource}\n\t\t\t\t\t\t\trelatedResources={related}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{typeLabel && <span>{typeLabel}</span>}\n\t\t\t\t\t\t\t<Icon id={iconId} className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t<span>{displayText}</span>\n\t\t\t\t\t\t</EventResourceLink>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{tags.length > 0 && (\n\t\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t\t{tags.map((tag) => {\n\t\t\t\t\t\t\tconst tagId = getResourceId(tag);\n\t\t\t\t\t\t\tconst tagName = getResourceName(tag) || tagId.split(\".\").pop();\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Badge key={tagId} variant=\"secondary\">\n\t\t\t\t\t\t\t\t\t{tagName}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction EventTimelineItem({ event, isLast }: EventTimelineItemProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\n\treturn (\n\t\t<div className=\"grid grid-cols-[6rem_2.5rem_1fr] gap-4 items-start py-4\">\n\t\t\t{/* Date column */}\n\t\t\t<EventTimestamp occurred={event.occurred} />\n\n\t\t\t{/* Point column with icon and vertical line */}\n\t\t\t<TimelinePoint event={event} isLast={isLast} />\n\n\t\t\t{/* Content column */}\n\t\t\t<Collapsible open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t\t<Card className=\"py-4\">\n\t\t\t\t\t<CardHeader className=\"py-0\">\n\t\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t<EventNameWithPrefixes\n\t\t\t\t\t\t\t\teventId={event.id}\n\t\t\t\t\t\t\t\teventName={event.event}\n\t\t\t\t\t\t\t\toccurred={event.occurred}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<EventResourceDisplay event={event} />\n\t\t\t\t\t\t\t{event.related && event.related.length > 0 && (\n\t\t\t\t\t\t\t\t<EventRelatedResources related={event.related} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<div className=\"px-6 pt-2\">\n\t\t\t\t\t\t<CollapsibleTrigger asChild>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName=\"w-full justify-center gap-2 text-muted-foreground\"\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tisOpen ? \"Collapse event details\" : \"Expand event details\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"h-4 w-4 transition-transform duration-200\",\n\t\t\t\t\t\t\t\t\t\tisOpen && \"rotate-180\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className=\"text-xs\">\n\t\t\t\t\t\t\t\t\t{isOpen ? \"Hide raw event\" : \"Show raw event\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</CollapsibleTrigger>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CollapsibleContent>\n\t\t\t\t\t\t<CardContent className=\"pt-4\">\n\t\t\t\t\t\t\t<JsonView\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(event, null, 2)}\n\t\t\t\t\t\t\t\tclassName=\"max-h-96 overflow-auto\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</CollapsibleContent>\n\t\t\t\t</Card>\n\t\t\t</Collapsible>\n\t\t</div>\n\t);\n}\n\nexport function EventsTimeline({ events, className }: EventsTimelineProps) {\n\tif (!events || events.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<ol className={cn(\"list-none p-0 m-0\", className)}>\n\t\t\t{events.map((event, index) => (\n\t\t\t\t<li key={event.id}>\n\t\t\t\t\t<EventTimelineItem\n\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\tisLast={index === events.length - 1}\n\t\t\t\t\t/>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ol>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildEventsCountQuery, type EventsCountFilter } from \"@/api/events\";\nimport { getEventPrefixes } from \"@/components/events/events-timeline/utilities\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { Typography } from \"@/components/ui/typography\";\n\nconst MAX_EVENT_TYPES_DISPLAYED = 2;\n\nexport type EventsTypeFilterProps = {\n\tfilter: EventsCountFilter;\n\tselectedEventTypes: string[];\n\tonEventTypesChange: (eventTypes: string[]) => void;\n};\n\nexport function EventsTypeFilter({\n\tfilter,\n\tselectedEventTypes,\n\tonEventTypesChange,\n}: EventsTypeFilterProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: eventCounts = [] } = useQuery(\n\t\tbuildEventsCountQuery(\"event\", filter),\n\t);\n\n\tconst eventTypeOptions = useMemo(() => {\n\t\tconst prefixSet = new Set<string>();\n\n\t\tfor (const eventCount of eventCounts) {\n\t\t\tconst prefixes = getEventPrefixes(eventCount.value);\n\t\t\tfor (const prefix of prefixes) {\n\t\t\t\tprefixSet.add(prefix);\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(prefixSet).sort();\n\t}, [eventCounts]);\n\n\tconst filteredOptions = useMemo(() => {\n\t\tif (!deferredSearch) {\n\t\t\treturn eventTypeOptions;\n\t\t}\n\t\treturn eventTypeOptions.filter((option) =>\n\t\t\toption.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [eventTypeOptions, deferredSearch]);\n\n\tconst handleSelectEventType = (eventType: string) => {\n\t\tconst isSelected = selectedEventTypes.includes(eventType);\n\t\tif (isSelected) {\n\t\t\tonEventTypesChange(\n\t\t\t\tselectedEventTypes.filter((type) => type !== eventType),\n\t\t\t);\n\t\t} else {\n\t\t\tonEventTypesChange([...selectedEventTypes, eventType]);\n\t\t}\n\t};\n\n\tconst handleClearAll = () => {\n\t\tonEventTypesChange([]);\n\t};\n\n\tconst renderSelectedEventTypes = () => {\n\t\tif (selectedEventTypes.length === 0) {\n\t\t\treturn \"All event types\";\n\t\t}\n\n\t\tconst visible = selectedEventTypes.slice(0, MAX_EVENT_TYPES_DISPLAYED);\n\t\tconst extraCount = selectedEventTypes.length - MAX_EVENT_TYPES_DISPLAYED;\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\taria-label=\"Filter by event type\"\n\t\t\t\tselected={selectedEventTypes.length === 0}\n\t\t\t>\n\t\t\t\t{renderSelectedEventTypes()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search event types...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No event types found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\taria-label=\"All event types\"\n\t\t\t\t\t\t\tonSelect={handleClearAll}\n\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\tvalue=\"__all__\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Checkbox checked={selectedEventTypes.length === 0} />\n\t\t\t\t\t\t\tAll event types\n\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t{filteredOptions.map((eventType) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={eventType}\n\t\t\t\t\t\t\t\taria-label={eventType}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelectEventType(eventType)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={eventType}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Checkbox checked={selectedEventTypes.includes(eventType)} />\n\t\t\t\t\t\t\t\t{eventType}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n\tbuildEventsNextPageQuery,\n\tbuildFilterEventsQuery,\n\ttype Event,\n\ttype EventsFilter,\n} from \"@/api/events\";\n\nconst PAGE_SIZE = 50;\n\ntype UseEventsPaginationOptions = {\n\tfilter: EventsFilter;\n};\n\ntype UseEventsPaginationReturn = {\n\tevents: Event[];\n\tcurrentPage: number;\n\ttotalPages: number;\n\ttotal: number;\n\tisLoadingNextPage: boolean;\n\tgoToPage: (page: number) => void;\n\tgoToNextPage: () => void;\n\tgoToPreviousPage: () => void;\n};\n\n/**\n * Hook for cursor-based pagination of events using a token vault pattern.\n *\n * The backend uses cursor-based pagination where each page response includes\n * a `next_page` URL containing a token to fetch the next page. This hook\n * manages these tokens in a \"vault\" (a Map) to enable bidirectional navigation.\n *\n * Key features:\n * - `tokenVault[n]` contains the token to fetch page `n+1`\n * - Clears token vault when filter changes (detected via JSON.stringify comparison)\n * - Stores next page tokens from API responses as they're received\n * - Uses `useQuery` for both the first page and subsequent pages\n *\n * @param options - Configuration options\n * @param options.filter - The events filter to apply\n * @returns Pagination state and navigation functions\n *\n * @example\n * ```tsx\n * const {\n * events,\n * currentPage,\n * totalPages,\n * isLoadingNextPage,\n * goToPage,\n * goToNextPage,\n * goToPreviousPage,\n * } = useEventsPagination({ filter: myFilter });\n * ```\n */\nexport function useEventsPagination({\n\tfilter,\n}: UseEventsPaginationOptions): UseEventsPaginationReturn {\n\tconst [currentPage, setCurrentPage] = useState(1);\n\tconst tokenVault = useRef<Map<number, string>>(new Map());\n\tconst previousFilterRef = useRef<string>(JSON.stringify(filter));\n\n\t// Reset pagination when filter changes\n\tuseEffect(() => {\n\t\tconst currentFilterString = JSON.stringify(filter);\n\t\tif (previousFilterRef.current !== currentFilterString) {\n\t\t\ttokenVault.current.clear();\n\t\t\tsetCurrentPage(1);\n\t\t\tpreviousFilterRef.current = currentFilterString;\n\t\t}\n\t}, [filter]);\n\n\t// First page query - always fetches the first page\n\tconst firstPageQuery = useQuery(buildFilterEventsQuery(filter));\n\n\t// Store the next_page token from first page response\n\tuseEffect(() => {\n\t\tif (firstPageQuery.data?.next_page) {\n\t\t\ttokenVault.current.set(1, firstPageQuery.data.next_page);\n\t\t}\n\t}, [firstPageQuery.data?.next_page]);\n\n\t// Get the token for the current page (if not page 1)\n\tconst currentPageToken =\n\t\tcurrentPage > 1 ? tokenVault.current.get(currentPage - 1) : null;\n\n\t// Subsequent page query - only enabled when we have a token and not on page 1\n\tconst nextPageQuery = useQuery({\n\t\t...buildEventsNextPageQuery(currentPageToken ?? \"\"),\n\t\tenabled: currentPage > 1 && !!currentPageToken,\n\t});\n\n\t// Store the next_page token from subsequent page responses\n\tuseEffect(() => {\n\t\tif (nextPageQuery.data?.next_page && currentPage > 1) {\n\t\t\ttokenVault.current.set(currentPage, nextPageQuery.data.next_page);\n\t\t}\n\t}, [nextPageQuery.data?.next_page, currentPage]);\n\n\t// Calculate total pages from the first page total count\n\tconst total = firstPageQuery.data?.total ?? 0;\n\tconst totalPages = Math.ceil(total / PAGE_SIZE);\n\n\t// Determine current events based on which page we're on\n\tconst events =\n\t\tcurrentPage === 1\n\t\t\t? (firstPageQuery.data?.events ?? [])\n\t\t\t: (nextPageQuery.data?.events ?? firstPageQuery.data?.events ?? []);\n\n\tconst isLoadingNextPage = currentPage > 1 && nextPageQuery.isLoading;\n\n\tconst goToPage = (page: number) => {\n\t\tif (page < 1 || page > totalPages) return;\n\t\tif (page > 1 && !tokenVault.current.has(page - 1)) {\n\t\t\treturn;\n\t\t}\n\t\tsetCurrentPage(page);\n\t};\n\n\tconst goToNextPage = () => {\n\t\tif (currentPage < totalPages && tokenVault.current.has(currentPage)) {\n\t\t\tsetCurrentPage(currentPage + 1);\n\t\t}\n\t};\n\n\tconst goToPreviousPage = () => {\n\t\tif (currentPage > 1) {\n\t\t\tsetCurrentPage(currentPage - 1);\n\t\t}\n\t};\n\n\treturn {\n\t\tevents,\n\t\tcurrentPage,\n\t\ttotalPages,\n\t\ttotal,\n\t\tisLoadingNextPage,\n\t\tgoToPage,\n\t\tgoToNextPage,\n\t\tgoToPreviousPage,\n\t};\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { buildEventsHistoryQuery } from \"@/api/events\";\nimport {\n\tbuildEventsCountFilterFromSearch,\n\tbuildEventsFilterFromSearch,\n\ttype EventsSearchParams,\n\tgetDateRangeFromSearch,\n} from \"@/api/events/filters\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport {\n\ttype DateRangeSelectValue,\n\tRichDateRangeSelector,\n} from \"@/components/ui/date-range-select\";\nimport {\n\tEmptyState,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n\tPagination,\n\tPaginationContent,\n\tPaginationItem,\n\tPaginationNextButton,\n\tPaginationPreviousButton,\n} from \"@/components/ui/pagination\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { cn } from \"@/utils\";\nimport { InteractiveEventsChart } from \"../events-line-chart\";\nimport { EventsResourceFilter } from \"../events-resource-filter\";\nimport { EventsTimeline } from \"../events-timeline\";\nimport { EventsTypeFilter } from \"../events-type-filter\";\nimport { useEventsPagination } from \"./use-events-pagination\";\n\nexport type EventsPageProps = {\n\tsearch: EventsSearchParams;\n\tonSearchChange: (search: Partial<EventsSearchParams>) => void;\n};\n\nexport function EventsPage({ search, onSearchChange }: EventsPageProps) {\n\t// Get the date range using the same logic as the route loader\n\t// This ensures query keys match and prevents infinite Suspense retries\n\tconst dateRange = getDateRangeFromSearch(search);\n\n\tconst eventsFilter = buildEventsFilterFromSearch(search);\n\tconst countFilter = buildEventsCountFilterFromSearch({\n\t\t...search,\n\t\trangeType: \"range\",\n\t\tstart: dateRange.from,\n\t\tend: dateRange.to,\n\t});\n\n\t// Create separate filter for type dropdown (without event filter)\n\t// This ensures all event types are shown regardless of current selection\n\tconst countFilterForTypeDropdown = buildEventsCountFilterFromSearch({\n\t\tresource: search.resource,\n\t\trangeType: \"range\",\n\t\tstart: dateRange.from,\n\t\tend: dateRange.to,\n\t});\n\n\t// Pagination\n\tconst {\n\t\tevents,\n\t\tcurrentPage,\n\t\ttotalPages,\n\t\tisLoadingNextPage,\n\t\tgoToNextPage,\n\t\tgoToPreviousPage,\n\t} = useEventsPagination({ filter: eventsFilter });\n\n\t// Chart histogram data\n\tconst { data: historyData } = useQuery(buildEventsHistoryQuery(countFilter));\n\n\t// Handlers - using correct property names that match EventsSearchParams\n\tconst handleResourceIdsChange = (resourceIds: string[]) => {\n\t\tonSearchChange({ resource: resourceIds });\n\t};\n\n\tconst handleEventTypesChange = (eventPrefixes: string[]) => {\n\t\tonSearchChange({ event: eventPrefixes });\n\t};\n\n\tconst handleDateRangeChange = (value: DateRangeSelectValue) => {\n\t\tif (value?.type === \"span\") {\n\t\t\tonSearchChange({ rangeType: \"span\", seconds: value.seconds });\n\t\t} else if (value?.type === \"range\") {\n\t\t\tonSearchChange({\n\t\t\t\trangeType: \"range\",\n\t\t\t\tstart: value.startDate.toISOString(),\n\t\t\t\tend: value.endDate.toISOString(),\n\t\t\t});\n\t\t}\n\t};\n\n\t// Sticky chart behavior\n\tconst [isChartSticky, setIsChartSticky] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst handleScroll = () => {\n\t\t\t// Chart becomes sticky when scrolled past 100px\n\t\t\tsetIsChartSticky(window.scrollY > 100);\n\t\t};\n\n\t\twindow.addEventListener(\"scroll\", handleScroll);\n\t\treturn () => window.removeEventListener(\"scroll\", handleScroll);\n\t}, []);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Breadcrumb>\n\t\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\t\tEvent Feed\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t\t</Breadcrumb>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Filters */}\n\t\t\t<div className=\"grid grid-cols-1 gap-4 sm:grid-cols-[2fr_1fr]\">\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t<Label>Resource</Label>\n\t\t\t\t\t<Suspense fallback={<Skeleton className=\"h-10 w-full\" />}>\n\t\t\t\t\t\t<EventsResourceFilter\n\t\t\t\t\t\t\tselectedResourceIds={search.resource ?? []}\n\t\t\t\t\t\t\tonResourceIdsChange={handleResourceIdsChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t<Label>Events</Label>\n\t\t\t\t\t<Suspense fallback={<Skeleton className=\"h-10 w-full\" />}>\n\t\t\t\t\t\t<EventsTypeFilter\n\t\t\t\t\t\t\tfilter={countFilterForTypeDropdown}\n\t\t\t\t\t\t\tselectedEventTypes={search.event ?? []}\n\t\t\t\t\t\t\tonEventTypesChange={handleEventTypesChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Chart - sticky when scrolling */}\n\t\t\t<Card\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"sticky top-0 z-10 transition-shadow\",\n\t\t\t\t\tisChartSticky && \"shadow-lg\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CardContent className=\"pt-6\">\n\t\t\t\t\t<InteractiveEventsChart\n\t\t\t\t\t\tdata={historyData ?? []}\n\t\t\t\t\t\tclassName=\"h-32\"\n\t\t\t\t\t\tstartDate={new Date(dateRange.from)}\n\t\t\t\t\t\tendDate={new Date(dateRange.to)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex justify-center pt-3\">\n\t\t\t\t\t\t<RichDateRangeSelector\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\tsearch.rangeType === \"range\" && search.start && search.end\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"range\",\n\t\t\t\t\t\t\t\t\t\t\tstartDate: new Date(search.start),\n\t\t\t\t\t\t\t\t\t\t\tendDate: new Date(search.end),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: { type: \"span\", seconds: search.seconds ?? -86400 }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonValueChange={handleDateRangeChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\n\t\t\t{/* Events timeline or empty state */}\n\t\t\t{events.length === 0 ? (\n\t\t\t\t<EmptyState>\n\t\t\t\t\t<EmptyStateIcon id=\"Calendar\" />\n\t\t\t\t\t<EmptyStateTitle>No events found</EmptyStateTitle>\n\t\t\t\t\t<EmptyStateDescription>\n\t\t\t\t\t\tNo events match your current filters. Try adjusting your date range\n\t\t\t\t\t\tor filters.\n\t\t\t\t\t</EmptyStateDescription>\n\t\t\t\t</EmptyState>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<EventsTimeline events={events} />\n\n\t\t\t\t\t{/* Pagination */}\n\t\t\t\t\t{totalPages > 1 && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-center gap-2\">\n\t\t\t\t\t\t\t<Pagination>\n\t\t\t\t\t\t\t\t<PaginationContent>\n\t\t\t\t\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t\t\t\t\t<PaginationPreviousButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToPreviousPage}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={currentPage <= 1}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"px-2\">\n\t\t\t\t\t\t\t\t\t\t\tPage {currentPage} of {totalPages}\n\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t\t\t\t\t<PaginationNextButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToNextPage}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={currentPage >= totalPages}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t\t\t\t</PaginationContent>\n\t\t\t\t\t\t\t</Pagination>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{isLoadingNextPage && (\n\t\t\t\t\t\t<div className=\"flex justify-center py-4\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { Suspense } from \"react\";\nimport { z } from \"zod\";\nimport { buildEventsHistoryQuery, buildFilterEventsQuery } from \"@/api/events\";\nimport {\n\tbuildEventsCountFilterFromSearch,\n\tbuildEventsFilterFromSearch,\n\ttype EventsSearchParams,\n} from \"@/api/events/filters\";\nimport { EventsPage } from \"@/components/events/events-page\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\n/**\n * Schema for validating URL search parameters for the events page.\n * Uses existing parameter names (resource, event) for compatibility with API infrastructure.\n */\nconst searchParams = z.object({\n\tresource: z.array(z.string()).optional(),\n\tevent: z.array(z.string()).optional(),\n\trangeType: z.enum([\"span\", \"range\"]).optional().default(\"span\"),\n\tseconds: z.number().optional().default(-86400),\n\tstart: z.string().optional(),\n\tend: z.string().optional(),\n\torder: z.enum([\"ASC\", \"DESC\"]).optional(),\n});\n\n/**\n * Skeleton component shown while the events page is loading.\n * Displays placeholder elements for header, filters, chart, and timeline.\n */\nfunction EventsPageSkeleton() {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t{/* Header skeleton */}\n\t\t\t<Skeleton className=\"h-8 w-48\" />\n\t\t\t{/* Filters skeleton */}\n\t\t\t<div className=\"flex flex-wrap gap-4\">\n\t\t\t\t<Skeleton className=\"h-10 w-48\" />\n\t\t\t\t<Skeleton className=\"h-10 w-48\" />\n\t\t\t\t<Skeleton className=\"h-10 w-48\" />\n\t\t\t</div>\n\t\t\t{/* Chart area skeleton */}\n\t\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t\t{/* Timeline area skeleton */}\n\t\t\t<Skeleton className=\"h-64 w-full\" />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/events/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tloaderDeps: ({ search }) => search,\n\twrapInSuspense: true,\n\tpendingComponent: EventsPageSkeleton,\n\tloader: ({ deps: search, context: { queryClient } }) => {\n\t\tconst eventsFilter = buildEventsFilterFromSearch(search);\n\t\tconst countFilter = buildEventsCountFilterFromSearch(search);\n\n\t\t// Prefetch queries without blocking route loading\n\t\tvoid queryClient.prefetchQuery(buildFilterEventsQuery(eventsFilter));\n\t\tvoid queryClient.prefetchQuery(buildEventsHistoryQuery(countFilter));\n\t},\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst handleSearchChange = (updates: Partial<EventsSearchParams>) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({ ...prev, ...updates }),\n\t\t\treplace: true,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Suspense fallback={<EventsPageSkeleton />}>\n\t\t\t<EventsPage search={search} onSearchChange={handleSearchChange} />\n\t\t</Suspense>\n\t);\n}\n"],"names":["EventsTooltipContent","active","payload","point","jsxs","jsx","format","chartConfig","EventsLineChart","forwardRef","data","className","showAxis","startDate","endDate","onCursorChange","ref","containerRef","useRef","useImperativeHandle","chartData","useMemo","points","item","startTime","endTime","handleMouseMove","state","timestamp","handleMouseLeave","cn","ChartContainer","AreaChart","XAxis","value","YAxis","max","ChartTooltip","Area","InteractiveEventsChart","RESOURCE_TYPE_DISPLAY_NAMES","EventsResourceFilter","props","Suspense","EventsResourceFilterImplementation","selectedResourceIds","onResourceIdsChange","search","setSearch","useState","deferredSearch","useDeferredValue","resourceOptions","useResourceOptions","filteredOptions","option","groupedOptions","groups","handleToggleResource","resourceId","isSelected","id","Combobox","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","type","options","ComboboxCommandGroup","ComboboxCommandItem","EventTimestamp","occurred","date","formattedTime","formattedDate","TimelinePoint","event","isLast","resourceType","parseResourceType","iconId","RESOURCE_ICONS","Icon","formatRouteDate","year","month","day","EventNameWithPrefixes","eventId","eventName","label","formatEventLabel","eventDate","Link","getResourceRole","resource","getResourceId","getResourceName","EventRelatedResources","related","tags","resources","displayText","typeLabel","RESOURCE_TYPE_LABELS","EventResourceLink","tag","tagId","tagName","Badge","EventTimelineItem","isOpen","setIsOpen","Collapsible","Card","CardHeader","EventResourceDisplay","CollapsibleTrigger","Button","ChevronDown","CollapsibleContent","CardContent","JsonView","EventsTimeline","events","index","MAX_EVENT_TYPES_DISPLAYED","EventsTypeFilter","filter","selectedEventTypes","onEventTypesChange","eventCounts","useQuery","buildEventsCountQuery","eventTypeOptions","prefixSet","eventCount","prefixes","getEventPrefixes","prefix","handleSelectEventType","eventType","handleClearAll","renderSelectedEventTypes","visible","extraCount","Typography","Checkbox","PAGE_SIZE","useEventsPagination","currentPage","setCurrentPage","tokenVault","previousFilterRef","useEffect","currentFilterString","firstPageQuery","buildFilterEventsQuery","currentPageToken","nextPageQuery","buildEventsNextPageQuery","total","totalPages","isLoadingNextPage","page","EventsPage","onSearchChange","dateRange","getDateRangeFromSearch","eventsFilter","buildEventsFilterFromSearch","countFilter","buildEventsCountFilterFromSearch","countFilterForTypeDropdown","goToNextPage","goToPreviousPage","historyData","buildEventsHistoryQuery","handleResourceIdsChange","resourceIds","handleEventTypesChange","eventPrefixes","handleDateRangeChange","isChartSticky","setIsChartSticky","handleScroll","Breadcrumb","BreadcrumbList","BreadcrumbItem","Label","Skeleton","RichDateRangeSelector","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","Fragment","Pagination","PaginationContent","PaginationItem","PaginationPreviousButton","PaginationNextButton","EventsPageSkeleton","RouteComponent","Route","useSearch","navigate","useNavigate","handleSearchChange","updates","to","prev","replace"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{c as g,r as c,j as o}from"./vendor-tanstack-CLpbOGYv.js";import{u as x,j as b,E as j}from"./vendor-codemirror-Dn73yRFx.js";import{z as v,aW as y,q as C,I as w,y as E}from"./index-BZqccBpn.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CP6hQtRc.js";import"./vendor-recharts-BOcghvr2.js";import"./vendor-forms-mroZAMaw.js";import"./vendor-date-Bxa7CHB1.js";const N=[b(),j.lineWrapping],z=g.forwardRef(({className:l,value:s,onChange:u,copy:p=!1,onBlur:I,disabled:r,hideLineNumbers:h=!1,...f},i)=>{const e=c.useRef(null),{resolvedTheme:m}=v();let n;r&&(n={lineNumbers:!h,highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1});const{setContainer:a}=x({container:e.current,extensions:N,value:s,onChange:u,indentWithTab:!1,editable:!r,basicSetup:n,theme:m==="dark"?"dark":"light",height:"100%"});c.useEffect(()=>{e.current&&a(e.current)},[a]);const d=t=>{E.success("Copied to clipboard"),navigator.clipboard.writeText(t)};return o.jsx("div",{className:y("rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative",l),ref:t=>{e.current=t,typeof i=="function"?i(t):i&&(i.current=t)},...f,children:p&&s&&o.jsx(C,{onClick:()=>d(s),variant:"ghost",size:"icon",className:"absolute top-0 right-0 z-10","aria-label":"copy",children:o.jsx(w,{id:"Copy",className:"size-2"})})})});z.displayName="JsonInput";export{z as JsonInput};
2
- //# sourceMappingURL=json-input-DFgWdLGv.js.map
1
+ import{c as g,r as c,j as o}from"./vendor-tanstack-CWDKYA_B.js";import{u as x,j as b,E as j}from"./vendor-codemirror-OTxfneaa.js";import{z as v,aW as y,q as C,I as w,y as E}from"./index-DLuXqHi9.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-DRMjKWJW.js";import"./vendor-recharts-BGjDGXVf.js";import"./vendor-forms-D-iybWES.js";import"./vendor-date-CRz8gtWZ.js";const N=[b(),j.lineWrapping],z=g.forwardRef(({className:l,value:s,onChange:u,copy:p=!1,onBlur:I,disabled:r,hideLineNumbers:h=!1,...f},i)=>{const e=c.useRef(null),{resolvedTheme:m}=v();let n;r&&(n={lineNumbers:!h,highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1});const{setContainer:a}=x({container:e.current,extensions:N,value:s,onChange:u,indentWithTab:!1,editable:!r,basicSetup:n,theme:m==="dark"?"dark":"light",height:"100%"});c.useEffect(()=>{e.current&&a(e.current)},[a]);const d=t=>{E.success("Copied to clipboard"),navigator.clipboard.writeText(t)};return o.jsx("div",{className:y("rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative",l),ref:t=>{e.current=t,typeof i=="function"?i(t):i&&(i.current=t)},...f,children:p&&s&&o.jsx(C,{onClick:()=>d(s),variant:"ghost",size:"icon",className:"absolute top-0 right-0 z-10","aria-label":"copy",children:o.jsx(w,{id:"Copy",className:"size-2"})})})});z.displayName="JsonInput";export{z as JsonInput};
2
+ //# sourceMappingURL=json-input-CJ1Ipjax.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-input-DFgWdLGv.js","sources":["../../src/components/ui/json-input.tsx"],"sourcesContent":["import { json } from \"@codemirror/lang-json\";\nimport {\n\ttype BasicSetupOptions,\n\tEditorView,\n\tuseCodeMirror,\n} from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport React, { useEffect, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/utils\";\nimport { Button } from \"./button\";\nimport { Icon } from \"./icons\";\n\nconst extensions = [json(), EditorView.lineWrapping];\n\ntype JsonInputProps = React.ComponentProps<\"div\"> & {\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tonBlur?: () => void;\n\tdisabled?: boolean;\n\tclassName?: string;\n\thideLineNumbers?: boolean;\n\tcopy?: boolean;\n};\n\n// the JsonInput's types for onChange are probably wrong but this makes it work\nexport type JsonInputOnChange = React.FormEventHandler<HTMLDivElement> &\n\t((value: string) => void);\n\nexport const JsonInput = React.forwardRef<HTMLDivElement, JsonInputProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tcopy = false,\n\t\t\tonBlur,\n\t\t\tdisabled,\n\t\t\thideLineNumbers = false,\n\t\t\t...props\n\t\t},\n\t\tforwardedRef,\n\t) => {\n\t\tconst editor = useRef<HTMLDivElement | null>(null);\n\t\tconst { resolvedTheme } = useTheme();\n\t\t// Setting `basicSetup` messes up the tab order. We only change the basic setup\n\t\t// if the input is disabled, so we leave it undefined to maintain the tab order.\n\t\tlet basicSetup: BasicSetupOptions | undefined;\n\t\tif (disabled) {\n\t\t\tbasicSetup = {\n\t\t\t\tlineNumbers: !hideLineNumbers,\n\t\t\t\thighlightActiveLine: false,\n\t\t\t\tfoldGutter: false,\n\t\t\t\thighlightActiveLineGutter: false,\n\t\t\t};\n\t\t}\n\t\tconst { setContainer } = useCodeMirror({\n\t\t\tcontainer: editor.current,\n\t\t\textensions,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tonBlur,\n\t\t\tindentWithTab: false,\n\t\t\teditable: !disabled,\n\t\t\tbasicSetup,\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t\theight: \"100%\",\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\tif (editor.current) {\n\t\t\t\tsetContainer(editor.current);\n\t\t\t}\n\t\t}, [setContainer]);\n\n\t\tconst handleCopy = (_value: string) => {\n\t\t\ttoast.success(\"Copied to clipboard\");\n\t\t\tvoid navigator.clipboard.writeText(_value);\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t\tif (typeof forwardedRef === \"function\") {\n\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{copy && value && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleCopy(value)}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nJsonInput.displayName = \"JsonInput\";\n"],"names":["extensions","json","EditorView","JsonInput","React","className","value","onChange","copy","onBlur","disabled","hideLineNumbers","props","forwardedRef","editor","useRef","resolvedTheme","useTheme","basicSetup","setContainer","useCodeMirror","useEffect","handleCopy","_value","toast","jsx","cn","node","Button","Icon"],"mappings":"wXAaA,MAAMA,EAAa,CAACC,IAAQC,EAAW,YAAY,EAgBtCC,EAAYC,EAAM,WAC9B,CACC,CACC,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,GACP,OAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,GAClB,GAAGC,CAAA,EAEJC,IACI,CACJ,MAAMC,EAASC,EAAAA,OAA8B,IAAI,EAC3C,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAG1B,IAAIC,EACAR,IACHQ,EAAa,CACZ,YAAa,CAACP,EACd,oBAAqB,GACrB,WAAY,GACZ,0BAA2B,EAAA,GAG7B,KAAM,CAAE,aAAAQ,CAAA,EAAiBC,EAAc,CACtC,UAAWN,EAAO,QAClB,WAAAd,EACA,MAAAM,EACA,SAAAC,EAEA,cAAe,GACf,SAAU,CAACG,EACX,WAAAQ,EACA,MAAOF,IAAkB,OAAS,OAAS,QAC3C,OAAQ,MAAA,CACR,EAEDK,EAAAA,UAAU,IAAM,CACXP,EAAO,SACVK,EAAaL,EAAO,OAAO,CAE7B,EAAG,CAACK,CAAY,CAAC,EAEjB,MAAMG,EAAcC,GAAmB,CACtCC,EAAM,QAAQ,qBAAqB,EAC9B,UAAU,UAAU,UAAUD,CAAM,CAC1C,EAEA,OACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,8HACArB,CAAA,EAED,IAAMsB,GAAS,CACdb,EAAO,QAAUa,EACb,OAAOd,GAAiB,WAC3BA,EAAac,CAAI,EACPd,IACVA,EAAa,QAAUc,EAEzB,EACC,GAAGf,EAEH,YAAQN,GACRmB,EAAAA,IAACG,EAAA,CACA,QAAS,IAAMN,EAAWhB,CAAK,EAC/B,QAAQ,QACR,KAAK,OACL,UAAU,8BACV,aAAW,OAEX,SAAAmB,EAAAA,IAACI,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAIJ,CACD,EAEA1B,EAAU,YAAc"}
1
+ {"version":3,"file":"json-input-CJ1Ipjax.js","sources":["../../src/components/ui/json-input.tsx"],"sourcesContent":["import { json } from \"@codemirror/lang-json\";\nimport {\n\ttype BasicSetupOptions,\n\tEditorView,\n\tuseCodeMirror,\n} from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport React, { useEffect, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/utils\";\nimport { Button } from \"./button\";\nimport { Icon } from \"./icons\";\n\nconst extensions = [json(), EditorView.lineWrapping];\n\ntype JsonInputProps = React.ComponentProps<\"div\"> & {\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tonBlur?: () => void;\n\tdisabled?: boolean;\n\tclassName?: string;\n\thideLineNumbers?: boolean;\n\tcopy?: boolean;\n};\n\n// the JsonInput's types for onChange are probably wrong but this makes it work\nexport type JsonInputOnChange = React.FormEventHandler<HTMLDivElement> &\n\t((value: string) => void);\n\nexport const JsonInput = React.forwardRef<HTMLDivElement, JsonInputProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tcopy = false,\n\t\t\tonBlur,\n\t\t\tdisabled,\n\t\t\thideLineNumbers = false,\n\t\t\t...props\n\t\t},\n\t\tforwardedRef,\n\t) => {\n\t\tconst editor = useRef<HTMLDivElement | null>(null);\n\t\tconst { resolvedTheme } = useTheme();\n\t\t// Setting `basicSetup` messes up the tab order. We only change the basic setup\n\t\t// if the input is disabled, so we leave it undefined to maintain the tab order.\n\t\tlet basicSetup: BasicSetupOptions | undefined;\n\t\tif (disabled) {\n\t\t\tbasicSetup = {\n\t\t\t\tlineNumbers: !hideLineNumbers,\n\t\t\t\thighlightActiveLine: false,\n\t\t\t\tfoldGutter: false,\n\t\t\t\thighlightActiveLineGutter: false,\n\t\t\t};\n\t\t}\n\t\tconst { setContainer } = useCodeMirror({\n\t\t\tcontainer: editor.current,\n\t\t\textensions,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tonBlur,\n\t\t\tindentWithTab: false,\n\t\t\teditable: !disabled,\n\t\t\tbasicSetup,\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t\theight: \"100%\",\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\tif (editor.current) {\n\t\t\t\tsetContainer(editor.current);\n\t\t\t}\n\t\t}, [setContainer]);\n\n\t\tconst handleCopy = (_value: string) => {\n\t\t\ttoast.success(\"Copied to clipboard\");\n\t\t\tvoid navigator.clipboard.writeText(_value);\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t\tif (typeof forwardedRef === \"function\") {\n\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{copy && value && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleCopy(value)}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nJsonInput.displayName = \"JsonInput\";\n"],"names":["extensions","json","EditorView","JsonInput","React","className","value","onChange","copy","onBlur","disabled","hideLineNumbers","props","forwardedRef","editor","useRef","resolvedTheme","useTheme","basicSetup","setContainer","useCodeMirror","useEffect","handleCopy","_value","toast","jsx","cn","node","Button","Icon"],"mappings":"wXAaA,MAAMA,EAAa,CAACC,IAAQC,EAAW,YAAY,EAgBtCC,EAAYC,EAAM,WAC9B,CACC,CACC,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,GACP,OAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,GAClB,GAAGC,CAAA,EAEJC,IACI,CACJ,MAAMC,EAASC,EAAAA,OAA8B,IAAI,EAC3C,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAG1B,IAAIC,EACAR,IACHQ,EAAa,CACZ,YAAa,CAACP,EACd,oBAAqB,GACrB,WAAY,GACZ,0BAA2B,EAAA,GAG7B,KAAM,CAAE,aAAAQ,CAAA,EAAiBC,EAAc,CACtC,UAAWN,EAAO,QAClB,WAAAd,EACA,MAAAM,EACA,SAAAC,EAEA,cAAe,GACf,SAAU,CAACG,EACX,WAAAQ,EACA,MAAOF,IAAkB,OAAS,OAAS,QAC3C,OAAQ,MAAA,CACR,EAEDK,EAAAA,UAAU,IAAM,CACXP,EAAO,SACVK,EAAaL,EAAO,OAAO,CAE7B,EAAG,CAACK,CAAY,CAAC,EAEjB,MAAMG,EAAcC,GAAmB,CACtCC,EAAM,QAAQ,qBAAqB,EAC9B,UAAU,UAAU,UAAUD,CAAM,CAC1C,EAEA,OACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,8HACArB,CAAA,EAED,IAAMsB,GAAS,CACdb,EAAO,QAAUa,EACb,OAAOd,GAAiB,WAC3BA,EAAac,CAAI,EACPd,IACVA,EAAa,QAAUc,EAEzB,EACC,GAAGf,EAEH,YAAQN,GACRmB,EAAAA,IAACG,EAAA,CACA,QAAS,IAAMN,EAAWhB,CAAK,EAC/B,QAAQ,QACR,KAAK,OACL,UAAU,8BACV,aAAW,OAEX,SAAAmB,EAAAA,IAACI,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAIJ,CACD,EAEA1B,EAAU,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as e,r as c,L as i,p as m}from"./vendor-tanstack-CLpbOGYv.js";import{aW as n,D as x,I as f,al as r,B as p,g as h,h as o,bs as b,bB as j,C as v,aM as g,dt as y,bv as N}from"./index-BZqccBpn.js";import{u as w}from"./use-get-artifacts-flow-task-runs-DUPrB7V9.js";import{L as k}from"./lazy-markdown-Bzi0YUUV.js";import{aA as C,aB as _,aC as M,aD as T,aE as z,aF as B}from"./vendor-radix-CP6hQtRc.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-recharts-BOcghvr2.js";import"./vendor-forms-mroZAMaw.js";import"./vendor-date-Bxa7CHB1.js";function L({className:t,...s}){return e.jsx(C,{"data-slot":"menubar",className:n("bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",t),...s})}function A({...t}){return e.jsx(_,{"data-slot":"menubar-menu",...t})}function D({...t}){return e.jsx(B,{"data-slot":"menubar-portal",...t})}function E({className:t,...s}){return e.jsx(M,{"data-slot":"menubar-trigger",className:n("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",t),...s})}function I({className:t,align:s="start",alignOffset:a=-4,sideOffset:d=8,...u}){return e.jsx(D,{children:e.jsx(T,{"data-slot":"menubar-content",align:s,alignOffset:a,sideOffset:d,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md",t),...u})})}function R({className:t,inset:s,variant:a="default",...d}){return e.jsx(z,{"data-slot":"menubar-item","data-inset":s,"data-variant":a,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t),...d})}const F=({artifactKey:t,pageHeader:s})=>{const a=c.useCallback(()=>{navigator.clipboard.writeText(t)},[t]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(S,{artifactKey:t}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(x,{id:"artifacts-guide",label:"Documentation"}),e.jsx(L,{children:e.jsxs(A,{children:[e.jsx(E,{className:"px-1",children:e.jsx(f,{id:"EllipsisVertical"})}),e.jsx(I,{children:e.jsx(R,{onClick:a,children:"Copy Id"})})]})})]})]}),s&&e.jsxs("div",{className:"",children:[e.jsx(r,{variant:"h2",className:"my-4 font-bold prose lg:prose-xl",children:e.jsx(k,{children:s})}),e.jsx("hr",{})]})]})},S=({artifactKey:t})=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{children:e.jsxs(h,{children:[e.jsx(o,{children:e.jsx(b,{to:"/artifacts",className:"text-xl font-semibold",children:"Artifacts"})}),e.jsx(j,{}),e.jsx(o,{className:"text-xl font-semibold",children:t})]})})}),$=({artifact:t})=>{const s=c.useMemo(()=>t.id?.split("-")[0],[t.id]);return e.jsxs(v,{"data-testid":`timeline-card-${t.id}`,className:"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow",children:[e.jsx(i,{to:"/artifacts/artifact/$id",params:{id:t.id??""},children:e.jsx(r,{variant:"body",className:"font-bold text-blue-700 hover:underline",children:s})}),t.flow_run&&e.jsxs(r,{variant:"bodySmall",children:["Flow run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/flow-run/$id",params:{id:t.flow_run_id??""},children:t.flow_run?.name})]}),t.task_run&&e.jsxs(r,{variant:"bodySmall",children:["Task run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/task-run/$id",params:{id:t.task_run_id??""},children:t.task_run?.name})]})]})},P=({artifact:t})=>{const[s,a]=g(t.created??"","dateTime").split(" at ");return e.jsxs("div",{"data-testid":`timeline-row-${t.id}`,className:"flex",children:[e.jsxs("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px"},children:[e.jsx(r,{variant:"body",children:a}),e.jsx(r,{variant:"bodySmall",className:"text-muted-foreground",children:s})]}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200",children:e.jsx("div",{className:"size-4 rounded-full bg-white my-5 mx-auto border-2",style:{margin:"20px calc(50% + 2px)"}})})}),e.jsx("div",{className:"grow mt-1",children:e.jsx($,{artifact:t})})]})},H=({artifacts:t})=>e.jsxs("div",{children:[t.map(s=>e.jsx(P,{artifact:s},s.id)),e.jsxs("div",{className:"flex border-b",children:[e.jsx("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px",height:"88px"}}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200 pt-3",children:e.jsx("div",{className:"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center",style:{margin:"20px calc(50% - 6px)"},children:e.jsx("div",{className:"size-4 rounded-full border-2 border-black relative"})})})}),e.jsx("div",{style:{padding:"33px 0 0 5px"},children:e.jsxs(r,{variant:"bodyLarge",children:["Created ",e.jsx("span",{className:"font-bold",children:t[0].key})]})})]})]}),Q=({artifactKey:t,artifacts:s})=>e.jsxs("div",{children:[e.jsx(F,{artifactKey:t,pageHeader:s[0]?.description??void 0}),e.jsx(H,{artifacts:s})]}),l=t=>({artifacts:{operator:"and_",key:{like_:t}},sort:"CREATED_DESC",offset:0});function Y(){const{key:t}=y.useParams(),{data:s}=m(N(l(t))),a=w(l(t));return e.jsx("div",{children:e.jsx(Q,{artifactKey:t,artifacts:a??s})})}export{Y as component};
2
- //# sourceMappingURL=key._key-CpeWM0mN.js.map
1
+ import{j as e,r as c,L as i,s as m}from"./vendor-tanstack-CWDKYA_B.js";import{aW as n,D as x,I as f,al as r,B as p,g as h,h as o,bs as b,bB as j,C as v,aM as g,dt as y,bv as N}from"./index-DLuXqHi9.js";import{u as w}from"./use-get-artifacts-flow-task-runs-I3Wb9fOV.js";import{L as k}from"./lazy-markdown-sP3PYQgB.js";import{aA as C,aB as _,aC as M,aD as T,aE as z,aF as B}from"./vendor-radix-DRMjKWJW.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-recharts-BGjDGXVf.js";import"./vendor-forms-D-iybWES.js";import"./vendor-date-CRz8gtWZ.js";function L({className:s,...t}){return e.jsx(C,{"data-slot":"menubar",className:n("bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",s),...t})}function A({...s}){return e.jsx(_,{"data-slot":"menubar-menu",...s})}function D({...s}){return e.jsx(B,{"data-slot":"menubar-portal",...s})}function E({className:s,...t}){return e.jsx(M,{"data-slot":"menubar-trigger",className:n("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",s),...t})}function I({className:s,align:t="start",alignOffset:a=-4,sideOffset:d=8,...u}){return e.jsx(D,{children:e.jsx(T,{"data-slot":"menubar-content",align:t,alignOffset:a,sideOffset:d,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md",s),...u})})}function R({className:s,inset:t,variant:a="default",...d}){return e.jsx(z,{"data-slot":"menubar-item","data-inset":t,"data-variant":a,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",s),...d})}const F=({artifactKey:s,pageHeader:t})=>{const a=c.useCallback(()=>{navigator.clipboard.writeText(s)},[s]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(S,{artifactKey:s}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(x,{id:"artifacts-guide",label:"Documentation"}),e.jsx(L,{children:e.jsxs(A,{children:[e.jsx(E,{className:"px-1",children:e.jsx(f,{id:"EllipsisVertical"})}),e.jsx(I,{children:e.jsx(R,{onClick:a,children:"Copy Id"})})]})})]})]}),t&&e.jsxs("div",{className:"",children:[e.jsx(r,{variant:"h2",className:"my-4 font-bold prose lg:prose-xl",children:e.jsx(k,{children:t})}),e.jsx("hr",{})]})]})},S=({artifactKey:s})=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{children:e.jsxs(h,{children:[e.jsx(o,{children:e.jsx(b,{to:"/artifacts",className:"text-xl font-semibold",children:"Artifacts"})}),e.jsx(j,{}),e.jsx(o,{className:"text-xl font-semibold",children:s})]})})}),$=({artifact:s})=>{const t=c.useMemo(()=>s.id?.split("-")[0],[s.id]);return e.jsxs(v,{"data-testid":`timeline-card-${s.id}`,className:"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow",children:[e.jsx(i,{to:"/artifacts/artifact/$id",params:{id:s.id??""},children:e.jsx(r,{variant:"body",className:"font-bold text-blue-700 hover:underline",children:t})}),s.flow_run&&e.jsxs(r,{variant:"bodySmall",children:["Flow run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/flow-run/$id",params:{id:s.flow_run_id??""},children:s.flow_run?.name})]}),s.task_run&&e.jsxs(r,{variant:"bodySmall",children:["Task run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/task-run/$id",params:{id:s.task_run_id??""},children:s.task_run?.name})]})]})},P=({artifact:s})=>{const[t,a]=g(s.created??"","dateTime").split(" at ");return e.jsxs("div",{"data-testid":`timeline-row-${s.id}`,className:"flex",children:[e.jsxs("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px"},children:[e.jsx(r,{variant:"body",children:a}),e.jsx(r,{variant:"bodySmall",className:"text-muted-foreground",children:t})]}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200",children:e.jsx("div",{className:"size-4 rounded-full bg-white my-5 mx-auto border-2",style:{margin:"20px calc(50% + 2px)"}})})}),e.jsx("div",{className:"grow mt-1",children:e.jsx($,{artifact:s})})]})},H=({artifacts:s})=>e.jsxs("div",{children:[s.map(t=>e.jsx(P,{artifact:t},t.id)),e.jsxs("div",{className:"flex border-b",children:[e.jsx("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px",height:"88px"}}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200 pt-3",children:e.jsx("div",{className:"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center",style:{margin:"20px calc(50% - 6px)"},children:e.jsx("div",{className:"size-4 rounded-full border-2 border-black relative"})})})}),e.jsx("div",{style:{padding:"33px 0 0 5px"},children:e.jsxs(r,{variant:"bodyLarge",children:["Created ",e.jsx("span",{className:"font-bold",children:s[0].key})]})})]})]}),Q=({artifactKey:s,artifacts:t})=>e.jsxs("div",{children:[e.jsx(F,{artifactKey:s,pageHeader:t[0]?.description??void 0}),e.jsx(H,{artifacts:t})]}),l=s=>({artifacts:{operator:"and_",key:{like_:s}},sort:"CREATED_DESC",offset:0});function Y(){const{key:s}=y.useParams(),{data:t}=m(N(l(s))),a=w(l(s));return e.jsx("div",{children:e.jsx(Q,{artifactKey:s,artifacts:a??t})})}export{Y as component};
2
+ //# sourceMappingURL=key._key-B0wb5Umi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"key._key-CpeWM0mN.js","sources":["../../src/components/ui/menubar.tsx","../../src/components/artifacts/key/artifacts-key-header.tsx","../../src/components/artifacts/key/timeline/timelineCard.tsx","../../src/components/artifacts/key/timeline/timelineRow.tsx","../../src/components/artifacts/key/timeline/timelineContainer.tsx","../../src/components/artifacts/key/artifacts-key-page.tsx","../../src/routes/artifacts/key.$key.tsx?tsr-split=component"],"sourcesContent":["import * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Menubar({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n\treturn (\n\t\t<MenubarPrimitive.Root\n\t\t\tdata-slot=\"menubar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarMenu({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n\treturn <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nfunction MenubarGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n\treturn <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nfunction MenubarPortal({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n\treturn <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nfunction MenubarRadioGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n\t);\n}\n\nfunction MenubarTrigger({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n\treturn (\n\t\t<MenubarPrimitive.Trigger\n\t\t\tdata-slot=\"menubar-trigger\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarContent({\n\tclassName,\n\talign = \"start\",\n\talignOffset = -4,\n\tsideOffset = 8,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n\treturn (\n\t\t<MenubarPortal>\n\t\t\t<MenubarPrimitive.Content\n\t\t\t\tdata-slot=\"menubar-content\"\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</MenubarPortal>\n\t);\n}\n\nfunction MenubarItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Item\n\t\t\tdata-slot=\"menubar-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<MenubarPrimitive.CheckboxItem\n\t\t\tdata-slot=\"menubar-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.CheckboxItem>\n\t);\n}\n\nfunction MenubarRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioItem\n\t\t\tdata-slot=\"menubar-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.RadioItem>\n\t);\n}\n\nfunction MenubarLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Label\n\t\t\tdata-slot=\"menubar-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n\treturn (\n\t\t<MenubarPrimitive.Separator\n\t\t\tdata-slot=\"menubar-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"menubar-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSub({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n\treturn <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nfunction MenubarSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.SubTrigger\n\t\t\tdata-slot=\"menubar-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n\t\t</MenubarPrimitive.SubTrigger>\n\t);\n}\n\nfunction MenubarSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n\treturn (\n\t\t<MenubarPrimitive.SubContent\n\t\t\tdata-slot=\"menubar-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tMenubar,\n\tMenubarPortal,\n\tMenubarMenu,\n\tMenubarTrigger,\n\tMenubarContent,\n\tMenubarGroup,\n\tMenubarSeparator,\n\tMenubarLabel,\n\tMenubarItem,\n\tMenubarShortcut,\n\tMenubarCheckboxItem,\n\tMenubarRadioGroup,\n\tMenubarRadioItem,\n\tMenubarSub,\n\tMenubarSubTrigger,\n\tMenubarSubContent,\n};\n","import { useCallback } from \"react\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport {\n\tMenubar,\n\tMenubarContent,\n\tMenubarItem,\n\tMenubarMenu,\n\tMenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype ArtifactsKeyHeaderProps = {\n\tartifactKey: string;\n\tpageHeader?: string;\n};\n\nexport const ArtifactsKeyHeader = ({\n\tartifactKey,\n\tpageHeader,\n}: ArtifactsKeyHeaderProps) => {\n\tconst handleCopyId = useCallback(() => {\n\t\tvoid navigator.clipboard.writeText(artifactKey);\n\t}, [artifactKey]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Header artifactKey={artifactKey} />\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t\t\t{/* <Button variant=\"outline\" className=\"px-1\"><Icon id=\"EllipsisVertical\" /></Button> */}\n\t\t\t\t\t<Menubar>\n\t\t\t\t\t\t<MenubarMenu>\n\t\t\t\t\t\t\t<MenubarTrigger className=\"px-1\">\n\t\t\t\t\t\t\t\t<Icon id=\"EllipsisVertical\" />\n\t\t\t\t\t\t\t</MenubarTrigger>\n\t\t\t\t\t\t\t<MenubarContent>\n\t\t\t\t\t\t\t\t<MenubarItem onClick={handleCopyId}>Copy Id</MenubarItem>\n\t\t\t\t\t\t\t</MenubarContent>\n\t\t\t\t\t\t</MenubarMenu>\n\t\t\t\t\t</Menubar>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{pageHeader && (\n\t\t\t\t<div className=\"\">\n\t\t\t\t\t<Typography variant=\"h2\" className=\"my-4 font-bold prose lg:prose-xl\">\n\t\t\t\t\t\t<LazyMarkdown>{pageHeader}</LazyMarkdown>\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<hr />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nconst Header = ({ artifactKey }: ArtifactsKeyHeaderProps) => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbLink to=\"/artifacts\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t{artifactKey}\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Card } from \"@/components/ui/card\";\nimport { Typography } from \"@/components/ui/typography\";\n\nexport type ArtifactTimelineCardProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactTimelineCard = ({\n\tartifact,\n}: ArtifactTimelineCardProps) => {\n\tconst artifactTitle = useMemo(() => {\n\t\treturn artifact.id?.split(\"-\")[0];\n\t}, [artifact.id]);\n\n\treturn (\n\t\t<Card\n\t\t\tdata-testid={`timeline-card-${artifact.id}`}\n\t\t\tclassName=\"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow\"\n\t\t>\n\t\t\t<Link to=\"/artifacts/artifact/$id\" params={{ id: artifact.id ?? \"\" }}>\n\t\t\t\t<Typography\n\t\t\t\t\tvariant=\"body\"\n\t\t\t\t\tclassName=\"font-bold text-blue-700 hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{artifactTitle}\n\t\t\t\t</Typography>\n\t\t\t</Link>\n\t\t\t{artifact.flow_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tFlow run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/flow-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.flow_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t\t{artifact.task_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tTask run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/task-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.task_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t</Card>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { formatDate } from \"@/utils/date\";\nimport { ArtifactTimelineCard } from \"./timelineCard\";\n\nexport type TimelineRowProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const TimelineRow = ({ artifact }: TimelineRowProps) => {\n\tconst [date, time] = formatDate(artifact.created ?? \"\", \"dateTime\").split(\n\t\t\" at \",\n\t);\n\treturn (\n\t\t<div data-testid={`timeline-row-${artifact.id}`} className=\"flex\">\n\t\t\t<div\n\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\tstyle={{ width: \"128px\" }}\n\t\t\t>\n\t\t\t\t<Typography variant=\"body\">{time}</Typography>\n\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t{date}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"size-4 rounded-full bg-white my-5 mx-auto border-2\"\n\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% + 2px)\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"grow mt-1\">\n\t\t\t\t<ArtifactTimelineCard artifact={artifact} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TimelineRow } from \"./timelineRow\";\n\nexport type TimelineContainerProps = {\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const TimelineContainer = ({ artifacts }: TimelineContainerProps) => {\n\treturn (\n\t\t<div>\n\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t<TimelineRow key={artifact.id} artifact={artifact} />\n\t\t\t))}\n\t\t\t<div className=\"flex border-b\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\t\tstyle={{ width: \"128px\", height: \"88px\" }}\n\t\t\t\t/>\n\t\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200 pt-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center\"\n\t\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% - 6px)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"size-4 rounded-full border-2 border-black relative\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ padding: \"33px 0 0 5px\" }}>\n\t\t\t\t\t<Typography variant=\"bodyLarge\">\n\t\t\t\t\t\tCreated <span className=\"font-bold\">{artifacts[0].key}</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactsKeyHeader } from \"./artifacts-key-header\";\nimport { TimelineContainer } from \"./timeline/timelineContainer\";\n\ntype ArtifactsKeyPageProps = {\n\tartifactKey: string;\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const ArtifactsKeyPage = ({\n\tartifactKey,\n\tartifacts,\n}: ArtifactsKeyPageProps) => {\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyHeader\n\t\t\t\tartifactKey={artifactKey}\n\t\t\t\tpageHeader={artifacts[0]?.description ?? undefined}\n\t\t\t/>\n\t\t\t<TimelineContainer artifacts={artifacts} />\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { type ArtifactsFilter, buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { useFilterArtifactsFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { ArtifactsKeyPage } from \"@/components/artifacts/key/artifacts-key-page\";\n\nconst buildFilterBody = (key: string): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\tkey: {\n\t\t\tlike_: key, // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/key/$key\")({\n\tcomponent: RouteComponent,\n\tloader: async ({ context, params }) => {\n\t\tconst { key } = params;\n\n\t\tconst artifacts = await context.queryClient.ensureQueryData(\n\t\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t\t);\n\n\t\treturn { artifacts };\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst { key } = Route.useParams();\n\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t);\n\n\tconst artifactWithMetadata = useFilterArtifactsFlowTaskRuns(\n\t\tbuildFilterBody(key),\n\t);\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyPage\n\t\t\t\tartifactKey={key} // can't use \"key\" as it is a reserved word\n\t\t\t\tartifacts={artifactWithMetadata ?? artifacts}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["Menubar","className","props","jsx","MenubarPrimitive.Root","cn","MenubarMenu","MenubarPrimitive.Menu","MenubarPortal","MenubarPrimitive.Portal","MenubarTrigger","MenubarPrimitive.Trigger","MenubarContent","align","alignOffset","sideOffset","MenubarPrimitive.Content","MenubarItem","inset","variant","MenubarPrimitive.Item","ArtifactsKeyHeader","artifactKey","pageHeader","handleCopyId","useCallback","jsxs","Fragment","Header","DocsLink","Icon","Typography","LazyMarkdown","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","ArtifactTimelineCard","artifact","artifactTitle","useMemo","Card","Link","TimelineRow","date","time","formatDate","TimelineContainer","artifacts","ArtifactsKeyPage","buildFilterBody","key","operator","like_","sort","offset","RouteComponent","Route","useParams","data","useSuspenseQuery","buildListArtifactsQuery","artifactWithMetadata","useFilterArtifactsFlowTaskRuns"],"mappings":"miBAMA,SAASA,EAAQ,CAChB,UAAAC,EACA,GAAGC,CACJ,EAAuD,CACtD,OACCC,EAAAA,IAACC,EAAA,CACA,YAAU,UACV,UAAWC,EACV,4EACAJ,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP,CAEA,SAASI,EAAY,CACpB,GAAGJ,CACJ,EAAuD,CACtD,aAAQK,EAAA,CAAsB,YAAU,eAAgB,GAAGL,EAAO,CACnE,CAQA,SAASM,EAAc,CACtB,GAAGN,CACJ,EAAyD,CACxD,aAAQO,EAAA,CAAwB,YAAU,iBAAkB,GAAGP,EAAO,CACvE,CAUA,SAASQ,EAAe,CACvB,UAAAT,EACA,GAAGC,CACJ,EAA0D,CACzD,OACCC,EAAAA,IAACQ,EAAA,CACA,YAAU,kBACV,UAAWN,EACV,0MACAJ,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP,CAEA,SAASU,EAAe,CACvB,UAAAX,EACA,MAAAY,EAAQ,QACR,YAAAC,EAAc,GACd,WAAAC,EAAa,EACb,GAAGb,CACJ,EAA0D,CACzD,aACEM,EAAA,CACA,SAAAL,EAAAA,IAACa,EAAA,CACA,YAAU,kBACV,MAAAH,EACA,YAAAC,EACA,WAAAC,EACA,UAAWV,EACV,yZACAJ,CAAA,EAEA,GAAGC,CAAA,CAAA,EAEN,CAEF,CAEA,SAASe,EAAY,CACpB,UAAAhB,EACA,MAAAiB,EACA,QAAAC,EAAU,UACV,GAAGjB,CACJ,EAGG,CACF,OACCC,EAAAA,IAACiB,EAAA,CACA,YAAU,eACV,aAAYF,EACZ,eAAcC,EACd,UAAWd,EACV,+oBACAJ,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP,CCpFO,MAAMmB,EAAqB,CAAC,CAClC,YAAAC,EACA,WAAAC,CACD,IAA+B,CAC9B,MAAMC,EAAeC,EAAAA,YAAY,IAAM,CACjC,UAAU,UAAU,UAAUH,CAAW,CAC/C,EAAG,CAACA,CAAW,CAAC,EAEhB,OACCI,EAAAA,KAAAC,WAAA,CACC,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAvB,MAACyB,GAAO,YAAAN,EAA0B,EAClCI,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAvB,EAAAA,IAAC0B,EAAA,CAAS,GAAG,kBAAkB,MAAM,gBAAgB,EAErD1B,EAAAA,IAACH,EAAA,CACA,SAAA0B,EAAAA,KAACpB,EAAA,CACA,SAAA,CAAAH,EAAAA,IAACO,GAAe,UAAU,OACzB,eAACoB,EAAA,CAAK,GAAG,mBAAmB,CAAA,CAC7B,QACClB,EAAA,CACA,SAAAT,MAACc,GAAY,QAASO,EAAc,mBAAO,CAAA,CAC5C,CAAA,CAAA,CACD,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EACD,EACCD,GACAG,EAAAA,KAAC,MAAA,CAAI,UAAU,GACd,SAAA,CAAAvB,EAAAA,IAAC4B,EAAA,CAAW,QAAQ,KAAK,UAAU,mCAClC,SAAA5B,EAAAA,IAAC6B,EAAA,CAAc,WAAW,CAAA,CAC3B,QACC,KAAA,CAAA,CAAG,CAAA,CAAA,CACL,CAAA,EAEF,CAEF,EAEMJ,EAAS,CAAC,CAAE,YAAAN,CAAA,IACjBnB,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACd,SAAAA,EAAAA,IAAC8B,EAAA,CACA,SAAAP,EAAAA,KAACQ,EAAA,CACA,SAAA,CAAA/B,EAAAA,IAACgC,EAAA,CACA,eAACC,EAAA,CAAe,GAAG,aAAa,UAAU,wBAAwB,qBAElE,CAAA,CACD,QACCC,EAAA,EAAoB,EACrBlC,EAAAA,IAACgC,EAAA,CAAe,UAAU,wBACxB,SAAAb,CAAA,CACF,CAAA,CAAA,CACD,EACD,EACD,ECrEYgB,EAAuB,CAAC,CACpC,SAAAC,CACD,IAAiC,CAChC,MAAMC,EAAgBC,EAAAA,QAAQ,IACtBF,EAAS,IAAI,MAAM,GAAG,EAAE,CAAC,EAC9B,CAACA,EAAS,EAAE,CAAC,EAEhB,OACCb,EAAAA,KAACgB,EAAA,CACA,cAAa,iBAAiBH,EAAS,EAAE,GACzC,UAAU,sEAEV,SAAA,CAAApC,EAAAA,IAACwC,EAAA,CAAK,GAAG,0BAA0B,OAAQ,CAAE,GAAIJ,EAAS,IAAM,EAAA,EAC/D,SAAApC,EAAAA,IAAC4B,EAAA,CACA,QAAQ,OACR,UAAU,0CAET,SAAAS,CAAA,CAAA,EAEH,EACCD,EAAS,UACTb,OAACK,EAAA,CAAW,QAAQ,YAAY,SAAA,CAAA,YACrB,IACV5B,EAAAA,IAACwC,EAAA,CACA,UAAU,gCACV,GAAI,qBACJ,OAAQ,CAAE,GAAIJ,EAAS,aAAe,EAAA,EAErC,WAAS,UAAU,IAAA,CAAA,CACrB,EACD,EAEAA,EAAS,UACTb,OAACK,EAAA,CAAW,QAAQ,YAAY,SAAA,CAAA,YACrB,IACV5B,EAAAA,IAACwC,EAAA,CACA,UAAU,gCACV,GAAI,qBACJ,OAAQ,CAAE,GAAIJ,EAAS,aAAe,EAAA,EAErC,WAAS,UAAU,IAAA,CAAA,CACrB,CAAA,CACD,CAAA,CAAA,CAAA,CAIJ,EC/CaK,EAAc,CAAC,CAAE,SAAAL,KAAiC,CAC9D,KAAM,CAACM,EAAMC,CAAI,EAAIC,EAAWR,EAAS,SAAW,GAAI,UAAU,EAAE,MACnE,MAAA,EAED,OACCb,OAAC,OAAI,cAAa,gBAAgBa,EAAS,EAAE,GAAI,UAAU,OAC1D,SAAA,CAAAb,EAAAA,KAAC,MAAA,CACA,UAAU,mDACV,MAAO,CAAE,MAAO,OAAA,EAEhB,SAAA,CAAAvB,EAAAA,IAAC4B,EAAA,CAAW,QAAQ,OAAQ,SAAAe,EAAK,QAChCf,EAAA,CAAW,QAAQ,YAAY,UAAU,wBACxC,SAAAc,CAAA,CACF,CAAA,CAAA,CAAA,QAEA,MAAA,CAAI,UAAU,qBACd,SAAA1C,MAAC,MAAA,CAAI,UAAU,sCACd,SAAAA,EAAAA,IAAC,MAAA,CACA,UAAU,qDACV,MAAO,CAAE,OAAQ,sBAAA,CAAuB,CAAA,EAE1C,CAAA,CACD,QACC,MAAA,CAAI,UAAU,YACd,SAAAA,EAAAA,IAACmC,EAAA,CAAqB,SAAAC,EAAoB,CAAA,CAC3C,CAAA,EACD,CAEF,EC7BaS,EAAoB,CAAC,CAAE,UAAAC,YAEjC,MAAA,CACC,SAAA,CAAAA,EAAU,IAAKV,GACfpC,EAAAA,IAACyC,GAA8B,SAAAL,CAAA,EAAbA,EAAS,EAAwB,CACnD,EACDb,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACd,SAAA,CAAAvB,EAAAA,IAAC,MAAA,CACA,UAAU,mDACV,MAAO,CAAE,MAAO,QAAS,OAAQ,MAAA,CAAO,CAAA,QAExC,MAAA,CAAI,UAAU,qBACd,SAAAA,MAAC,MAAA,CAAI,UAAU,2CACd,SAAAA,EAAAA,IAAC,MAAA,CACA,UAAU,sFACV,MAAO,CAAE,OAAQ,sBAAA,EAEjB,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,oDAAA,CAAqD,CAAA,CAAA,EAEtE,CAAA,CACD,EACAA,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,QAAS,gBACtB,SAAAuB,EAAAA,KAACK,EAAA,CAAW,QAAQ,YAAY,SAAA,CAAA,iBACtB,OAAA,CAAK,UAAU,YAAa,SAAAkB,EAAU,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,CACvD,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EACD,EC1BWC,EAAmB,CAAC,CAChC,YAAA5B,EACA,UAAA2B,CACD,WAEG,MAAA,CACA,SAAA,CAAA9C,EAAAA,IAACkB,EAAA,CACA,YAAAC,EACA,WAAY2B,EAAU,CAAC,GAAG,aAAe,MAAA,CAAA,EAE1C9C,MAAC6C,GAAkB,UAAAC,CAAA,CAAsB,CAAA,EAC1C,ECdIE,EAAmBC,IAAkC,CAC1DH,UAAW,CACVI,SAAU,OACVD,IAAK,CACJE,MAAOF,CAAAA,CACR,EAEDG,KAAM,eACNC,OAAQ,CACT,GAgBA,SAASC,GAAiB,CACzB,KAAM,CAAEL,IAAAA,CAAAA,EAAQM,EAAMC,UAAAA,EAEhB,CAAEC,KAAMX,CAAAA,EAAcY,EAC3BC,EAAwBX,EAAgBC,CAAG,CAAC,CAC7C,EAEMW,EAAuBC,EAC5Bb,EAAgBC,CAAG,CACpB,EACA,aACE,MAAA,CACA,SAAAjD,EAAAA,IAAC+C,EAAA,CACA,YAAaE,EACb,UAAWW,GAAwBd,CAAAA,CAAAA,EAErC,CAEF"}
1
+ {"version":3,"file":"key._key-B0wb5Umi.js","sources":["../../src/components/ui/menubar.tsx","../../src/components/artifacts/key/artifacts-key-header.tsx","../../src/components/artifacts/key/timeline/timelineCard.tsx","../../src/components/artifacts/key/timeline/timelineRow.tsx","../../src/components/artifacts/key/timeline/timelineContainer.tsx","../../src/components/artifacts/key/artifacts-key-page.tsx","../../src/routes/artifacts/key.$key.tsx?tsr-split=component"],"sourcesContent":["import * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Menubar({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n\treturn (\n\t\t<MenubarPrimitive.Root\n\t\t\tdata-slot=\"menubar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarMenu({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n\treturn <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nfunction MenubarGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n\treturn <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nfunction MenubarPortal({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n\treturn <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nfunction MenubarRadioGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n\t);\n}\n\nfunction MenubarTrigger({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n\treturn (\n\t\t<MenubarPrimitive.Trigger\n\t\t\tdata-slot=\"menubar-trigger\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarContent({\n\tclassName,\n\talign = \"start\",\n\talignOffset = -4,\n\tsideOffset = 8,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n\treturn (\n\t\t<MenubarPortal>\n\t\t\t<MenubarPrimitive.Content\n\t\t\t\tdata-slot=\"menubar-content\"\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</MenubarPortal>\n\t);\n}\n\nfunction MenubarItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Item\n\t\t\tdata-slot=\"menubar-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<MenubarPrimitive.CheckboxItem\n\t\t\tdata-slot=\"menubar-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.CheckboxItem>\n\t);\n}\n\nfunction MenubarRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioItem\n\t\t\tdata-slot=\"menubar-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.RadioItem>\n\t);\n}\n\nfunction MenubarLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Label\n\t\t\tdata-slot=\"menubar-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n\treturn (\n\t\t<MenubarPrimitive.Separator\n\t\t\tdata-slot=\"menubar-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"menubar-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSub({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n\treturn <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nfunction MenubarSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.SubTrigger\n\t\t\tdata-slot=\"menubar-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n\t\t</MenubarPrimitive.SubTrigger>\n\t);\n}\n\nfunction MenubarSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n\treturn (\n\t\t<MenubarPrimitive.SubContent\n\t\t\tdata-slot=\"menubar-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tMenubar,\n\tMenubarPortal,\n\tMenubarMenu,\n\tMenubarTrigger,\n\tMenubarContent,\n\tMenubarGroup,\n\tMenubarSeparator,\n\tMenubarLabel,\n\tMenubarItem,\n\tMenubarShortcut,\n\tMenubarCheckboxItem,\n\tMenubarRadioGroup,\n\tMenubarRadioItem,\n\tMenubarSub,\n\tMenubarSubTrigger,\n\tMenubarSubContent,\n};\n","import { useCallback } from \"react\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport {\n\tMenubar,\n\tMenubarContent,\n\tMenubarItem,\n\tMenubarMenu,\n\tMenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype ArtifactsKeyHeaderProps = {\n\tartifactKey: string;\n\tpageHeader?: string;\n};\n\nexport const ArtifactsKeyHeader = ({\n\tartifactKey,\n\tpageHeader,\n}: ArtifactsKeyHeaderProps) => {\n\tconst handleCopyId = useCallback(() => {\n\t\tvoid navigator.clipboard.writeText(artifactKey);\n\t}, [artifactKey]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Header artifactKey={artifactKey} />\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t\t\t{/* <Button variant=\"outline\" className=\"px-1\"><Icon id=\"EllipsisVertical\" /></Button> */}\n\t\t\t\t\t<Menubar>\n\t\t\t\t\t\t<MenubarMenu>\n\t\t\t\t\t\t\t<MenubarTrigger className=\"px-1\">\n\t\t\t\t\t\t\t\t<Icon id=\"EllipsisVertical\" />\n\t\t\t\t\t\t\t</MenubarTrigger>\n\t\t\t\t\t\t\t<MenubarContent>\n\t\t\t\t\t\t\t\t<MenubarItem onClick={handleCopyId}>Copy Id</MenubarItem>\n\t\t\t\t\t\t\t</MenubarContent>\n\t\t\t\t\t\t</MenubarMenu>\n\t\t\t\t\t</Menubar>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{pageHeader && (\n\t\t\t\t<div className=\"\">\n\t\t\t\t\t<Typography variant=\"h2\" className=\"my-4 font-bold prose lg:prose-xl\">\n\t\t\t\t\t\t<LazyMarkdown>{pageHeader}</LazyMarkdown>\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<hr />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nconst Header = ({ artifactKey }: ArtifactsKeyHeaderProps) => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbLink to=\"/artifacts\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t{artifactKey}\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Card } from \"@/components/ui/card\";\nimport { Typography } from \"@/components/ui/typography\";\n\nexport type ArtifactTimelineCardProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactTimelineCard = ({\n\tartifact,\n}: ArtifactTimelineCardProps) => {\n\tconst artifactTitle = useMemo(() => {\n\t\treturn artifact.id?.split(\"-\")[0];\n\t}, [artifact.id]);\n\n\treturn (\n\t\t<Card\n\t\t\tdata-testid={`timeline-card-${artifact.id}`}\n\t\t\tclassName=\"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow\"\n\t\t>\n\t\t\t<Link to=\"/artifacts/artifact/$id\" params={{ id: artifact.id ?? \"\" }}>\n\t\t\t\t<Typography\n\t\t\t\t\tvariant=\"body\"\n\t\t\t\t\tclassName=\"font-bold text-blue-700 hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{artifactTitle}\n\t\t\t\t</Typography>\n\t\t\t</Link>\n\t\t\t{artifact.flow_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tFlow run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/flow-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.flow_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t\t{artifact.task_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tTask run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/task-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.task_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t</Card>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { formatDate } from \"@/utils/date\";\nimport { ArtifactTimelineCard } from \"./timelineCard\";\n\nexport type TimelineRowProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const TimelineRow = ({ artifact }: TimelineRowProps) => {\n\tconst [date, time] = formatDate(artifact.created ?? \"\", \"dateTime\").split(\n\t\t\" at \",\n\t);\n\treturn (\n\t\t<div data-testid={`timeline-row-${artifact.id}`} className=\"flex\">\n\t\t\t<div\n\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\tstyle={{ width: \"128px\" }}\n\t\t\t>\n\t\t\t\t<Typography variant=\"body\">{time}</Typography>\n\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t{date}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"size-4 rounded-full bg-white my-5 mx-auto border-2\"\n\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% + 2px)\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"grow mt-1\">\n\t\t\t\t<ArtifactTimelineCard artifact={artifact} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TimelineRow } from \"./timelineRow\";\n\nexport type TimelineContainerProps = {\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const TimelineContainer = ({ artifacts }: TimelineContainerProps) => {\n\treturn (\n\t\t<div>\n\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t<TimelineRow key={artifact.id} artifact={artifact} />\n\t\t\t))}\n\t\t\t<div className=\"flex border-b\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\t\tstyle={{ width: \"128px\", height: \"88px\" }}\n\t\t\t\t/>\n\t\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200 pt-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center\"\n\t\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% - 6px)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"size-4 rounded-full border-2 border-black relative\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ padding: \"33px 0 0 5px\" }}>\n\t\t\t\t\t<Typography variant=\"bodyLarge\">\n\t\t\t\t\t\tCreated <span className=\"font-bold\">{artifacts[0].key}</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactsKeyHeader } from \"./artifacts-key-header\";\nimport { TimelineContainer } from \"./timeline/timelineContainer\";\n\ntype ArtifactsKeyPageProps = {\n\tartifactKey: string;\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const ArtifactsKeyPage = ({\n\tartifactKey,\n\tartifacts,\n}: ArtifactsKeyPageProps) => {\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyHeader\n\t\t\t\tartifactKey={artifactKey}\n\t\t\t\tpageHeader={artifacts[0]?.description ?? undefined}\n\t\t\t/>\n\t\t\t<TimelineContainer artifacts={artifacts} />\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { type ArtifactsFilter, buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { useFilterArtifactsFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { ArtifactsKeyPage } from \"@/components/artifacts/key/artifacts-key-page\";\n\nconst buildFilterBody = (key: string): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\tkey: {\n\t\t\tlike_: key, // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/key/$key\")({\n\tcomponent: RouteComponent,\n\tloader: async ({ context, params }) => {\n\t\tconst { key } = params;\n\n\t\tconst artifacts = await context.queryClient.ensureQueryData(\n\t\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t\t);\n\n\t\treturn { artifacts };\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst { key } = Route.useParams();\n\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t);\n\n\tconst artifactWithMetadata = useFilterArtifactsFlowTaskRuns(\n\t\tbuildFilterBody(key),\n\t);\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyPage\n\t\t\t\tartifactKey={key} // can't use \"key\" as it is a reserved word\n\t\t\t\tartifacts={artifactWithMetadata ?? artifacts}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["Menubar","className","props","jsx","MenubarPrimitive.Root","cn","MenubarMenu","MenubarPrimitive.Menu","MenubarPortal","MenubarPrimitive.Portal","MenubarTrigger","MenubarPrimitive.Trigger","MenubarContent","align","alignOffset","sideOffset","MenubarPrimitive.Content","MenubarItem","inset","variant","MenubarPrimitive.Item","ArtifactsKeyHeader","artifactKey","pageHeader","handleCopyId","useCallback","jsxs","Fragment","Header","DocsLink","Icon","Typography","LazyMarkdown","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","ArtifactTimelineCard","artifact","artifactTitle","useMemo","Card","Link","TimelineRow","date","time","formatDate","TimelineContainer","artifacts","ArtifactsKeyPage","buildFilterBody","key","operator","like_","sort","offset","RouteComponent","Route","useParams","data","useSuspenseQuery","buildListArtifactsQuery","artifactWithMetadata","useFilterArtifactsFlowTaskRuns"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-markdown-BV905mMk.js","assets/vendor-tanstack-CLpbOGYv.js","assets/vendor-react-Bce9NwRC.js"])))=>i.map(i=>d[i]);
2
- import{cc as r,b5 as _}from"./index-BZqccBpn.js";import{r as e,j as s}from"./vendor-tanstack-CLpbOGYv.js";function f({children:a,...i}){const[o,u]=e.useState(null),[n,l]=e.useState(null);return e.useEffect(()=>{Promise.all([r(()=>import("./vendor-markdown-BV905mMk.js").then(t=>t.i),__vite__mapDeps([0,1,2])),r(()=>import("./vendor-markdown-BV905mMk.js").then(t=>t.a),__vite__mapDeps([0,1,2]))]).then(([t,m])=>{u(()=>t.default),l(()=>m.default)})},[]),!o||!n?s.jsx(_,{className:"min-h-[100px]"}):s.jsx(o,{remarkPlugins:[n],...i,children:a})}export{f as L};
3
- //# sourceMappingURL=lazy-markdown-Bzi0YUUV.js.map
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-markdown-TdbL8FCd.js","assets/vendor-tanstack-CWDKYA_B.js","assets/vendor-react-Bce9NwRC.js"])))=>i.map(i=>d[i]);
2
+ import{cc as r,b5 as _}from"./index-DLuXqHi9.js";import{r as e,j as s}from"./vendor-tanstack-CWDKYA_B.js";function f({children:a,...i}){const[o,u]=e.useState(null),[n,l]=e.useState(null);return e.useEffect(()=>{Promise.all([r(()=>import("./vendor-markdown-TdbL8FCd.js").then(t=>t.i),__vite__mapDeps([0,1,2])),r(()=>import("./vendor-markdown-TdbL8FCd.js").then(t=>t.a),__vite__mapDeps([0,1,2]))]).then(([t,m])=>{u(()=>t.default),l(()=>m.default)})},[]),!o||!n?s.jsx(_,{className:"min-h-[100px]"}):s.jsx(o,{remarkPlugins:[n],...i,children:a})}export{f as L};
3
+ //# sourceMappingURL=lazy-markdown-sP3PYQgB.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":";0GAQO,SAASA,EAAa,CAAE,SAAAC,EAAU,GAAGC,GAA4B,CACvE,KAAM,CAACC,EAAWC,CAAY,EAC7BC,WAA8C,IAAI,EAC7C,CAACC,EAAQC,CAAS,EAAIF,WAE1B,IAAI,EAWN,OATAG,YAAU,IAAM,CACV,QAAQ,IAAI,CAAAC,EAAA,IAAC,OAAO,+BAAgB,OAAAC,KAAA,mCAAG,OAAO,+BAAY,wCAAC,CAAC,EAAE,KAClE,CAAC,CAACC,EAAIC,CAAG,IAAM,CACdR,EAAa,IAAMO,EAAG,OAAO,EAC7BJ,EAAU,IAAMK,EAAI,OAAO,CAC5B,EAEF,EAAG,EAAE,EAED,CAACT,GAAa,CAACG,EACXO,MAACC,EAAA,CAAS,UAAU,gBAAgB,EAI3CD,MAACV,GAAU,cAAe,CAACG,CAAM,EAAI,GAAGJ,EACtC,SAAAD,EACF,CAEF","names":["LazyMarkdown","children","props","Component","setComponent","useState","plugin","setPlugin","useEffect","__vitePreload","n","md","gfm","jsx","Skeleton"],"ignoreList":[],"sources":["../../src/components/ui/lazy-markdown.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { Options } from \"react-markdown\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\ntype LazyMarkdownProps = Omit<Options, \"children\"> & {\n\tchildren: string;\n};\n\nexport function LazyMarkdown({ children, ...props }: LazyMarkdownProps) {\n\tconst [Component, setComponent] =\n\t\tuseState<React.ComponentType<Options> | null>(null);\n\tconst [plugin, setPlugin] = useState<\n\t\ttypeof import(\"remark-gfm\").default | null\n\t>(null);\n\n\tuseEffect(() => {\n\t\tvoid Promise.all([import(\"react-markdown\"), import(\"remark-gfm\")]).then(\n\t\t\t([md, gfm]) => {\n\t\t\t\tsetComponent(() => md.default);\n\t\t\t\tsetPlugin(() => gfm.default);\n\t\t\t},\n\t\t);\n\t}, []);\n\n\tif (!Component || !plugin) {\n\t\treturn <Skeleton className=\"min-h-[100px]\" />;\n\t}\n\n\treturn (\n\t\t<Component remarkPlugins={[plugin]} {...props}>\n\t\t\t{children}\n\t\t</Component>\n\t);\n}\n"],"file":"lazy-markdown-Bzi0YUUV.js"}
1
+ {"version":3,"mappings":";0GAQO,SAASA,EAAa,CAAE,SAAAC,EAAU,GAAGC,GAA4B,CACvE,KAAM,CAACC,EAAWC,CAAY,EAC7BC,WAA8C,IAAI,EAC7C,CAACC,EAAQC,CAAS,EAAIF,WAE1B,IAAI,EAWN,OATAG,YAAU,IAAM,CACV,QAAQ,IAAI,CAAAC,EAAA,IAAC,OAAO,+BAAgB,OAAAC,KAAA,mCAAG,OAAO,+BAAY,wCAAC,CAAC,EAAE,KAClE,CAAC,CAACC,EAAIC,CAAG,IAAM,CACdR,EAAa,IAAMO,EAAG,OAAO,EAC7BJ,EAAU,IAAMK,EAAI,OAAO,CAC5B,EAEF,EAAG,EAAE,EAED,CAACT,GAAa,CAACG,EACXO,MAACC,EAAA,CAAS,UAAU,gBAAgB,EAI3CD,MAACV,GAAU,cAAe,CAACG,CAAM,EAAI,GAAGJ,EACtC,SAAAD,EACF,CAEF","names":["LazyMarkdown","children","props","Component","setComponent","useState","plugin","setPlugin","useEffect","__vitePreload","n","md","gfm","jsx","Skeleton"],"ignoreList":[],"sources":["../../src/components/ui/lazy-markdown.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { Options } from \"react-markdown\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\ntype LazyMarkdownProps = Omit<Options, \"children\"> & {\n\tchildren: string;\n};\n\nexport function LazyMarkdown({ children, ...props }: LazyMarkdownProps) {\n\tconst [Component, setComponent] =\n\t\tuseState<React.ComponentType<Options> | null>(null);\n\tconst [plugin, setPlugin] = useState<\n\t\ttypeof import(\"remark-gfm\").default | null\n\t>(null);\n\n\tuseEffect(() => {\n\t\tvoid Promise.all([import(\"react-markdown\"), import(\"remark-gfm\")]).then(\n\t\t\t([md, gfm]) => {\n\t\t\t\tsetComponent(() => md.default);\n\t\t\t\tsetPlugin(() => gfm.default);\n\t\t\t},\n\t\t);\n\t}, []);\n\n\tif (!Component || !plugin) {\n\t\treturn <Skeleton className=\"min-h-[100px]\" />;\n\t}\n\n\treturn (\n\t\t<Component remarkPlugins={[plugin]} {...props}>\n\t\t\t{children}\n\t\t</Component>\n\t);\n}\n"],"file":"lazy-markdown-sP3PYQgB.js"}
@@ -1,2 +1,2 @@
1
- import{j as e,r as o,u as p,N as h}from"./vendor-tanstack-CLpbOGYv.js";import{l as g,C as j,m as v,n as L,o as w,p as C,q as b,R as N,r as R,P as S}from"./index-BZqccBpn.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CP6hQtRc.js";import"./vendor-recharts-BOcghvr2.js";import"./vendor-forms-mroZAMaw.js";import"./vendor-date-Bxa7CHB1.js";function P({className:t="size-11"}){return e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 76 76",className:t,"aria-label":"Prefect Logo",children:[e.jsx("title",{children:"Prefect Logo"}),e.jsx("path",{fill:"currentColor",fillRule:"evenodd",d:"M15.89 15.07 38 26.543v22.935l22.104-11.47.007.004V15.068l-.003.001L38 3.598z",clipRule:"evenodd"}),e.jsx("path",{fill:"currentColor",fillRule:"evenodd",d:"M15.89 15.07 38 26.543v22.935l22.104-11.47.007.004V15.068l-.003.001L38 3.598z",clipRule:"evenodd"}),e.jsx("path",{fill:"currentColor",fillRule:"evenodd",d:"M37.987 49.464 15.89 38v22.944l.013-.006L38 72.402V49.457z",clipRule:"evenodd"})]})}function u({redirectTo:t="/dashboard"}){const[s,d]=o.useState(""),[i,n]=o.useState(""),[r,l]=o.useState(!1),{login:f}=g(),m=p(),x=a=>{a.preventDefault(),!(r||!s.trim())&&(l(!0),n(""),f(s).then(c=>{c.success?m({to:t}):(n(c.error??"Authentication failed"),l(!1))}))};return e.jsx("div",{className:"flex items-center justify-center min-h-screen",children:e.jsxs(j,{className:"w-full max-w-[400px]",children:[e.jsxs(v,{className:"flex flex-col items-center gap-4",children:[e.jsx(P,{className:"size-16"}),e.jsx(L,{children:"Login"})]}),e.jsx(w,{children:e.jsxs("form",{onSubmit:x,className:"flex flex-col gap-4",children:[e.jsx(C,{type:"password",placeholder:"admin:pass",value:s,onChange:a=>d(a.target.value),autoFocus:!0,disabled:r}),i&&e.jsx("p",{className:"text-sm text-destructive",children:i}),e.jsx(b,{type:"submit",disabled:r,className:"w-full",children:r?"Logging in...":"Login"})]})})]})})}function I(){const{redirectTo:t}=N.useSearch(),s=R();return s?s.isLoading?e.jsx(S,{}):s.isAuthenticated?e.jsx(h,{to:t??"/dashboard",replace:!0}):e.jsx(u,{redirectTo:t}):e.jsx(u,{redirectTo:t})}export{I as component};
2
- //# sourceMappingURL=login-CM0nuDdd.js.map
1
+ import{j as e,r as o,d as p,N as h}from"./vendor-tanstack-CWDKYA_B.js";import{l as g,C as j,m as v,n as L,o as w,p as C,q as b,R as N,r as R,P as S}from"./index-DLuXqHi9.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-DRMjKWJW.js";import"./vendor-recharts-BGjDGXVf.js";import"./vendor-forms-D-iybWES.js";import"./vendor-date-CRz8gtWZ.js";function P({className:t="size-11"}){return e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 76 76",className:t,"aria-label":"Prefect Logo",children:[e.jsx("title",{children:"Prefect Logo"}),e.jsx("path",{fill:"currentColor",fillRule:"evenodd",d:"M15.89 15.07 38 26.543v22.935l22.104-11.47.007.004V15.068l-.003.001L38 3.598z",clipRule:"evenodd"}),e.jsx("path",{fill:"currentColor",fillRule:"evenodd",d:"M15.89 15.07 38 26.543v22.935l22.104-11.47.007.004V15.068l-.003.001L38 3.598z",clipRule:"evenodd"}),e.jsx("path",{fill:"currentColor",fillRule:"evenodd",d:"M37.987 49.464 15.89 38v22.944l.013-.006L38 72.402V49.457z",clipRule:"evenodd"})]})}function d({redirectTo:t="/dashboard"}){const[s,u]=o.useState(""),[i,n]=o.useState(""),[r,l]=o.useState(!1),{login:f}=g(),m=p(),x=a=>{a.preventDefault(),!(r||!s.trim())&&(l(!0),n(""),f(s).then(c=>{c.success?m({to:t}):(n(c.error??"Authentication failed"),l(!1))}))};return e.jsx("div",{className:"flex items-center justify-center min-h-screen",children:e.jsxs(j,{className:"w-full max-w-[400px]",children:[e.jsxs(v,{className:"flex flex-col items-center gap-4",children:[e.jsx(P,{className:"size-16"}),e.jsx(L,{children:"Login"})]}),e.jsx(w,{children:e.jsxs("form",{onSubmit:x,className:"flex flex-col gap-4",children:[e.jsx(C,{type:"password",placeholder:"admin:pass",value:s,onChange:a=>u(a.target.value),autoFocus:!0,disabled:r}),i&&e.jsx("p",{className:"text-sm text-destructive",children:i}),e.jsx(b,{type:"submit",disabled:r,className:"w-full",children:r?"Logging in...":"Login"})]})})]})})}function I(){const{redirectTo:t}=N.useSearch(),s=R();return s?s.isLoading?e.jsx(S,{}):s.isAuthenticated?e.jsx(h,{to:t??"/dashboard",replace:!0}):e.jsx(d,{redirectTo:t}):e.jsx(d,{redirectTo:t})}export{I as component};
2
+ //# sourceMappingURL=login-DNY0o3XU.js.map