prefect 3.6.13.dev2__py3-none-any.whl → 3.6.14.dev1__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 (226) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/_internal/compatibility/blocks.py +18 -0
  3. prefect/client/schemas/filters.py +24 -0
  4. prefect/flow_engine.py +192 -10
  5. prefect/flows.py +61 -2
  6. prefect/results.py +262 -21
  7. prefect/runner/runner.py +29 -82
  8. prefect/runner/storage.py +3 -2
  9. prefect/server/schemas/filters.py +45 -0
  10. prefect/server/ui-v2/assets/{artifact-card-C8JEQRHl.js → artifact-card-DkgEVahF.js} +2 -2
  11. prefect/server/ui-v2/assets/{artifact-card-C8JEQRHl.js.map → artifact-card-DkgEVahF.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{artifact._id-67V8kTg9.js → artifact._id-C7yJhkKY.js} +2 -2
  13. prefect/server/ui-v2/assets/{artifact._id-67V8kTg9.js.map → artifact._id-C7yJhkKY.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automation-wizard-DuxZ47Nn.js → automation-wizard-BLI4sqs9.js} +2 -2
  15. prefect/server/ui-v2/assets/{automation-wizard-DuxZ47Nn.js.map → automation-wizard-BLI4sqs9.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{automation._id-D8S8r4Ji.js → automation._id-OLes3du9.js} +2 -2
  17. prefect/server/ui-v2/assets/{automation._id-D8S8r4Ji.js.map → automation._id-OLes3du9.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{automation_._id.edit-C1fOM0Hx.js → automation_._id.edit-QrSzkDDB.js} +2 -2
  19. prefect/server/ui-v2/assets/{automation_._id.edit-C1fOM0Hx.js.map → automation_._id.edit-QrSzkDDB.js.map} +1 -1
  20. prefect/server/ui-v2/assets/{automations-header-DrijTNGi.js → automations-header-BoJc9HK8.js} +2 -2
  21. prefect/server/ui-v2/assets/{automations-header-DrijTNGi.js.map → automations-header-BoJc9HK8.js.map} +1 -1
  22. prefect/server/ui-v2/assets/{base-job-template-form-section-BDkqOkpe.js → base-job-template-form-section-Br6s0jNS.js} +2 -2
  23. prefect/server/ui-v2/assets/{base-job-template-form-section-BDkqOkpe.js.map → base-job-template-form-section-Br6s0jNS.js.map} +1 -1
  24. prefect/server/ui-v2/assets/{block-type-details-CrFHWH5D.js → block-type-details-BSbBP-Nm.js} +2 -2
  25. prefect/server/ui-v2/assets/{block-type-details-CrFHWH5D.js.map → block-type-details-BSbBP-Nm.js.map} +1 -1
  26. prefect/server/ui-v2/assets/block-type-logo-DNFERTyH.js +2 -0
  27. prefect/server/ui-v2/assets/{block-type-logo-WQNm0PzP.js.map → block-type-logo-DNFERTyH.js.map} +1 -1
  28. prefect/server/ui-v2/assets/{block._id-C3gN1Ae8.js → block._id-DO6Hulrv.js} +2 -2
  29. prefect/server/ui-v2/assets/{block._id-C3gN1Ae8.js.map → block._id-DO6Hulrv.js.map} +1 -1
  30. prefect/server/ui-v2/assets/{block_._id.edit-DzPuSvat.js → block_._id.edit-BWF0TQvv.js} +2 -2
  31. prefect/server/ui-v2/assets/{block_._id.edit-DzPuSvat.js.map → block_._id.edit-BWF0TQvv.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{catalog-T-7MqsyE.js → catalog-BlaqZP0r.js} +2 -2
  33. prefect/server/ui-v2/assets/{catalog-T-7MqsyE.js.map → catalog-BlaqZP0r.js.map} +1 -1
  34. prefect/server/ui-v2/assets/{catalog_._slug-DMOI61fc.js → catalog_._slug-BZWiMtjq.js} +2 -2
  35. prefect/server/ui-v2/assets/{catalog_._slug-DMOI61fc.js.map → catalog_._slug-BZWiMtjq.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{catalog_._slug_.create-l9bGUPi-.js → catalog_._slug_.create-oHffbeMs.js} +2 -2
  37. prefect/server/ui-v2/assets/{catalog_._slug_.create-l9bGUPi-.js.map → catalog_._slug_.create-oHffbeMs.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{collapsible-DM-Ze5-Y.js → collapsible-D45P93xU.js} +2 -2
  39. prefect/server/ui-v2/assets/{collapsible-DM-Ze5-Y.js.map → collapsible-D45P93xU.js.map} +1 -1
  40. prefect/server/ui-v2/assets/{concurrency-limit._id-BHEt9viF.js → concurrency-limit._id-B6oyPVya.js} +2 -2
  41. prefect/server/ui-v2/assets/{concurrency-limit._id-BHEt9viF.js.map → concurrency-limit._id-B6oyPVya.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{create-BMxUOyN5.js → create-CcYMd6w6.js} +2 -2
  43. prefect/server/ui-v2/assets/{create-BMxUOyN5.js.map → create-CcYMd6w6.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{create-Cq-EAHVk.js → create-DK1WvDhf.js} +2 -2
  45. prefect/server/ui-v2/assets/{create-Cq-EAHVk.js.map → create-DK1WvDhf.js.map} +1 -1
  46. prefect/server/ui-v2/assets/{data-table-Bw8TZx9D.js → data-table-B_iyrrTm.js} +2 -2
  47. prefect/server/ui-v2/assets/{data-table-Bw8TZx9D.js.map → data-table-B_iyrrTm.js.map} +1 -1
  48. prefect/server/ui-v2/assets/{delete-confirmation-dialog-CTdWZlGM.js → delete-confirmation-dialog-7GKqeKy1.js} +2 -2
  49. prefect/server/ui-v2/assets/{delete-confirmation-dialog-CTdWZlGM.js.map → delete-confirmation-dialog-7GKqeKy1.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment-action-header-BObYqmI_.js → deployment-action-header-DrvnfE9Y.js} +2 -2
  51. prefect/server/ui-v2/assets/{deployment-action-header-BObYqmI_.js.map → deployment-action-header-DrvnfE9Y.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment-form-CntyhRrK.js → deployment-form-DsAij22s.js} +3 -3
  53. prefect/server/ui-v2/assets/{deployment-form-CntyhRrK.js.map → deployment-form-DsAij22s.js.map} +1 -1
  54. prefect/server/ui-v2/assets/{deployment-links-DBUSCaxB.js → deployment-links-BwqfKWQX.js} +2 -2
  55. prefect/server/ui-v2/assets/{deployment-links-DBUSCaxB.js.map → deployment-links-BwqfKWQX.js.map} +1 -1
  56. prefect/server/ui-v2/assets/{deployment._id-BXanVFA8.js → deployment._id-E5e5s6bO.js} +2 -2
  57. prefect/server/ui-v2/assets/{deployment._id-BXanVFA8.js.map → deployment._id-E5e5s6bO.js.map} +1 -1
  58. prefect/server/ui-v2/assets/{deployment._id-Q5cvHMX9.js → deployment._id-U6KrtWw0.js} +2 -2
  59. prefect/server/ui-v2/assets/{deployment._id-Q5cvHMX9.js.map → deployment._id-U6KrtWw0.js.map} +1 -1
  60. prefect/server/ui-v2/assets/deployment_._id.duplicate-C_kNyCA9.js +2 -0
  61. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DB-4hHHc.js.map → deployment_._id.duplicate-C_kNyCA9.js.map} +1 -1
  62. prefect/server/ui-v2/assets/deployment_._id.edit-BP8pfTOR.js +2 -0
  63. prefect/server/ui-v2/assets/{deployment_._id.edit-CWf1RIGy.js.map → deployment_._id.edit-BP8pfTOR.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{deployment_._id.run-CoHGXFoM.js → deployment_._id.run-Di3-4Mtk.js} +2 -2
  65. prefect/server/ui-v2/assets/{deployment_._id.run-CoHGXFoM.js.map → deployment_._id.run-Di3-4Mtk.js.map} +1 -1
  66. prefect/server/ui-v2/assets/{dropdown-menu-CT-s-V7d.js → dropdown-menu-iS8iJMpx.js} +2 -2
  67. prefect/server/ui-v2/assets/{dropdown-menu-CT-s-V7d.js.map → dropdown-menu-iS8iJMpx.js.map} +1 -1
  68. prefect/server/ui-v2/assets/{event._eventDate._eventId-BITo_GYL.js → event._eventDate._eventId-CG15qDSZ.js} +2 -2
  69. prefect/server/ui-v2/assets/{event._eventDate._eventId-BITo_GYL.js.map → event._eventDate._eventId-CG15qDSZ.js.map} +1 -1
  70. prefect/server/ui-v2/assets/flow-run-graph-B1vF1w0Z.js +2 -0
  71. prefect/server/ui-v2/assets/flow-run-graph-B1vF1w0Z.js.map +1 -0
  72. prefect/server/ui-v2/assets/flow-run._id-BHY61H6u.js +4 -0
  73. prefect/server/ui-v2/assets/flow-run._id-BHY61H6u.js.map +1 -0
  74. prefect/server/ui-v2/assets/{flow-run._id-BtSgRDtA.js → flow-run._id-D_eAHZ5z.js} +2 -2
  75. prefect/server/ui-v2/assets/{flow-run._id-BtSgRDtA.js.map → flow-run._id-D_eAHZ5z.js.map} +1 -1
  76. prefect/server/ui-v2/assets/{flow-run._id-Bbm9OpDi.js → flow-run._id-wco0Q19f.js} +2 -2
  77. prefect/server/ui-v2/assets/{flow-run._id-Bbm9OpDi.js.map → flow-run._id-wco0Q19f.js.map} +1 -1
  78. prefect/server/ui-v2/assets/{flow-runs-pagination-LrU9Aio8.js → flow-runs-pagination-DzGHOht3.js} +2 -2
  79. prefect/server/ui-v2/assets/{flow-runs-pagination-LrU9Aio8.js.map → flow-runs-pagination-DzGHOht3.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{flow._id-BJBRokk4.js → flow._id-Dn2so3rK.js} +2 -2
  81. prefect/server/ui-v2/assets/{flow._id-BJBRokk4.js.map → flow._id-Dn2so3rK.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{form-CVSlEnl8.js → form-rC8pxeRl.js} +2 -2
  83. prefect/server/ui-v2/assets/{form-CVSlEnl8.js.map → form-rC8pxeRl.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-4plZZheZ.js → header-C0zV3WDn.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-4plZZheZ.js.map → header-C0zV3WDn.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{header-D3uM8_xM.js → header-C6ko3O7G.js} +2 -2
  87. prefect/server/ui-v2/assets/{header-D3uM8_xM.js.map → header-C6ko3O7G.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{header-9rXZ4r39.js → header-CuAwmJ64.js} +2 -2
  89. prefect/server/ui-v2/assets/{header-9rXZ4r39.js.map → header-CuAwmJ64.js.map} +1 -1
  90. prefect/server/ui-v2/assets/{index-6OsEYhIi.js → index-0g8aAM30.js} +2 -2
  91. prefect/server/ui-v2/assets/{index-6OsEYhIi.js.map → index-0g8aAM30.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-BeoNC2tJ.js → index-BIqzfifB.js} +2 -2
  93. prefect/server/ui-v2/assets/{index-BeoNC2tJ.js.map → index-BIqzfifB.js.map} +1 -1
  94. prefect/server/ui-v2/assets/{index-ChIrfjIW.js → index-BKbBu9gL.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-ChIrfjIW.js.map → index-BKbBu9gL.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-h9-QgNjZ.js → index-BYQ1P2TC.js} +2 -2
  97. prefect/server/ui-v2/assets/{index-h9-QgNjZ.js.map → index-BYQ1P2TC.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{index-DODEq1Pi.js → index-BdgomKuA.js} +2 -2
  99. prefect/server/ui-v2/assets/{index-DODEq1Pi.js.map → index-BdgomKuA.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{index-DqCPbST9.js → index-Benf9xn3.js} +2 -2
  101. prefect/server/ui-v2/assets/{index-DqCPbST9.js.map → index-Benf9xn3.js.map} +1 -1
  102. prefect/server/ui-v2/assets/{index-B7xsJ-QH.js → index-BjsWjEUO.js} +2 -2
  103. prefect/server/ui-v2/assets/{index-B7xsJ-QH.js.map → index-BjsWjEUO.js.map} +1 -1
  104. prefect/server/ui-v2/assets/{index-DicK6p3K.js → index-C3D0Re7U.js} +2 -2
  105. prefect/server/ui-v2/assets/{index-DicK6p3K.js.map → index-C3D0Re7U.js.map} +1 -1
  106. prefect/server/ui-v2/assets/{index-BlpD74iH.js → index-CCs20W5W.js} +2 -2
  107. prefect/server/ui-v2/assets/{index-BlpD74iH.js.map → index-CCs20W5W.js.map} +1 -1
  108. prefect/server/ui-v2/assets/{index-udb79rgq.js → index-CEStyUb-.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-udb79rgq.js.map → index-CEStyUb-.js.map} +1 -1
  110. prefect/server/ui-v2/assets/{index-tBdv6kBF.js → index-CYpFLd7y.js} +2 -2
  111. prefect/server/ui-v2/assets/{index-tBdv6kBF.js.map → index-CYpFLd7y.js.map} +1 -1
  112. prefect/server/ui-v2/assets/{index-CDyLkbVG.js → index-CcVSC2pV.js} +2 -2
  113. prefect/server/ui-v2/assets/{index-CDyLkbVG.js.map → index-CcVSC2pV.js.map} +1 -1
  114. prefect/server/ui-v2/assets/index-Cd7pM9pk.js +17 -0
  115. prefect/server/ui-v2/assets/index-Cd7pM9pk.js.map +1 -0
  116. prefect/server/ui-v2/assets/{index-DJyKqsFO.js → index-CotXErTe.js} +2 -2
  117. prefect/server/ui-v2/assets/{index-DJyKqsFO.js.map → index-CotXErTe.js.map} +1 -1
  118. prefect/server/ui-v2/assets/{index-DxPoKag8.js → index-D8fZaZa7.js} +2 -2
  119. prefect/server/ui-v2/assets/{index-DxPoKag8.js.map → index-D8fZaZa7.js.map} +1 -1
  120. prefect/server/ui-v2/assets/{index-D6GJ4go1.js → index-DB2qeheX.js} +2 -2
  121. prefect/server/ui-v2/assets/{index-D6GJ4go1.js.map → index-DB2qeheX.js.map} +1 -1
  122. prefect/server/ui-v2/assets/{index-CzCSgCK-.js → index-DvKYj8ko.js} +2 -2
  123. prefect/server/ui-v2/assets/{index-CzCSgCK-.js.map → index-DvKYj8ko.js.map} +1 -1
  124. prefect/server/ui-v2/assets/{index-BfJLUM7N.js → index-DwkedbVy.js} +2 -2
  125. prefect/server/ui-v2/assets/{index-BfJLUM7N.js.map → index-DwkedbVy.js.map} +1 -1
  126. prefect/server/ui-v2/assets/index-b9WBW430.css +1 -0
  127. prefect/server/ui-v2/assets/{index-CDwJvjUM.js → index-fhrsIceD.js} +2 -2
  128. prefect/server/ui-v2/assets/{index-CDwJvjUM.js.map → index-fhrsIceD.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{index-D5v9S-lB.js → index-k2161reF.js} +2 -2
  130. prefect/server/ui-v2/assets/{index-D5v9S-lB.js.map → index-k2161reF.js.map} +1 -1
  131. prefect/server/ui-v2/assets/{index-Bj0OOguP.js → index-pE_31vXF.js} +2 -2
  132. prefect/server/ui-v2/assets/{index-Bj0OOguP.js.map → index-pE_31vXF.js.map} +1 -1
  133. prefect/server/ui-v2/assets/{json-input-Dt1icmrn.js → json-input-C9dkBSdc.js} +2 -2
  134. prefect/server/ui-v2/assets/{json-input-Dt1icmrn.js.map → json-input-C9dkBSdc.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{key._key-Cyh5MBX_.js → key._key-BBVH44_R.js} +2 -2
  136. prefect/server/ui-v2/assets/{key._key-Cyh5MBX_.js.map → key._key-BBVH44_R.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{lazy-markdown-BwIwKFRF.js → lazy-markdown-BoMKGRXo.js} +2 -2
  138. prefect/server/ui-v2/assets/{lazy-markdown-BwIwKFRF.js.map → lazy-markdown-BoMKGRXo.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{login-DKXFVSwk.js → login-BmmIDesJ.js} +2 -2
  140. prefect/server/ui-v2/assets/{login-DKXFVSwk.js.map → login-BmmIDesJ.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{markdown-input-Dp0mBlkV.js → markdown-input-C6P8cYT1.js} +2 -2
  142. prefect/server/ui-v2/assets/{markdown-input-Dp0mBlkV.js.map → markdown-input-C6P8cYT1.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{python-example-snippet-BYwPjHI5.js → python-example-snippet-DPumgTpL.js} +3 -3
  144. prefect/server/ui-v2/assets/{python-example-snippet-BYwPjHI5.js.map → python-example-snippet-DPumgTpL.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{python-input-y26XMqXw.js → python-input-DX4uV8MF.js} +2 -2
  146. prefect/server/ui-v2/assets/{python-input-y26XMqXw.js.map → python-input-DX4uV8MF.js.map} +1 -1
  147. prefect/server/ui-v2/assets/{radio-group-D0van45v.js → radio-group-DeNK-Ob0.js} +2 -2
  148. prefect/server/ui-v2/assets/{radio-group-D0van45v.js.map → radio-group-DeNK-Ob0.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{route-error-state-CGGpuCGN.js → route-error-state-C9CbByMx.js} +2 -2
  150. prefect/server/ui-v2/assets/{route-error-state-CGGpuCGN.js.map → route-error-state-C9CbByMx.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{schema-form-2tg5SXM4.js → schema-form-B45xnsnK.js} +2 -2
  152. prefect/server/ui-v2/assets/{schema-form-2tg5SXM4.js.map → schema-form-B45xnsnK.js.map} +1 -1
  153. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZt6AJ4z.js → schema-form-input-string-format-datetime-BJj81bu-.js} +4 -4
  154. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZt6AJ4z.js.map → schema-form-input-string-format-datetime-BJj81bu-.js.map} +1 -1
  155. prefect/server/ui-v2/assets/{settings-DDUadk_N.js → settings-CbkeWqQ9.js} +2 -2
  156. prefect/server/ui-v2/assets/{settings-DDUadk_N.js.map → settings-CbkeWqQ9.js.map} +1 -1
  157. prefect/server/ui-v2/assets/{sort-filter-D9p3cPx9.js → sort-filter-DM7SvBB0.js} +2 -2
  158. prefect/server/ui-v2/assets/{sort-filter-D9p3cPx9.js.map → sort-filter-DM7SvBB0.js.map} +1 -1
  159. prefect/server/ui-v2/assets/{table-vo9Do8sA.js → table-CEPo6xb_.js} +2 -2
  160. prefect/server/ui-v2/assets/{table-vo9Do8sA.js.map → table-CEPo6xb_.js.map} +1 -1
  161. prefect/server/ui-v2/assets/{tags-input-Ci2JQ-k3.js → tags-input-DJiZSVHp.js} +2 -2
  162. prefect/server/ui-v2/assets/{tags-input-Ci2JQ-k3.js.map → tags-input-DJiZSVHp.js.map} +1 -1
  163. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CJzPc2gw.js → task-run-concurrency-limits-reset-dialog-vJEkvqWp.js} +2 -2
  164. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CJzPc2gw.js.map → task-run-concurrency-limits-reset-dialog-vJEkvqWp.js.map} +1 -1
  165. prefect/server/ui-v2/assets/{task-run._id-D8QKG5UZ.js → task-run._id-BCnDnXrL.js} +2 -2
  166. prefect/server/ui-v2/assets/{task-run._id-D8QKG5UZ.js.map → task-run._id-BCnDnXrL.js.map} +1 -1
  167. prefect/server/ui-v2/assets/{task-run._id-CjevSs79.js → task-run._id-ByJw1K82.js} +2 -2
  168. prefect/server/ui-v2/assets/{task-run._id-CjevSs79.js.map → task-run._id-ByJw1K82.js.map} +1 -1
  169. prefect/server/ui-v2/assets/{task-runs-pagination-CifoSGct.js → task-runs-pagination-DbjB6XnY.js} +2 -2
  170. prefect/server/ui-v2/assets/{task-runs-pagination-CifoSGct.js.map → task-runs-pagination-DbjB6XnY.js.map} +1 -1
  171. prefect/server/ui-v2/assets/{textarea-BAtfAxtV.js → textarea-BX8KbLGx.js} +2 -2
  172. prefect/server/ui-v2/assets/{textarea-BAtfAxtV.js.map → textarea-BX8KbLGx.js.map} +1 -1
  173. prefect/server/ui-v2/assets/{timezone-select-QlQTZSsF.js → timezone-select-TBj2n6Ox.js} +2 -2
  174. prefect/server/ui-v2/assets/{timezone-select-QlQTZSsF.js.map → timezone-select-TBj2n6Ox.js.map} +1 -1
  175. prefect/server/ui-v2/assets/{toggle-group-BJN1vjEh.js → toggle-group-D7mfSUim.js} +2 -2
  176. prefect/server/ui-v2/assets/{toggle-group-BJN1vjEh.js.map → toggle-group-D7mfSUim.js.map} +1 -1
  177. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-eOWJYPkD.js → use-delete-automation-confirmation-dialog-BpBSjz60.js} +2 -2
  178. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-eOWJYPkD.js.map → use-delete-automation-confirmation-dialog-BpBSjz60.js.map} +1 -1
  179. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BTwSeHRM.js → use-delete-block-document-confirmation-dialog-BjKsNw6b.js} +2 -2
  180. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BTwSeHRM.js.map → use-delete-block-document-confirmation-dialog-BjKsNw6b.js.map} +1 -1
  181. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-BL_Gv9CC.js → use-flow-runs-selected-rows-B_BlBMic.js} +2 -2
  182. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-BL_Gv9CC.js.map → use-flow-runs-selected-rows-B_BlBMic.js.map} +1 -1
  183. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-TSCoomjQ.js → use-get-artifacts-flow-task-runs-BfE433bC.js} +2 -2
  184. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-TSCoomjQ.js.map → use-get-artifacts-flow-task-runs-BfE433bC.js.map} +1 -1
  185. prefect/server/ui-v2/assets/{use-quick-run-BMnCkwSv.js → use-quick-run-qrtcF-DD.js} +2 -2
  186. prefect/server/ui-v2/assets/{use-quick-run-BMnCkwSv.js.map → use-quick-run-qrtcF-DD.js.map} +1 -1
  187. prefect/server/ui-v2/assets/{use-stepper-C1wm66U2.js → use-stepper-CVy1_GBw.js} +2 -2
  188. prefect/server/ui-v2/assets/{use-stepper-C1wm66U2.js.map → use-stepper-CVy1_GBw.js.map} +1 -1
  189. prefect/server/ui-v2/assets/{utilities-DxRXxFOF.js → utilities-D5-00wjP.js} +2 -2
  190. prefect/server/ui-v2/assets/{utilities-DxRXxFOF.js.map → utilities-D5-00wjP.js.map} +1 -1
  191. prefect/server/ui-v2/assets/{vendor-graphs-Diy0Lo-N.js → vendor-graphs-R8z6S3Jg.js} +2 -2
  192. prefect/server/ui-v2/assets/{vendor-graphs-Diy0Lo-N.js.map → vendor-graphs-R8z6S3Jg.js.map} +1 -1
  193. prefect/server/ui-v2/assets/{work-pool-filter-PudrkZYj.js → work-pool-filter-D8MkTbSW.js} +2 -2
  194. prefect/server/ui-v2/assets/{work-pool-filter-PudrkZYj.js.map → work-pool-filter-D8MkTbSW.js.map} +1 -1
  195. prefect/server/ui-v2/assets/{work-pool-queue-toggle-BAOrV_0R.js → work-pool-queue-toggle-CbI7Gfu5.js} +2 -2
  196. prefect/server/ui-v2/assets/{work-pool-queue-toggle-BAOrV_0R.js.map → work-pool-queue-toggle-CbI7Gfu5.js.map} +1 -1
  197. prefect/server/ui-v2/assets/{work-pool._workPoolName-BOM3849e.js → work-pool._workPoolName-CCzzgVV2.js} +2 -2
  198. prefect/server/ui-v2/assets/{work-pool._workPoolName-BOM3849e.js.map → work-pool._workPoolName-CCzzgVV2.js.map} +1 -1
  199. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CIhcG6yr.js → work-pool_._workPoolName.edit-BAgiuU_j.js} +2 -2
  200. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CIhcG6yr.js.map → work-pool_._workPoolName.edit-BAgiuU_j.js.map} +1 -1
  201. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js → work-pool_._workPoolName.queue._workQueueName-BUawWJEy.js} +2 -2
  202. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js.map → work-pool_._workPoolName.queue._workQueueName-BUawWJEy.js.map} +1 -1
  203. prefect/server/ui-v2/assets/{work-queue-icon-text-CP4yX3uM.js → work-queue-icon-text-D_G_UCJX.js} +2 -2
  204. prefect/server/ui-v2/assets/{work-queue-icon-text-CP4yX3uM.js.map → work-queue-icon-text-D_G_UCJX.js.map} +1 -1
  205. prefect/server/ui-v2/index.html +2 -2
  206. prefect/settings/models/flows.py +14 -1
  207. prefect/settings/models/runner.py +16 -6
  208. prefect/task_engine.py +1 -3
  209. prefect/task_worker.py +1 -1
  210. prefect/tasks.py +2 -2
  211. prefect/testing/fixtures.py +23 -5
  212. {prefect-3.6.13.dev2.dist-info → prefect-3.6.14.dev1.dist-info}/METADATA +1 -1
  213. {prefect-3.6.13.dev2.dist-info → prefect-3.6.14.dev1.dist-info}/RECORD +216 -216
  214. prefect/server/ui-v2/assets/block-type-logo-WQNm0PzP.js +0 -2
  215. prefect/server/ui-v2/assets/deployment_._id.duplicate-DB-4hHHc.js +0 -2
  216. prefect/server/ui-v2/assets/deployment_._id.edit-CWf1RIGy.js +0 -2
  217. prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js +0 -2
  218. prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js.map +0 -1
  219. prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js +0 -4
  220. prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js.map +0 -1
  221. prefect/server/ui-v2/assets/index-BvSl3DKP.js +0 -17
  222. prefect/server/ui-v2/assets/index-BvSl3DKP.js.map +0 -1
  223. prefect/server/ui-v2/assets/index-NY089eTx.css +0 -1
  224. {prefect-3.6.13.dev2.dist-info → prefect-3.6.14.dev1.dist-info}/WHEEL +0 -0
  225. {prefect-3.6.13.dev2.dist-info → prefect-3.6.14.dev1.dist-info}/entry_points.txt +0 -0
  226. {prefect-3.6.13.dev2.dist-info → prefect-3.6.14.dev1.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"task-run._id-CjevSs79.js","sources":["../../src/components/task-runs/task-run-artifacts/index.tsx","../../src/components/task-runs/task-run-details/task-run-details.tsx","../../src/components/task-runs/task-run-logs/index.tsx","../../src/hooks/use-state-favicon.ts","../../src/components/task-runs/task-run-details-page/index.tsx","../../src/routes/runs/task-run.$id.tsx?tsr-split=component"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { LayoutGrid, Rows3 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { ArtifactCard } from \"@/components/artifacts/artifact-card\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/utils\";\n\ntype TaskRunArtifactsProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunArtifacts = ({ taskRun }: TaskRunArtifactsProps) => {\n\tconst [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\ttask_run_id: {\n\t\t\t\t\tany_: [taskRun.id],\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"ID_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\tif (artifacts.length === 0) {\n\t\treturn (\n\t\t\t<Card>\n\t\t\t\t<CardContent className=\"text-center\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis task run did not produce any artifacts; for more information on\n\t\t\t\t\t\tcreating artifacts, see the{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://docs.prefect.io/v3/develop/artifacts\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-blue-500\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tvalue={view}\n\t\t\t\t\tonValueChange={(value) => setView(value as \"grid\" | \"list\")}\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"grid\" aria-label=\"Grid view\">\n\t\t\t\t\t\t<LayoutGrid className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"list\" aria-label=\"List view\">\n\t\t\t\t\t\t<Rows3 className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid\",\n\t\t\t\t\tview === \"grid\"\n\t\t\t\t\t\t? \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\"\n\t\t\t\t\t\t: \"grid-cols-1\",\n\t\t\t\t\t\"gap-4\",\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"task-run-artifacts-grid\"\n\t\t\t>\n\t\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t\t<ArtifactCard\n\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tcompact={view === \"list\"}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport humanizeDuration from \"humanize-duration\";\nimport { buildGetTaskRunResultQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\nfunction formatTaskDate(dateString: string | null | undefined): string {\n\tif (!dateString) return \"N/A\";\n\treturn formatDate(dateString, \"dateTimeNumeric\");\n}\n\nfunction formatTaskDuration(seconds: number | null | undefined): string {\n\tif (seconds === null || seconds === undefined) return \"N/A\";\n\treturn humanizeDuration(seconds * 1000, {\n\t\tmaxDecimalPoints: 2,\n\t\tunits: [\"s\"],\n\t});\n}\n\nexport type TaskRunDetailsProps = {\n\ttaskRun: TaskRun | null | undefined;\n};\n\nexport const TaskRunDetails = ({ taskRun }: TaskRunDetailsProps) => {\n\tconst { data: resultArtifact } = useQuery({\n\t\t...buildGetTaskRunResultQuery(taskRun?.id ?? \"\"),\n\t\tenabled: !!taskRun?.id,\n\t});\n\n\tif (!taskRun) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 bg-gray-100 p-4 rounded-md\">\n\t\t\t\t<span className=\"text-gray-500\">No task run details available</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 p-2 text-xs\">\n\t\t\t{taskRun.flow_run_id ? (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: taskRun.flow_run_id }}\n\t\t\t\t\t\t\tclassName=\"text-blue-500 hover:underline cursor-pointer flex items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"ExternalLink\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t\t{taskRun.flow_run_name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t) : (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>None</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Start Time</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.start_time ? formatTaskDate(taskRun.start_time) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Duration</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t<span className=\"flex items-center\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t{taskRun.total_run_time !== null &&\n\t\t\t\t\t\ttaskRun.total_run_time !== undefined\n\t\t\t\t\t\t\t? formatTaskDuration(taskRun.total_run_time)\n\t\t\t\t\t\t\t: \"None\"}\n\t\t\t\t\t</span>\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Run Count</dt>\n\t\t\t\t<dd className=\"\">{taskRun.run_count ?? 0}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Estimated Run Time</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.estimated_run_time !== null &&\n\t\t\t\t\ttaskRun.estimated_run_time !== undefined\n\t\t\t\t\t\t? formatTaskDuration(taskRun.estimated_run_time)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Created</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.created ? formatTaskDate(taskRun.created) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Last Updated</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.updated ? formatTaskDate(taskRun.updated) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.cache_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Expiration</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.cache_expiration\n\t\t\t\t\t\t? formatTaskDate(taskRun.cache_expiration)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Dynamic Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.dynamic_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Task Run ID</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.id}</dd>\n\t\t\t</dl>\n\n\t\t\t{resultArtifact?.description && (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-muted-foreground\">Result</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<div className=\"prose max-w-none dark:prose-invert\">\n\t\t\t\t\t\t\t<LazyMarkdown>{resultArtifact.description}</LazyMarkdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<div className=\"border-t border-gray-200 mt-2 pt-4\" />\n\t\t\t<h3 className=\"text-sm font-semibold mb-2\">Task configuration</h3>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Version</dt>\n\t\t\t\t<dd className=\"\">{taskRun.task_version || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retries</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retries?.toString() ?? \"0\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Delay</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{typeof taskRun.empirical_policy?.retry_delay === \"number\"\n\t\t\t\t\t\t? formatTaskDuration(taskRun.empirical_policy.retry_delay)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Jitter Factor</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retry_jitter_factor !== null &&\n\t\t\t\t\ttaskRun.empirical_policy?.retry_jitter_factor !== undefined\n\t\t\t\t\t\t? taskRun.empirical_policy.retry_jitter_factor.toString()\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Tags</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"None\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</div>\n\t);\n};\n","import { useSuspenseInfiniteQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport type { components } from \"@/api/prefect\";\nimport { RunLogs } from \"@/components/ui/run-logs\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\ntype TaskRunLogsProps = {\n\ttaskRun: components[\"schemas\"][\"TaskRun\"];\n\tvirtualize?: boolean;\n};\n\nexport const TaskRunLogs = ({\n\ttaskRun,\n\tvirtualize = true,\n}: TaskRunLogsProps) => {\n\tconst [levelFilter, setLevelFilter] = useState<number>(0);\n\tconst [sortOrder, setSortOrder] = useState<\n\t\t\"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\"\n\t>(\"TIMESTAMP_ASC\");\n\n\tconst queryOptions = useMemo(\n\t\t() => ({\n\t\t\t...buildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: sortOrder,\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: { ge_: levelFilter },\n\t\t\t\t\ttask_run_id: { any_: [taskRun.id] },\n\t\t\t\t},\n\t\t\t}),\n\t\t\trefetchInterval:\n\t\t\t\ttaskRun.state_type === \"RUNNING\" ? 5000 : (false as const),\n\t\t}),\n\t\t[levelFilter, sortOrder, taskRun.id, taskRun.state_type],\n\t);\n\n\tconst {\n\t\tdata: logs,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSuspenseInfiniteQuery(queryOptions);\n\n\tconst noLogs = logs.pages.length === 1 && logs.pages[0].length === 0;\n\tlet message = \"This run did not produce any logs.\";\n\tif (noLogs) {\n\t\tif (levelFilter > 0) {\n\t\t\tmessage = \"No logs match your filter criteria\";\n\t\t} else if (\n\t\t\ttaskRun.state_type === \"SCHEDULED\" &&\n\t\t\ttaskRun.state_name === \"Scheduled\"\n\t\t) {\n\t\t\tmessage = \"Run has not yet started. Check back soon for logs.\";\n\t\t} else if (taskRun.state_type === \"RUNNING\") {\n\t\t\tmessage = \"Waiting for logs...\";\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<LogLevelFilter\n\t\t\t\t\tlevelFilter={levelFilter}\n\t\t\t\t\tsetLevelFilter={setLevelFilter}\n\t\t\t\t/>\n\t\t\t\t<LogSortOrder sortOrder={sortOrder} setSortOrder={setSortOrder} />\n\t\t\t</div>\n\t\t\t{noLogs ? (\n\t\t\t\t<div className=\"flex flex-col gap-2 text-center bg-muted p-2 rounded-md\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">{message}</span>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"rounded-md\">\n\t\t\t\t\t<RunLogs\n\t\t\t\t\t\ttaskRun={taskRun}\n\t\t\t\t\t\tlogs={logs.pages.flat()}\n\t\t\t\t\t\tonBottomReached={() => {\n\t\t\t\t\t\t\tif (hasNextPage && !isFetchingNextPage) {\n\t\t\t\t\t\t\t\tfetchNextPage().catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"max-h-[85vh]\"\n\t\t\t\t\t\tvirtualize={virtualize}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst LEVEL_FILTER_OPTIONS = [\n\t{ label: \"All\", value: 0 },\n\t{ label: \"Critical only\", value: 50 },\n\t{ label: \"Error and above\", value: 40 },\n\t{ label: \"Warning and above\", value: 30 },\n\t{ label: \"Info and above\", value: 20 },\n\t{ label: \"Debug and above\", value: 10 },\n] as const;\n\nconst LogLevelFilter = ({\n\tlevelFilter,\n\tsetLevelFilter,\n}: {\n\tlevelFilter: number;\n\tsetLevelFilter: (level: number) => void;\n}) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={levelFilter.toString()}\n\t\t\tonValueChange={(value) => setLevelFilter(Number(value))}\n\t\t>\n\t\t\t<SelectTrigger aria-label=\"log level filter\">\n\t\t\t\t<span>\n\t\t\t\t\t{`Level:\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tLEVEL_FILTER_OPTIONS.find(\n\t\t\t\t\t\t\t\t\t(option) => option.value === levelFilter,\n\t\t\t\t\t\t\t\t)?.label\n\t\t\t\t\t\t\t}`}\n\t\t\t\t</span>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{LEVEL_FILTER_OPTIONS.map((option) => (\n\t\t\t\t\t<SelectItem key={option.value} value={option.value.toString()}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nconst LogSortOrder = ({\n\tsortOrder,\n\tsetSortOrder,\n}: {\n\tsortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\";\n\tsetSortOrder: (sortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\") => void;\n}) => (\n\t<Select\n\t\tvalue={sortOrder}\n\t\tonValueChange={(value) =>\n\t\t\tsetSortOrder(value as \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\")\n\t\t}\n\t>\n\t\t<SelectTrigger aria-label=\"log sort order\">\n\t\t\t<SelectValue placeholder=\"Sort log order\" />\n\t\t</SelectTrigger>\n\t\t<SelectContent>\n\t\t\t<SelectItem value=\"TIMESTAMP_ASC\">Oldest to newest</SelectItem>\n\t\t\t<SelectItem value=\"TIMESTAMP_DESC\">Newest to oldest</SelectItem>\n\t\t</SelectContent>\n\t</Select>\n);\n","import { useEffect } from \"react\";\n\ntype StateType =\n\t| \"SCHEDULED\"\n\t| \"PENDING\"\n\t| \"RUNNING\"\n\t| \"COMPLETED\"\n\t| \"FAILED\"\n\t| \"CANCELLED\"\n\t| \"CANCELLING\"\n\t| \"CRASHED\"\n\t| \"PAUSED\";\n\nfunction getPreferredColorScheme(): \"dark\" | \"light\" | \"no-preference\" {\n\tif (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n\t\treturn \"dark\";\n\t}\n\tif (window.matchMedia(\"(prefers-color-scheme: light)\").matches) {\n\t\treturn \"light\";\n\t}\n\treturn \"no-preference\";\n}\n\n/**\n * A hook that sets the browser favicon based on the provided state type.\n * Resets the favicon to the default when the component unmounts.\n *\n * @param stateType - The state type to display in the favicon (e.g., \"COMPLETED\", \"FAILED\")\n * @returns void\n *\n * @example\n * ```tsx\n * // Set favicon based on task run state\n * useStateFavicon(taskRun.state_type);\n * ```\n */\nexport function useStateFavicon(stateType: StateType | null | undefined): void {\n\tuseEffect(() => {\n\t\tconst colorScheme = getPreferredColorScheme();\n\t\tconst favicon16 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-16-dark\")\n\t\t\t\t: document.getElementById(\"favicon-16\");\n\t\tconst favicon32 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-32-dark\")\n\t\t\t\t: document.getElementById(\"favicon-32\");\n\n\t\tif (stateType) {\n\t\t\tconst faviconPath = `/${stateType.toLowerCase()}.svg`;\n\t\t\tfavicon16?.setAttribute(\"href\", faviconPath);\n\t\t\tfavicon32?.setAttribute(\"href\", faviconPath);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Reset to default favicon on unmount\n\t\t\tif (colorScheme === \"dark\") {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16-dark.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32-dark.png\");\n\t\t\t} else {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32.png\");\n\t\t\t}\n\t\t};\n\t}, [stateType]);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetTaskRunDetailsQuery,\n\ttype TaskRun,\n\tuseDeleteTaskRun,\n\tuseSetTaskRunState,\n} from \"@/api/task-runs\";\nimport { TaskRunArtifacts } from \"@/components/task-runs/task-run-artifacts\";\nimport { TaskRunDetails } from \"@/components/task-runs/task-run-details/task-run-details\";\nimport { TaskRunLogs } from \"@/components/task-runs/task-run-logs\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tChangeStateDialog,\n\tuseChangeStateDialog,\n} from \"@/components/ui/change-state-dialog\";\nimport {\n\tDeleteConfirmationDialog,\n\tuseDeleteConfirmationDialog,\n} from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useStateFavicon } from \"@/hooks/use-state-favicon\";\n\ntype TaskRunDetailsPageProps = {\n\tid: string;\n\ttab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n};\n\ntype TaskRunDetailsTabOptions = \"Logs\" | \"Artifacts\" | \"TaskInputs\" | \"Details\";\n\nexport const TaskRunDetailsPage = ({\n\tid,\n\ttab,\n\tonTabChange,\n}: TaskRunDetailsPageProps) => {\n\tconst [refetchInterval, setRefetchInterval] = useState<number | false>(false);\n\tconst { data: taskRun } = useSuspenseQuery({\n\t\t...buildGetTaskRunDetailsQuery(id),\n\t\trefetchInterval,\n\t});\n\tconst { deleteTaskRun } = useDeleteTaskRun();\n\tconst { navigate } = useRouter();\n\n\t// Set page title based on task run name\n\tusePageTitle(taskRun?.name ? `Task Run: ${taskRun.name}` : \"Task Run\");\n\n\t// Set favicon based on task run state\n\tuseStateFavicon(taskRun?.state_type);\n\n\tuseEffect(() => {\n\t\tif (taskRun.state_type === \"RUNNING\" || taskRun.state_type === \"PENDING\") {\n\t\t\tsetRefetchInterval(5000);\n\t\t} else {\n\t\t\tsetRefetchInterval(false);\n\t\t}\n\t}, [taskRun]);\n\n\tconst onDeleteRunClicked = () => {\n\t\tdeleteTaskRun(\n\t\t\t{ id: taskRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tsetRefetchInterval(false);\n\t\t\t\t\ttoast.success(\"Task run deleted\");\n\t\t\t\t\tif (taskRun.flow_run_id) {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/runs/flow-run/$id\",\n\t\t\t\t\t\t\tparams: { id: taskRun.flow_run_id },\n\t\t\t\t\t\t\treplace: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvoid navigate({ to: \"/runs\", replace: true });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while deleting task run.\";\n\t\t\t\t\ttoast.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Header taskRun={taskRun} onDeleteRunClicked={onDeleteRunClicked} />\n\t\t\t</div>\n\t\t\t<div className=\"grid lg:grid-cols-[1fr_250px] grid-cols-[1fr] gap-4\">\n\t\t\t\t<TabsLayout\n\t\t\t\t\tcurrentTab={tab}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t\tlogsContent={\n\t\t\t\t\t\t<Suspense fallback={<LogsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunLogs taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\tartifactsContent={\n\t\t\t\t\t\t<Suspense fallback={<ArtifactsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunArtifacts taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\ttaskInputsContent={<TaskInputs taskRun={taskRun} />}\n\t\t\t\t\tdetailsContent={<TaskRunDetails taskRun={taskRun} />}\n\t\t\t\t/>\n\t\t\t\t<div className=\"hidden lg:block\">\n\t\t\t\t\t<TaskRunDetails taskRun={taskRun} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst Header = ({\n\ttaskRun,\n\tonDeleteRunClicked,\n}: {\n\ttaskRun: TaskRun;\n\tonDeleteRunClicked: () => void;\n}) => {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\tconst {\n\t\topen: isChangeStateOpen,\n\t\tonOpenChange: setChangeStateOpen,\n\t\topenDialog: openChangeState,\n\t} = useChangeStateDialog();\n\tconst { setTaskRunState, isPending: isChangingState } = useSetTaskRunState();\n\n\tconst canChangeState =\n\t\ttaskRun.state_type &&\n\t\t[\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"].includes(\n\t\t\ttaskRun.state_type,\n\t\t);\n\n\tconst handleChangeState = (newState: { type: string; message?: string }) => {\n\t\tsetTaskRunState(\n\t\t\t{\n\t\t\t\tid: taskRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: newState.type as\n\t\t\t\t\t\t| \"COMPLETED\"\n\t\t\t\t\t\t| \"FAILED\"\n\t\t\t\t\t\t| \"CANCELLED\"\n\t\t\t\t\t\t| \"CRASHED\",\n\t\t\t\t\tname: newState.type.charAt(0) + newState.type.slice(1).toLowerCase(),\n\t\t\t\t\tmessage: newState.message,\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Task run state changed\");\n\t\t\t\t\tsetChangeStateOpen(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to change state\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/runs\"\n\t\t\t\t\t\t\tsearch={{ tab: \"task-runs\" }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRuns\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t{taskRun.flow_run_id && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: taskRun.flow_run_id }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{taskRun.flow_run_name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t\t<BreadcrumbPage className=\"font-semibold\">\n\t\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t{taskRun.state && (\n\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\ttype={taskRun.state.type}\n\t\t\t\t\t\t\t\tname={taskRun.state.name}\n\t\t\t\t\t\t\t\tclassName=\"ml-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"p-2\">\n\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent>\n\t\t\t\t\t{canChangeState && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={openChangeState}>\n\t\t\t\t\t\t\tChange state\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\ttoast.success(\"Copied task run ID to clipboard\");\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(taskRun.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tconfirmDelete({\n\t\t\t\t\t\t\t\ttitle: \"Delete Task Run\",\n\t\t\t\t\t\t\t\tdescription: `Are you sure you want to delete task run ${taskRun.name}?`,\n\t\t\t\t\t\t\t\tonConfirm: onDeleteRunClicked,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t\t<ChangeStateDialog\n\t\t\t\topen={isChangeStateOpen}\n\t\t\t\tonOpenChange={setChangeStateOpen}\n\t\t\t\tcurrentState={\n\t\t\t\t\ttaskRun.state\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: taskRun.state.type,\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\ttaskRun.state.name ??\n\t\t\t\t\t\t\t\t\ttaskRun.state.type.charAt(0) +\n\t\t\t\t\t\t\t\t\t\ttaskRun.state.type.slice(1).toLowerCase(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel=\"Task Run\"\n\t\t\t\tonConfirm={handleChangeState}\n\t\t\t\tisLoading={isChangingState}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nconst TabsLayout = ({\n\tcurrentTab,\n\tonTabChange,\n\tlogsContent,\n\tartifactsContent,\n\ttaskInputsContent,\n\tdetailsContent,\n}: {\n\tcurrentTab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n\tlogsContent: React.ReactNode;\n\tartifactsContent: React.ReactNode;\n\ttaskInputsContent: React.ReactNode;\n\tdetailsContent: React.ReactNode;\n}) => {\n\t// Change tab on screen size change when the details tab is selected\n\tuseEffect(() => {\n\t\tconst bp = getComputedStyle(document.documentElement)\n\t\t\t.getPropertyValue(\"--breakpoint-lg\")\n\t\t\t.trim();\n\t\tconst mql = window.matchMedia(`(max-width: ${bp})`);\n\t\tconst onChange = () => {\n\t\t\tif (currentTab === \"Details\") {\n\t\t\t\tonTabChange(\"Logs\");\n\t\t\t}\n\t\t};\n\t\tmql.addEventListener(\"change\", onChange);\n\t\treturn () => mql.removeEventListener(\"change\", onChange);\n\t}, [currentTab, onTabChange]);\n\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value) => onTabChange(value as TaskRunDetailsTabOptions)}\n\t\t>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger value=\"Details\" className=\"lg:hidden\">\n\t\t\t\t\tDetails\n\t\t\t\t</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Logs\">Logs</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Artifacts\">Artifacts</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"TaskInputs\">\n\t\t\t\t\tTask Inputs\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<Icon id=\"Info\" className=\"w-4 h-4\" />\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\tTask inputs show parameter keys and can also show task run\n\t\t\t\t\t\t\trelationships.\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Logs\">{logsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Artifacts\">{artifactsContent}</TabsContent>\n\t\t\t<TabsContent value=\"TaskInputs\">{taskInputsContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n\nconst LogsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-25\" />\n\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-32\" />\n\t\t</div>\n\t);\n};\n\nconst ArtifactsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-12\" />\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3\">\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst TaskInputs = ({ taskRun }: { taskRun: TaskRun }) => {\n\treturn (\n\t\t<JsonInput\n\t\t\tvalue={JSON.stringify(taskRun.task_inputs, null, 2)}\n\t\t\tdisabled\n\t\t\tcopy\n\t\t/>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildGetTaskRunDetailsQuery } from \"@/api/task-runs\";\nimport { TaskRunDetailsPage } from \"@/components/task-runs/task-run-details-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Logs\", \"Artifacts\", \"TaskInputs\", \"Details\"])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type TaskRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction TaskRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load task run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Task Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/task-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\tawait queryClient.ensureQueryData(buildGetTaskRunDetailsQuery(params.id));\n\t},\n\twrapInSuspense: true,\n\terrorComponent: TaskRunErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: TaskRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <TaskRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"names":["TaskRunArtifacts","taskRun","view","setView","useState","artifacts","useSuspenseQuery","buildListArtifactsQuery","Card","jsx","CardContent","jsxs","ToggleGroup","value","ToggleGroupItem","LayoutGrid","Rows3","cn","artifact","ArtifactCard","formatTaskDate","dateString","formatDate","formatTaskDuration","seconds","humanizeDuration","TaskRunDetails","resultArtifact","useQuery","buildGetTaskRunResultQuery","Link","Icon","LazyMarkdown","tag","TagBadge","TaskRunLogs","virtualize","levelFilter","setLevelFilter","sortOrder","setSortOrder","queryOptions","useMemo","buildInfiniteFilterLogsQuery","logs","hasNextPage","fetchNextPage","isFetchingNextPage","useSuspenseInfiniteQuery","noLogs","message","LogLevelFilter","LogSortOrder","RunLogs","error","LEVEL_FILTER_OPTIONS","Select","SelectTrigger","option","SelectContent","SelectItem","SelectValue","getPreferredColorScheme","useStateFavicon","stateType","useEffect","colorScheme","favicon16","favicon32","faviconPath","TaskRunDetailsPage","id","tab","onTabChange","refetchInterval","setRefetchInterval","buildGetTaskRunDetailsQuery","deleteTaskRun","useDeleteTaskRun","navigate","useRouter","usePageTitle","onDeleteRunClicked","toast","Header","TabsLayout","Suspense","LogsSkeleton","ArtifactsSkeleton","TaskInputs","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","setTaskRunState","isChangingState","useSetTaskRunState","canChangeState","handleChangeState","newState","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","Fragment","BreadcrumbPage","StateBadge","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","DeleteConfirmationDialog","ChangeStateDialog","currentTab","logsContent","artifactsContent","taskInputsContent","detailsContent","bp","mql","onChange","Tabs","TabsList","TabsTrigger","Tooltip","TooltipTrigger","TooltipContent","TabsContent","Skeleton","JsonInput","z","default","catch","RouteComponent","Route","useParams","useSearch","useNavigate","to","search","prev"],"mappings":"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"}
1
+ {"version":3,"file":"task-run._id-ByJw1K82.js","sources":["../../src/components/task-runs/task-run-artifacts/index.tsx","../../src/components/task-runs/task-run-details/task-run-details.tsx","../../src/components/task-runs/task-run-logs/index.tsx","../../src/hooks/use-state-favicon.ts","../../src/components/task-runs/task-run-details-page/index.tsx","../../src/routes/runs/task-run.$id.tsx?tsr-split=component"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { LayoutGrid, Rows3 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { ArtifactCard } from \"@/components/artifacts/artifact-card\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/utils\";\n\ntype TaskRunArtifactsProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunArtifacts = ({ taskRun }: TaskRunArtifactsProps) => {\n\tconst [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\ttask_run_id: {\n\t\t\t\t\tany_: [taskRun.id],\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"ID_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\tif (artifacts.length === 0) {\n\t\treturn (\n\t\t\t<Card>\n\t\t\t\t<CardContent className=\"text-center\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis task run did not produce any artifacts; for more information on\n\t\t\t\t\t\tcreating artifacts, see the{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://docs.prefect.io/v3/develop/artifacts\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-blue-500\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tvalue={view}\n\t\t\t\t\tonValueChange={(value) => setView(value as \"grid\" | \"list\")}\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"grid\" aria-label=\"Grid view\">\n\t\t\t\t\t\t<LayoutGrid className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"list\" aria-label=\"List view\">\n\t\t\t\t\t\t<Rows3 className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid\",\n\t\t\t\t\tview === \"grid\"\n\t\t\t\t\t\t? \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\"\n\t\t\t\t\t\t: \"grid-cols-1\",\n\t\t\t\t\t\"gap-4\",\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"task-run-artifacts-grid\"\n\t\t\t>\n\t\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t\t<ArtifactCard\n\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tcompact={view === \"list\"}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport humanizeDuration from \"humanize-duration\";\nimport { buildGetTaskRunResultQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\nfunction formatTaskDate(dateString: string | null | undefined): string {\n\tif (!dateString) return \"N/A\";\n\treturn formatDate(dateString, \"dateTimeNumeric\");\n}\n\nfunction formatTaskDuration(seconds: number | null | undefined): string {\n\tif (seconds === null || seconds === undefined) return \"N/A\";\n\treturn humanizeDuration(seconds * 1000, {\n\t\tmaxDecimalPoints: 2,\n\t\tunits: [\"s\"],\n\t});\n}\n\nexport type TaskRunDetailsProps = {\n\ttaskRun: TaskRun | null | undefined;\n};\n\nexport const TaskRunDetails = ({ taskRun }: TaskRunDetailsProps) => {\n\tconst { data: resultArtifact } = useQuery({\n\t\t...buildGetTaskRunResultQuery(taskRun?.id ?? \"\"),\n\t\tenabled: !!taskRun?.id,\n\t});\n\n\tif (!taskRun) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 bg-gray-100 p-4 rounded-md\">\n\t\t\t\t<span className=\"text-gray-500\">No task run details available</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 p-2 text-xs\">\n\t\t\t{taskRun.flow_run_id ? (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: taskRun.flow_run_id }}\n\t\t\t\t\t\t\tclassName=\"text-blue-500 hover:underline cursor-pointer flex items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"ExternalLink\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t\t{taskRun.flow_run_name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t) : (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>None</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Start Time</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.start_time ? formatTaskDate(taskRun.start_time) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Duration</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t<span className=\"flex items-center\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t{taskRun.total_run_time !== null &&\n\t\t\t\t\t\ttaskRun.total_run_time !== undefined\n\t\t\t\t\t\t\t? formatTaskDuration(taskRun.total_run_time)\n\t\t\t\t\t\t\t: \"None\"}\n\t\t\t\t\t</span>\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Run Count</dt>\n\t\t\t\t<dd className=\"\">{taskRun.run_count ?? 0}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Estimated Run Time</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.estimated_run_time !== null &&\n\t\t\t\t\ttaskRun.estimated_run_time !== undefined\n\t\t\t\t\t\t? formatTaskDuration(taskRun.estimated_run_time)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Created</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.created ? formatTaskDate(taskRun.created) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Last Updated</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.updated ? formatTaskDate(taskRun.updated) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.cache_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Expiration</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.cache_expiration\n\t\t\t\t\t\t? formatTaskDate(taskRun.cache_expiration)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Dynamic Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.dynamic_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Task Run ID</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.id}</dd>\n\t\t\t</dl>\n\n\t\t\t{resultArtifact?.description && (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-muted-foreground\">Result</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<div className=\"prose max-w-none dark:prose-invert\">\n\t\t\t\t\t\t\t<LazyMarkdown>{resultArtifact.description}</LazyMarkdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<div className=\"border-t border-gray-200 mt-2 pt-4\" />\n\t\t\t<h3 className=\"text-sm font-semibold mb-2\">Task configuration</h3>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Version</dt>\n\t\t\t\t<dd className=\"\">{taskRun.task_version || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retries</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retries?.toString() ?? \"0\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Delay</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{typeof taskRun.empirical_policy?.retry_delay === \"number\"\n\t\t\t\t\t\t? formatTaskDuration(taskRun.empirical_policy.retry_delay)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Jitter Factor</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retry_jitter_factor !== null &&\n\t\t\t\t\ttaskRun.empirical_policy?.retry_jitter_factor !== undefined\n\t\t\t\t\t\t? taskRun.empirical_policy.retry_jitter_factor.toString()\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Tags</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"None\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</div>\n\t);\n};\n","import { useSuspenseInfiniteQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport type { components } from \"@/api/prefect\";\nimport { RunLogs } from \"@/components/ui/run-logs\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\ntype TaskRunLogsProps = {\n\ttaskRun: components[\"schemas\"][\"TaskRun\"];\n\tvirtualize?: boolean;\n};\n\nexport const TaskRunLogs = ({\n\ttaskRun,\n\tvirtualize = true,\n}: TaskRunLogsProps) => {\n\tconst [levelFilter, setLevelFilter] = useState<number>(0);\n\tconst [sortOrder, setSortOrder] = useState<\n\t\t\"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\"\n\t>(\"TIMESTAMP_ASC\");\n\n\tconst queryOptions = useMemo(\n\t\t() => ({\n\t\t\t...buildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: sortOrder,\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: { ge_: levelFilter },\n\t\t\t\t\ttask_run_id: { any_: [taskRun.id] },\n\t\t\t\t},\n\t\t\t}),\n\t\t\trefetchInterval:\n\t\t\t\ttaskRun.state_type === \"RUNNING\" ? 5000 : (false as const),\n\t\t}),\n\t\t[levelFilter, sortOrder, taskRun.id, taskRun.state_type],\n\t);\n\n\tconst {\n\t\tdata: logs,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSuspenseInfiniteQuery(queryOptions);\n\n\tconst noLogs = logs.pages.length === 1 && logs.pages[0].length === 0;\n\tlet message = \"This run did not produce any logs.\";\n\tif (noLogs) {\n\t\tif (levelFilter > 0) {\n\t\t\tmessage = \"No logs match your filter criteria\";\n\t\t} else if (\n\t\t\ttaskRun.state_type === \"SCHEDULED\" &&\n\t\t\ttaskRun.state_name === \"Scheduled\"\n\t\t) {\n\t\t\tmessage = \"Run has not yet started. Check back soon for logs.\";\n\t\t} else if (taskRun.state_type === \"RUNNING\") {\n\t\t\tmessage = \"Waiting for logs...\";\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<LogLevelFilter\n\t\t\t\t\tlevelFilter={levelFilter}\n\t\t\t\t\tsetLevelFilter={setLevelFilter}\n\t\t\t\t/>\n\t\t\t\t<LogSortOrder sortOrder={sortOrder} setSortOrder={setSortOrder} />\n\t\t\t</div>\n\t\t\t{noLogs ? (\n\t\t\t\t<div className=\"flex flex-col gap-2 text-center bg-muted p-2 rounded-md\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">{message}</span>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"rounded-md\">\n\t\t\t\t\t<RunLogs\n\t\t\t\t\t\ttaskRun={taskRun}\n\t\t\t\t\t\tlogs={logs.pages.flat()}\n\t\t\t\t\t\tonBottomReached={() => {\n\t\t\t\t\t\t\tif (hasNextPage && !isFetchingNextPage) {\n\t\t\t\t\t\t\t\tfetchNextPage().catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"max-h-[85vh]\"\n\t\t\t\t\t\tvirtualize={virtualize}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst LEVEL_FILTER_OPTIONS = [\n\t{ label: \"All\", value: 0 },\n\t{ label: \"Critical only\", value: 50 },\n\t{ label: \"Error and above\", value: 40 },\n\t{ label: \"Warning and above\", value: 30 },\n\t{ label: \"Info and above\", value: 20 },\n\t{ label: \"Debug and above\", value: 10 },\n] as const;\n\nconst LogLevelFilter = ({\n\tlevelFilter,\n\tsetLevelFilter,\n}: {\n\tlevelFilter: number;\n\tsetLevelFilter: (level: number) => void;\n}) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={levelFilter.toString()}\n\t\t\tonValueChange={(value) => setLevelFilter(Number(value))}\n\t\t>\n\t\t\t<SelectTrigger aria-label=\"log level filter\">\n\t\t\t\t<span>\n\t\t\t\t\t{`Level:\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tLEVEL_FILTER_OPTIONS.find(\n\t\t\t\t\t\t\t\t\t(option) => option.value === levelFilter,\n\t\t\t\t\t\t\t\t)?.label\n\t\t\t\t\t\t\t}`}\n\t\t\t\t</span>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{LEVEL_FILTER_OPTIONS.map((option) => (\n\t\t\t\t\t<SelectItem key={option.value} value={option.value.toString()}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nconst LogSortOrder = ({\n\tsortOrder,\n\tsetSortOrder,\n}: {\n\tsortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\";\n\tsetSortOrder: (sortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\") => void;\n}) => (\n\t<Select\n\t\tvalue={sortOrder}\n\t\tonValueChange={(value) =>\n\t\t\tsetSortOrder(value as \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\")\n\t\t}\n\t>\n\t\t<SelectTrigger aria-label=\"log sort order\">\n\t\t\t<SelectValue placeholder=\"Sort log order\" />\n\t\t</SelectTrigger>\n\t\t<SelectContent>\n\t\t\t<SelectItem value=\"TIMESTAMP_ASC\">Oldest to newest</SelectItem>\n\t\t\t<SelectItem value=\"TIMESTAMP_DESC\">Newest to oldest</SelectItem>\n\t\t</SelectContent>\n\t</Select>\n);\n","import { useEffect } from \"react\";\n\ntype StateType =\n\t| \"SCHEDULED\"\n\t| \"PENDING\"\n\t| \"RUNNING\"\n\t| \"COMPLETED\"\n\t| \"FAILED\"\n\t| \"CANCELLED\"\n\t| \"CANCELLING\"\n\t| \"CRASHED\"\n\t| \"PAUSED\";\n\nfunction getPreferredColorScheme(): \"dark\" | \"light\" | \"no-preference\" {\n\tif (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n\t\treturn \"dark\";\n\t}\n\tif (window.matchMedia(\"(prefers-color-scheme: light)\").matches) {\n\t\treturn \"light\";\n\t}\n\treturn \"no-preference\";\n}\n\n/**\n * A hook that sets the browser favicon based on the provided state type.\n * Resets the favicon to the default when the component unmounts.\n *\n * @param stateType - The state type to display in the favicon (e.g., \"COMPLETED\", \"FAILED\")\n * @returns void\n *\n * @example\n * ```tsx\n * // Set favicon based on task run state\n * useStateFavicon(taskRun.state_type);\n * ```\n */\nexport function useStateFavicon(stateType: StateType | null | undefined): void {\n\tuseEffect(() => {\n\t\tconst colorScheme = getPreferredColorScheme();\n\t\tconst favicon16 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-16-dark\")\n\t\t\t\t: document.getElementById(\"favicon-16\");\n\t\tconst favicon32 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-32-dark\")\n\t\t\t\t: document.getElementById(\"favicon-32\");\n\n\t\tif (stateType) {\n\t\t\tconst faviconPath = `/${stateType.toLowerCase()}.svg`;\n\t\t\tfavicon16?.setAttribute(\"href\", faviconPath);\n\t\t\tfavicon32?.setAttribute(\"href\", faviconPath);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Reset to default favicon on unmount\n\t\t\tif (colorScheme === \"dark\") {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16-dark.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32-dark.png\");\n\t\t\t} else {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32.png\");\n\t\t\t}\n\t\t};\n\t}, [stateType]);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetTaskRunDetailsQuery,\n\ttype TaskRun,\n\tuseDeleteTaskRun,\n\tuseSetTaskRunState,\n} from \"@/api/task-runs\";\nimport { TaskRunArtifacts } from \"@/components/task-runs/task-run-artifacts\";\nimport { TaskRunDetails } from \"@/components/task-runs/task-run-details/task-run-details\";\nimport { TaskRunLogs } from \"@/components/task-runs/task-run-logs\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tChangeStateDialog,\n\tuseChangeStateDialog,\n} from \"@/components/ui/change-state-dialog\";\nimport {\n\tDeleteConfirmationDialog,\n\tuseDeleteConfirmationDialog,\n} from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useStateFavicon } from \"@/hooks/use-state-favicon\";\n\ntype TaskRunDetailsPageProps = {\n\tid: string;\n\ttab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n};\n\ntype TaskRunDetailsTabOptions = \"Logs\" | \"Artifacts\" | \"TaskInputs\" | \"Details\";\n\nexport const TaskRunDetailsPage = ({\n\tid,\n\ttab,\n\tonTabChange,\n}: TaskRunDetailsPageProps) => {\n\tconst [refetchInterval, setRefetchInterval] = useState<number | false>(false);\n\tconst { data: taskRun } = useSuspenseQuery({\n\t\t...buildGetTaskRunDetailsQuery(id),\n\t\trefetchInterval,\n\t});\n\tconst { deleteTaskRun } = useDeleteTaskRun();\n\tconst { navigate } = useRouter();\n\n\t// Set page title based on task run name\n\tusePageTitle(taskRun?.name ? `Task Run: ${taskRun.name}` : \"Task Run\");\n\n\t// Set favicon based on task run state\n\tuseStateFavicon(taskRun?.state_type);\n\n\tuseEffect(() => {\n\t\tif (taskRun.state_type === \"RUNNING\" || taskRun.state_type === \"PENDING\") {\n\t\t\tsetRefetchInterval(5000);\n\t\t} else {\n\t\t\tsetRefetchInterval(false);\n\t\t}\n\t}, [taskRun]);\n\n\tconst onDeleteRunClicked = () => {\n\t\tdeleteTaskRun(\n\t\t\t{ id: taskRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tsetRefetchInterval(false);\n\t\t\t\t\ttoast.success(\"Task run deleted\");\n\t\t\t\t\tif (taskRun.flow_run_id) {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/runs/flow-run/$id\",\n\t\t\t\t\t\t\tparams: { id: taskRun.flow_run_id },\n\t\t\t\t\t\t\treplace: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvoid navigate({ to: \"/runs\", replace: true });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while deleting task run.\";\n\t\t\t\t\ttoast.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Header taskRun={taskRun} onDeleteRunClicked={onDeleteRunClicked} />\n\t\t\t</div>\n\t\t\t<div className=\"grid lg:grid-cols-[1fr_250px] grid-cols-[1fr] gap-4\">\n\t\t\t\t<TabsLayout\n\t\t\t\t\tcurrentTab={tab}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t\tlogsContent={\n\t\t\t\t\t\t<Suspense fallback={<LogsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunLogs taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\tartifactsContent={\n\t\t\t\t\t\t<Suspense fallback={<ArtifactsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunArtifacts taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\ttaskInputsContent={<TaskInputs taskRun={taskRun} />}\n\t\t\t\t\tdetailsContent={<TaskRunDetails taskRun={taskRun} />}\n\t\t\t\t/>\n\t\t\t\t<div className=\"hidden lg:block\">\n\t\t\t\t\t<TaskRunDetails taskRun={taskRun} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst Header = ({\n\ttaskRun,\n\tonDeleteRunClicked,\n}: {\n\ttaskRun: TaskRun;\n\tonDeleteRunClicked: () => void;\n}) => {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\tconst {\n\t\topen: isChangeStateOpen,\n\t\tonOpenChange: setChangeStateOpen,\n\t\topenDialog: openChangeState,\n\t} = useChangeStateDialog();\n\tconst { setTaskRunState, isPending: isChangingState } = useSetTaskRunState();\n\n\tconst canChangeState =\n\t\ttaskRun.state_type &&\n\t\t[\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"].includes(\n\t\t\ttaskRun.state_type,\n\t\t);\n\n\tconst handleChangeState = (newState: { type: string; message?: string }) => {\n\t\tsetTaskRunState(\n\t\t\t{\n\t\t\t\tid: taskRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: newState.type as\n\t\t\t\t\t\t| \"COMPLETED\"\n\t\t\t\t\t\t| \"FAILED\"\n\t\t\t\t\t\t| \"CANCELLED\"\n\t\t\t\t\t\t| \"CRASHED\",\n\t\t\t\t\tname: newState.type.charAt(0) + newState.type.slice(1).toLowerCase(),\n\t\t\t\t\tmessage: newState.message,\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Task run state changed\");\n\t\t\t\t\tsetChangeStateOpen(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to change state\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/runs\"\n\t\t\t\t\t\t\tsearch={{ tab: \"task-runs\" }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRuns\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t{taskRun.flow_run_id && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: taskRun.flow_run_id }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{taskRun.flow_run_name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t\t<BreadcrumbPage className=\"font-semibold\">\n\t\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t{taskRun.state && (\n\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\ttype={taskRun.state.type}\n\t\t\t\t\t\t\t\tname={taskRun.state.name}\n\t\t\t\t\t\t\t\tclassName=\"ml-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"p-2\">\n\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent>\n\t\t\t\t\t{canChangeState && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={openChangeState}>\n\t\t\t\t\t\t\tChange state\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\ttoast.success(\"Copied task run ID to clipboard\");\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(taskRun.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tconfirmDelete({\n\t\t\t\t\t\t\t\ttitle: \"Delete Task Run\",\n\t\t\t\t\t\t\t\tdescription: `Are you sure you want to delete task run ${taskRun.name}?`,\n\t\t\t\t\t\t\t\tonConfirm: onDeleteRunClicked,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t\t<ChangeStateDialog\n\t\t\t\topen={isChangeStateOpen}\n\t\t\t\tonOpenChange={setChangeStateOpen}\n\t\t\t\tcurrentState={\n\t\t\t\t\ttaskRun.state\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: taskRun.state.type,\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\ttaskRun.state.name ??\n\t\t\t\t\t\t\t\t\ttaskRun.state.type.charAt(0) +\n\t\t\t\t\t\t\t\t\t\ttaskRun.state.type.slice(1).toLowerCase(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel=\"Task Run\"\n\t\t\t\tonConfirm={handleChangeState}\n\t\t\t\tisLoading={isChangingState}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nconst TabsLayout = ({\n\tcurrentTab,\n\tonTabChange,\n\tlogsContent,\n\tartifactsContent,\n\ttaskInputsContent,\n\tdetailsContent,\n}: {\n\tcurrentTab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n\tlogsContent: React.ReactNode;\n\tartifactsContent: React.ReactNode;\n\ttaskInputsContent: React.ReactNode;\n\tdetailsContent: React.ReactNode;\n}) => {\n\t// Change tab on screen size change when the details tab is selected\n\tuseEffect(() => {\n\t\tconst bp = getComputedStyle(document.documentElement)\n\t\t\t.getPropertyValue(\"--breakpoint-lg\")\n\t\t\t.trim();\n\t\tconst mql = window.matchMedia(`(max-width: ${bp})`);\n\t\tconst onChange = () => {\n\t\t\tif (currentTab === \"Details\") {\n\t\t\t\tonTabChange(\"Logs\");\n\t\t\t}\n\t\t};\n\t\tmql.addEventListener(\"change\", onChange);\n\t\treturn () => mql.removeEventListener(\"change\", onChange);\n\t}, [currentTab, onTabChange]);\n\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value) => onTabChange(value as TaskRunDetailsTabOptions)}\n\t\t>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger value=\"Details\" className=\"lg:hidden\">\n\t\t\t\t\tDetails\n\t\t\t\t</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Logs\">Logs</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Artifacts\">Artifacts</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"TaskInputs\">\n\t\t\t\t\tTask Inputs\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<Icon id=\"Info\" className=\"w-4 h-4\" />\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\tTask inputs show parameter keys and can also show task run\n\t\t\t\t\t\t\trelationships.\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Logs\">{logsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Artifacts\">{artifactsContent}</TabsContent>\n\t\t\t<TabsContent value=\"TaskInputs\">{taskInputsContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n\nconst LogsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-25\" />\n\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-32\" />\n\t\t</div>\n\t);\n};\n\nconst ArtifactsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-12\" />\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3\">\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst TaskInputs = ({ taskRun }: { taskRun: TaskRun }) => {\n\treturn (\n\t\t<JsonInput\n\t\t\tvalue={JSON.stringify(taskRun.task_inputs, null, 2)}\n\t\t\tdisabled\n\t\t\tcopy\n\t\t/>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildGetTaskRunDetailsQuery } from \"@/api/task-runs\";\nimport { TaskRunDetailsPage } from \"@/components/task-runs/task-run-details-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Logs\", \"Artifacts\", \"TaskInputs\", \"Details\"])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type TaskRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction TaskRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load task run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Task Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/task-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\tawait queryClient.ensureQueryData(buildGetTaskRunDetailsQuery(params.id));\n\t},\n\twrapInSuspense: true,\n\terrorComponent: TaskRunErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: TaskRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <TaskRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"names":["TaskRunArtifacts","taskRun","view","setView","useState","artifacts","useSuspenseQuery","buildListArtifactsQuery","Card","jsx","CardContent","jsxs","ToggleGroup","value","ToggleGroupItem","LayoutGrid","Rows3","cn","artifact","ArtifactCard","formatTaskDate","dateString","formatDate","formatTaskDuration","seconds","humanizeDuration","TaskRunDetails","resultArtifact","useQuery","buildGetTaskRunResultQuery","Link","Icon","LazyMarkdown","tag","TagBadge","TaskRunLogs","virtualize","levelFilter","setLevelFilter","sortOrder","setSortOrder","queryOptions","useMemo","buildInfiniteFilterLogsQuery","logs","hasNextPage","fetchNextPage","isFetchingNextPage","useSuspenseInfiniteQuery","noLogs","message","LogLevelFilter","LogSortOrder","RunLogs","error","LEVEL_FILTER_OPTIONS","Select","SelectTrigger","option","SelectContent","SelectItem","SelectValue","getPreferredColorScheme","useStateFavicon","stateType","useEffect","colorScheme","favicon16","favicon32","faviconPath","TaskRunDetailsPage","id","tab","onTabChange","refetchInterval","setRefetchInterval","buildGetTaskRunDetailsQuery","deleteTaskRun","useDeleteTaskRun","navigate","useRouter","usePageTitle","onDeleteRunClicked","toast","Header","TabsLayout","Suspense","LogsSkeleton","ArtifactsSkeleton","TaskInputs","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","setTaskRunState","isChangingState","useSetTaskRunState","canChangeState","handleChangeState","newState","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","Fragment","BreadcrumbPage","StateBadge","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","DeleteConfirmationDialog","ChangeStateDialog","currentTab","logsContent","artifactsContent","taskInputsContent","detailsContent","bp","mql","onChange","Tabs","TabsList","TabsTrigger","Tooltip","TooltipTrigger","TooltipContent","TabsContent","Skeleton","JsonInput","z","default","catch","RouteComponent","Route","useParams","useSearch","useNavigate","to","search","prev"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,r as _,p}from"./vendor-tanstack-BK8oseNA.js";import{S,a as w,b as E,c as P,e as u,C as h,cq as q,ak as z,X as O,aq as Q,an as W,ao as X,B as H,g as J,h as x,bs as m,bB as g,aM as N,bU as v,bR as y,bS as C,I as D,bT as I,ar as T,al as K,q as Y,b5 as d,b6 as Z,b7 as R,b8 as o,cr as ee,b9 as se,ba as te,cs as ae}from"./index-BvSl3DKP.js";const je=({defaultValue:t,value:a,onSelect:s})=>e.jsxs(S,{defaultValue:t,value:a,onValueChange:s,children:[e.jsx(w,{"aria-label":"Task run sort order",className:"w-full",children:e.jsx(E,{placeholder:"Sort by"})}),e.jsxs(P,{children:[e.jsx(u,{value:"EXPECTED_START_TIME_DESC",children:"Newest to oldest"}),e.jsx(u,{value:"EXPECTED_START_TIME_ASC",children:"Oldest to newest"})]})]}),L=({taskRun:t,flow:a,flowRun:s,checked:r,onCheckedChange:l})=>{const i=typeof l=="function";return e.jsxs(h,{className:re({state:t.state?.type}),children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[i&&e.jsx(z,{checked:r??!1,onCheckedChange:l}),e.jsx(le,{taskRun:t,flow:a,flowRun:s})]}),e.jsx("div",{children:e.jsx(O,{tags:t.tags??[]})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[t.state&&e.jsx(Q,{type:t.state.type,name:t.state.name}),e.jsx(ie,{taskRun:t}),e.jsx(ne,{taskRun:t})]})]})},re=q("flex flex-col gap-2 p-4 border-l-8",{variants:{state:{COMPLETED:"border-l-green-600",FAILED:"border-l-red-600",RUNNING:"border-l-blue-700",CANCELLED:"border-l-gray-800",CANCELLING:"border-l-gray-800",CRASHED:"border-l-orange-600",PAUSED:"border-l-gray-800",PENDING:"border-l-gray-800",SCHEDULED:"border-l-yellow-700"}}}),le=({taskRun:t,flow:a,flowRun:s})=>e.jsx("div",{className:"flex items-center",children:e.jsx(H,{children:e.jsxs(J,{children:[a&&e.jsxs(e.Fragment,{children:[e.jsx(x,{children:e.jsx(m,{to:"/flows/flow/$id",params:{id:a.id},className:"font-semibold text-foreground",children:a.name})}),e.jsx(g,{})]}),s&&e.jsxs(e.Fragment,{children:[e.jsx(x,{children:e.jsx(m,{to:"/runs/flow-run/$id",params:{id:s.id},children:s.name})}),e.jsx(g,{})]}),e.jsx(x,{className:"font-bold text-foreground",children:e.jsx(m,{to:"/runs/task-run/$id",params:{id:t.id},children:t.name})})]})})}),ie=({taskRun:t})=>{const a="start_time"in t?t.start_time:null,s="expected_start_time"in t?t.expected_start_time:null,{text:r,tooltipText:l}=_.useMemo(()=>{let i,n;return a?(i=N(a,"dateTimeNumeric"),n=new Date(a).toString()):s&&(i=`Scheduled for ${N(s,"dateTimeNumeric")}`,n=new Date(s).toString()),{text:i,tooltipText:n}},[s,a]);return e.jsx(v,{children:e.jsxs(y,{children:[e.jsx(C,{asChild:!0,disabled:!r,children:e.jsxs("div",{className:"text-xs font-mono flex gap-2 items-center",children:[e.jsx(D,{id:"Calendar",className:"size-4"}),r??"No start time"]})}),e.jsx(I,{children:l})]})})},ne=({taskRun:t})=>{const a="estimated_run_time"in t?t.estimated_run_time:null,s="total_run_time"in t?t.total_run_time:null,r=a??s??0;if(r===0)return null;const l=T(r*1e3,{maxDecimalPoints:2,units:["h","m","s"],round:!0}),i=T(r*1e3,{maxDecimalPoints:5,units:["h","m","s"]});return e.jsx(v,{children:e.jsxs(y,{children:[e.jsx(C,{asChild:!0,children:e.jsxs("div",{className:"flex gap-2 items-center text-xs font-mono",children:[e.jsx(D,{id:"Clock",className:"size-4"}),l]})}),e.jsx(I,{children:i})]})})},ce=({taskRun:t,flowRunId:a,checked:s,onCheckedChange:r})=>{const{data:l}=p(W(a)),{data:i}=p(X(l.flow_id));return e.jsx(L,{taskRun:t,flow:i,flowRun:l,checked:s,onCheckedChange:r})},de=({taskRun:t,checked:a,onCheckedChange:s})=>{const r=t.flow_run_id;return r?e.jsx(ce,{taskRun:t,flowRunId:r,checked:a,onCheckedChange:s}):e.jsx(L,{taskRun:t,checked:a,onCheckedChange:s})},oe=({taskRun:t,checked:a,onCheckedChange:s})=>e.jsx(_.Suspense,{fallback:e.jsxs(h,{className:"flex flex-col gap-2 p-4 border-l-8 border-l-gray-300 animate-pulse",children:[e.jsx("div",{className:"h-5 bg-gray-200 rounded w-1/3"}),e.jsx("div",{className:"h-4 bg-gray-200 rounded w-1/4"})]}),children:e.jsx(de,{taskRun:t,checked:a,onCheckedChange:s})}),fe=({taskRuns:t,onClearFilters:a,onSelect:s,selectedRows:r})=>t?t.length===0?e.jsx("div",{className:"flex justify-center py-4",children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(K,{children:"No runs found"}),a&&e.jsx(Y,{onClick:a,children:"Clear Filters"})]})}):e.jsx("ul",{className:"flex flex-col gap-2",children:t.map(l=>e.jsx("li",{children:e.jsx(oe,{taskRun:l,checked:r?.has(l.id),onCheckedChange:s?i=>s(l.id,i):void 0})},l.id))}):e.jsx(xe,{numSkeletons:5}),xe=({numSkeletons:t=1})=>e.jsx("ul",{className:"flex flex-col gap-1",children:Array.from({length:t}).map((a,s)=>e.jsx("li",{children:e.jsxs(h,{className:"flex flex-col gap-2 p-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(d,{className:"h-4 w-[350px]"}),e.jsx(d,{className:"h-4 w-[400px]"})]}),e.jsx(d,{className:"h-4 w-[400px]"}),e.jsx(d,{className:"h-4 w-[200px]"})]})},s))}),me=[5,10,25,50,100],be=({count:t,pages:a,pagination:s,onChangePagination:r,onPrefetchPage:l})=>{const i=()=>r({limit:s.limit,page:1}),n=()=>r({limit:s.limit,page:s.page-1}),B=()=>r({limit:s.limit,page:s.page+1}),M=()=>r({limit:s.limit,page:a}),A=()=>{s.page>1&&l?.(1)},F=()=>{s.page>1&&l?.(s.page-1)},G=()=>{s.page<a&&l?.(s.page+1)},k=()=>{s.page<a&&l?.(a)},j=s.page<=1,f=s.page>=a,U=c=>{const b=Number(c),V=Math.ceil(t/b),$=Math.min(s.page,V);r({limit:b,page:$})};return e.jsxs("div",{className:"flex flex-row justify-between items-center",children:[e.jsxs("div",{className:"flex flex-row items-center gap-2 text-xs text-muted-foreground",children:[e.jsx("span",{className:"whitespace-nowrap",children:"Items per page"}),e.jsxs(S,{value:String(s.limit),onValueChange:U,children:[e.jsx(w,{"aria-label":"Items per page",children:e.jsx(E,{placeholder:"Theme"})}),e.jsx(P,{children:me.map(c=>e.jsx(u,{value:String(c),children:c},c))})]})]}),e.jsx(Z,{className:"justify-end",children:e.jsxs(R,{children:[e.jsxs(o,{children:[e.jsx(ee,{onClick:i,onMouseEnter:A,disabled:j}),e.jsx(se,{onClick:n,onMouseEnter:F,disabled:j})]}),e.jsxs(o,{className:"text-sm",children:["Page ",a===0?0:s.page," of ",a]}),e.jsx(o,{children:e.jsx(te,{onClick:B,onMouseEnter:G,disabled:f})}),e.jsx(o,{children:e.jsx(ae,{onClick:M,onMouseEnter:k,disabled:f})})]})})]})};export{je as T,be as a,fe as b};
2
- //# sourceMappingURL=task-runs-pagination-CifoSGct.js.map
1
+ import{j as e,r as _,p}from"./vendor-tanstack-BK8oseNA.js";import{S,a as w,b as E,c as P,e as u,C as h,cr as z,ak as O,X as Q,aq as W,an as X,ao as q,B as H,g as J,h as x,bs as m,bB as g,aM as N,bU as v,bR as y,bS as C,I as D,bT as I,ar as T,al as K,q as Y,b5 as d,b6 as Z,b7 as R,b8 as o,cs as ee,b9 as se,ba as te,ct as ae}from"./index-Cd7pM9pk.js";const je=({defaultValue:t,value:a,onSelect:s})=>e.jsxs(S,{defaultValue:t,value:a,onValueChange:s,children:[e.jsx(w,{"aria-label":"Task run sort order",className:"w-full",children:e.jsx(E,{placeholder:"Sort by"})}),e.jsxs(P,{children:[e.jsx(u,{value:"EXPECTED_START_TIME_DESC",children:"Newest to oldest"}),e.jsx(u,{value:"EXPECTED_START_TIME_ASC",children:"Oldest to newest"})]})]}),L=({taskRun:t,flow:a,flowRun:s,checked:r,onCheckedChange:l})=>{const i=typeof l=="function";return e.jsxs(h,{className:re({state:t.state?.type}),children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[i&&e.jsx(O,{checked:r??!1,onCheckedChange:l}),e.jsx(le,{taskRun:t,flow:a,flowRun:s})]}),e.jsx("div",{children:e.jsx(Q,{tags:t.tags??[]})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[t.state&&e.jsx(W,{type:t.state.type,name:t.state.name}),e.jsx(ie,{taskRun:t}),e.jsx(ne,{taskRun:t})]})]})},re=z("flex flex-col gap-2 p-4 border-l-8",{variants:{state:{COMPLETED:"border-l-green-600",FAILED:"border-l-red-600",RUNNING:"border-l-blue-700",CANCELLED:"border-l-gray-800",CANCELLING:"border-l-gray-800",CRASHED:"border-l-orange-600",PAUSED:"border-l-gray-800",PENDING:"border-l-gray-800",SCHEDULED:"border-l-yellow-700"}}}),le=({taskRun:t,flow:a,flowRun:s})=>e.jsx("div",{className:"flex items-center",children:e.jsx(H,{children:e.jsxs(J,{children:[a&&e.jsxs(e.Fragment,{children:[e.jsx(x,{children:e.jsx(m,{to:"/flows/flow/$id",params:{id:a.id},className:"font-semibold text-foreground",children:a.name})}),e.jsx(g,{})]}),s&&e.jsxs(e.Fragment,{children:[e.jsx(x,{children:e.jsx(m,{to:"/runs/flow-run/$id",params:{id:s.id},children:s.name})}),e.jsx(g,{})]}),e.jsx(x,{className:"font-bold text-foreground",children:e.jsx(m,{to:"/runs/task-run/$id",params:{id:t.id},children:t.name})})]})})}),ie=({taskRun:t})=>{const a="start_time"in t?t.start_time:null,s="expected_start_time"in t?t.expected_start_time:null,{text:r,tooltipText:l}=_.useMemo(()=>{let i,n;return a?(i=N(a,"dateTimeNumeric"),n=new Date(a).toString()):s&&(i=`Scheduled for ${N(s,"dateTimeNumeric")}`,n=new Date(s).toString()),{text:i,tooltipText:n}},[s,a]);return e.jsx(v,{children:e.jsxs(y,{children:[e.jsx(C,{asChild:!0,disabled:!r,children:e.jsxs("div",{className:"text-xs font-mono flex gap-2 items-center",children:[e.jsx(D,{id:"Calendar",className:"size-4"}),r??"No start time"]})}),e.jsx(I,{children:l})]})})},ne=({taskRun:t})=>{const a="estimated_run_time"in t?t.estimated_run_time:null,s="total_run_time"in t?t.total_run_time:null,r=a??s??0;if(r===0)return null;const l=T(r*1e3,{maxDecimalPoints:2,units:["h","m","s"],round:!0}),i=T(r*1e3,{maxDecimalPoints:5,units:["h","m","s"]});return e.jsx(v,{children:e.jsxs(y,{children:[e.jsx(C,{asChild:!0,children:e.jsxs("div",{className:"flex gap-2 items-center text-xs font-mono",children:[e.jsx(D,{id:"Clock",className:"size-4"}),l]})}),e.jsx(I,{children:i})]})})},ce=({taskRun:t,flowRunId:a,checked:s,onCheckedChange:r})=>{const{data:l}=p(X(a)),{data:i}=p(q(l.flow_id));return e.jsx(L,{taskRun:t,flow:i,flowRun:l,checked:s,onCheckedChange:r})},de=({taskRun:t,checked:a,onCheckedChange:s})=>{const r=t.flow_run_id;return r?e.jsx(ce,{taskRun:t,flowRunId:r,checked:a,onCheckedChange:s}):e.jsx(L,{taskRun:t,checked:a,onCheckedChange:s})},oe=({taskRun:t,checked:a,onCheckedChange:s})=>e.jsx(_.Suspense,{fallback:e.jsxs(h,{className:"flex flex-col gap-2 p-4 border-l-8 border-l-gray-300 animate-pulse",children:[e.jsx("div",{className:"h-5 bg-gray-200 rounded w-1/3"}),e.jsx("div",{className:"h-4 bg-gray-200 rounded w-1/4"})]}),children:e.jsx(de,{taskRun:t,checked:a,onCheckedChange:s})}),fe=({taskRuns:t,onClearFilters:a,onSelect:s,selectedRows:r})=>t?t.length===0?e.jsx("div",{className:"flex justify-center py-4",children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(K,{children:"No runs found"}),a&&e.jsx(Y,{onClick:a,children:"Clear Filters"})]})}):e.jsx("ul",{className:"flex flex-col gap-2",children:t.map(l=>e.jsx("li",{children:e.jsx(oe,{taskRun:l,checked:r?.has(l.id),onCheckedChange:s?i=>s(l.id,i):void 0})},l.id))}):e.jsx(xe,{numSkeletons:5}),xe=({numSkeletons:t=1})=>e.jsx("ul",{className:"flex flex-col gap-1",children:Array.from({length:t}).map((a,s)=>e.jsx("li",{children:e.jsxs(h,{className:"flex flex-col gap-2 p-4",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(d,{className:"h-4 w-[350px]"}),e.jsx(d,{className:"h-4 w-[400px]"})]}),e.jsx(d,{className:"h-4 w-[400px]"}),e.jsx(d,{className:"h-4 w-[200px]"})]})},s))}),me=[5,10,25,50,100],be=({count:t,pages:a,pagination:s,onChangePagination:r,onPrefetchPage:l})=>{const i=()=>r({limit:s.limit,page:1}),n=()=>r({limit:s.limit,page:s.page-1}),B=()=>r({limit:s.limit,page:s.page+1}),M=()=>r({limit:s.limit,page:a}),A=()=>{s.page>1&&l?.(1)},F=()=>{s.page>1&&l?.(s.page-1)},G=()=>{s.page<a&&l?.(s.page+1)},k=()=>{s.page<a&&l?.(a)},j=s.page<=1,f=s.page>=a,U=c=>{const b=Number(c),V=Math.ceil(t/b),$=Math.min(s.page,V);r({limit:b,page:$})};return e.jsxs("div",{className:"flex flex-row justify-between items-center",children:[e.jsxs("div",{className:"flex flex-row items-center gap-2 text-xs text-muted-foreground",children:[e.jsx("span",{className:"whitespace-nowrap",children:"Items per page"}),e.jsxs(S,{value:String(s.limit),onValueChange:U,children:[e.jsx(w,{"aria-label":"Items per page",children:e.jsx(E,{placeholder:"Theme"})}),e.jsx(P,{children:me.map(c=>e.jsx(u,{value:String(c),children:c},c))})]})]}),e.jsx(Z,{className:"justify-end",children:e.jsxs(R,{children:[e.jsxs(o,{children:[e.jsx(ee,{onClick:i,onMouseEnter:A,disabled:j}),e.jsx(se,{onClick:n,onMouseEnter:F,disabled:j})]}),e.jsxs(o,{className:"text-sm",children:["Page ",a===0?0:s.page," of ",a]}),e.jsx(o,{children:e.jsx(te,{onClick:B,onMouseEnter:G,disabled:f})}),e.jsx(o,{children:e.jsx(ae,{onClick:M,onMouseEnter:k,disabled:f})})]})})]})};export{je as T,be as a,fe as b};
2
+ //# sourceMappingURL=task-runs-pagination-DbjB6XnY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-runs-pagination-CifoSGct.js","sources":["../../src/components/task-runs/task-runs-list/task-run-sort-filter.tsx","../../src/components/task-runs/task-runs-list/task-runs-list-item.tsx","../../src/components/task-runs/task-runs-list/task-runs-list.tsx","../../src/components/task-runs/task-runs-list/task-runs-pagination.tsx"],"sourcesContent":["import {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport type { TaskRunSortFilters } from \"./task-run-sort-filter.constants\";\n\ntype TaskRunsSortFilterProps = {\n\tdefaultValue?: TaskRunSortFilters;\n\tonSelect: (filter: TaskRunSortFilters) => void;\n\tvalue: undefined | TaskRunSortFilters;\n};\n\nexport const TaskRunsSortFilter = ({\n\tdefaultValue,\n\tvalue,\n\tonSelect,\n}: TaskRunsSortFilterProps) => {\n\treturn (\n\t\t<Select defaultValue={defaultValue} value={value} onValueChange={onSelect}>\n\t\t\t<SelectTrigger aria-label=\"Task run sort order\" className=\"w-full\">\n\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t<SelectItem value=\"EXPECTED_START_TIME_DESC\">\n\t\t\t\t\tNewest to oldest\n\t\t\t\t</SelectItem>\n\t\t\t\t<SelectItem value=\"EXPECTED_START_TIME_ASC\">\n\t\t\t\t\tOldest to newest\n\t\t\t\t</SelectItem>\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { cva } from \"class-variance-authority\";\nimport humanizeDuration from \"humanize-duration\";\nimport { Suspense, useMemo } from \"react\";\nimport { buildGetFlowRunDetailsQuery, type FlowRun } from \"@/api/flow-runs\";\nimport { buildFLowDetailsQuery, type Flow } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport type { TaskRun, TaskRunResponse } from \"@/api/task-runs\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Card } from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { formatDate } from \"@/utils/date\";\n\ntype TaskRunsListItemProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tflow?: Flow;\n\tflowRun?: FlowRun;\n\tchecked?: boolean;\n\tonCheckedChange?: (checked: boolean) => void;\n};\n\nexport const TaskRunsListItem = ({\n\ttaskRun,\n\tflow,\n\tflowRun,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemProps) => {\n\tconst isSelectable = typeof onCheckedChange === \"function\";\n\n\treturn (\n\t\t<Card className={stateCardVariants({ state: taskRun.state?.type })}>\n\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{isSelectable && (\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tchecked={checked ?? false}\n\t\t\t\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<TaskRunBreadcrumbs taskRun={taskRun} flow={flow} flowRun={flowRun} />\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<TagBadgeGroup tags={taskRun.tags ?? []} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t{taskRun.state && (\n\t\t\t\t\t<StateBadge type={taskRun.state.type} name={taskRun.state.name} />\n\t\t\t\t)}\n\t\t\t\t<TaskRunStartTime taskRun={taskRun} />\n\t\t\t\t<TaskRunDuration taskRun={taskRun} />\n\t\t\t</div>\n\t\t</Card>\n\t);\n};\n\nconst stateCardVariants = cva(\"flex flex-col gap-2 p-4 border-l-8\", {\n\tvariants: {\n\t\tstate: {\n\t\t\tCOMPLETED: \"border-l-green-600\",\n\t\t\tFAILED: \"border-l-red-600\",\n\t\t\tRUNNING: \"border-l-blue-700\",\n\t\t\tCANCELLED: \"border-l-gray-800\",\n\t\t\tCANCELLING: \"border-l-gray-800\",\n\t\t\tCRASHED: \"border-l-orange-600\",\n\t\t\tPAUSED: \"border-l-gray-800\",\n\t\t\tPENDING: \"border-l-gray-800\",\n\t\t\tSCHEDULED: \"border-l-yellow-700\",\n\t\t} satisfies Record<components[\"schemas\"][\"StateType\"], string>,\n\t},\n});\n\ntype TaskRunBreadcrumbsProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tflow?: Flow;\n\tflowRun?: FlowRun;\n};\n\nconst TaskRunBreadcrumbs = ({\n\ttaskRun,\n\tflow,\n\tflowRun,\n}: TaskRunBreadcrumbsProps) => {\n\treturn (\n\t\t<div className=\"flex items-center\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t{flow && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/flows/flow/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: flow.id }}\n\t\t\t\t\t\t\t\t\tclassName=\"font-semibold text-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{flow.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: flowRun.id }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{flowRun.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"font-bold text-foreground\">\n\t\t\t\t\t\t<BreadcrumbLink to=\"/runs/task-run/$id\" params={{ id: taskRun.id }}>\n\t\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n\ntype TaskRunStartTimeProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n};\n\nconst TaskRunStartTime = ({ taskRun }: TaskRunStartTimeProps) => {\n\t// These properties only exist on UITaskRun, not TaskRunResponse\n\tconst start_time =\n\t\t\"start_time\" in taskRun ? (taskRun.start_time as string | null) : null;\n\tconst expected_start_time =\n\t\t\"expected_start_time\" in taskRun\n\t\t\t? (taskRun.expected_start_time as string | null)\n\t\t\t: null;\n\n\tconst { text, tooltipText } = useMemo(() => {\n\t\tlet text: string | undefined;\n\t\tlet tooltipText: string | undefined;\n\t\tif (start_time) {\n\t\t\ttext = formatDate(start_time, \"dateTimeNumeric\");\n\t\t\ttooltipText = new Date(start_time).toString();\n\t\t} else if (expected_start_time) {\n\t\t\ttext = `Scheduled for ${formatDate(expected_start_time, \"dateTimeNumeric\")}`;\n\t\t\ttooltipText = new Date(expected_start_time).toString();\n\t\t}\n\t\treturn { text, tooltipText };\n\t}, [expected_start_time, start_time]);\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild disabled={!text}>\n\t\t\t\t\t<div className=\"text-xs font-mono flex gap-2 items-center\">\n\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"size-4\" />\n\t\t\t\t\t\t{text ?? \"No start time\"}\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{tooltipText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\ntype TaskRunDurationProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n};\n\nconst TaskRunDuration = ({ taskRun }: TaskRunDurationProps) => {\n\t// These properties only exist on UITaskRun, not TaskRunResponse\n\tconst estimated_run_time =\n\t\t\"estimated_run_time\" in taskRun\n\t\t\t? (taskRun.estimated_run_time as number | null)\n\t\t\t: null;\n\tconst total_run_time =\n\t\t\"total_run_time\" in taskRun\n\t\t\t? (taskRun.total_run_time as number | null)\n\t\t\t: null;\n\tconst duration = estimated_run_time ?? total_run_time ?? 0;\n\n\tif (duration === 0) {\n\t\treturn null;\n\t}\n\n\tconst durationLabel = humanizeDuration(duration * 1000, {\n\t\tmaxDecimalPoints: 2,\n\t\tunits: [\"h\", \"m\", \"s\"],\n\t\tround: true,\n\t});\n\tconst durationTooltip = humanizeDuration(duration * 1000, {\n\t\tmaxDecimalPoints: 5,\n\t\tunits: [\"h\", \"m\", \"s\"],\n\t});\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t<div className=\"flex gap-2 items-center text-xs font-mono\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"size-4\" />\n\t\t\t\t\t\t{durationLabel}\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{durationTooltip}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\ntype TaskRunsListItemWithDataProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tchecked?: boolean;\n\tonCheckedChange?: (checked: boolean) => void;\n};\n\ntype TaskRunsListItemWithFlowDataProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tflowRunId: string;\n\tchecked?: boolean;\n\tonCheckedChange?: (checked: boolean) => void;\n};\n\nconst TaskRunsListItemWithFlowData = ({\n\ttaskRun,\n\tflowRunId,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemWithFlowDataProps) => {\n\tconst { data: flowRun } = useSuspenseQuery(\n\t\tbuildGetFlowRunDetailsQuery(flowRunId),\n\t);\n\tconst { data: flow } = useSuspenseQuery(\n\t\tbuildFLowDetailsQuery(flowRun.flow_id),\n\t);\n\n\treturn (\n\t\t<TaskRunsListItem\n\t\t\ttaskRun={taskRun}\n\t\t\tflow={flow}\n\t\t\tflowRun={flowRun}\n\t\t\tchecked={checked}\n\t\t\tonCheckedChange={onCheckedChange}\n\t\t/>\n\t);\n};\n\nconst TaskRunsListItemWithDataInner = ({\n\ttaskRun,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemWithDataProps) => {\n\tconst flowRunId = taskRun.flow_run_id;\n\n\tif (!flowRunId) {\n\t\treturn (\n\t\t\t<TaskRunsListItem\n\t\t\t\ttaskRun={taskRun}\n\t\t\t\tchecked={checked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<TaskRunsListItemWithFlowData\n\t\t\ttaskRun={taskRun}\n\t\t\tflowRunId={flowRunId}\n\t\t\tchecked={checked}\n\t\t\tonCheckedChange={onCheckedChange}\n\t\t/>\n\t);\n};\n\nexport const TaskRunsListItemWithData = ({\n\ttaskRun,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemWithDataProps) => {\n\treturn (\n\t\t<Suspense\n\t\t\tfallback={\n\t\t\t\t<Card className=\"flex flex-col gap-2 p-4 border-l-8 border-l-gray-300 animate-pulse\">\n\t\t\t\t\t<div className=\"h-5 bg-gray-200 rounded w-1/3\" />\n\t\t\t\t\t<div className=\"h-4 bg-gray-200 rounded w-1/4\" />\n\t\t\t\t</Card>\n\t\t\t}\n\t\t>\n\t\t\t<TaskRunsListItemWithDataInner\n\t\t\t\ttaskRun={taskRun}\n\t\t\t\tchecked={checked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n};\n","import type { TaskRunResponse } from \"@/api/task-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TaskRunsListItemWithData } from \"./task-runs-list-item\";\n\ntype TaskRunsListProps = {\n\ttaskRuns?: Array<TaskRunResponse>;\n\tonSelect?: (id: string, checked: boolean) => void;\n\tselectedRows?: Set<string>;\n\tonClearFilters?: () => void;\n};\n\nexport const TaskRunsList = ({\n\ttaskRuns,\n\tonClearFilters,\n\tonSelect,\n\tselectedRows,\n}: TaskRunsListProps) => {\n\tif (!taskRuns) {\n\t\treturn <LoadingSkeleton numSkeletons={5} />;\n\t}\n\n\tif (taskRuns.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex justify-center py-4\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<Typography>No runs found</Typography>\n\t\t\t\t\t{onClearFilters && (\n\t\t\t\t\t\t<Button onClick={onClearFilters}>Clear Filters</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t{taskRuns.map((taskRun) => (\n\t\t\t\t<li key={taskRun.id}>\n\t\t\t\t\t<TaskRunsListItemWithData\n\t\t\t\t\t\ttaskRun={taskRun}\n\t\t\t\t\t\tchecked={selectedRows?.has(taskRun.id)}\n\t\t\t\t\t\tonCheckedChange={\n\t\t\t\t\t\t\tonSelect ? (checked) => onSelect(taskRun.id, checked) : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ul>\n\t);\n};\n\ntype LoadingSkeletonProps = {\n\tnumSkeletons?: number;\n};\nconst LoadingSkeleton = ({ numSkeletons = 1 }: LoadingSkeletonProps) => (\n\t<ul className=\"flex flex-col gap-1\">\n\t\t{Array.from({ length: numSkeletons }).map((_, i) => (\n\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: okay for static skeleton list\n\t\t\t<li key={i}>\n\t\t\t\t<Card className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t<Skeleton className=\"h-4 w-[350px]\" />\n\t\t\t\t\t\t<Skeleton className=\"h-4 w-[400px]\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Skeleton className=\"h-4 w-[400px]\" />\n\t\t\t\t\t<Skeleton className=\"h-4 w-[200px]\" />\n\t\t\t\t</Card>\n\t\t\t</li>\n\t\t))}\n\t</ul>\n);\n","import {\n\tPagination,\n\tPaginationContent,\n\tPaginationFirstButton,\n\tPaginationItem,\n\tPaginationLastButton,\n\tPaginationNextButton,\n\tPaginationPreviousButton,\n} from \"@/components/ui/pagination\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst PAGINATION_INCREMENTS = [5, 10, 25, 50, 100];\n\nexport type PaginationState = {\n\tlimit: number;\n\tpage: number;\n};\nexport type PaginationStateUpdater = (\n\tprevState: PaginationState,\n) => PaginationState;\n\ntype TaskRunsPaginationProps = {\n\tcount: number;\n\tpages: number;\n\tpagination: PaginationState;\n\tonChangePagination: (pagination: PaginationState) => void;\n\tonPrefetchPage?: (page: number) => void;\n};\nexport const TaskRunsPagination = ({\n\tcount,\n\tpages,\n\tpagination,\n\tonChangePagination,\n\tonPrefetchPage,\n}: TaskRunsPaginationProps) => {\n\tconst handleFirstPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: 1 });\n\tconst handlePreviousPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pagination.page - 1 });\n\tconst handleNextPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pagination.page + 1 });\n\n\tconst handleLastPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pages });\n\n\tconst handlePrefetchFirstPage = () => {\n\t\tif (pagination.page > 1) onPrefetchPage?.(1);\n\t};\n\tconst handlePrefetchPreviousPage = () => {\n\t\tif (pagination.page > 1) onPrefetchPage?.(pagination.page - 1);\n\t};\n\tconst handlePrefetchNextPage = () => {\n\t\tif (pagination.page < pages) onPrefetchPage?.(pagination.page + 1);\n\t};\n\tconst handlePrefetchLastPage = () => {\n\t\tif (pagination.page < pages) onPrefetchPage?.(pages);\n\t};\n\n\tconst disablePreviousPage = pagination.page <= 1;\n\tconst disableNextPage = pagination.page >= pages;\n\n\tconst handleChangeLimit = (value: string) => {\n\t\tconst newLimit = Number(value);\n\t\tconst newTotalPages = Math.ceil(count / newLimit);\n\t\tconst newPage = Math.min(pagination.page, newTotalPages);\n\t\tonChangePagination({\n\t\t\tlimit: newLimit,\n\t\t\tpage: newPage,\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between items-center\">\n\t\t\t<div className=\"flex flex-row items-center gap-2 text-xs text-muted-foreground\">\n\t\t\t\t<span className=\"whitespace-nowrap\">Items per page</span>\n\t\t\t\t<Select\n\t\t\t\t\tvalue={String(pagination.limit)}\n\t\t\t\t\tonValueChange={handleChangeLimit}\n\t\t\t\t>\n\t\t\t\t\t<SelectTrigger aria-label=\"Items per page\">\n\t\t\t\t\t\t<SelectValue placeholder=\"Theme\" />\n\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t{PAGINATION_INCREMENTS.map((increment) => (\n\t\t\t\t\t\t\t<SelectItem key={increment} value={String(increment)}>\n\t\t\t\t\t\t\t\t{increment}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectContent>\n\t\t\t\t</Select>\n\t\t\t</div>\n\t\t\t<Pagination className=\"justify-end\">\n\t\t\t\t<PaginationContent>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationFirstButton\n\t\t\t\t\t\t\tonClick={handleFirstPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchFirstPage}\n\t\t\t\t\t\t\tdisabled={disablePreviousPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<PaginationPreviousButton\n\t\t\t\t\t\t\tonClick={handlePreviousPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchPreviousPage}\n\t\t\t\t\t\t\tdisabled={disablePreviousPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem className=\"text-sm\">\n\t\t\t\t\t\tPage {pages === 0 ? 0 : pagination.page} of {pages}\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationNextButton\n\t\t\t\t\t\t\tonClick={handleNextPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchNextPage}\n\t\t\t\t\t\t\tdisabled={disableNextPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationLastButton\n\t\t\t\t\t\t\tonClick={handleLastPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchLastPage}\n\t\t\t\t\t\t\tdisabled={disableNextPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t</PaginationContent>\n\t\t\t</Pagination>\n\t\t</div>\n\t);\n};\n"],"names":["TaskRunsSortFilter","defaultValue","value","onSelect","jsxs","Select","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem","TaskRunsListItem","taskRun","flow","flowRun","checked","onCheckedChange","isSelectable","Card","stateCardVariants","Checkbox","TaskRunBreadcrumbs","TagBadgeGroup","StateBadge","TaskRunStartTime","TaskRunDuration","cva","Breadcrumb","BreadcrumbList","Fragment","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","start_time","expected_start_time","text","tooltipText","useMemo","formatDate","TooltipProvider","Tooltip","TooltipTrigger","Icon","TooltipContent","estimated_run_time","total_run_time","duration","durationLabel","humanizeDuration","durationTooltip","TaskRunsListItemWithFlowData","flowRunId","useSuspenseQuery","buildGetFlowRunDetailsQuery","buildFLowDetailsQuery","TaskRunsListItemWithDataInner","TaskRunsListItemWithData","Suspense","TaskRunsList","taskRuns","onClearFilters","selectedRows","Typography","Button","LoadingSkeleton","numSkeletons","_","i","Skeleton","PAGINATION_INCREMENTS","TaskRunsPagination","count","pages","pagination","onChangePagination","onPrefetchPage","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePrefetchFirstPage","handlePrefetchPreviousPage","handlePrefetchNextPage","handlePrefetchLastPage","disablePreviousPage","disableNextPage","handleChangeLimit","newLimit","newTotalPages","newPage","increment","Pagination","PaginationContent","PaginationItem","PaginationFirstButton","PaginationPreviousButton","PaginationNextButton","PaginationLastButton"],"mappings":"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"}
1
+ {"version":3,"file":"task-runs-pagination-DbjB6XnY.js","sources":["../../src/components/task-runs/task-runs-list/task-run-sort-filter.tsx","../../src/components/task-runs/task-runs-list/task-runs-list-item.tsx","../../src/components/task-runs/task-runs-list/task-runs-list.tsx","../../src/components/task-runs/task-runs-list/task-runs-pagination.tsx"],"sourcesContent":["import {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport type { TaskRunSortFilters } from \"./task-run-sort-filter.constants\";\n\ntype TaskRunsSortFilterProps = {\n\tdefaultValue?: TaskRunSortFilters;\n\tonSelect: (filter: TaskRunSortFilters) => void;\n\tvalue: undefined | TaskRunSortFilters;\n};\n\nexport const TaskRunsSortFilter = ({\n\tdefaultValue,\n\tvalue,\n\tonSelect,\n}: TaskRunsSortFilterProps) => {\n\treturn (\n\t\t<Select defaultValue={defaultValue} value={value} onValueChange={onSelect}>\n\t\t\t<SelectTrigger aria-label=\"Task run sort order\" className=\"w-full\">\n\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t<SelectItem value=\"EXPECTED_START_TIME_DESC\">\n\t\t\t\t\tNewest to oldest\n\t\t\t\t</SelectItem>\n\t\t\t\t<SelectItem value=\"EXPECTED_START_TIME_ASC\">\n\t\t\t\t\tOldest to newest\n\t\t\t\t</SelectItem>\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { cva } from \"class-variance-authority\";\nimport humanizeDuration from \"humanize-duration\";\nimport { Suspense, useMemo } from \"react\";\nimport { buildGetFlowRunDetailsQuery, type FlowRun } from \"@/api/flow-runs\";\nimport { buildFLowDetailsQuery, type Flow } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport type { TaskRun, TaskRunResponse } from \"@/api/task-runs\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Card } from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { formatDate } from \"@/utils/date\";\n\ntype TaskRunsListItemProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tflow?: Flow;\n\tflowRun?: FlowRun;\n\tchecked?: boolean;\n\tonCheckedChange?: (checked: boolean) => void;\n};\n\nexport const TaskRunsListItem = ({\n\ttaskRun,\n\tflow,\n\tflowRun,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemProps) => {\n\tconst isSelectable = typeof onCheckedChange === \"function\";\n\n\treturn (\n\t\t<Card className={stateCardVariants({ state: taskRun.state?.type })}>\n\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{isSelectable && (\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tchecked={checked ?? false}\n\t\t\t\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<TaskRunBreadcrumbs taskRun={taskRun} flow={flow} flowRun={flowRun} />\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<TagBadgeGroup tags={taskRun.tags ?? []} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t{taskRun.state && (\n\t\t\t\t\t<StateBadge type={taskRun.state.type} name={taskRun.state.name} />\n\t\t\t\t)}\n\t\t\t\t<TaskRunStartTime taskRun={taskRun} />\n\t\t\t\t<TaskRunDuration taskRun={taskRun} />\n\t\t\t</div>\n\t\t</Card>\n\t);\n};\n\nconst stateCardVariants = cva(\"flex flex-col gap-2 p-4 border-l-8\", {\n\tvariants: {\n\t\tstate: {\n\t\t\tCOMPLETED: \"border-l-green-600\",\n\t\t\tFAILED: \"border-l-red-600\",\n\t\t\tRUNNING: \"border-l-blue-700\",\n\t\t\tCANCELLED: \"border-l-gray-800\",\n\t\t\tCANCELLING: \"border-l-gray-800\",\n\t\t\tCRASHED: \"border-l-orange-600\",\n\t\t\tPAUSED: \"border-l-gray-800\",\n\t\t\tPENDING: \"border-l-gray-800\",\n\t\t\tSCHEDULED: \"border-l-yellow-700\",\n\t\t} satisfies Record<components[\"schemas\"][\"StateType\"], string>,\n\t},\n});\n\ntype TaskRunBreadcrumbsProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tflow?: Flow;\n\tflowRun?: FlowRun;\n};\n\nconst TaskRunBreadcrumbs = ({\n\ttaskRun,\n\tflow,\n\tflowRun,\n}: TaskRunBreadcrumbsProps) => {\n\treturn (\n\t\t<div className=\"flex items-center\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t{flow && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/flows/flow/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: flow.id }}\n\t\t\t\t\t\t\t\t\tclassName=\"font-semibold text-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{flow.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: flowRun.id }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{flowRun.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"font-bold text-foreground\">\n\t\t\t\t\t\t<BreadcrumbLink to=\"/runs/task-run/$id\" params={{ id: taskRun.id }}>\n\t\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n};\n\ntype TaskRunStartTimeProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n};\n\nconst TaskRunStartTime = ({ taskRun }: TaskRunStartTimeProps) => {\n\t// These properties only exist on UITaskRun, not TaskRunResponse\n\tconst start_time =\n\t\t\"start_time\" in taskRun ? (taskRun.start_time as string | null) : null;\n\tconst expected_start_time =\n\t\t\"expected_start_time\" in taskRun\n\t\t\t? (taskRun.expected_start_time as string | null)\n\t\t\t: null;\n\n\tconst { text, tooltipText } = useMemo(() => {\n\t\tlet text: string | undefined;\n\t\tlet tooltipText: string | undefined;\n\t\tif (start_time) {\n\t\t\ttext = formatDate(start_time, \"dateTimeNumeric\");\n\t\t\ttooltipText = new Date(start_time).toString();\n\t\t} else if (expected_start_time) {\n\t\t\ttext = `Scheduled for ${formatDate(expected_start_time, \"dateTimeNumeric\")}`;\n\t\t\ttooltipText = new Date(expected_start_time).toString();\n\t\t}\n\t\treturn { text, tooltipText };\n\t}, [expected_start_time, start_time]);\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild disabled={!text}>\n\t\t\t\t\t<div className=\"text-xs font-mono flex gap-2 items-center\">\n\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"size-4\" />\n\t\t\t\t\t\t{text ?? \"No start time\"}\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{tooltipText}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\ntype TaskRunDurationProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n};\n\nconst TaskRunDuration = ({ taskRun }: TaskRunDurationProps) => {\n\t// These properties only exist on UITaskRun, not TaskRunResponse\n\tconst estimated_run_time =\n\t\t\"estimated_run_time\" in taskRun\n\t\t\t? (taskRun.estimated_run_time as number | null)\n\t\t\t: null;\n\tconst total_run_time =\n\t\t\"total_run_time\" in taskRun\n\t\t\t? (taskRun.total_run_time as number | null)\n\t\t\t: null;\n\tconst duration = estimated_run_time ?? total_run_time ?? 0;\n\n\tif (duration === 0) {\n\t\treturn null;\n\t}\n\n\tconst durationLabel = humanizeDuration(duration * 1000, {\n\t\tmaxDecimalPoints: 2,\n\t\tunits: [\"h\", \"m\", \"s\"],\n\t\tround: true,\n\t});\n\tconst durationTooltip = humanizeDuration(duration * 1000, {\n\t\tmaxDecimalPoints: 5,\n\t\tunits: [\"h\", \"m\", \"s\"],\n\t});\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t<div className=\"flex gap-2 items-center text-xs font-mono\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"size-4\" />\n\t\t\t\t\t\t{durationLabel}\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>{durationTooltip}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n\ntype TaskRunsListItemWithDataProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tchecked?: boolean;\n\tonCheckedChange?: (checked: boolean) => void;\n};\n\ntype TaskRunsListItemWithFlowDataProps = {\n\ttaskRun: TaskRun | TaskRunResponse;\n\tflowRunId: string;\n\tchecked?: boolean;\n\tonCheckedChange?: (checked: boolean) => void;\n};\n\nconst TaskRunsListItemWithFlowData = ({\n\ttaskRun,\n\tflowRunId,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemWithFlowDataProps) => {\n\tconst { data: flowRun } = useSuspenseQuery(\n\t\tbuildGetFlowRunDetailsQuery(flowRunId),\n\t);\n\tconst { data: flow } = useSuspenseQuery(\n\t\tbuildFLowDetailsQuery(flowRun.flow_id),\n\t);\n\n\treturn (\n\t\t<TaskRunsListItem\n\t\t\ttaskRun={taskRun}\n\t\t\tflow={flow}\n\t\t\tflowRun={flowRun}\n\t\t\tchecked={checked}\n\t\t\tonCheckedChange={onCheckedChange}\n\t\t/>\n\t);\n};\n\nconst TaskRunsListItemWithDataInner = ({\n\ttaskRun,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemWithDataProps) => {\n\tconst flowRunId = taskRun.flow_run_id;\n\n\tif (!flowRunId) {\n\t\treturn (\n\t\t\t<TaskRunsListItem\n\t\t\t\ttaskRun={taskRun}\n\t\t\t\tchecked={checked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<TaskRunsListItemWithFlowData\n\t\t\ttaskRun={taskRun}\n\t\t\tflowRunId={flowRunId}\n\t\t\tchecked={checked}\n\t\t\tonCheckedChange={onCheckedChange}\n\t\t/>\n\t);\n};\n\nexport const TaskRunsListItemWithData = ({\n\ttaskRun,\n\tchecked,\n\tonCheckedChange,\n}: TaskRunsListItemWithDataProps) => {\n\treturn (\n\t\t<Suspense\n\t\t\tfallback={\n\t\t\t\t<Card className=\"flex flex-col gap-2 p-4 border-l-8 border-l-gray-300 animate-pulse\">\n\t\t\t\t\t<div className=\"h-5 bg-gray-200 rounded w-1/3\" />\n\t\t\t\t\t<div className=\"h-4 bg-gray-200 rounded w-1/4\" />\n\t\t\t\t</Card>\n\t\t\t}\n\t\t>\n\t\t\t<TaskRunsListItemWithDataInner\n\t\t\t\ttaskRun={taskRun}\n\t\t\t\tchecked={checked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t/>\n\t\t</Suspense>\n\t);\n};\n","import type { TaskRunResponse } from \"@/api/task-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TaskRunsListItemWithData } from \"./task-runs-list-item\";\n\ntype TaskRunsListProps = {\n\ttaskRuns?: Array<TaskRunResponse>;\n\tonSelect?: (id: string, checked: boolean) => void;\n\tselectedRows?: Set<string>;\n\tonClearFilters?: () => void;\n};\n\nexport const TaskRunsList = ({\n\ttaskRuns,\n\tonClearFilters,\n\tonSelect,\n\tselectedRows,\n}: TaskRunsListProps) => {\n\tif (!taskRuns) {\n\t\treturn <LoadingSkeleton numSkeletons={5} />;\n\t}\n\n\tif (taskRuns.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex justify-center py-4\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<Typography>No runs found</Typography>\n\t\t\t\t\t{onClearFilters && (\n\t\t\t\t\t\t<Button onClick={onClearFilters}>Clear Filters</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t{taskRuns.map((taskRun) => (\n\t\t\t\t<li key={taskRun.id}>\n\t\t\t\t\t<TaskRunsListItemWithData\n\t\t\t\t\t\ttaskRun={taskRun}\n\t\t\t\t\t\tchecked={selectedRows?.has(taskRun.id)}\n\t\t\t\t\t\tonCheckedChange={\n\t\t\t\t\t\t\tonSelect ? (checked) => onSelect(taskRun.id, checked) : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ul>\n\t);\n};\n\ntype LoadingSkeletonProps = {\n\tnumSkeletons?: number;\n};\nconst LoadingSkeleton = ({ numSkeletons = 1 }: LoadingSkeletonProps) => (\n\t<ul className=\"flex flex-col gap-1\">\n\t\t{Array.from({ length: numSkeletons }).map((_, i) => (\n\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: okay for static skeleton list\n\t\t\t<li key={i}>\n\t\t\t\t<Card className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t<Skeleton className=\"h-4 w-[350px]\" />\n\t\t\t\t\t\t<Skeleton className=\"h-4 w-[400px]\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Skeleton className=\"h-4 w-[400px]\" />\n\t\t\t\t\t<Skeleton className=\"h-4 w-[200px]\" />\n\t\t\t\t</Card>\n\t\t\t</li>\n\t\t))}\n\t</ul>\n);\n","import {\n\tPagination,\n\tPaginationContent,\n\tPaginationFirstButton,\n\tPaginationItem,\n\tPaginationLastButton,\n\tPaginationNextButton,\n\tPaginationPreviousButton,\n} from \"@/components/ui/pagination\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst PAGINATION_INCREMENTS = [5, 10, 25, 50, 100];\n\nexport type PaginationState = {\n\tlimit: number;\n\tpage: number;\n};\nexport type PaginationStateUpdater = (\n\tprevState: PaginationState,\n) => PaginationState;\n\ntype TaskRunsPaginationProps = {\n\tcount: number;\n\tpages: number;\n\tpagination: PaginationState;\n\tonChangePagination: (pagination: PaginationState) => void;\n\tonPrefetchPage?: (page: number) => void;\n};\nexport const TaskRunsPagination = ({\n\tcount,\n\tpages,\n\tpagination,\n\tonChangePagination,\n\tonPrefetchPage,\n}: TaskRunsPaginationProps) => {\n\tconst handleFirstPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: 1 });\n\tconst handlePreviousPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pagination.page - 1 });\n\tconst handleNextPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pagination.page + 1 });\n\n\tconst handleLastPage = () =>\n\t\tonChangePagination({ limit: pagination.limit, page: pages });\n\n\tconst handlePrefetchFirstPage = () => {\n\t\tif (pagination.page > 1) onPrefetchPage?.(1);\n\t};\n\tconst handlePrefetchPreviousPage = () => {\n\t\tif (pagination.page > 1) onPrefetchPage?.(pagination.page - 1);\n\t};\n\tconst handlePrefetchNextPage = () => {\n\t\tif (pagination.page < pages) onPrefetchPage?.(pagination.page + 1);\n\t};\n\tconst handlePrefetchLastPage = () => {\n\t\tif (pagination.page < pages) onPrefetchPage?.(pages);\n\t};\n\n\tconst disablePreviousPage = pagination.page <= 1;\n\tconst disableNextPage = pagination.page >= pages;\n\n\tconst handleChangeLimit = (value: string) => {\n\t\tconst newLimit = Number(value);\n\t\tconst newTotalPages = Math.ceil(count / newLimit);\n\t\tconst newPage = Math.min(pagination.page, newTotalPages);\n\t\tonChangePagination({\n\t\t\tlimit: newLimit,\n\t\t\tpage: newPage,\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between items-center\">\n\t\t\t<div className=\"flex flex-row items-center gap-2 text-xs text-muted-foreground\">\n\t\t\t\t<span className=\"whitespace-nowrap\">Items per page</span>\n\t\t\t\t<Select\n\t\t\t\t\tvalue={String(pagination.limit)}\n\t\t\t\t\tonValueChange={handleChangeLimit}\n\t\t\t\t>\n\t\t\t\t\t<SelectTrigger aria-label=\"Items per page\">\n\t\t\t\t\t\t<SelectValue placeholder=\"Theme\" />\n\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t{PAGINATION_INCREMENTS.map((increment) => (\n\t\t\t\t\t\t\t<SelectItem key={increment} value={String(increment)}>\n\t\t\t\t\t\t\t\t{increment}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectContent>\n\t\t\t\t</Select>\n\t\t\t</div>\n\t\t\t<Pagination className=\"justify-end\">\n\t\t\t\t<PaginationContent>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationFirstButton\n\t\t\t\t\t\t\tonClick={handleFirstPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchFirstPage}\n\t\t\t\t\t\t\tdisabled={disablePreviousPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<PaginationPreviousButton\n\t\t\t\t\t\t\tonClick={handlePreviousPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchPreviousPage}\n\t\t\t\t\t\t\tdisabled={disablePreviousPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem className=\"text-sm\">\n\t\t\t\t\t\tPage {pages === 0 ? 0 : pagination.page} of {pages}\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationNextButton\n\t\t\t\t\t\t\tonClick={handleNextPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchNextPage}\n\t\t\t\t\t\t\tdisabled={disableNextPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationLastButton\n\t\t\t\t\t\t\tonClick={handleLastPage}\n\t\t\t\t\t\t\tonMouseEnter={handlePrefetchLastPage}\n\t\t\t\t\t\t\tdisabled={disableNextPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t</PaginationContent>\n\t\t\t</Pagination>\n\t\t</div>\n\t);\n};\n"],"names":["TaskRunsSortFilter","defaultValue","value","onSelect","jsxs","Select","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem","TaskRunsListItem","taskRun","flow","flowRun","checked","onCheckedChange","isSelectable","Card","stateCardVariants","Checkbox","TaskRunBreadcrumbs","TagBadgeGroup","StateBadge","TaskRunStartTime","TaskRunDuration","cva","Breadcrumb","BreadcrumbList","Fragment","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","start_time","expected_start_time","text","tooltipText","useMemo","formatDate","TooltipProvider","Tooltip","TooltipTrigger","Icon","TooltipContent","estimated_run_time","total_run_time","duration","durationLabel","humanizeDuration","durationTooltip","TaskRunsListItemWithFlowData","flowRunId","useSuspenseQuery","buildGetFlowRunDetailsQuery","buildFLowDetailsQuery","TaskRunsListItemWithDataInner","TaskRunsListItemWithData","Suspense","TaskRunsList","taskRuns","onClearFilters","selectedRows","Typography","Button","LoadingSkeleton","numSkeletons","_","i","Skeleton","PAGINATION_INCREMENTS","TaskRunsPagination","count","pages","pagination","onChangePagination","onPrefetchPage","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePrefetchFirstPage","handlePrefetchPreviousPage","handlePrefetchNextPage","handlePrefetchLastPage","disablePreviousPage","disableNextPage","handleChangeLimit","newLimit","newTotalPages","newPage","increment","Pagination","PaginationContent","PaginationItem","PaginationFirstButton","PaginationPreviousButton","PaginationNextButton","PaginationLastButton"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as i}from"./vendor-tanstack-BK8oseNA.js";import{aW as t}from"./index-BvSl3DKP.js";function n({className:r,...e}){return i.jsx("textarea",{"data-slot":"textarea",className:t("border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",r),...e})}export{n as T};
2
- //# sourceMappingURL=textarea-BAtfAxtV.js.map
1
+ import{j as i}from"./vendor-tanstack-BK8oseNA.js";import{aW as t}from"./index-Cd7pM9pk.js";function n({className:r,...e}){return i.jsx("textarea",{"data-slot":"textarea",className:t("border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",r),...e})}export{n as T};
2
+ //# sourceMappingURL=textarea-BX8KbLGx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"textarea-BAtfAxtV.js","sources":["../../src/components/ui/textarea.tsx"],"sourcesContent":["import type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n\treturn (\n\t\t<textarea\n\t\t\tdata-slot=\"textarea\"\n\t\t\tclassName={cn(\n\t\t\t\t\"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Textarea };\n"],"names":["Textarea","className","props","jsx","cn"],"mappings":"2FAIA,SAASA,EAAS,CAAE,UAAAC,EAAW,GAAGC,GAA2C,CAC5E,OACCC,EAAAA,IAAC,WAAA,CACA,YAAU,WACV,UAAWC,EACV,qbACAH,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP"}
1
+ {"version":3,"file":"textarea-BX8KbLGx.js","sources":["../../src/components/ui/textarea.tsx"],"sourcesContent":["import type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n\treturn (\n\t\t<textarea\n\t\t\tdata-slot=\"textarea\"\n\t\t\tclassName={cn(\n\t\t\t\t\"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Textarea };\n"],"names":["Textarea","className","props","jsx","cn"],"mappings":"2FAIA,SAASA,EAAS,CAAE,UAAAC,EAAW,GAAGC,GAA2C,CAC5E,OACCC,EAAAA,IAAC,WAAA,CACA,YAAU,WACV,UAAWC,EACV,qbACAH,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP"}
@@ -1,2 +1,2 @@
1
- import{r as n,j as e}from"./vendor-tanstack-BK8oseNA.js";import{ac as j,ad as T,ae as f,af as L,ah as E,ag as g,ai as w,aj as u}from"./index-BvSl3DKP.js";import{c as b,e as z}from"./dropdown-menu-CT-s-V7d.js";function x(s){return s.replaceAll("/"," / ").replaceAll("_"," ")}const C=Intl.DateTimeFormat().resolvedOptions().timeZone,p=[{label:"UTC",value:"Etc/UTC"},{label:x(C),value:C}],h=Intl.supportedValuesOf("timeZone").map(s=>({label:x(s),value:s})).slice(0,5),M=[...p,...h],A=({selectedValue:s="",onSelect:m})=>{const[c,a]=n.useState(""),t=n.useDeferredValue(c),i=n.useMemo(()=>p.filter(o=>o.label.toLowerCase().includes(t.toLowerCase())||o.value.toLowerCase().includes(t.toLowerCase())),[t]),d=n.useMemo(()=>h.filter(o=>o.label.toLowerCase().includes(t.toLowerCase())||o.value.toLowerCase().includes(t.toLowerCase())),[t]),S=n.useMemo(()=>M.find(({value:o})=>o===s),[s]);return e.jsxs(j,{children:[e.jsx(T,{selected:!!s,"aria-label":"Select timezone",children:S?.label??"Select timezone"}),e.jsxs(f,{children:[e.jsx(L,{value:c,onValueChange:a,placeholder:"Search"}),e.jsx(E,{children:"No timezone found"}),e.jsx(g,{children:e.jsxs(w,{children:[i.length>0&&e.jsx(b,{children:"Suggested timezones"}),i.map(({label:o,value:r})=>e.jsx(u,{selected:s===r,onSelect:l=>{m(l),a("")},value:r,children:o},r)),e.jsx(z,{}),d.length>0&&e.jsx(b,{children:"All timezones"}),d.map(({label:o,value:r})=>e.jsx(u,{selected:s===r,onSelect:l=>{m(l),a("")},value:r,children:o},r))]})})]})]})};export{A as T};
2
- //# sourceMappingURL=timezone-select-QlQTZSsF.js.map
1
+ import{r as n,j as e}from"./vendor-tanstack-BK8oseNA.js";import{ac as j,ad as T,ae as f,af as L,ah as E,ag as g,ai as w,aj as u}from"./index-Cd7pM9pk.js";import{c as b,e as z}from"./dropdown-menu-iS8iJMpx.js";function x(s){return s.replaceAll("/"," / ").replaceAll("_"," ")}const C=Intl.DateTimeFormat().resolvedOptions().timeZone,p=[{label:"UTC",value:"Etc/UTC"},{label:x(C),value:C}],h=Intl.supportedValuesOf("timeZone").map(s=>({label:x(s),value:s})).slice(0,5),M=[...p,...h],A=({selectedValue:s="",onSelect:m})=>{const[c,a]=n.useState(""),t=n.useDeferredValue(c),i=n.useMemo(()=>p.filter(o=>o.label.toLowerCase().includes(t.toLowerCase())||o.value.toLowerCase().includes(t.toLowerCase())),[t]),d=n.useMemo(()=>h.filter(o=>o.label.toLowerCase().includes(t.toLowerCase())||o.value.toLowerCase().includes(t.toLowerCase())),[t]),S=n.useMemo(()=>M.find(({value:o})=>o===s),[s]);return e.jsxs(j,{children:[e.jsx(T,{selected:!!s,"aria-label":"Select timezone",children:S?.label??"Select timezone"}),e.jsxs(f,{children:[e.jsx(L,{value:c,onValueChange:a,placeholder:"Search"}),e.jsx(E,{children:"No timezone found"}),e.jsx(g,{children:e.jsxs(w,{children:[i.length>0&&e.jsx(b,{children:"Suggested timezones"}),i.map(({label:o,value:r})=>e.jsx(u,{selected:s===r,onSelect:l=>{m(l),a("")},value:r,children:o},r)),e.jsx(z,{}),d.length>0&&e.jsx(b,{children:"All timezones"}),d.map(({label:o,value:r})=>e.jsx(u,{selected:s===r,onSelect:l=>{m(l),a("")},value:r,children:o},r))]})})]})]})};export{A as T};
2
+ //# sourceMappingURL=timezone-select-TBj2n6Ox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timezone-select-QlQTZSsF.js","sources":["../../src/components/ui/timezone-select/timezone-select.tsx"],"sourcesContent":["import { 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\tDropdownMenuLabel,\n\tDropdownMenuSeparator,\n} from \"@/components/ui/dropdown-menu\";\n\nfunction getTimezoneLabel(value: string): string {\n\treturn value.replaceAll(\"/\", \" / \").replaceAll(\"_\", \" \");\n}\n\nconst localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\nconst SUGGESTED_TIMEZONES = [\n\t{ label: \"UTC\", value: \"Etc/UTC\" },\n\t{\n\t\tlabel: getTimezoneLabel(localTimezone),\n\t\tvalue: localTimezone,\n\t},\n];\n\nconst TIMEZONES = Intl.supportedValuesOf(\"timeZone\")\n\t.map((timezone) => ({\n\t\tlabel: getTimezoneLabel(timezone),\n\t\tvalue: timezone,\n\t}))\n\t.slice(0, 5);\n\nconst ALL_TIMEZONES = [...SUGGESTED_TIMEZONES, ...TIMEZONES];\n\ntype TimezoneSelectProps = {\n\tselectedValue: string | undefined | null;\n\tonSelect: (value: string) => void;\n};\n\nexport const TimezoneSelect = ({\n\tselectedValue = \"\",\n\tonSelect,\n}: TimezoneSelectProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst filteredSuggestedTimezones = useMemo(() => {\n\t\treturn SUGGESTED_TIMEZONES.filter(\n\t\t\t(timeZone) =>\n\t\t\t\ttimeZone.label.toLowerCase().includes(deferredSearch.toLowerCase()) ||\n\t\t\t\ttimeZone.value.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst filteredTimezones = useMemo(() => {\n\t\treturn TIMEZONES.filter(\n\t\t\t(timeZone) =>\n\t\t\t\ttimeZone.label.toLowerCase().includes(deferredSearch.toLowerCase()) ||\n\t\t\t\ttimeZone.value.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst selectedTimezone = useMemo(\n\t\t() => ALL_TIMEZONES.find(({ value }) => value === selectedValue),\n\t\t[selectedValue],\n\t);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\tselected={Boolean(selectedValue)}\n\t\t\t\taria-label=\"Select timezone\"\n\t\t\t>\n\t\t\t\t{selectedTimezone?.label ?? \"Select timezone\"}\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\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No timezone found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredSuggestedTimezones.length > 0 && (\n\t\t\t\t\t\t\t<DropdownMenuLabel>Suggested timezones</DropdownMenuLabel>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredSuggestedTimezones.map(({ label, value }) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\t\tselected={selectedValue === value}\n\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\tonSelect(value);\n\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t{filteredTimezones.length > 0 && (\n\t\t\t\t\t\t\t<DropdownMenuLabel>All timezones</DropdownMenuLabel>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredTimezones.map(({ label, value }) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\t\tselected={selectedValue === value}\n\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\tonSelect(value);\n\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t);\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"],"names":["getTimezoneLabel","value","localTimezone","SUGGESTED_TIMEZONES","TIMEZONES","timezone","ALL_TIMEZONES","TimezoneSelect","selectedValue","onSelect","search","setSearch","useState","deferredSearch","useDeferredValue","filteredSuggestedTimezones","useMemo","timeZone","filteredTimezones","selectedTimezone","Combobox","jsx","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","jsxs","ComboboxCommandGroup","DropdownMenuLabel","label","ComboboxCommandItem","DropdownMenuSeparator"],"mappings":"iNAgBA,SAASA,EAAiBC,EAAuB,CAChD,OAAOA,EAAM,WAAW,IAAK,KAAK,EAAE,WAAW,IAAK,GAAG,CACxD,CAEA,MAAMC,EAAgB,KAAK,iBAAiB,kBAAkB,SAExDC,EAAsB,CAC3B,CAAE,MAAO,MAAO,MAAO,SAAA,EACvB,CACC,MAAOH,EAAiBE,CAAa,EACrC,MAAOA,CAAA,CAET,EAEME,EAAY,KAAK,kBAAkB,UAAU,EACjD,IAAKC,IAAc,CACnB,MAAOL,EAAiBK,CAAQ,EAChC,MAAOA,CACR,EAAE,EACD,MAAM,EAAG,CAAC,EAENC,EAAgB,CAAC,GAAGH,EAAqB,GAAGC,CAAS,EAO9CG,EAAiB,CAAC,CAC9B,cAAAC,EAAgB,GAChB,SAAAC,CACD,IAA2B,CAC1B,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAE,EAEjCC,EAAiBC,EAAAA,iBAAiBJ,CAAM,EAExCK,EAA6BC,EAAAA,QAAQ,IACnCb,EAAoB,OACzBc,GACAA,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,YAAA,CAAa,GAClEI,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,aAAa,CAAA,EAElE,CAACA,CAAc,CAAC,EAEbK,EAAoBF,EAAAA,QAAQ,IAC1BZ,EAAU,OACfa,GACAA,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,YAAA,CAAa,GAClEI,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,aAAa,CAAA,EAElE,CAACA,CAAc,CAAC,EAEbM,EAAmBH,EAAAA,QACxB,IAAMV,EAAc,KAAK,CAAC,CAAE,MAAAL,CAAA,IAAYA,IAAUO,CAAa,EAC/D,CAACA,CAAa,CAAA,EAGf,cACEY,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,SAAU,EAAQd,EAClB,aAAW,kBAEV,YAAkB,OAAS,iBAAA,CAAA,SAE5Be,EAAA,CACA,SAAA,CAAAF,EAAAA,IAACG,EAAA,CACA,MAAOd,EACP,cAAeC,EACf,YAAY,QAAA,CAAA,EAEbU,EAAAA,IAACI,GAAqB,SAAA,mBAAA,CAAiB,EACvCJ,EAAAA,IAACK,EAAA,CACA,SAAAC,EAAAA,KAACC,EAAA,CACC,SAAA,CAAAb,EAA2B,OAAS,GACpCM,EAAAA,IAACQ,EAAA,CAAkB,SAAA,sBAAmB,EAEtCd,EAA2B,IAAI,CAAC,CAAE,MAAAe,EAAO,MAAA7B,KAExCoB,EAAAA,IAACU,EAAA,CAEA,SAAUvB,IAAkBP,EAC5B,SAAWA,GAAU,CACpBQ,EAASR,CAAK,EACdU,EAAU,EAAE,CACb,EACA,MAAAV,EAEC,SAAA6B,CAAA,EARI7B,CAAA,CAWP,QACA+B,EAAA,EAAsB,EACtBd,EAAkB,OAAS,GAC3BG,EAAAA,IAACQ,GAAkB,SAAA,gBAAa,EAEhCX,EAAkB,IAAI,CAAC,CAAE,MAAAY,EAAO,MAAA7B,KAE/BoB,EAAAA,IAACU,EAAA,CAEA,SAAUvB,IAAkBP,EAC5B,SAAWA,GAAU,CACpBQ,EAASR,CAAK,EACdU,EAAU,EAAE,CACb,EACA,MAAAV,EAEC,SAAA6B,CAAA,EARI7B,CAAA,CAWP,CAAA,CAAA,CACF,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EACD,CAEF"}
1
+ {"version":3,"file":"timezone-select-TBj2n6Ox.js","sources":["../../src/components/ui/timezone-select/timezone-select.tsx"],"sourcesContent":["import { 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\tDropdownMenuLabel,\n\tDropdownMenuSeparator,\n} from \"@/components/ui/dropdown-menu\";\n\nfunction getTimezoneLabel(value: string): string {\n\treturn value.replaceAll(\"/\", \" / \").replaceAll(\"_\", \" \");\n}\n\nconst localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\nconst SUGGESTED_TIMEZONES = [\n\t{ label: \"UTC\", value: \"Etc/UTC\" },\n\t{\n\t\tlabel: getTimezoneLabel(localTimezone),\n\t\tvalue: localTimezone,\n\t},\n];\n\nconst TIMEZONES = Intl.supportedValuesOf(\"timeZone\")\n\t.map((timezone) => ({\n\t\tlabel: getTimezoneLabel(timezone),\n\t\tvalue: timezone,\n\t}))\n\t.slice(0, 5);\n\nconst ALL_TIMEZONES = [...SUGGESTED_TIMEZONES, ...TIMEZONES];\n\ntype TimezoneSelectProps = {\n\tselectedValue: string | undefined | null;\n\tonSelect: (value: string) => void;\n};\n\nexport const TimezoneSelect = ({\n\tselectedValue = \"\",\n\tonSelect,\n}: TimezoneSelectProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst filteredSuggestedTimezones = useMemo(() => {\n\t\treturn SUGGESTED_TIMEZONES.filter(\n\t\t\t(timeZone) =>\n\t\t\t\ttimeZone.label.toLowerCase().includes(deferredSearch.toLowerCase()) ||\n\t\t\t\ttimeZone.value.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst filteredTimezones = useMemo(() => {\n\t\treturn TIMEZONES.filter(\n\t\t\t(timeZone) =>\n\t\t\t\ttimeZone.label.toLowerCase().includes(deferredSearch.toLowerCase()) ||\n\t\t\t\ttimeZone.value.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst selectedTimezone = useMemo(\n\t\t() => ALL_TIMEZONES.find(({ value }) => value === selectedValue),\n\t\t[selectedValue],\n\t);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\tselected={Boolean(selectedValue)}\n\t\t\t\taria-label=\"Select timezone\"\n\t\t\t>\n\t\t\t\t{selectedTimezone?.label ?? \"Select timezone\"}\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\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No timezone found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredSuggestedTimezones.length > 0 && (\n\t\t\t\t\t\t\t<DropdownMenuLabel>Suggested timezones</DropdownMenuLabel>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredSuggestedTimezones.map(({ label, value }) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\t\tselected={selectedValue === value}\n\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\tonSelect(value);\n\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t{filteredTimezones.length > 0 && (\n\t\t\t\t\t\t\t<DropdownMenuLabel>All timezones</DropdownMenuLabel>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredTimezones.map(({ label, value }) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\t\tselected={selectedValue === value}\n\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\tonSelect(value);\n\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t);\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"],"names":["getTimezoneLabel","value","localTimezone","SUGGESTED_TIMEZONES","TIMEZONES","timezone","ALL_TIMEZONES","TimezoneSelect","selectedValue","onSelect","search","setSearch","useState","deferredSearch","useDeferredValue","filteredSuggestedTimezones","useMemo","timeZone","filteredTimezones","selectedTimezone","Combobox","jsx","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","jsxs","ComboboxCommandGroup","DropdownMenuLabel","label","ComboboxCommandItem","DropdownMenuSeparator"],"mappings":"iNAgBA,SAASA,EAAiBC,EAAuB,CAChD,OAAOA,EAAM,WAAW,IAAK,KAAK,EAAE,WAAW,IAAK,GAAG,CACxD,CAEA,MAAMC,EAAgB,KAAK,iBAAiB,kBAAkB,SAExDC,EAAsB,CAC3B,CAAE,MAAO,MAAO,MAAO,SAAA,EACvB,CACC,MAAOH,EAAiBE,CAAa,EACrC,MAAOA,CAAA,CAET,EAEME,EAAY,KAAK,kBAAkB,UAAU,EACjD,IAAKC,IAAc,CACnB,MAAOL,EAAiBK,CAAQ,EAChC,MAAOA,CACR,EAAE,EACD,MAAM,EAAG,CAAC,EAENC,EAAgB,CAAC,GAAGH,EAAqB,GAAGC,CAAS,EAO9CG,EAAiB,CAAC,CAC9B,cAAAC,EAAgB,GAChB,SAAAC,CACD,IAA2B,CAC1B,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAE,EAEjCC,EAAiBC,EAAAA,iBAAiBJ,CAAM,EAExCK,EAA6BC,EAAAA,QAAQ,IACnCb,EAAoB,OACzBc,GACAA,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,YAAA,CAAa,GAClEI,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,aAAa,CAAA,EAElE,CAACA,CAAc,CAAC,EAEbK,EAAoBF,EAAAA,QAAQ,IAC1BZ,EAAU,OACfa,GACAA,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,YAAA,CAAa,GAClEI,EAAS,MAAM,YAAA,EAAc,SAASJ,EAAe,aAAa,CAAA,EAElE,CAACA,CAAc,CAAC,EAEbM,EAAmBH,EAAAA,QACxB,IAAMV,EAAc,KAAK,CAAC,CAAE,MAAAL,CAAA,IAAYA,IAAUO,CAAa,EAC/D,CAACA,CAAa,CAAA,EAGf,cACEY,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,SAAU,EAAQd,EAClB,aAAW,kBAEV,YAAkB,OAAS,iBAAA,CAAA,SAE5Be,EAAA,CACA,SAAA,CAAAF,EAAAA,IAACG,EAAA,CACA,MAAOd,EACP,cAAeC,EACf,YAAY,QAAA,CAAA,EAEbU,EAAAA,IAACI,GAAqB,SAAA,mBAAA,CAAiB,EACvCJ,EAAAA,IAACK,EAAA,CACA,SAAAC,EAAAA,KAACC,EAAA,CACC,SAAA,CAAAb,EAA2B,OAAS,GACpCM,EAAAA,IAACQ,EAAA,CAAkB,SAAA,sBAAmB,EAEtCd,EAA2B,IAAI,CAAC,CAAE,MAAAe,EAAO,MAAA7B,KAExCoB,EAAAA,IAACU,EAAA,CAEA,SAAUvB,IAAkBP,EAC5B,SAAWA,GAAU,CACpBQ,EAASR,CAAK,EACdU,EAAU,EAAE,CACb,EACA,MAAAV,EAEC,SAAA6B,CAAA,EARI7B,CAAA,CAWP,QACA+B,EAAA,EAAsB,EACtBd,EAAkB,OAAS,GAC3BG,EAAAA,IAACQ,GAAkB,SAAA,gBAAa,EAEhCX,EAAkB,IAAI,CAAC,CAAE,MAAAY,EAAO,MAAA7B,KAE/BoB,EAAAA,IAACU,EAAA,CAEA,SAAUvB,IAAkBP,EAC5B,SAAWA,GAAU,CACpBQ,EAASR,CAAK,EACdU,EAAU,EAAE,CACb,EACA,MAAAV,EAEC,SAAA6B,CAAA,EARI7B,CAAA,CAWP,CAAA,CAAA,CACF,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EACD,CAEF"}
@@ -1,2 +1,2 @@
1
- import{j as i,r as s}from"./vendor-tanstack-BK8oseNA.js";import{ax as l,ay as c}from"./vendor-radix-CznP1SOq.js";import{cq as g,aW as d}from"./index-BvSl3DKP.js";const v=g("inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",{variants:{variant:{default:"bg-transparent",outline:"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground"},size:{default:"h-9 px-2 min-w-9",sm:"h-8 px-1.5 min-w-8",lg:"h-10 px-2.5 min-w-10"}},defaultVariants:{variant:"default",size:"default"}}),u=s.createContext({size:"default",variant:"default"});function x({className:n,variant:e,size:t,children:a,...o}){return i.jsx(l,{"data-slot":"toggle-group","data-variant":e,"data-size":t,className:d("group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs",n),...o,children:i.jsx(u.Provider,{value:{variant:e,size:t},children:a})})}function b({className:n,children:e,variant:t,size:a,...o}){const r=s.useContext(u);return i.jsx(c,{"data-slot":"toggle-group-item","data-variant":r.variant||t,"data-size":r.size||a,className:d(v({variant:r.variant||t,size:r.size||a}),"min-w-0 flex-1 shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:border-l-0 data-[variant=outline]:first:border-l",n),...o,children:e})}export{x as T,b as a};
2
- //# sourceMappingURL=toggle-group-BJN1vjEh.js.map
1
+ import{j as i,r as s}from"./vendor-tanstack-BK8oseNA.js";import{ax as l,ay as c}from"./vendor-radix-CznP1SOq.js";import{cr as g,aW as d}from"./index-Cd7pM9pk.js";const v=g("inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",{variants:{variant:{default:"bg-transparent",outline:"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground"},size:{default:"h-9 px-2 min-w-9",sm:"h-8 px-1.5 min-w-8",lg:"h-10 px-2.5 min-w-10"}},defaultVariants:{variant:"default",size:"default"}}),u=s.createContext({size:"default",variant:"default"});function x({className:n,variant:e,size:t,children:a,...o}){return i.jsx(l,{"data-slot":"toggle-group","data-variant":e,"data-size":t,className:d("group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs",n),...o,children:i.jsx(u.Provider,{value:{variant:e,size:t},children:a})})}function b({className:n,children:e,variant:t,size:a,...o}){const r=s.useContext(u);return i.jsx(c,{"data-slot":"toggle-group-item","data-variant":r.variant||t,"data-size":r.size||a,className:d(v({variant:r.variant||t,size:r.size||a}),"min-w-0 flex-1 shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:border-l-0 data-[variant=outline]:first:border-l",n),...o,children:e})}export{x as T,b as a};
2
+ //# sourceMappingURL=toggle-group-D7mfSUim.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toggle-group-BJN1vjEh.js","sources":["../../src/components/ui/toggle/styles.ts","../../src/components/ui/toggle-group.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const toggleVariants = cva(\n\t\"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-transparent\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-9 px-2 min-w-9\",\n\t\t\t\tsm: \"h-8 px-1.5 min-w-8\",\n\t\t\t\tlg: \"h-10 px-2.5 min-w-10\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t},\n);\n","import * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { toggleVariants } from \"@/components/ui/toggle\";\nimport { cn } from \"@/utils\";\n\nconst ToggleGroupContext = React.createContext<\n\tVariantProps<typeof toggleVariants>\n>({\n\tsize: \"default\",\n\tvariant: \"default\",\n});\n\nfunction ToggleGroup({\n\tclassName,\n\tvariant,\n\tsize,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n\tVariantProps<typeof toggleVariants>) {\n\treturn (\n\t\t<ToggleGroupPrimitive.Root\n\t\t\tdata-slot=\"toggle-group\"\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ToggleGroupContext.Provider value={{ variant, size }}>\n\t\t\t\t{children}\n\t\t\t</ToggleGroupContext.Provider>\n\t\t</ToggleGroupPrimitive.Root>\n\t);\n}\n\nfunction ToggleGroupItem({\n\tclassName,\n\tchildren,\n\tvariant,\n\tsize,\n\t...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n\tVariantProps<typeof toggleVariants>) {\n\tconst context = React.useContext(ToggleGroupContext);\n\n\treturn (\n\t\t<ToggleGroupPrimitive.Item\n\t\t\tdata-slot=\"toggle-group-item\"\n\t\t\tdata-variant={context.variant || variant}\n\t\t\tdata-size={context.size || size}\n\t\t\tclassName={cn(\n\t\t\t\ttoggleVariants({\n\t\t\t\t\tvariant: context.variant || variant,\n\t\t\t\t\tsize: context.size || size,\n\t\t\t\t}),\n\t\t\t\t\"min-w-0 flex-1 shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:border-l-0 data-[variant=outline]:first:border-l\",\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</ToggleGroupPrimitive.Item>\n\t);\n}\n\nexport { ToggleGroup, ToggleGroupItem };\n"],"names":["toggleVariants","cva","ToggleGroupContext","React.createContext","ToggleGroup","className","variant","size","children","props","jsx","ToggleGroupPrimitive.Root","cn","ToggleGroupItem","context","React.useContext","ToggleGroupPrimitive.Item"],"mappings":"kKAEO,MAAMA,EAAiBC,EAC7B,gjBACA,CACC,SAAU,CACT,QAAS,CACR,QAAS,iBACT,QACC,2FAAA,EAEF,KAAM,CACL,QAAS,mBACT,GAAI,qBACJ,GAAI,sBAAA,CACL,EAED,gBAAiB,CAChB,QAAS,UACT,KAAM,SAAA,CACP,CAEF,ECfMC,EAAqBC,EAAAA,cAEzB,CACD,KAAM,UACN,QAAS,SACV,CAAC,EAED,SAASC,EAAY,CACpB,UAAAC,EACA,QAAAC,EACA,KAAAC,EACA,SAAAC,EACA,GAAGC,CACJ,EACsC,CACrC,OACCC,EAAAA,IAACC,EAAA,CACA,YAAU,eACV,eAAcL,EACd,YAAWC,EACX,UAAWK,EACV,yFACAP,CAAA,EAEA,GAAGI,EAEJ,SAAAC,EAAAA,IAACR,EAAmB,SAAnB,CAA4B,MAAO,CAAE,QAAAI,EAAS,KAAAC,CAAA,EAC7C,SAAAC,CAAA,CACF,CAAA,CAAA,CAGH,CAEA,SAASK,EAAgB,CACxB,UAAAR,EACA,SAAAG,EACA,QAAAF,EACA,KAAAC,EACA,GAAGE,CACJ,EACsC,CACrC,MAAMK,EAAUC,EAAAA,WAAiBb,CAAkB,EAEnD,OACCQ,EAAAA,IAACM,EAAA,CACA,YAAU,oBACV,eAAcF,EAAQ,SAAWR,EACjC,YAAWQ,EAAQ,MAAQP,EAC3B,UAAWK,EACVZ,EAAe,CACd,QAASc,EAAQ,SAAWR,EAC5B,KAAMQ,EAAQ,MAAQP,CAAA,CACtB,EACD,8LACAF,CAAA,EAEA,GAAGI,EAEH,SAAAD,CAAA,CAAA,CAGJ"}
1
+ {"version":3,"file":"toggle-group-D7mfSUim.js","sources":["../../src/components/ui/toggle/styles.ts","../../src/components/ui/toggle-group.tsx"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const toggleVariants = cva(\n\t\"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-transparent\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-9 px-2 min-w-9\",\n\t\t\t\tsm: \"h-8 px-1.5 min-w-8\",\n\t\t\t\tlg: \"h-10 px-2.5 min-w-10\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t},\n);\n","import * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { toggleVariants } from \"@/components/ui/toggle\";\nimport { cn } from \"@/utils\";\n\nconst ToggleGroupContext = React.createContext<\n\tVariantProps<typeof toggleVariants>\n>({\n\tsize: \"default\",\n\tvariant: \"default\",\n});\n\nfunction ToggleGroup({\n\tclassName,\n\tvariant,\n\tsize,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n\tVariantProps<typeof toggleVariants>) {\n\treturn (\n\t\t<ToggleGroupPrimitive.Root\n\t\t\tdata-slot=\"toggle-group\"\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ToggleGroupContext.Provider value={{ variant, size }}>\n\t\t\t\t{children}\n\t\t\t</ToggleGroupContext.Provider>\n\t\t</ToggleGroupPrimitive.Root>\n\t);\n}\n\nfunction ToggleGroupItem({\n\tclassName,\n\tchildren,\n\tvariant,\n\tsize,\n\t...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n\tVariantProps<typeof toggleVariants>) {\n\tconst context = React.useContext(ToggleGroupContext);\n\n\treturn (\n\t\t<ToggleGroupPrimitive.Item\n\t\t\tdata-slot=\"toggle-group-item\"\n\t\t\tdata-variant={context.variant || variant}\n\t\t\tdata-size={context.size || size}\n\t\t\tclassName={cn(\n\t\t\t\ttoggleVariants({\n\t\t\t\t\tvariant: context.variant || variant,\n\t\t\t\t\tsize: context.size || size,\n\t\t\t\t}),\n\t\t\t\t\"min-w-0 flex-1 shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:border-l-0 data-[variant=outline]:first:border-l\",\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</ToggleGroupPrimitive.Item>\n\t);\n}\n\nexport { ToggleGroup, ToggleGroupItem };\n"],"names":["toggleVariants","cva","ToggleGroupContext","React.createContext","ToggleGroup","className","variant","size","children","props","jsx","ToggleGroupPrimitive.Root","cn","ToggleGroupItem","context","React.useContext","ToggleGroupPrimitive.Item"],"mappings":"kKAEO,MAAMA,EAAiBC,EAC7B,gjBACA,CACC,SAAU,CACT,QAAS,CACR,QAAS,iBACT,QACC,2FAAA,EAEF,KAAM,CACL,QAAS,mBACT,GAAI,qBACJ,GAAI,sBAAA,CACL,EAED,gBAAiB,CAChB,QAAS,UACT,KAAM,SAAA,CACP,CAEF,ECfMC,EAAqBC,EAAAA,cAEzB,CACD,KAAM,UACN,QAAS,SACV,CAAC,EAED,SAASC,EAAY,CACpB,UAAAC,EACA,QAAAC,EACA,KAAAC,EACA,SAAAC,EACA,GAAGC,CACJ,EACsC,CACrC,OACCC,EAAAA,IAACC,EAAA,CACA,YAAU,eACV,eAAcL,EACd,YAAWC,EACX,UAAWK,EACV,yFACAP,CAAA,EAEA,GAAGI,EAEJ,SAAAC,EAAAA,IAACR,EAAmB,SAAnB,CAA4B,MAAO,CAAE,QAAAI,EAAS,KAAAC,CAAA,EAC7C,SAAAC,CAAA,CACF,CAAA,CAAA,CAGH,CAEA,SAASK,EAAgB,CACxB,UAAAR,EACA,SAAAG,EACA,QAAAF,EACA,KAAAC,EACA,GAAGE,CACJ,EACsC,CACrC,MAAMK,EAAUC,EAAAA,WAAiBb,CAAkB,EAEnD,OACCQ,EAAAA,IAACM,EAAA,CACA,YAAU,oBACV,eAAcF,EAAQ,SAAWR,EACjC,YAAWQ,EAAQ,MAAQP,EAC3B,UAAWK,EACVZ,EAAe,CACd,QAASc,EAAQ,SAAWR,EAC5B,KAAMQ,EAAQ,MAAQP,CAAA,CACtB,EACD,8LACAF,CAAA,EAEA,GAAGI,EAEH,SAAAD,CAAA,CAAA,CAGJ"}