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":"index-D5v9S-lB.js","sources":["../../src/components/variables/data-table/cells.tsx","../../src/components/variables/data-table/data-table.tsx","../../src/components/variables/empty-state.tsx","../../src/components/variables/variable-dialog/use-variable-dialog.ts","../../src/components/variables/variable-dialog/variable-dialog.tsx","../../src/routes/variables/index.tsx?tsr-split=component"],"sourcesContent":["import type { CellContext } from \"@tanstack/react-table\";\nimport { useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n\tHoverCard,\n\tHoverCardContent,\n\tHoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { useIsOverflowing } from \"@/hooks/use-is-overflowing\";\n\ntype ActionsCellProps = CellContext<\n\tcomponents[\"schemas\"][\"Variable\"],\n\tunknown\n> & {\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const ActionsCell = ({ row, onVariableEdit }: ActionsCellProps) => {\n\tconst id = row.original.id;\n\tconst { deleteVariable } = useDeleteVariable();\n\tif (!id) return null;\n\n\tconst onVariableDelete = () => {\n\t\tdeleteVariable(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Variable deleted\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\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\tvoid navigator.clipboard.writeText(row.original.name);\n\t\t\t\t\t\t\ttoast.success(\"Name copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy Name\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\tconst copyValue =\n\t\t\t\t\t\t\t\ttypeof row.original.value !== \"string\"\n\t\t\t\t\t\t\t\t\t? JSON.stringify(row.original.value)\n\t\t\t\t\t\t\t\t\t: row.original.value;\n\t\t\t\t\t\t\tif (copyValue) {\n\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(copyValue);\n\t\t\t\t\t\t\t\ttoast.success(\"Value copied\");\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\tCopy Value\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onVariableEdit(row.original)}>\n\t\t\t\t\t\tEdit\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={onVariableDelete}>Delete</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nexport const ValueCell = (\n\tprops: CellContext<components[\"schemas\"][\"Variable\"], unknown>,\n) => {\n\tconst value = props.getValue();\n\tconst codeRef = useRef<HTMLDivElement>(null);\n\tconst isOverflowing = useIsOverflowing(codeRef);\n\n\tif (!value) return null;\n\treturn (\n\t\t// Disable the hover card if the value is not overflowing\n\t\t<HoverCard open={isOverflowing ? undefined : false}>\n\t\t\t<HoverCardTrigger asChild>\n\t\t\t\t<code\n\t\t\t\t\tref={codeRef}\n\t\t\t\t\tclassName=\"px-2 py-1 font-mono text-sm text-ellipsis overflow-hidden whitespace-nowrap block\"\n\t\t\t\t>\n\t\t\t\t\t{JSON.stringify(value, null, 2)}\n\t\t\t\t</code>\n\t\t\t</HoverCardTrigger>\n\t\t\t<HoverCardContent className=\"p-0\">\n\t\t\t\t<JsonInput value={JSON.stringify(value, null, 2)} disabled />\n\t\t\t</HoverCardContent>\n\t\t</HoverCard>\n\t);\n};\n","import {\n\ttype ColumnFiltersState,\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport type React from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type { components } from \"@/api/prefect\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ValueCell } from \"./cells\";\n\nconst columnHelper = createColumnHelper<components[\"schemas\"][\"Variable\"]>();\n\nconst createColumns = (\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void,\n) => [\n\tcolumnHelper.accessor(\"name\", {\n\t\theader: \"Name\",\n\t}),\n\tcolumnHelper.accessor(\"value\", {\n\t\theader: \"Value\",\n\t\tcell: ValueCell,\n\t}),\n\tcolumnHelper.accessor(\"updated\", {\n\t\theader: \"Updated\",\n\t\tcell: (props) => {\n\t\t\tconst updated = props.getValue();\n\t\t\tif (!updated) return null;\n\t\t\treturn new Date(updated ?? new Date())\n\t\t\t\t.toLocaleString(undefined, {\n\t\t\t\t\tyear: \"numeric\",\n\t\t\t\t\tmonth: \"numeric\",\n\t\t\t\t\tday: \"numeric\",\n\t\t\t\t\thour: \"numeric\",\n\t\t\t\t\tminute: \"numeric\",\n\t\t\t\t\tsecond: \"numeric\",\n\t\t\t\t\thour12: true,\n\t\t\t\t})\n\t\t\t\t.replace(\",\", \"\");\n\t\t},\n\t}),\n\tcolumnHelper.accessor(\"tags\", {\n\t\theader: () => null,\n\t\tcell: (props) => {\n\t\t\tconst tags = props.getValue();\n\t\t\tif (!tags) return null;\n\t\t\treturn <TagBadgeGroup tags={tags} maxTagsDisplayed={3} />;\n\t\t},\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onVariableEdit={onVariableEdit} />,\n\t}),\n];\n\ntype VariablesDataTableProps = {\n\tvariables: components[\"schemas\"][\"Variable\"][];\n\tcurrentVariableCount: number;\n\tpagination: PaginationState;\n\tonPaginationChange: (newPagination: PaginationState) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (newColumnFilters: ColumnFiltersState) => void;\n\tsorting: components[\"schemas\"][\"VariableSort\"];\n\tonSortingChange: (sortKey: components[\"schemas\"][\"VariableSort\"]) => void;\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const VariablesDataTable = ({\n\tvariables,\n\tcurrentVariableCount,\n\tpagination,\n\tonPaginationChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tsorting,\n\tonSortingChange,\n\tonVariableEdit,\n}: VariablesDataTableProps) => {\n\tconst columns = useMemo(\n\t\t() => createColumns(onVariableEdit),\n\t\t[onVariableEdit],\n\t);\n\n\tconst nameSearchValue = columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value as string;\n\tconst tagsSearchValue = columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value as string[];\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: variables,\n\t\tcolumns: columns,\n\t\tstate: {\n\t\t\tpagination,\n\t\t\tcolumnFilters,\n\t\t},\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: currentVariableCount,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentVariableCount} {pluralize(currentVariableCount, \"Variable\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search variables\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sorting} onValueChange={onSortingChange}>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Variable sort order\" className=\"w-full\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { Button } from \"@/components/ui/button\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype VariablesEmptyStateProps = {\n\tonAddVariableClick: () => void;\n};\nexport const VariablesEmptyState = ({\n\tonAddVariableClick,\n}: VariablesEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Variable\" />\n\t\t<EmptyStateTitle>Add a variable to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tVariables store non-sensitive pieces of JSON.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={() => onAddVariableClick()}>\n\t\t\t\tAdd Variable <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"variables-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useCallback, useState } from \"react\";\nimport type { VariableDialogProps } from \"./variable-dialog\";\n\nexport const useVariableDialog = () => {\n\tconst handleVariableDialogOpenChange = useCallback((open: boolean) => {\n\t\tsetDialogState((prev) => ({\n\t\t\t...prev,\n\t\t\topen,\n\t\t}));\n\t}, []);\n\n\tconst [dialogState, setDialogState] = useState<VariableDialogProps>({\n\t\topen: false,\n\t\tonOpenChange: handleVariableDialogOpenChange,\n\t});\n\n\tconst handleVariableAddOrEdit = useCallback(\n\t\t(variableToEdit?: VariableDialogProps[\"variableToEdit\"]) => {\n\t\t\tsetDialogState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\topen: true,\n\t\t\t\tvariableToEdit,\n\t\t\t}));\n\t\t},\n\t\t[],\n\t);\n\n\treturn [dialogState, handleVariableAddOrEdit] as const;\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useEffect, useMemo } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport type { components } from \"@/api/prefect\";\nimport { useCreateVariable, useUpdateVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\n\nexport type JSONValue =\n\t| string\n\t| number\n\t| boolean\n\t| Record<string, never>\n\t| unknown[]\n\t| null;\n\nconst formSchema = z.object({\n\tname: z.string().min(2, { message: \"Name must be at least 2 characters\" }),\n\tvalue: z.string(),\n\ttags: z.string().array().optional(),\n});\n\nexport type VariableDialogProps = {\n\tonOpenChange: (open: boolean) => void;\n\topen: boolean;\n\tvariableToEdit?: components[\"schemas\"][\"Variable\"];\n};\n\nconst VARIABLE_FORM_DEFAULT_VALUES = {\n\tname: \"\",\n\tvalue: \"\",\n\ttags: [],\n};\n\nexport const VariableDialog = ({\n\tonOpenChange,\n\topen,\n\tvariableToEdit,\n}: VariableDialogProps) => {\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: VARIABLE_FORM_DEFAULT_VALUES,\n\t});\n\tconst initialValues = useMemo(() => {\n\t\tif (!variableToEdit) return undefined;\n\t\treturn {\n\t\t\tname: variableToEdit.name,\n\t\t\tvalue: JSON.stringify(variableToEdit.value, null, 2),\n\t\t\ttags: variableToEdit.tags,\n\t\t};\n\t}, [variableToEdit]);\n\n\tuseEffect(() => {\n\t\t// Ensure we start with the initial values when the dialog opens\n\t\tif (open) {\n\t\t\tform.reset(initialValues ?? VARIABLE_FORM_DEFAULT_VALUES);\n\t\t}\n\t}, [initialValues, form, open]);\n\n\tconst { createVariable, isPending: isCreating } = useCreateVariable();\n\n\tconst { updateVariable, isPending: isUpdating } = useUpdateVariable();\n\n\tconst onSubmit = (values: z.infer<typeof formSchema>) => {\n\t\ttry {\n\t\t\tconst value = JSON.parse(values.value) as JSONValue;\n\t\t\tif (variableToEdit?.id) {\n\t\t\t\tupdateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: variableToEdit.id,\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable updated\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while updating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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);\n\t\t\t} else {\n\t\t\t\tcreateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable created\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while creating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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);\n\t\t\t}\n\t\t} catch {\n\t\t\tform.setError(\"value\", { message: \"Value must be valid JSON\" });\n\t\t}\n\t};\n\tconst dialogTitle = variableToEdit ? \"Edit Variable\" : \"New Variable\";\n\tconst dialogDescription = variableToEdit\n\t\t? \"Edit the variable by changing the name, value, or tags.\"\n\t\t: \"Add a new variable by providing a name, value, and optional tags. Values can be any valid JSON value.\";\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>{dialogDescription}</DialogDescription>\n\t\t\t\t<Form {...form}>\n\t\t\t\t\t<form\n\t\t\t\t\t\tonSubmit={(e) => void form.handleSubmit(onSubmit)(e)}\n\t\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input autoComplete=\"off\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"value\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Value</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<JsonInput {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"tags\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Tags</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<TagsInput {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t\t<DialogClose asChild>\n\t\t\t\t\t\t\t\t<Button type=\"button\" variant=\"outline\">\n\t\t\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</DialogClose>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isCreating || isUpdating}>\n\t\t\t\t\t\t\t\t{variableToEdit ? \"Save\" : \"Create\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</DialogFooter>\n\t\t\t\t\t</form>\n\t\t\t\t</Form>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountVariablesQuery,\n\tbuildFilterVariablesQuery,\n\ttype VariablesFilter,\n} from \"@/api/variables\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\nimport { VariablesDataTable } from \"@/components/variables/data-table\";\nimport { VariablesEmptyState } from \"@/components/variables/empty-state\";\nimport { VariablesPageHeader } from \"@/components/variables/header\";\nimport {\n\tuseVariableDialog,\n\tVariableDialog,\n} from \"@/components/variables/variable-dialog\";\n\n/**\n * Schema for validating URL search parameters for the variables page.\n * @property {number} offset - The number of items to skip (for pagination). Must be non-negative. Defaults to 0.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n * @property {string} sort - The sort order for variables. Can be \"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", or \"NAME_DESC\". Defaults to \"CREATED_DESC\".\n * @property {string} name - Optional filter to search variables by name.\n * @property {string[]} tags - Optional array of tags to filter variables by.\n */\nconst searchParams = z.object({\n\toffset: z.number().int().nonnegative().optional().default(0).catch(0),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\tsort: z\n\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t.optional()\n\t\t.default(\"CREATED_DESC\")\n\t\t.catch(\"CREATED_DESC\"),\n\tname: z.string().optional().catch(undefined),\n\ttags: z.array(z.string()).optional().catch(undefined),\n});\n\n/**\n * Builds a filter body for the variables API based on search parameters.\n * @param search - Optional search parameters containing offset, limit, sort, name filter, and tags filter\n * @returns An object containing pagination parameters and variable filters that can be passed to the variables API\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): VariablesFilter => ({\n\toffset: search?.offset ?? 0,\n\tlimit: search?.limit ?? 10,\n\tsort: search?.sort ?? \"CREATED_DESC\",\n\tvariables: {\n\t\toperator: \"and_\" as const,\n\t\t...(search?.name && { name: { like_: search.name } }),\n\t\t...(search?.tags?.length && {\n\t\t\ttags: { operator: \"and_\" as const, all_: search.tags },\n\t\t}),\n\t},\n});\n\nfunction VariablesErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load variables\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/variables/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\terrorComponent: VariablesErrorComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch filtered variables\n\t\tvoid context.queryClient.prefetchQuery(buildFilterVariablesQuery(deps));\n\t\t// Prefetch filtered count\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery(deps));\n\t\t// Prefetch total count (no filter)\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery());\n\t},\n\twrapInSuspense: true,\n});\n\n/**\n * Hook to manage pagination state and navigation for variables table\n *\n * Calculates current page index and size from URL search parameters and provides\n * a callback to update pagination state. Updates the URL when pagination changes.\n *\n * @returns A tuple containing:\n * - pagination: Current pagination state with pageIndex and pageSize\n * - onPaginationChange: Callback to update pagination and navigate with new search params\n */\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pageIndex = search.offset ? Math.ceil(search.offset / search.limit) : 0;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\toffset: newPagination.pageIndex * newPagination.pageSize,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\n/**\n * Hook to manage column filtering state and navigation for variables table\n *\n * Handles filtering by name and tags, updating the URL search parameters when filters change.\n * Resets pagination offset when filters are updated.\n *\n * @returns A tuple containing:\n * - columnFilters: Current column filter state for name and tags\n * - onColumnFiltersChange: Callback to update filters and navigate with new search params\n */\nconst useVariableColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"name\", value: search.name },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.name, search.tags],\n\t);\n\n\tconst onColumnFiltersChange = useCallback(\n\t\t(newColumnFilters: ColumnFiltersState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => {\n\t\t\t\t\tconst name = newColumnFilters.find((filter) => filter.id === \"name\")\n\t\t\t\t\t\t?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [columnFilters, onColumnFiltersChange] as const;\n};\n\n/**\n * Hook to manage sorting state and navigation for variables table\n *\n * Handles updating the URL search parameters when sort key changes.\n * Uses the current sort value from search params and provides a callback\n * to update sorting.\n *\n * @returns A tuple containing:\n * - sorting: Current sort key from search params\n * - onSortingChange: Callback to update sort and navigate with new search params\n */\nconst useVariableSorting = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortingChange = useCallback(\n\t\t(sortKey: components[\"schemas\"][\"VariableSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort: sortKey }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortingChange] as const;\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [columnFilters, onColumnFiltersChange] = useVariableColumnFilters();\n\tconst [sorting, onSortingChange] = useVariableSorting();\n\tconst [variableDialogState, onVariableAddOrEdit] = useVariableDialog();\n\n\tconst [{ data: variables }, { data: filteredCount }, { data: totalCount }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildFilterVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(),\n\t\t\t],\n\t\t});\n\n\tconst hasVariables = (totalCount ?? 0) > 0;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t<VariableDialog {...variableDialogState} />\n\t\t\t{hasVariables ? (\n\t\t\t\t<VariablesDataTable\n\t\t\t\t\tvariables={variables ?? []}\n\t\t\t\t\tcurrentVariableCount={filteredCount ?? 0}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tsorting={sorting}\n\t\t\t\t\tonSortingChange={onSortingChange}\n\t\t\t\t\tonVariableEdit={onVariableAddOrEdit}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<VariablesEmptyState onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["ActionsCell","row","onVariableEdit","id","deleteVariable","useDeleteVariable","onVariableDelete","toast","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","copyValue","ValueCell","props","value","codeRef","useRef","isOverflowing","useIsOverflowing","HoverCard","HoverCardTrigger","HoverCardContent","JsonInput","columnHelper","createColumnHelper","createColumns","updated","tags","TagBadgeGroup","VariablesDataTable","variables","currentVariableCount","pagination","onPaginationChange","columnFilters","onColumnFiltersChange","sorting","onSortingChange","columns","useMemo","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","useCallback","filters","handleTagsSearchChange","e","handlePaginationChange","updater","newPagination","table","useReactTable","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DataTable","VariablesEmptyState","onAddVariableClick","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","useVariableDialog","handleVariableDialogOpenChange","open","setDialogState","prev","dialogState","useState","handleVariableAddOrEdit","variableToEdit","formSchema","z.object","z.string","VARIABLE_FORM_DEFAULT_VALUES","VariableDialog","onOpenChange","form","useForm","zodResolver","initialValues","useEffect","createVariable","isCreating","useCreateVariable","updateVariable","isUpdating","useUpdateVariable","onSubmit","values","error","message","dialogTitle","dialogDescription","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Form","FormMessage","FormField","field","FormItem","FormLabel","FormControl","Input","DialogFooter","DialogClose","buildFilterBody","search","offset","limit","sort","operator","name","like_","length","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","Math","ceil","pageSize","to","replace","useVariableColumnFilters","newColumnFilters","find","useVariableSorting","sortKey","RouteComponent","variableDialogState","onVariableAddOrEdit","data","filteredCount","totalCount","useSuspenseQueries","queries","buildFilterVariablesQuery","buildCountVariablesQuery","hasVariables","VariablesPageHeader"],"mappings":"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"}
1
+ {"version":3,"file":"index-k2161reF.js","sources":["../../src/components/variables/data-table/cells.tsx","../../src/components/variables/data-table/data-table.tsx","../../src/components/variables/empty-state.tsx","../../src/components/variables/variable-dialog/use-variable-dialog.ts","../../src/components/variables/variable-dialog/variable-dialog.tsx","../../src/routes/variables/index.tsx?tsr-split=component"],"sourcesContent":["import type { CellContext } from \"@tanstack/react-table\";\nimport { useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n\tHoverCard,\n\tHoverCardContent,\n\tHoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { useIsOverflowing } from \"@/hooks/use-is-overflowing\";\n\ntype ActionsCellProps = CellContext<\n\tcomponents[\"schemas\"][\"Variable\"],\n\tunknown\n> & {\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const ActionsCell = ({ row, onVariableEdit }: ActionsCellProps) => {\n\tconst id = row.original.id;\n\tconst { deleteVariable } = useDeleteVariable();\n\tif (!id) return null;\n\n\tconst onVariableDelete = () => {\n\t\tdeleteVariable(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Variable deleted\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\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\tvoid navigator.clipboard.writeText(row.original.name);\n\t\t\t\t\t\t\ttoast.success(\"Name copied\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy Name\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\tconst copyValue =\n\t\t\t\t\t\t\t\ttypeof row.original.value !== \"string\"\n\t\t\t\t\t\t\t\t\t? JSON.stringify(row.original.value)\n\t\t\t\t\t\t\t\t\t: row.original.value;\n\t\t\t\t\t\t\tif (copyValue) {\n\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(copyValue);\n\t\t\t\t\t\t\t\ttoast.success(\"Value copied\");\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\tCopy Value\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onVariableEdit(row.original)}>\n\t\t\t\t\t\tEdit\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={onVariableDelete}>Delete</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nexport const ValueCell = (\n\tprops: CellContext<components[\"schemas\"][\"Variable\"], unknown>,\n) => {\n\tconst value = props.getValue();\n\tconst codeRef = useRef<HTMLDivElement>(null);\n\tconst isOverflowing = useIsOverflowing(codeRef);\n\n\tif (!value) return null;\n\treturn (\n\t\t// Disable the hover card if the value is not overflowing\n\t\t<HoverCard open={isOverflowing ? undefined : false}>\n\t\t\t<HoverCardTrigger asChild>\n\t\t\t\t<code\n\t\t\t\t\tref={codeRef}\n\t\t\t\t\tclassName=\"px-2 py-1 font-mono text-sm text-ellipsis overflow-hidden whitespace-nowrap block\"\n\t\t\t\t>\n\t\t\t\t\t{JSON.stringify(value, null, 2)}\n\t\t\t\t</code>\n\t\t\t</HoverCardTrigger>\n\t\t\t<HoverCardContent className=\"p-0\">\n\t\t\t\t<JsonInput value={JSON.stringify(value, null, 2)} disabled />\n\t\t\t</HoverCardContent>\n\t\t</HoverCard>\n\t);\n};\n","import {\n\ttype ColumnFiltersState,\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype OnChangeFn,\n\ttype PaginationState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport type React from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type { components } from \"@/api/prefect\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ValueCell } from \"./cells\";\n\nconst columnHelper = createColumnHelper<components[\"schemas\"][\"Variable\"]>();\n\nconst createColumns = (\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void,\n) => [\n\tcolumnHelper.accessor(\"name\", {\n\t\theader: \"Name\",\n\t}),\n\tcolumnHelper.accessor(\"value\", {\n\t\theader: \"Value\",\n\t\tcell: ValueCell,\n\t}),\n\tcolumnHelper.accessor(\"updated\", {\n\t\theader: \"Updated\",\n\t\tcell: (props) => {\n\t\t\tconst updated = props.getValue();\n\t\t\tif (!updated) return null;\n\t\t\treturn new Date(updated ?? new Date())\n\t\t\t\t.toLocaleString(undefined, {\n\t\t\t\t\tyear: \"numeric\",\n\t\t\t\t\tmonth: \"numeric\",\n\t\t\t\t\tday: \"numeric\",\n\t\t\t\t\thour: \"numeric\",\n\t\t\t\t\tminute: \"numeric\",\n\t\t\t\t\tsecond: \"numeric\",\n\t\t\t\t\thour12: true,\n\t\t\t\t})\n\t\t\t\t.replace(\",\", \"\");\n\t\t},\n\t}),\n\tcolumnHelper.accessor(\"tags\", {\n\t\theader: () => null,\n\t\tcell: (props) => {\n\t\t\tconst tags = props.getValue();\n\t\t\tif (!tags) return null;\n\t\t\treturn <TagBadgeGroup tags={tags} maxTagsDisplayed={3} />;\n\t\t},\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onVariableEdit={onVariableEdit} />,\n\t}),\n];\n\ntype VariablesDataTableProps = {\n\tvariables: components[\"schemas\"][\"Variable\"][];\n\tcurrentVariableCount: number;\n\tpagination: PaginationState;\n\tonPaginationChange: (newPagination: PaginationState) => void;\n\tcolumnFilters: ColumnFiltersState;\n\tonColumnFiltersChange: (newColumnFilters: ColumnFiltersState) => void;\n\tsorting: components[\"schemas\"][\"VariableSort\"];\n\tonSortingChange: (sortKey: components[\"schemas\"][\"VariableSort\"]) => void;\n\tonVariableEdit: (variable: components[\"schemas\"][\"Variable\"]) => void;\n};\n\nexport const VariablesDataTable = ({\n\tvariables,\n\tcurrentVariableCount,\n\tpagination,\n\tonPaginationChange,\n\tcolumnFilters,\n\tonColumnFiltersChange,\n\tsorting,\n\tonSortingChange,\n\tonVariableEdit,\n}: VariablesDataTableProps) => {\n\tconst columns = useMemo(\n\t\t() => createColumns(onVariableEdit),\n\t\t[onVariableEdit],\n\t);\n\n\tconst nameSearchValue = columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value as string;\n\tconst tagsSearchValue = columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value as string[];\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: variables,\n\t\tcolumns: columns,\n\t\tstate: {\n\t\t\tpagination,\n\t\t\tcolumnFilters,\n\t\t},\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tmanualPagination: true,\n\t\tonPaginationChange: handlePaginationChange,\n\t\trowCount: currentVariableCount,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentVariableCount} {pluralize(currentVariableCount, \"Variable\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search variables\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sorting} onValueChange={onSortingChange}>\n\t\t\t\t\t\t<SelectTrigger aria-label=\"Variable sort order\" className=\"w-full\">\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { Button } from \"@/components/ui/button\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype VariablesEmptyStateProps = {\n\tonAddVariableClick: () => void;\n};\nexport const VariablesEmptyState = ({\n\tonAddVariableClick,\n}: VariablesEmptyStateProps) => (\n\t<EmptyState>\n\t\t<EmptyStateIcon id=\"Variable\" />\n\t\t<EmptyStateTitle>Add a variable to get started</EmptyStateTitle>\n\t\t<EmptyStateDescription>\n\t\t\tVariables store non-sensitive pieces of JSON.\n\t\t</EmptyStateDescription>\n\t\t<EmptyStateActions>\n\t\t\t<Button onClick={() => onAddVariableClick()}>\n\t\t\t\tAdd Variable <Icon id=\"Plus\" className=\"size-4 ml-2\" />\n\t\t\t</Button>\n\t\t\t<DocsLink id=\"variables-guide\" />\n\t\t</EmptyStateActions>\n\t</EmptyState>\n);\n","import { useCallback, useState } from \"react\";\nimport type { VariableDialogProps } from \"./variable-dialog\";\n\nexport const useVariableDialog = () => {\n\tconst handleVariableDialogOpenChange = useCallback((open: boolean) => {\n\t\tsetDialogState((prev) => ({\n\t\t\t...prev,\n\t\t\topen,\n\t\t}));\n\t}, []);\n\n\tconst [dialogState, setDialogState] = useState<VariableDialogProps>({\n\t\topen: false,\n\t\tonOpenChange: handleVariableDialogOpenChange,\n\t});\n\n\tconst handleVariableAddOrEdit = useCallback(\n\t\t(variableToEdit?: VariableDialogProps[\"variableToEdit\"]) => {\n\t\t\tsetDialogState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\topen: true,\n\t\t\t\tvariableToEdit,\n\t\t\t}));\n\t\t},\n\t\t[],\n\t);\n\n\treturn [dialogState, handleVariableAddOrEdit] as const;\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useEffect, useMemo } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\nimport type { components } from \"@/api/prefect\";\nimport { useCreateVariable, useUpdateVariable } from \"@/api/variables\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport {\n\tForm,\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\n\nexport type JSONValue =\n\t| string\n\t| number\n\t| boolean\n\t| Record<string, never>\n\t| unknown[]\n\t| null;\n\nconst formSchema = z.object({\n\tname: z.string().min(2, { message: \"Name must be at least 2 characters\" }),\n\tvalue: z.string(),\n\ttags: z.string().array().optional(),\n});\n\nexport type VariableDialogProps = {\n\tonOpenChange: (open: boolean) => void;\n\topen: boolean;\n\tvariableToEdit?: components[\"schemas\"][\"Variable\"];\n};\n\nconst VARIABLE_FORM_DEFAULT_VALUES = {\n\tname: \"\",\n\tvalue: \"\",\n\ttags: [],\n};\n\nexport const VariableDialog = ({\n\tonOpenChange,\n\topen,\n\tvariableToEdit,\n}: VariableDialogProps) => {\n\tconst form = useForm({\n\t\tresolver: zodResolver(formSchema),\n\t\tdefaultValues: VARIABLE_FORM_DEFAULT_VALUES,\n\t});\n\tconst initialValues = useMemo(() => {\n\t\tif (!variableToEdit) return undefined;\n\t\treturn {\n\t\t\tname: variableToEdit.name,\n\t\t\tvalue: JSON.stringify(variableToEdit.value, null, 2),\n\t\t\ttags: variableToEdit.tags,\n\t\t};\n\t}, [variableToEdit]);\n\n\tuseEffect(() => {\n\t\t// Ensure we start with the initial values when the dialog opens\n\t\tif (open) {\n\t\t\tform.reset(initialValues ?? VARIABLE_FORM_DEFAULT_VALUES);\n\t\t}\n\t}, [initialValues, form, open]);\n\n\tconst { createVariable, isPending: isCreating } = useCreateVariable();\n\n\tconst { updateVariable, isPending: isUpdating } = useUpdateVariable();\n\n\tconst onSubmit = (values: z.infer<typeof formSchema>) => {\n\t\ttry {\n\t\t\tconst value = JSON.parse(values.value) as JSONValue;\n\t\t\tif (variableToEdit?.id) {\n\t\t\t\tupdateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: variableToEdit.id,\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable updated\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while updating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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);\n\t\t\t} else {\n\t\t\t\tcreateVariable(\n\t\t\t\t\t{\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\ttags: values.tags,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\ttoast.success(\"Variable created\");\n\t\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror.message || \"Unknown error while creating variable.\";\n\t\t\t\t\t\t\tform.setError(\"root\", {\n\t\t\t\t\t\t\t\tmessage,\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);\n\t\t\t}\n\t\t} catch {\n\t\t\tform.setError(\"value\", { message: \"Value must be valid JSON\" });\n\t\t}\n\t};\n\tconst dialogTitle = variableToEdit ? \"Edit Variable\" : \"New Variable\";\n\tconst dialogDescription = variableToEdit\n\t\t? \"Edit the variable by changing the name, value, or tags.\"\n\t\t: \"Add a new variable by providing a name, value, and optional tags. Values can be any valid JSON value.\";\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>{dialogTitle}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>{dialogDescription}</DialogDescription>\n\t\t\t\t<Form {...form}>\n\t\t\t\t\t<form\n\t\t\t\t\t\tonSubmit={(e) => void form.handleSubmit(onSubmit)(e)}\n\t\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<Input autoComplete=\"off\" {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"value\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Value</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<JsonInput {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<FormField\n\t\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\t\tname=\"tags\"\n\t\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Tags</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<TagsInput {...field} />\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DialogFooter>\n\t\t\t\t\t\t\t<DialogClose asChild>\n\t\t\t\t\t\t\t\t<Button type=\"button\" variant=\"outline\">\n\t\t\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</DialogClose>\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={isCreating || isUpdating}>\n\t\t\t\t\t\t\t\t{variableToEdit ? \"Save\" : \"Create\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</DialogFooter>\n\t\t\t\t\t</form>\n\t\t\t\t</Form>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { useSuspenseQueries } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { useCallback, useMemo } from \"react\";\nimport { z } from \"zod\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tbuildCountVariablesQuery,\n\tbuildFilterVariablesQuery,\n\ttype VariablesFilter,\n} from \"@/api/variables\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\nimport { VariablesDataTable } from \"@/components/variables/data-table\";\nimport { VariablesEmptyState } from \"@/components/variables/empty-state\";\nimport { VariablesPageHeader } from \"@/components/variables/header\";\nimport {\n\tuseVariableDialog,\n\tVariableDialog,\n} from \"@/components/variables/variable-dialog\";\n\n/**\n * Schema for validating URL search parameters for the variables page.\n * @property {number} offset - The number of items to skip (for pagination). Must be non-negative. Defaults to 0.\n * @property {number} limit - The maximum number of items to return. Must be positive. Defaults to 10.\n * @property {string} sort - The sort order for variables. Can be \"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", or \"NAME_DESC\". Defaults to \"CREATED_DESC\".\n * @property {string} name - Optional filter to search variables by name.\n * @property {string[]} tags - Optional array of tags to filter variables by.\n */\nconst searchParams = z.object({\n\toffset: z.number().int().nonnegative().optional().default(0).catch(0),\n\tlimit: z.number().int().positive().optional().default(10).catch(10),\n\tsort: z\n\t\t.enum([\"CREATED_DESC\", \"UPDATED_DESC\", \"NAME_ASC\", \"NAME_DESC\"])\n\t\t.optional()\n\t\t.default(\"CREATED_DESC\")\n\t\t.catch(\"CREATED_DESC\"),\n\tname: z.string().optional().catch(undefined),\n\ttags: z.array(z.string()).optional().catch(undefined),\n});\n\n/**\n * Builds a filter body for the variables API based on search parameters.\n * @param search - Optional search parameters containing offset, limit, sort, name filter, and tags filter\n * @returns An object containing pagination parameters and variable filters that can be passed to the variables API\n */\nconst buildFilterBody = (\n\tsearch?: z.infer<typeof searchParams>,\n): VariablesFilter => ({\n\toffset: search?.offset ?? 0,\n\tlimit: search?.limit ?? 10,\n\tsort: search?.sort ?? \"CREATED_DESC\",\n\tvariables: {\n\t\toperator: \"and_\" as const,\n\t\t...(search?.name && { name: { like_: search.name } }),\n\t\t...(search?.tags?.length && {\n\t\t\ttags: { operator: \"and_\" as const, all_: search.tags },\n\t\t}),\n\t},\n});\n\nfunction VariablesErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load variables\");\n\n\t// Only handle API errors (server-error, client-error) at route level\n\t// Let network errors and unknown errors bubble up to root error component\n\tif (\n\t\tserverError.type !== \"server-error\" &&\n\t\tserverError.type !== \"client-error\"\n\t) {\n\t\tthrow error;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader />\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/variables/\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\terrorComponent: VariablesErrorComponent,\n\tloaderDeps: ({ search }) => buildFilterBody(search),\n\tloader: ({ deps, context }) => {\n\t\t// Prefetch filtered variables\n\t\tvoid context.queryClient.prefetchQuery(buildFilterVariablesQuery(deps));\n\t\t// Prefetch filtered count\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery(deps));\n\t\t// Prefetch total count (no filter)\n\t\tvoid context.queryClient.prefetchQuery(buildCountVariablesQuery());\n\t},\n\twrapInSuspense: true,\n});\n\n/**\n * Hook to manage pagination state and navigation for variables table\n *\n * Calculates current page index and size from URL search parameters and provides\n * a callback to update pagination state. Updates the URL when pagination changes.\n *\n * @returns A tuple containing:\n * - pagination: Current pagination state with pageIndex and pageSize\n * - onPaginationChange: Callback to update pagination and navigate with new search params\n */\nconst usePagination = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst pageIndex = search.offset ? Math.ceil(search.offset / search.limit) : 0;\n\tconst pageSize = search.limit ?? 10;\n\tconst pagination: PaginationState = useMemo(\n\t\t() => ({\n\t\t\tpageIndex,\n\t\t\tpageSize,\n\t\t}),\n\t\t[pageIndex, pageSize],\n\t);\n\n\tconst onPaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\toffset: newPagination.pageIndex * newPagination.pageSize,\n\t\t\t\t\tlimit: newPagination.pageSize,\n\t\t\t\t}),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [pagination, onPaginationChange] as const;\n};\n\n/**\n * Hook to manage column filtering state and navigation for variables table\n *\n * Handles filtering by name and tags, updating the URL search parameters when filters change.\n * Resets pagination offset when filters are updated.\n *\n * @returns A tuple containing:\n * - columnFilters: Current column filter state for name and tags\n * - onColumnFiltersChange: Callback to update filters and navigate with new search params\n */\nconst useVariableColumnFilters = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\tconst columnFilters: ColumnFiltersState = useMemo(\n\t\t() => [\n\t\t\t{ id: \"name\", value: search.name },\n\t\t\t{ id: \"tags\", value: search.tags },\n\t\t],\n\t\t[search.name, search.tags],\n\t);\n\n\tconst onColumnFiltersChange = useCallback(\n\t\t(newColumnFilters: ColumnFiltersState) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => {\n\t\t\t\t\tconst name = newColumnFilters.find((filter) => filter.id === \"name\")\n\t\t\t\t\t\t?.value as string | undefined;\n\t\t\t\t\tconst tags = newColumnFilters.find((filter) => filter.id === \"tags\")\n\t\t\t\t\t\t?.value as string[] | undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttags,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [columnFilters, onColumnFiltersChange] as const;\n};\n\n/**\n * Hook to manage sorting state and navigation for variables table\n *\n * Handles updating the URL search parameters when sort key changes.\n * Uses the current sort value from search params and provides a callback\n * to update sorting.\n *\n * @returns A tuple containing:\n * - sorting: Current sort key from search params\n * - onSortingChange: Callback to update sort and navigate with new search params\n */\nconst useVariableSorting = () => {\n\tconst search = Route.useSearch();\n\tconst navigate = Route.useNavigate();\n\n\tconst onSortingChange = useCallback(\n\t\t(sortKey: components[\"schemas\"][\"VariableSort\"]) => {\n\t\t\tvoid navigate({\n\t\t\t\tto: \".\",\n\t\t\t\tsearch: (prev) => ({ ...prev, sort: sortKey }),\n\t\t\t\treplace: true,\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\treturn [search.sort, onSortingChange] as const;\n};\n\nfunction RouteComponent() {\n\tconst search = Route.useSearch();\n\tconst [pagination, onPaginationChange] = usePagination();\n\tconst [columnFilters, onColumnFiltersChange] = useVariableColumnFilters();\n\tconst [sorting, onSortingChange] = useVariableSorting();\n\tconst [variableDialogState, onVariableAddOrEdit] = useVariableDialog();\n\n\tconst [{ data: variables }, { data: filteredCount }, { data: totalCount }] =\n\t\tuseSuspenseQueries({\n\t\t\tqueries: [\n\t\t\t\tbuildFilterVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(buildFilterBody(search)),\n\t\t\t\tbuildCountVariablesQuery(),\n\t\t\t],\n\t\t});\n\n\tconst hasVariables = (totalCount ?? 0) > 0;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<VariablesPageHeader onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t<VariableDialog {...variableDialogState} />\n\t\t\t{hasVariables ? (\n\t\t\t\t<VariablesDataTable\n\t\t\t\t\tvariables={variables ?? []}\n\t\t\t\t\tcurrentVariableCount={filteredCount ?? 0}\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonPaginationChange={onPaginationChange}\n\t\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\t\tonColumnFiltersChange={onColumnFiltersChange}\n\t\t\t\t\tsorting={sorting}\n\t\t\t\t\tonSortingChange={onSortingChange}\n\t\t\t\t\tonVariableEdit={onVariableAddOrEdit}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<VariablesEmptyState onAddVariableClick={onVariableAddOrEdit} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["ActionsCell","row","onVariableEdit","id","deleteVariable","useDeleteVariable","onVariableDelete","toast","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","copyValue","ValueCell","props","value","codeRef","useRef","isOverflowing","useIsOverflowing","HoverCard","HoverCardTrigger","HoverCardContent","JsonInput","columnHelper","createColumnHelper","createColumns","updated","tags","TagBadgeGroup","VariablesDataTable","variables","currentVariableCount","pagination","onPaginationChange","columnFilters","onColumnFiltersChange","sorting","onSortingChange","columns","useMemo","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","useCallback","filters","handleTagsSearchChange","e","handlePaginationChange","updater","newPagination","table","useReactTable","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DataTable","VariablesEmptyState","onAddVariableClick","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DocsLink","useVariableDialog","handleVariableDialogOpenChange","open","setDialogState","prev","dialogState","useState","handleVariableAddOrEdit","variableToEdit","formSchema","z.object","z.string","VARIABLE_FORM_DEFAULT_VALUES","VariableDialog","onOpenChange","form","useForm","zodResolver","initialValues","useEffect","createVariable","isCreating","useCreateVariable","updateVariable","isUpdating","useUpdateVariable","onSubmit","values","error","message","dialogTitle","dialogDescription","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Form","FormMessage","FormField","field","FormItem","FormLabel","FormControl","Input","DialogFooter","DialogClose","buildFilterBody","search","offset","limit","sort","operator","name","like_","length","all_","usePagination","Route","useSearch","navigate","useNavigate","pageIndex","Math","ceil","pageSize","to","replace","useVariableColumnFilters","newColumnFilters","find","useVariableSorting","sortKey","RouteComponent","variableDialogState","onVariableAddOrEdit","data","filteredCount","totalCount","useSuspenseQueries","queries","buildFilterVariablesQuery","buildCountVariablesQuery","hasVariables","VariablesPageHeader"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as p,s as A,j as e,L as D,C as T,D as B,B as E}from"./vendor-tanstack-BK8oseNA.js";import{u as I,a as k}from"./use-quick-run-BMnCkwSv.js";import{bN as M,aN as z,aR as O,q as _,I as P,y as $,N as Q,O as V,S as G,a as W,b as H,c as L,e as j,c4 as U,c5 as Z,X as q}from"./index-BvSl3DKP.js";import{D as X}from"./data-table-Bw8TZx9D.js";import{D as J}from"./delete-confirmation-dialog-CTdWZlGM.js";import{S as K}from"./index-tBdv6kBF.js";import{S as Y}from"./index-ChIrfjIW.js";import{T as F}from"./tags-input-Ci2JQ-k3.js";import{s as ee,U as se}from"./vendor-date-7GxEwcQM.js";import{D as ae,a as le,b as te,c as ne,d}from"./dropdown-menu-CT-s-V7d.js";const ie=({row:n,onDelete:s})=>{const{id:l,parameters:o}=n.original,{onQuickRun:u,isPending:i}=I();return l?e.jsx("div",{className:"flex flex-row justify-end",children:e.jsxs(ae,{children:[e.jsx(le,{asChild:!0,children:e.jsxs(_,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(P,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(te,{align:"end",children:[e.jsx(ne,{children:"Actions"}),e.jsx(d,{disabled:i,onClick:()=>u(l),children:"Quick Run"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/run",params:{id:l},search:{parameters:o},children:"Custom Run"})}),e.jsx(d,{onClick:()=>{navigator.clipboard.writeText(l),$.success("ID copied")},children:"Copy ID"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/edit",params:{id:l},children:"Edit"})}),e.jsx(d,{onClick:()=>s(n.original),children:"Delete"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/duplicate",params:{id:l},children:"Duplicate"})})]})]})}):null},C=8,re=4,oe=({row:n})=>{const[s,l]=p.useState(0),o=M(s,150),u=p.useCallback(r=>{if(!r)return;const x=()=>{const v=r.getBoundingClientRect().width;l(Math.floor(v/(C+re)))};x();const g=new ResizeObserver(x);return g.observe(r),()=>{g.disconnect()}},[]),{data:i}=A(z({deployments:{operator:"and_",id:{any_:[n.original.id]}},sort:"START_TIME_DESC",limit:o||s,offset:0})),{flow:h,...y}=n.original,c=i?.map(r=>({...r,deployment:y,flow:h}))??[];return e.jsx("div",{className:"w-full",ref:u,children:e.jsx(O,{startDate:ee(new Date,se),endDate:new Date,numberOfBars:o||s,barWidth:C,enrichedFlowRuns:c,className:"h-12 w-full",chartId:n.original.id})})},m=E(),ce=({onDelete:n})=>[m.display({id:"name",header:"Deployment",cell:({row:s})=>e.jsxs("div",{className:"flex flex-col",children:[e.jsx(D,{to:"/deployments/deployment/$id",params:{id:s.original.id},children:e.jsx("span",{className:"text-sm font-medium truncate",title:s.original.name,children:s.original.name})}),s.original.flow&&e.jsx(Z,{flow:s.original.flow,className:"text-xs text-muted-foreground flex items-center gap-1",iconSize:12})]}),size:100}),m.accessor("status",{id:"status",header:"Status",cell:({row:s})=>{const l=s.original.status;return l?e.jsx("div",{className:"min-w-28",children:e.jsx(Y,{status:l})}):null},size:50}),m.display({id:"activity",header:"Activity",cell:s=>e.jsx("div",{className:"flex flex-row gap-2 items-center min-w-28",children:e.jsx(oe,{...s})}),size:300}),m.display({id:"tags",header:()=>null,cell:({row:s})=>e.jsx(q,{tags:s.original.tags??[]})}),m.display({id:"schedules",header:"Schedules",cell:({row:s})=>{const l=s.original.schedules;return!l||l.length===0?null:e.jsx(K,{schedules:l})},size:150}),m.display({id:"actions",cell:s=>e.jsx(ie,{...s,onDelete:n})})],ye=({deployments:n,currentDeploymentsCount:s,pagination:l,pageCount:o,sort:u,columnFilters:i,onPaginationChange:h,onSortChange:y,onColumnFiltersChange:c})=>{const[r,x]=k(),g=i.find(a=>a.id==="flowOrDeploymentName")?.value??"",v=i.find(a=>a.id==="tags")?.value??[],b=p.useCallback(a=>{const t=i.filter(f=>f.id!=="flowOrDeploymentName");c(a?[...t,{id:"flowOrDeploymentName",value:a}]:t)},[c,i]),S=p.useCallback(a=>{const t=Array.isArray(a)?a:a.target.value,f=i.filter(R=>R.id!=="tags");c(t.length?[...f,{id:"tags",value:t}]:f)},[c,i]),N=p.useCallback(a=>{let t=l;typeof a=="function"?t=a(l):t=a,h(t)},[l,h]),w=T({data:n,columns:ce({onDelete:a=>{const t=a.flow?.name?`${a.flow?.name}/${a.name}`:a.name;x({...a,name:t})}}),getCoreRowModel:B(),pageCount:o,manualPagination:!0,defaultColumn:{maxSize:300},state:{pagination:l},onPaginationChange:N});return e.jsxs("div",{children:[e.jsxs("div",{className:"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center",children:[e.jsx("div",{className:"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first",children:e.jsxs("p",{className:"text-sm text-muted-foreground",children:[s," ",Q(s,"Deployment")]})}),e.jsx("div",{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",children:e.jsx(V,{placeholder:"Search deployments",value:g,onChange:a=>b(a.target.value)})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-3",children:e.jsx(F,{placeholder:"Filter by tags",onChange:S,value:v})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-2",children:e.jsxs(G,{value:u,onValueChange:y,children:[e.jsx(W,{"aria-label":"Deployment sort order",className:"w-full",children:e.jsx(H,{placeholder:"Sort by"})}),e.jsxs(L,{children:[e.jsx(j,{value:"CREATED_DESC",children:"Created"}),e.jsx(j,{value:"UPDATED_DESC",children:"Updated"}),e.jsx(j,{value:"NAME_ASC",children:"A to Z"}),e.jsx(j,{value:"NAME_DESC",children:"Z to A"})]})]})})]}),e.jsx(J,{...r}),e.jsx(U,{children:e.jsx(X,{table:w})})]})};export{ye as D};
2
- //# sourceMappingURL=index-Bj0OOguP.js.map
1
+ import{r as p,s as A,j as e,L as D,C as T,D as B,B as E}from"./vendor-tanstack-BK8oseNA.js";import{u as I,a as k}from"./use-quick-run-qrtcF-DD.js";import{bN as M,aN as z,aR as O,q as _,I as P,y as $,N as Q,O as V,S as G,a as W,b as H,c as L,e as j,c4 as U,c5 as Z,X as q}from"./index-Cd7pM9pk.js";import{D as X}from"./data-table-B_iyrrTm.js";import{D as J}from"./delete-confirmation-dialog-7GKqeKy1.js";import{S as K}from"./index-CYpFLd7y.js";import{S as Y}from"./index-BKbBu9gL.js";import{T as F}from"./tags-input-DJiZSVHp.js";import{s as ee,U as se}from"./vendor-date-7GxEwcQM.js";import{D as ae,a as le,b as te,c as ne,d}from"./dropdown-menu-iS8iJMpx.js";const ie=({row:n,onDelete:s})=>{const{id:l,parameters:o}=n.original,{onQuickRun:u,isPending:i}=I();return l?e.jsx("div",{className:"flex flex-row justify-end",children:e.jsxs(ae,{children:[e.jsx(le,{asChild:!0,children:e.jsxs(_,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(P,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(te,{align:"end",children:[e.jsx(ne,{children:"Actions"}),e.jsx(d,{disabled:i,onClick:()=>u(l),children:"Quick Run"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/run",params:{id:l},search:{parameters:o},children:"Custom Run"})}),e.jsx(d,{onClick:()=>{navigator.clipboard.writeText(l),$.success("ID copied")},children:"Copy ID"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/edit",params:{id:l},children:"Edit"})}),e.jsx(d,{onClick:()=>s(n.original),children:"Delete"}),e.jsx(d,{children:e.jsx(D,{to:"/deployments/deployment/$id/duplicate",params:{id:l},children:"Duplicate"})})]})]})}):null},C=8,re=4,oe=({row:n})=>{const[s,l]=p.useState(0),o=M(s,150),u=p.useCallback(r=>{if(!r)return;const x=()=>{const v=r.getBoundingClientRect().width;l(Math.floor(v/(C+re)))};x();const g=new ResizeObserver(x);return g.observe(r),()=>{g.disconnect()}},[]),{data:i}=A(z({deployments:{operator:"and_",id:{any_:[n.original.id]}},sort:"START_TIME_DESC",limit:o||s,offset:0})),{flow:h,...y}=n.original,c=i?.map(r=>({...r,deployment:y,flow:h}))??[];return e.jsx("div",{className:"w-full",ref:u,children:e.jsx(O,{startDate:ee(new Date,se),endDate:new Date,numberOfBars:o||s,barWidth:C,enrichedFlowRuns:c,className:"h-12 w-full",chartId:n.original.id})})},m=E(),ce=({onDelete:n})=>[m.display({id:"name",header:"Deployment",cell:({row:s})=>e.jsxs("div",{className:"flex flex-col",children:[e.jsx(D,{to:"/deployments/deployment/$id",params:{id:s.original.id},children:e.jsx("span",{className:"text-sm font-medium truncate",title:s.original.name,children:s.original.name})}),s.original.flow&&e.jsx(Z,{flow:s.original.flow,className:"text-xs text-muted-foreground flex items-center gap-1",iconSize:12})]}),size:100}),m.accessor("status",{id:"status",header:"Status",cell:({row:s})=>{const l=s.original.status;return l?e.jsx("div",{className:"min-w-28",children:e.jsx(Y,{status:l})}):null},size:50}),m.display({id:"activity",header:"Activity",cell:s=>e.jsx("div",{className:"flex flex-row gap-2 items-center min-w-28",children:e.jsx(oe,{...s})}),size:300}),m.display({id:"tags",header:()=>null,cell:({row:s})=>e.jsx(q,{tags:s.original.tags??[]})}),m.display({id:"schedules",header:"Schedules",cell:({row:s})=>{const l=s.original.schedules;return!l||l.length===0?null:e.jsx(K,{schedules:l})},size:150}),m.display({id:"actions",cell:s=>e.jsx(ie,{...s,onDelete:n})})],ye=({deployments:n,currentDeploymentsCount:s,pagination:l,pageCount:o,sort:u,columnFilters:i,onPaginationChange:h,onSortChange:y,onColumnFiltersChange:c})=>{const[r,x]=k(),g=i.find(a=>a.id==="flowOrDeploymentName")?.value??"",v=i.find(a=>a.id==="tags")?.value??[],b=p.useCallback(a=>{const t=i.filter(f=>f.id!=="flowOrDeploymentName");c(a?[...t,{id:"flowOrDeploymentName",value:a}]:t)},[c,i]),S=p.useCallback(a=>{const t=Array.isArray(a)?a:a.target.value,f=i.filter(R=>R.id!=="tags");c(t.length?[...f,{id:"tags",value:t}]:f)},[c,i]),N=p.useCallback(a=>{let t=l;typeof a=="function"?t=a(l):t=a,h(t)},[l,h]),w=T({data:n,columns:ce({onDelete:a=>{const t=a.flow?.name?`${a.flow?.name}/${a.name}`:a.name;x({...a,name:t})}}),getCoreRowModel:B(),pageCount:o,manualPagination:!0,defaultColumn:{maxSize:300},state:{pagination:l},onPaginationChange:N});return e.jsxs("div",{children:[e.jsxs("div",{className:"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center",children:[e.jsx("div",{className:"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first",children:e.jsxs("p",{className:"text-sm text-muted-foreground",children:[s," ",Q(s,"Deployment")]})}),e.jsx("div",{className:"sm:col-span-2 md:col-span-2 lg:col-span-3",children:e.jsx(V,{placeholder:"Search deployments",value:g,onChange:a=>b(a.target.value)})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-3",children:e.jsx(F,{placeholder:"Filter by tags",onChange:S,value:v})}),e.jsx("div",{className:"xs:col-span-1 md:col-span-2 lg:col-span-2",children:e.jsxs(G,{value:u,onValueChange:y,children:[e.jsx(W,{"aria-label":"Deployment sort order",className:"w-full",children:e.jsx(H,{placeholder:"Sort by"})}),e.jsxs(L,{children:[e.jsx(j,{value:"CREATED_DESC",children:"Created"}),e.jsx(j,{value:"UPDATED_DESC",children:"Updated"}),e.jsx(j,{value:"NAME_ASC",children:"A to Z"}),e.jsx(j,{value:"NAME_DESC",children:"Z to A"})]})]})})]}),e.jsx(J,{...r}),e.jsx(U,{children:e.jsx(X,{table:w})})]})};export{ye as D};
2
+ //# sourceMappingURL=index-pE_31vXF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-Bj0OOguP.js","sources":["../../src/components/deployments/data-table/cells.tsx","../../src/components/deployments/data-table/index.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport type { CellContext } from \"@tanstack/react-table\";\nimport { subSeconds } from \"date-fns\";\nimport { secondsInWeek } from \"date-fns/constants\";\nimport { useCallback, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport { useQuickRun } from \"@/components/deployments/use-quick-run\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Icon } from \"@/components/ui/icons\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype ActionsCellProps = CellContext<DeploymentWithFlow, unknown> & {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n};\n\nexport const ActionsCell = ({ row, onDelete }: ActionsCellProps) => {\n\tconst { id, parameters } = row.original;\n\tconst { onQuickRun, isPending } = useQuickRun();\n\n\tif (!id) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem disabled={isPending} onClick={() => onQuickRun(id)}>\n\t\t\t\t\t\tQuick Run\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/deployments/deployment/$id/run\"\n\t\t\t\t\t\t\tparams={{ id }}\n\t\t\t\t\t\t\tsearch={{ parameters }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCustom Run\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\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\t<Link to=\"/deployments/deployment/$id/edit\" params={{ id }}>\n\t\t\t\t\t\t\tEdit\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onDelete(row.original)}>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link to=\"/deployments/deployment/$id/duplicate\" params={{ id }}>\n\t\t\t\t\t\t\tDuplicate\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nconst BAR_WIDTH = 8;\nconst BAR_GAP = 4;\n\nexport const ActivityCell = ({\n\trow,\n}: CellContext<DeploymentWithFlow, unknown>) => {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\t// Set the initial number of bars based on the chart width\n\t\tupdateBars();\n\n\t\t// Observe the chart for resize events\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => {\n\t\t\t// Clean up the observer\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tconst { data: flowRuns } = useQuery(\n\t\tbuildFilterFlowRunsQuery({\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: {\n\t\t\t\t\tany_: [row.original.id],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: debouncedNumberOfBars || numberOfBars,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst { flow, ...deployment } = row.original;\n\tconst enrichedFlowRuns =\n\t\tflowRuns?.map((flowRun) => ({\n\t\t\t...flowRun,\n\t\t\tdeployment,\n\t\t\tflow,\n\t\t})) ?? [];\n\n\treturn (\n\t\t<div className=\"w-full\" ref={chartRef}>\n\t\t\t<FlowRunActivityBarChart\n\t\t\t\tstartDate={subSeconds(new Date(), secondsInWeek)}\n\t\t\t\tendDate={new Date()}\n\t\t\t\t// If debouncedNumberOfBars is 0, use numberOfBars for an asymmetric debounce to avoid rendering an empty chart on initial paint.\n\t\t\t\tnumberOfBars={debouncedNumberOfBars || numberOfBars}\n\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\tclassName=\"h-12 w-full\"\n\t\t\t\tchartId={row.original.id}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteDeploymentConfirmationDialog } from \"@/components/deployments/use-delete-deployment-confirmation-dialog\";\nimport { FlowIconText } from \"@/components/flows/flow-icon-text\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { FlowRunActivityBarGraphTooltipProvider } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { ScheduleBadgeGroup } from \"@/components/ui/schedule-badge\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ActivityCell } from \"./cells\";\n\nexport type DeploymentsDataTableProps = {\n\tdeployments: DeploymentWithFlow[];\n\tcurrentDeploymentsCount: number;\n\tpageCount: number;\n\tpagination: PaginationState;\n\tsort: components[\"schemas\"][\"DeploymentSort\"];\n\tcolumnFilters: ColumnFiltersState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: components[\"schemas\"][\"DeploymentSort\"]) => void;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n};\n\nconst columnHelper = createColumnHelper<DeploymentWithFlow>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tid: \"name\",\n\t\theader: \"Deployment\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t<Link to=\"/deployments/deployment/$id\" params={{ id: row.original.id }}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium truncate\"\n\t\t\t\t\t\ttitle={row.original.name}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.original.name}\n\t\t\t\t\t</span>\n\t\t\t\t</Link>\n\n\t\t\t\t{row.original.flow && (\n\t\t\t\t\t<FlowIconText\n\t\t\t\t\t\tflow={row.original.flow}\n\t\t\t\t\t\tclassName=\"text-xs text-muted-foreground flex items-center gap-1\"\n\t\t\t\t\t\ticonSize={12}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t),\n\t\tsize: 100,\n\t}),\n\tcolumnHelper.accessor(\"status\", {\n\t\tid: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => {\n\t\t\tconst status = row.original.status;\n\t\t\tif (!status) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"min-w-28\">\n\t\t\t\t\t<StatusBadge status={status} />\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t\tsize: 50,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: (props) => (\n\t\t\t<div className=\"flex flex-row gap-2 items-center min-w-28\">\n\t\t\t\t<ActivityCell {...props} />\n\t\t\t</div>\n\t\t),\n\t\tsize: 300,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"tags\",\n\t\theader: () => null,\n\t\tcell: ({ row }) => <TagBadgeGroup tags={row.original.tags ?? []} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"schedules\",\n\t\theader: \"Schedules\",\n\t\tcell: ({ row }) => {\n\t\t\tconst schedules = row.original.schedules;\n\t\t\tif (!schedules || schedules.length === 0) return null;\n\t\t\treturn <ScheduleBadgeGroup schedules={schedules} />;\n\t\t},\n\t\tsize: 150,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onDelete={onDelete} />,\n\t}),\n];\n\nexport const DeploymentsDataTable = ({\n\tdeployments,\n\tcurrentDeploymentsCount,\n\tpagination,\n\tpageCount,\n\tsort,\n\tcolumnFilters,\n\tonPaginationChange,\n\tonSortChange,\n\tonColumnFiltersChange,\n}: DeploymentsDataTableProps) => {\n\tconst [deleteConfirmationDialogState, confirmDelete] =\n\t\tuseDeleteDeploymentConfirmationDialog();\n\n\tconst nameSearchValue = (columnFilters.find(\n\t\t(filter) => filter.id === \"flowOrDeploymentName\",\n\t)?.value ?? \"\") as string;\n\tconst tagsSearchValue = (columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value ?? []) as string[];\n\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter(\n\t\t\t\t(filter) => filter.id !== \"flowOrDeploymentName\",\n\t\t\t);\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"flowOrDeploymentName\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: deployments,\n\t\tcolumns: createColumns({\n\t\t\tonDelete: (deployment) => {\n\t\t\t\tconst name = deployment.flow?.name\n\t\t\t\t\t? `${deployment.flow?.name}/${deployment.name}`\n\t\t\t\t\t: deployment.name;\n\t\t\t\tconfirmDelete({ ...deployment, name });\n\t\t\t},\n\t\t}),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tpageCount,\n\t\tmanualPagination: true,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t\tstate: {\n\t\t\tpagination,\n\t\t},\n\t\tonPaginationChange: handlePaginationChange,\n\t});\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentDeploymentsCount}{\" \"}\n\t\t\t\t\t\t{pluralize(currentDeploymentsCount, \"Deployment\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search deployments\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sort} onValueChange={onSortChange}>\n\t\t\t\t\t\t<SelectTrigger\n\t\t\t\t\t\t\taria-label=\"Deployment sort order\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t<DataTable table={table} />\n\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\t\t</div>\n\t);\n};\n"],"names":["ActionsCell","row","onDelete","id","parameters","onQuickRun","isPending","useQuickRun","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","Link","toast","BAR_WIDTH","BAR_GAP","ActivityCell","numberOfBars","setNumberOfBars","useState","debouncedNumberOfBars","useDebounce","chartRef","useCallback","node","updateBars","chartWidth","resizeObserver","flowRuns","useQuery","buildFilterFlowRunsQuery","flow","deployment","enrichedFlowRuns","flowRun","FlowRunActivityBarChart","subSeconds","secondsInWeek","columnHelper","createColumnHelper","createColumns","FlowIconText","status","StatusBadge","props","TagBadgeGroup","schedules","ScheduleBadgeGroup","DeploymentsDataTable","deployments","currentDeploymentsCount","pagination","pageCount","sort","columnFilters","onPaginationChange","onSortChange","onColumnFiltersChange","deleteConfirmationDialogState","confirmDelete","useDeleteDeploymentConfirmationDialog","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","value","filters","handleTagsSearchChange","e","tags","handlePaginationChange","updater","newPagination","table","useReactTable","name","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DeleteConfirmationDialog","FlowRunActivityBarGraphTooltipProvider","DataTable"],"mappings":"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"}
1
+ {"version":3,"file":"index-pE_31vXF.js","sources":["../../src/components/deployments/data-table/cells.tsx","../../src/components/deployments/data-table/index.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport type { CellContext } from \"@tanstack/react-table\";\nimport { subSeconds } from \"date-fns\";\nimport { secondsInWeek } from \"date-fns/constants\";\nimport { useCallback, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport { buildFilterFlowRunsQuery } from \"@/api/flow-runs\";\nimport { useQuickRun } from \"@/components/deployments/use-quick-run\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FlowRunActivityBarChart } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { Icon } from \"@/components/ui/icons\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype ActionsCellProps = CellContext<DeploymentWithFlow, unknown> & {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n};\n\nexport const ActionsCell = ({ row, onDelete }: ActionsCellProps) => {\n\tconst { id, parameters } = row.original;\n\tconst { onQuickRun, isPending } = useQuickRun();\n\n\tif (!id) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuItem disabled={isPending} onClick={() => onQuickRun(id)}>\n\t\t\t\t\t\tQuick Run\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/deployments/deployment/$id/run\"\n\t\t\t\t\t\t\tparams={{ id }}\n\t\t\t\t\t\t\tsearch={{ parameters }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCustom Run\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(id);\n\t\t\t\t\t\t\ttoast.success(\"ID copied\");\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\t<Link to=\"/deployments/deployment/$id/edit\" params={{ id }}>\n\t\t\t\t\t\t\tEdit\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem onClick={() => onDelete(row.original)}>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem>\n\t\t\t\t\t\t<Link to=\"/deployments/deployment/$id/duplicate\" params={{ id }}>\n\t\t\t\t\t\t\tDuplicate\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t</div>\n\t);\n};\n\nconst BAR_WIDTH = 8;\nconst BAR_GAP = 4;\n\nexport const ActivityCell = ({\n\trow,\n}: CellContext<DeploymentWithFlow, unknown>) => {\n\tconst [numberOfBars, setNumberOfBars] = useState<number>(0);\n\tconst debouncedNumberOfBars = useDebounce(numberOfBars, 150);\n\n\tconst chartRef = useCallback((node: HTMLDivElement | null) => {\n\t\tif (!node) return;\n\n\t\tconst updateBars = () => {\n\t\t\tconst chartWidth = node.getBoundingClientRect().width;\n\t\t\tsetNumberOfBars(Math.floor(chartWidth / (BAR_WIDTH + BAR_GAP)));\n\t\t};\n\n\t\t// Set the initial number of bars based on the chart width\n\t\tupdateBars();\n\n\t\t// Observe the chart for resize events\n\t\tconst resizeObserver = new ResizeObserver(updateBars);\n\t\tresizeObserver.observe(node);\n\t\treturn () => {\n\t\t\t// Clean up the observer\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, []);\n\n\tconst { data: flowRuns } = useQuery(\n\t\tbuildFilterFlowRunsQuery({\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: {\n\t\t\t\t\tany_: [row.original.id],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: debouncedNumberOfBars || numberOfBars,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst { flow, ...deployment } = row.original;\n\tconst enrichedFlowRuns =\n\t\tflowRuns?.map((flowRun) => ({\n\t\t\t...flowRun,\n\t\t\tdeployment,\n\t\t\tflow,\n\t\t})) ?? [];\n\n\treturn (\n\t\t<div className=\"w-full\" ref={chartRef}>\n\t\t\t<FlowRunActivityBarChart\n\t\t\t\tstartDate={subSeconds(new Date(), secondsInWeek)}\n\t\t\t\tendDate={new Date()}\n\t\t\t\t// If debouncedNumberOfBars is 0, use numberOfBars for an asymmetric debounce to avoid rendering an empty chart on initial paint.\n\t\t\t\tnumberOfBars={debouncedNumberOfBars || numberOfBars}\n\t\t\t\tbarWidth={BAR_WIDTH}\n\t\t\t\tenrichedFlowRuns={enrichedFlowRuns}\n\t\t\t\tclassName=\"h-12 w-full\"\n\t\t\t\tchartId={row.original.id}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport type { components } from \"@/api/prefect\";\nimport { useDeleteDeploymentConfirmationDialog } from \"@/components/deployments/use-delete-deployment-confirmation-dialog\";\nimport { FlowIconText } from \"@/components/flows/flow-icon-text\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\nimport { FlowRunActivityBarGraphTooltipProvider } from \"@/components/ui/flow-run-activity-bar-graph\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { ScheduleBadgeGroup } from \"@/components/ui/schedule-badge\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { StatusBadge } from \"@/components/ui/status-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { pluralize } from \"@/utils\";\nimport { ActionsCell, ActivityCell } from \"./cells\";\n\nexport type DeploymentsDataTableProps = {\n\tdeployments: DeploymentWithFlow[];\n\tcurrentDeploymentsCount: number;\n\tpageCount: number;\n\tpagination: PaginationState;\n\tsort: components[\"schemas\"][\"DeploymentSort\"];\n\tcolumnFilters: ColumnFiltersState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonSortChange: (sort: components[\"schemas\"][\"DeploymentSort\"]) => void;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n};\n\nconst columnHelper = createColumnHelper<DeploymentWithFlow>();\n\nconst createColumns = ({\n\tonDelete,\n}: {\n\tonDelete: (deployment: DeploymentWithFlow) => void;\n}) => [\n\tcolumnHelper.display({\n\t\tid: \"name\",\n\t\theader: \"Deployment\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t<Link to=\"/deployments/deployment/$id\" params={{ id: row.original.id }}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium truncate\"\n\t\t\t\t\t\ttitle={row.original.name}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.original.name}\n\t\t\t\t\t</span>\n\t\t\t\t</Link>\n\n\t\t\t\t{row.original.flow && (\n\t\t\t\t\t<FlowIconText\n\t\t\t\t\t\tflow={row.original.flow}\n\t\t\t\t\t\tclassName=\"text-xs text-muted-foreground flex items-center gap-1\"\n\t\t\t\t\t\ticonSize={12}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t),\n\t\tsize: 100,\n\t}),\n\tcolumnHelper.accessor(\"status\", {\n\t\tid: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => {\n\t\t\tconst status = row.original.status;\n\t\t\tif (!status) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"min-w-28\">\n\t\t\t\t\t<StatusBadge status={status} />\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t\tsize: 50,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"activity\",\n\t\theader: \"Activity\",\n\t\tcell: (props) => (\n\t\t\t<div className=\"flex flex-row gap-2 items-center min-w-28\">\n\t\t\t\t<ActivityCell {...props} />\n\t\t\t</div>\n\t\t),\n\t\tsize: 300,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"tags\",\n\t\theader: () => null,\n\t\tcell: ({ row }) => <TagBadgeGroup tags={row.original.tags ?? []} />,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"schedules\",\n\t\theader: \"Schedules\",\n\t\tcell: ({ row }) => {\n\t\t\tconst schedules = row.original.schedules;\n\t\t\tif (!schedules || schedules.length === 0) return null;\n\t\t\treturn <ScheduleBadgeGroup schedules={schedules} />;\n\t\t},\n\t\tsize: 150,\n\t}),\n\tcolumnHelper.display({\n\t\tid: \"actions\",\n\t\tcell: (props) => <ActionsCell {...props} onDelete={onDelete} />,\n\t}),\n];\n\nexport const DeploymentsDataTable = ({\n\tdeployments,\n\tcurrentDeploymentsCount,\n\tpagination,\n\tpageCount,\n\tsort,\n\tcolumnFilters,\n\tonPaginationChange,\n\tonSortChange,\n\tonColumnFiltersChange,\n}: DeploymentsDataTableProps) => {\n\tconst [deleteConfirmationDialogState, confirmDelete] =\n\t\tuseDeleteDeploymentConfirmationDialog();\n\n\tconst nameSearchValue = (columnFilters.find(\n\t\t(filter) => filter.id === \"flowOrDeploymentName\",\n\t)?.value ?? \"\") as string;\n\tconst tagsSearchValue = (columnFilters.find((filter) => filter.id === \"tags\")\n\t\t?.value ?? []) as string[];\n\n\tconst handleNameSearchChange = useCallback(\n\t\t(value?: string) => {\n\t\t\tconst filters = columnFilters.filter(\n\t\t\t\t(filter) => filter.id !== \"flowOrDeploymentName\",\n\t\t\t);\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"flowOrDeploymentName\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handleTagsSearchChange: React.ChangeEventHandler<HTMLInputElement> &\n\t\t((tags: string[]) => void) = useCallback(\n\t\t(e: string[] | React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst tags = Array.isArray(e) ? e : e.target.value;\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"tags\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\ttags.length ? [...filters, { id: \"tags\", value: tags }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: deployments,\n\t\tcolumns: createColumns({\n\t\t\tonDelete: (deployment) => {\n\t\t\t\tconst name = deployment.flow?.name\n\t\t\t\t\t? `${deployment.flow?.name}/${deployment.name}`\n\t\t\t\t\t: deployment.name;\n\t\t\t\tconfirmDelete({ ...deployment, name });\n\t\t\t},\n\t\t}),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tpageCount,\n\t\tmanualPagination: true,\n\t\tdefaultColumn: {\n\t\t\tmaxSize: 300,\n\t\t},\n\t\tstate: {\n\t\t\tpagination,\n\t\t},\n\t\tonPaginationChange: handlePaginationChange,\n\t});\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"grid sm:grid-cols-2 md:grid-cols-6 lg:grid-cols-12 gap-2 pb-4 items-center\">\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-6 lg:col-span-4 order-last lg:order-first\">\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{currentDeploymentsCount}{\" \"}\n\t\t\t\t\t\t{pluralize(currentDeploymentsCount, \"Deployment\")}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"sm:col-span-2 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search deployments\"\n\t\t\t\t\t\tvalue={nameSearchValue}\n\t\t\t\t\t\tonChange={(e) => handleNameSearchChange(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-3\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tplaceholder=\"Filter by tags\"\n\t\t\t\t\t\tonChange={handleTagsSearchChange}\n\t\t\t\t\t\tvalue={tagsSearchValue}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xs:col-span-1 md:col-span-2 lg:col-span-2\">\n\t\t\t\t\t<Select value={sort} onValueChange={onSortChange}>\n\t\t\t\t\t\t<SelectTrigger\n\t\t\t\t\t\t\taria-label=\"Deployment sort order\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t<SelectItem value=\"CREATED_DESC\">Created</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"UPDATED_DESC\">Updated</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t</Select>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<DeleteConfirmationDialog {...deleteConfirmationDialogState} />\n\t\t\t<FlowRunActivityBarGraphTooltipProvider>\n\t\t\t\t<DataTable table={table} />\n\t\t\t</FlowRunActivityBarGraphTooltipProvider>\n\t\t</div>\n\t);\n};\n"],"names":["ActionsCell","row","onDelete","id","parameters","onQuickRun","isPending","useQuickRun","jsx","DropdownMenu","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","Link","toast","BAR_WIDTH","BAR_GAP","ActivityCell","numberOfBars","setNumberOfBars","useState","debouncedNumberOfBars","useDebounce","chartRef","useCallback","node","updateBars","chartWidth","resizeObserver","flowRuns","useQuery","buildFilterFlowRunsQuery","flow","deployment","enrichedFlowRuns","flowRun","FlowRunActivityBarChart","subSeconds","secondsInWeek","columnHelper","createColumnHelper","createColumns","FlowIconText","status","StatusBadge","props","TagBadgeGroup","schedules","ScheduleBadgeGroup","DeploymentsDataTable","deployments","currentDeploymentsCount","pagination","pageCount","sort","columnFilters","onPaginationChange","onSortChange","onColumnFiltersChange","deleteConfirmationDialogState","confirmDelete","useDeleteDeploymentConfirmationDialog","nameSearchValue","filter","tagsSearchValue","handleNameSearchChange","value","filters","handleTagsSearchChange","e","tags","handlePaginationChange","updater","newPagination","table","useReactTable","name","getCoreRowModel","pluralize","SearchInput","TagsInput","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","DeleteConfirmationDialog","FlowRunActivityBarGraphTooltipProvider","DataTable"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{c as g,r as c,j as o}from"./vendor-tanstack-BK8oseNA.js";import{u as x,j as b,E as j}from"./vendor-codemirror-CXN7nd_v.js";import{z as v,aW as y,q as C,I as w,y as E}from"./index-BvSl3DKP.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";const N=[b(),j.lineWrapping],z=g.forwardRef(({className:l,value:s,onChange:u,copy:p=!1,onBlur:I,disabled:r,hideLineNumbers:h=!1,...f},i)=>{const e=c.useRef(null),{resolvedTheme:m}=v();let n;r&&(n={lineNumbers:!h,highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1});const{setContainer:a}=x({container:e.current,extensions:N,value:s,onChange:u,indentWithTab:!1,editable:!r,basicSetup:n,theme:m==="dark"?"dark":"light",height:"100%"});c.useEffect(()=>{e.current&&a(e.current)},[a]);const d=t=>{E.success("Copied to clipboard"),navigator.clipboard.writeText(t)};return o.jsx("div",{className:y("rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative",l),ref:t=>{e.current=t,typeof i=="function"?i(t):i&&(i.current=t)},...f,children:p&&s&&o.jsx(C,{onClick:()=>d(s),variant:"ghost",size:"icon",className:"absolute top-0 right-0 z-10","aria-label":"copy",children:o.jsx(w,{id:"Copy",className:"size-2"})})})});z.displayName="JsonInput";export{z as JsonInput};
2
- //# sourceMappingURL=json-input-Dt1icmrn.js.map
1
+ import{c as g,r as c,j as o}from"./vendor-tanstack-BK8oseNA.js";import{u as x,j as b,E as j}from"./vendor-codemirror-CXN7nd_v.js";import{z as v,aW as y,q as C,I as w,y as E}from"./index-Cd7pM9pk.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";const N=[b(),j.lineWrapping],z=g.forwardRef(({className:l,value:s,onChange:u,copy:p=!1,onBlur:I,disabled:r,hideLineNumbers:h=!1,...f},i)=>{const e=c.useRef(null),{resolvedTheme:m}=v();let n;r&&(n={lineNumbers:!h,highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1});const{setContainer:a}=x({container:e.current,extensions:N,value:s,onChange:u,indentWithTab:!1,editable:!r,basicSetup:n,theme:m==="dark"?"dark":"light",height:"100%"});c.useEffect(()=>{e.current&&a(e.current)},[a]);const d=t=>{E.success("Copied to clipboard"),navigator.clipboard.writeText(t)};return o.jsx("div",{className:y("rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative",l),ref:t=>{e.current=t,typeof i=="function"?i(t):i&&(i.current=t)},...f,children:p&&s&&o.jsx(C,{onClick:()=>d(s),variant:"ghost",size:"icon",className:"absolute top-0 right-0 z-10","aria-label":"copy",children:o.jsx(w,{id:"Copy",className:"size-2"})})})});z.displayName="JsonInput";export{z as JsonInput};
2
+ //# sourceMappingURL=json-input-C9dkBSdc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-input-Dt1icmrn.js","sources":["../../src/components/ui/json-input.tsx"],"sourcesContent":["import { json } from \"@codemirror/lang-json\";\nimport {\n\ttype BasicSetupOptions,\n\tEditorView,\n\tuseCodeMirror,\n} from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport React, { useEffect, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/utils\";\nimport { Button } from \"./button\";\nimport { Icon } from \"./icons\";\n\nconst extensions = [json(), EditorView.lineWrapping];\n\ntype JsonInputProps = React.ComponentProps<\"div\"> & {\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tonBlur?: () => void;\n\tdisabled?: boolean;\n\tclassName?: string;\n\thideLineNumbers?: boolean;\n\tcopy?: boolean;\n};\n\n// the JsonInput's types for onChange are probably wrong but this makes it work\nexport type JsonInputOnChange = React.FormEventHandler<HTMLDivElement> &\n\t((value: string) => void);\n\nexport const JsonInput = React.forwardRef<HTMLDivElement, JsonInputProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tcopy = false,\n\t\t\tonBlur,\n\t\t\tdisabled,\n\t\t\thideLineNumbers = false,\n\t\t\t...props\n\t\t},\n\t\tforwardedRef,\n\t) => {\n\t\tconst editor = useRef<HTMLDivElement | null>(null);\n\t\tconst { resolvedTheme } = useTheme();\n\t\t// Setting `basicSetup` messes up the tab order. We only change the basic setup\n\t\t// if the input is disabled, so we leave it undefined to maintain the tab order.\n\t\tlet basicSetup: BasicSetupOptions | undefined;\n\t\tif (disabled) {\n\t\t\tbasicSetup = {\n\t\t\t\tlineNumbers: !hideLineNumbers,\n\t\t\t\thighlightActiveLine: false,\n\t\t\t\tfoldGutter: false,\n\t\t\t\thighlightActiveLineGutter: false,\n\t\t\t};\n\t\t}\n\t\tconst { setContainer } = useCodeMirror({\n\t\t\tcontainer: editor.current,\n\t\t\textensions,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tonBlur,\n\t\t\tindentWithTab: false,\n\t\t\teditable: !disabled,\n\t\t\tbasicSetup,\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t\theight: \"100%\",\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\tif (editor.current) {\n\t\t\t\tsetContainer(editor.current);\n\t\t\t}\n\t\t}, [setContainer]);\n\n\t\tconst handleCopy = (_value: string) => {\n\t\t\ttoast.success(\"Copied to clipboard\");\n\t\t\tvoid navigator.clipboard.writeText(_value);\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t\tif (typeof forwardedRef === \"function\") {\n\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{copy && value && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleCopy(value)}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nJsonInput.displayName = \"JsonInput\";\n"],"names":["extensions","json","EditorView","JsonInput","React","className","value","onChange","copy","onBlur","disabled","hideLineNumbers","props","forwardedRef","editor","useRef","resolvedTheme","useTheme","basicSetup","setContainer","useCodeMirror","useEffect","handleCopy","_value","toast","jsx","cn","node","Button","Icon"],"mappings":"wXAaA,MAAMA,EAAa,CAACC,IAAQC,EAAW,YAAY,EAgBtCC,EAAYC,EAAM,WAC9B,CACC,CACC,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,GACP,OAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,GAClB,GAAGC,CAAA,EAEJC,IACI,CACJ,MAAMC,EAASC,EAAAA,OAA8B,IAAI,EAC3C,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAG1B,IAAIC,EACAR,IACHQ,EAAa,CACZ,YAAa,CAACP,EACd,oBAAqB,GACrB,WAAY,GACZ,0BAA2B,EAAA,GAG7B,KAAM,CAAE,aAAAQ,CAAA,EAAiBC,EAAc,CACtC,UAAWN,EAAO,QAClB,WAAAd,EACA,MAAAM,EACA,SAAAC,EAEA,cAAe,GACf,SAAU,CAACG,EACX,WAAAQ,EACA,MAAOF,IAAkB,OAAS,OAAS,QAC3C,OAAQ,MAAA,CACR,EAEDK,EAAAA,UAAU,IAAM,CACXP,EAAO,SACVK,EAAaL,EAAO,OAAO,CAE7B,EAAG,CAACK,CAAY,CAAC,EAEjB,MAAMG,EAAcC,GAAmB,CACtCC,EAAM,QAAQ,qBAAqB,EAC9B,UAAU,UAAU,UAAUD,CAAM,CAC1C,EAEA,OACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,8HACArB,CAAA,EAED,IAAMsB,GAAS,CACdb,EAAO,QAAUa,EACb,OAAOd,GAAiB,WAC3BA,EAAac,CAAI,EACPd,IACVA,EAAa,QAAUc,EAEzB,EACC,GAAGf,EAEH,YAAQN,GACRmB,EAAAA,IAACG,EAAA,CACA,QAAS,IAAMN,EAAWhB,CAAK,EAC/B,QAAQ,QACR,KAAK,OACL,UAAU,8BACV,aAAW,OAEX,SAAAmB,EAAAA,IAACI,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAIJ,CACD,EAEA1B,EAAU,YAAc"}
1
+ {"version":3,"file":"json-input-C9dkBSdc.js","sources":["../../src/components/ui/json-input.tsx"],"sourcesContent":["import { json } from \"@codemirror/lang-json\";\nimport {\n\ttype BasicSetupOptions,\n\tEditorView,\n\tuseCodeMirror,\n} from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport React, { useEffect, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/utils\";\nimport { Button } from \"./button\";\nimport { Icon } from \"./icons\";\n\nconst extensions = [json(), EditorView.lineWrapping];\n\ntype JsonInputProps = React.ComponentProps<\"div\"> & {\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tonBlur?: () => void;\n\tdisabled?: boolean;\n\tclassName?: string;\n\thideLineNumbers?: boolean;\n\tcopy?: boolean;\n};\n\n// the JsonInput's types for onChange are probably wrong but this makes it work\nexport type JsonInputOnChange = React.FormEventHandler<HTMLDivElement> &\n\t((value: string) => void);\n\nexport const JsonInput = React.forwardRef<HTMLDivElement, JsonInputProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tcopy = false,\n\t\t\tonBlur,\n\t\t\tdisabled,\n\t\t\thideLineNumbers = false,\n\t\t\t...props\n\t\t},\n\t\tforwardedRef,\n\t) => {\n\t\tconst editor = useRef<HTMLDivElement | null>(null);\n\t\tconst { resolvedTheme } = useTheme();\n\t\t// Setting `basicSetup` messes up the tab order. We only change the basic setup\n\t\t// if the input is disabled, so we leave it undefined to maintain the tab order.\n\t\tlet basicSetup: BasicSetupOptions | undefined;\n\t\tif (disabled) {\n\t\t\tbasicSetup = {\n\t\t\t\tlineNumbers: !hideLineNumbers,\n\t\t\t\thighlightActiveLine: false,\n\t\t\t\tfoldGutter: false,\n\t\t\t\thighlightActiveLineGutter: false,\n\t\t\t};\n\t\t}\n\t\tconst { setContainer } = useCodeMirror({\n\t\t\tcontainer: editor.current,\n\t\t\textensions,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tonBlur,\n\t\t\tindentWithTab: false,\n\t\t\teditable: !disabled,\n\t\t\tbasicSetup,\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t\theight: \"100%\",\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\tif (editor.current) {\n\t\t\t\tsetContainer(editor.current);\n\t\t\t}\n\t\t}, [setContainer]);\n\n\t\tconst handleCopy = (_value: string) => {\n\t\t\ttoast.success(\"Copied to clipboard\");\n\t\t\tvoid navigator.clipboard.writeText(_value);\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-md border shadow-xs overflow-hidden focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t\tif (typeof forwardedRef === \"function\") {\n\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{copy && value && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleCopy(value)}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nJsonInput.displayName = \"JsonInput\";\n"],"names":["extensions","json","EditorView","JsonInput","React","className","value","onChange","copy","onBlur","disabled","hideLineNumbers","props","forwardedRef","editor","useRef","resolvedTheme","useTheme","basicSetup","setContainer","useCodeMirror","useEffect","handleCopy","_value","toast","jsx","cn","node","Button","Icon"],"mappings":"wXAaA,MAAMA,EAAa,CAACC,IAAQC,EAAW,YAAY,EAgBtCC,EAAYC,EAAM,WAC9B,CACC,CACC,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,GACP,OAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,GAClB,GAAGC,CAAA,EAEJC,IACI,CACJ,MAAMC,EAASC,EAAAA,OAA8B,IAAI,EAC3C,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAG1B,IAAIC,EACAR,IACHQ,EAAa,CACZ,YAAa,CAACP,EACd,oBAAqB,GACrB,WAAY,GACZ,0BAA2B,EAAA,GAG7B,KAAM,CAAE,aAAAQ,CAAA,EAAiBC,EAAc,CACtC,UAAWN,EAAO,QAClB,WAAAd,EACA,MAAAM,EACA,SAAAC,EAEA,cAAe,GACf,SAAU,CAACG,EACX,WAAAQ,EACA,MAAOF,IAAkB,OAAS,OAAS,QAC3C,OAAQ,MAAA,CACR,EAEDK,EAAAA,UAAU,IAAM,CACXP,EAAO,SACVK,EAAaL,EAAO,OAAO,CAE7B,EAAG,CAACK,CAAY,CAAC,EAEjB,MAAMG,EAAcC,GAAmB,CACtCC,EAAM,QAAQ,qBAAqB,EAC9B,UAAU,UAAU,UAAUD,CAAM,CAC1C,EAEA,OACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,8HACArB,CAAA,EAED,IAAMsB,GAAS,CACdb,EAAO,QAAUa,EACb,OAAOd,GAAiB,WAC3BA,EAAac,CAAI,EACPd,IACVA,EAAa,QAAUc,EAEzB,EACC,GAAGf,EAEH,YAAQN,GACRmB,EAAAA,IAACG,EAAA,CACA,QAAS,IAAMN,EAAWhB,CAAK,EAC/B,QAAQ,QACR,KAAK,OACL,UAAU,8BACV,aAAW,OAEX,SAAAmB,EAAAA,IAACI,EAAA,CAAK,GAAG,OAAO,UAAU,QAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAIJ,CACD,EAEA1B,EAAU,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as e,r as c,L as i,p as m}from"./vendor-tanstack-BK8oseNA.js";import{aW as n,D as x,I as f,al as r,B as p,g as h,h as o,bs as b,bB as j,C as v,aM as g,dt as y,bv as N}from"./index-BvSl3DKP.js";import{u as w}from"./use-get-artifacts-flow-task-runs-TSCoomjQ.js";import{L as k}from"./lazy-markdown-BwIwKFRF.js";import{az as C,aA as _,aB as M,aC as T,aD as z,aE as B}from"./vendor-radix-CznP1SOq.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";function L({className:t,...s}){return e.jsx(C,{"data-slot":"menubar",className:n("bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",t),...s})}function A({...t}){return e.jsx(_,{"data-slot":"menubar-menu",...t})}function D({...t}){return e.jsx(B,{"data-slot":"menubar-portal",...t})}function E({className:t,...s}){return e.jsx(M,{"data-slot":"menubar-trigger",className:n("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",t),...s})}function I({className:t,align:s="start",alignOffset:a=-4,sideOffset:d=8,...u}){return e.jsx(D,{children:e.jsx(T,{"data-slot":"menubar-content",align:s,alignOffset:a,sideOffset:d,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md",t),...u})})}function R({className:t,inset:s,variant:a="default",...d}){return e.jsx(z,{"data-slot":"menubar-item","data-inset":s,"data-variant":a,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t),...d})}const S=({artifactKey:t,pageHeader:s})=>{const a=c.useCallback(()=>{navigator.clipboard.writeText(t)},[t]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(F,{artifactKey:t}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(x,{id:"artifacts-guide",label:"Documentation"}),e.jsx(L,{children:e.jsxs(A,{children:[e.jsx(E,{className:"px-1",children:e.jsx(f,{id:"EllipsisVertical"})}),e.jsx(I,{children:e.jsx(R,{onClick:a,children:"Copy Id"})})]})})]})]}),s&&e.jsxs("div",{className:"",children:[e.jsx(r,{variant:"h2",className:"my-4 font-bold prose lg:prose-xl",children:e.jsx(k,{children:s})}),e.jsx("hr",{})]})]})},F=({artifactKey:t})=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{children:e.jsxs(h,{children:[e.jsx(o,{children:e.jsx(b,{to:"/artifacts",className:"text-xl font-semibold",children:"Artifacts"})}),e.jsx(j,{}),e.jsx(o,{className:"text-xl font-semibold",children:t})]})})}),$=({artifact:t})=>{const s=c.useMemo(()=>t.id?.split("-")[0],[t.id]);return e.jsxs(v,{"data-testid":`timeline-card-${t.id}`,className:"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow",children:[e.jsx(i,{to:"/artifacts/artifact/$id",params:{id:t.id??""},children:e.jsx(r,{variant:"body",className:"font-bold text-blue-700 hover:underline",children:s})}),t.flow_run&&e.jsxs(r,{variant:"bodySmall",children:["Flow run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/flow-run/$id",params:{id:t.flow_run_id??""},children:t.flow_run?.name})]}),t.task_run&&e.jsxs(r,{variant:"bodySmall",children:["Task run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/task-run/$id",params:{id:t.task_run_id??""},children:t.task_run?.name})]})]})},P=({artifact:t})=>{const[s,a]=g(t.created??"","dateTime").split(" at ");return e.jsxs("div",{"data-testid":`timeline-row-${t.id}`,className:"flex",children:[e.jsxs("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px"},children:[e.jsx(r,{variant:"body",children:a}),e.jsx(r,{variant:"bodySmall",className:"text-muted-foreground",children:s})]}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200",children:e.jsx("div",{className:"size-4 rounded-full bg-white my-5 mx-auto border-2",style:{margin:"20px calc(50% + 2px)"}})})}),e.jsx("div",{className:"grow mt-1",children:e.jsx($,{artifact:t})})]})},H=({artifacts:t})=>e.jsxs("div",{children:[t.map(s=>e.jsx(P,{artifact:s},s.id)),e.jsxs("div",{className:"flex border-b",children:[e.jsx("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px",height:"88px"}}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200 pt-3",children:e.jsx("div",{className:"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center",style:{margin:"20px calc(50% - 6px)"},children:e.jsx("div",{className:"size-4 rounded-full border-2 border-black relative"})})})}),e.jsx("div",{style:{padding:"33px 0 0 5px"},children:e.jsxs(r,{variant:"bodyLarge",children:["Created ",e.jsx("span",{className:"font-bold",children:t[0].key})]})})]})]}),Q=({artifactKey:t,artifacts:s})=>e.jsxs("div",{children:[e.jsx(S,{artifactKey:t,pageHeader:s[0]?.description??void 0}),e.jsx(H,{artifacts:s})]}),l=t=>({artifacts:{operator:"and_",key:{like_:t}},sort:"CREATED_DESC",offset:0});function Y(){const{key:t}=y.useParams(),{data:s}=m(N(l(t))),a=w(l(t));return e.jsx("div",{children:e.jsx(Q,{artifactKey:t,artifacts:a??s})})}export{Y as component};
2
- //# sourceMappingURL=key._key-Cyh5MBX_.js.map
1
+ import{j as e,r as c,L as i,p as m}from"./vendor-tanstack-BK8oseNA.js";import{aW as n,D as x,I as f,al as r,B as p,g as h,h as o,bs as b,bB as j,C as v,aM as g,dt as y,bv as N}from"./index-Cd7pM9pk.js";import{u as w}from"./use-get-artifacts-flow-task-runs-BfE433bC.js";import{L as k}from"./lazy-markdown-BoMKGRXo.js";import{az as C,aA as _,aB as M,aC as T,aD as z,aE as B}from"./vendor-radix-CznP1SOq.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";function L({className:t,...s}){return e.jsx(C,{"data-slot":"menubar",className:n("bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs",t),...s})}function A({...t}){return e.jsx(_,{"data-slot":"menubar-menu",...t})}function D({...t}){return e.jsx(B,{"data-slot":"menubar-portal",...t})}function E({className:t,...s}){return e.jsx(M,{"data-slot":"menubar-trigger",className:n("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none",t),...s})}function I({className:t,align:s="start",alignOffset:a=-4,sideOffset:d=8,...u}){return e.jsx(D,{children:e.jsx(T,{"data-slot":"menubar-content",align:s,alignOffset:a,sideOffset:d,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md",t),...u})})}function R({className:t,inset:s,variant:a="default",...d}){return e.jsx(z,{"data-slot":"menubar-item","data-inset":s,"data-variant":a,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t),...d})}const S=({artifactKey:t,pageHeader:s})=>{const a=c.useCallback(()=>{navigator.clipboard.writeText(t)},[t]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(F,{artifactKey:t}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(x,{id:"artifacts-guide",label:"Documentation"}),e.jsx(L,{children:e.jsxs(A,{children:[e.jsx(E,{className:"px-1",children:e.jsx(f,{id:"EllipsisVertical"})}),e.jsx(I,{children:e.jsx(R,{onClick:a,children:"Copy Id"})})]})})]})]}),s&&e.jsxs("div",{className:"",children:[e.jsx(r,{variant:"h2",className:"my-4 font-bold prose lg:prose-xl",children:e.jsx(k,{children:s})}),e.jsx("hr",{})]})]})},F=({artifactKey:t})=>e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{children:e.jsxs(h,{children:[e.jsx(o,{children:e.jsx(b,{to:"/artifacts",className:"text-xl font-semibold",children:"Artifacts"})}),e.jsx(j,{}),e.jsx(o,{className:"text-xl font-semibold",children:t})]})})}),$=({artifact:t})=>{const s=c.useMemo(()=>t.id?.split("-")[0],[t.id]);return e.jsxs(v,{"data-testid":`timeline-card-${t.id}`,className:"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow",children:[e.jsx(i,{to:"/artifacts/artifact/$id",params:{id:t.id??""},children:e.jsx(r,{variant:"body",className:"font-bold text-blue-700 hover:underline",children:s})}),t.flow_run&&e.jsxs(r,{variant:"bodySmall",children:["Flow run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/flow-run/$id",params:{id:t.flow_run_id??""},children:t.flow_run?.name})]}),t.task_run&&e.jsxs(r,{variant:"bodySmall",children:["Task run:"," ",e.jsx(i,{className:"text-blue-700 hover:underline",to:"/runs/task-run/$id",params:{id:t.task_run_id??""},children:t.task_run?.name})]})]})},P=({artifact:t})=>{const[s,a]=g(t.created??"","dateTime").split(" at ");return e.jsxs("div",{"data-testid":`timeline-row-${t.id}`,className:"flex",children:[e.jsxs("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px"},children:[e.jsx(r,{variant:"body",children:a}),e.jsx(r,{variant:"bodySmall",className:"text-muted-foreground",children:s})]}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200",children:e.jsx("div",{className:"size-4 rounded-full bg-white my-5 mx-auto border-2",style:{margin:"20px calc(50% + 2px)"}})})}),e.jsx("div",{className:"grow mt-1",children:e.jsx($,{artifact:t})})]})},H=({artifacts:t})=>e.jsxs("div",{children:[t.map(s=>e.jsx(P,{artifact:s},s.id)),e.jsxs("div",{className:"flex border-b",children:[e.jsx("div",{className:"flex flex-col items-end justify-items-start pt-4",style:{width:"128px",height:"88px"}}),e.jsx("div",{className:"w-10 flex flex-col",children:e.jsx("div",{className:"w-5 h-full border-r border-gray-200 pt-3",children:e.jsx("div",{className:"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center",style:{margin:"20px calc(50% - 6px)"},children:e.jsx("div",{className:"size-4 rounded-full border-2 border-black relative"})})})}),e.jsx("div",{style:{padding:"33px 0 0 5px"},children:e.jsxs(r,{variant:"bodyLarge",children:["Created ",e.jsx("span",{className:"font-bold",children:t[0].key})]})})]})]}),Q=({artifactKey:t,artifacts:s})=>e.jsxs("div",{children:[e.jsx(S,{artifactKey:t,pageHeader:s[0]?.description??void 0}),e.jsx(H,{artifacts:s})]}),l=t=>({artifacts:{operator:"and_",key:{like_:t}},sort:"CREATED_DESC",offset:0});function Y(){const{key:t}=y.useParams(),{data:s}=m(N(l(t))),a=w(l(t));return e.jsx("div",{children:e.jsx(Q,{artifactKey:t,artifacts:a??s})})}export{Y as component};
2
+ //# sourceMappingURL=key._key-BBVH44_R.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"key._key-Cyh5MBX_.js","sources":["../../src/components/ui/menubar.tsx","../../src/components/artifacts/key/artifacts-key-header.tsx","../../src/components/artifacts/key/timeline/timelineCard.tsx","../../src/components/artifacts/key/timeline/timelineRow.tsx","../../src/components/artifacts/key/timeline/timelineContainer.tsx","../../src/components/artifacts/key/artifacts-key-page.tsx","../../src/routes/artifacts/key.$key.tsx?tsr-split=component"],"sourcesContent":["import * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Menubar({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n\treturn (\n\t\t<MenubarPrimitive.Root\n\t\t\tdata-slot=\"menubar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarMenu({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n\treturn <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nfunction MenubarGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n\treturn <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nfunction MenubarPortal({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n\treturn <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nfunction MenubarRadioGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n\t);\n}\n\nfunction MenubarTrigger({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n\treturn (\n\t\t<MenubarPrimitive.Trigger\n\t\t\tdata-slot=\"menubar-trigger\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarContent({\n\tclassName,\n\talign = \"start\",\n\talignOffset = -4,\n\tsideOffset = 8,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n\treturn (\n\t\t<MenubarPortal>\n\t\t\t<MenubarPrimitive.Content\n\t\t\t\tdata-slot=\"menubar-content\"\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</MenubarPortal>\n\t);\n}\n\nfunction MenubarItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Item\n\t\t\tdata-slot=\"menubar-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<MenubarPrimitive.CheckboxItem\n\t\t\tdata-slot=\"menubar-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.CheckboxItem>\n\t);\n}\n\nfunction MenubarRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioItem\n\t\t\tdata-slot=\"menubar-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.RadioItem>\n\t);\n}\n\nfunction MenubarLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Label\n\t\t\tdata-slot=\"menubar-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n\treturn (\n\t\t<MenubarPrimitive.Separator\n\t\t\tdata-slot=\"menubar-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"menubar-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSub({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n\treturn <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nfunction MenubarSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.SubTrigger\n\t\t\tdata-slot=\"menubar-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n\t\t</MenubarPrimitive.SubTrigger>\n\t);\n}\n\nfunction MenubarSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n\treturn (\n\t\t<MenubarPrimitive.SubContent\n\t\t\tdata-slot=\"menubar-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tMenubar,\n\tMenubarPortal,\n\tMenubarMenu,\n\tMenubarTrigger,\n\tMenubarContent,\n\tMenubarGroup,\n\tMenubarSeparator,\n\tMenubarLabel,\n\tMenubarItem,\n\tMenubarShortcut,\n\tMenubarCheckboxItem,\n\tMenubarRadioGroup,\n\tMenubarRadioItem,\n\tMenubarSub,\n\tMenubarSubTrigger,\n\tMenubarSubContent,\n};\n","import { useCallback } from \"react\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport {\n\tMenubar,\n\tMenubarContent,\n\tMenubarItem,\n\tMenubarMenu,\n\tMenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype ArtifactsKeyHeaderProps = {\n\tartifactKey: string;\n\tpageHeader?: string;\n};\n\nexport const ArtifactsKeyHeader = ({\n\tartifactKey,\n\tpageHeader,\n}: ArtifactsKeyHeaderProps) => {\n\tconst handleCopyId = useCallback(() => {\n\t\tvoid navigator.clipboard.writeText(artifactKey);\n\t}, [artifactKey]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Header artifactKey={artifactKey} />\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t\t\t{/* <Button variant=\"outline\" className=\"px-1\"><Icon id=\"EllipsisVertical\" /></Button> */}\n\t\t\t\t\t<Menubar>\n\t\t\t\t\t\t<MenubarMenu>\n\t\t\t\t\t\t\t<MenubarTrigger className=\"px-1\">\n\t\t\t\t\t\t\t\t<Icon id=\"EllipsisVertical\" />\n\t\t\t\t\t\t\t</MenubarTrigger>\n\t\t\t\t\t\t\t<MenubarContent>\n\t\t\t\t\t\t\t\t<MenubarItem onClick={handleCopyId}>Copy Id</MenubarItem>\n\t\t\t\t\t\t\t</MenubarContent>\n\t\t\t\t\t\t</MenubarMenu>\n\t\t\t\t\t</Menubar>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{pageHeader && (\n\t\t\t\t<div className=\"\">\n\t\t\t\t\t<Typography variant=\"h2\" className=\"my-4 font-bold prose lg:prose-xl\">\n\t\t\t\t\t\t<LazyMarkdown>{pageHeader}</LazyMarkdown>\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<hr />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nconst Header = ({ artifactKey }: ArtifactsKeyHeaderProps) => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbLink to=\"/artifacts\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t{artifactKey}\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Card } from \"@/components/ui/card\";\nimport { Typography } from \"@/components/ui/typography\";\n\nexport type ArtifactTimelineCardProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactTimelineCard = ({\n\tartifact,\n}: ArtifactTimelineCardProps) => {\n\tconst artifactTitle = useMemo(() => {\n\t\treturn artifact.id?.split(\"-\")[0];\n\t}, [artifact.id]);\n\n\treturn (\n\t\t<Card\n\t\t\tdata-testid={`timeline-card-${artifact.id}`}\n\t\t\tclassName=\"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow\"\n\t\t>\n\t\t\t<Link to=\"/artifacts/artifact/$id\" params={{ id: artifact.id ?? \"\" }}>\n\t\t\t\t<Typography\n\t\t\t\t\tvariant=\"body\"\n\t\t\t\t\tclassName=\"font-bold text-blue-700 hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{artifactTitle}\n\t\t\t\t</Typography>\n\t\t\t</Link>\n\t\t\t{artifact.flow_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tFlow run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/flow-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.flow_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t\t{artifact.task_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tTask run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/task-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.task_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t</Card>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { formatDate } from \"@/utils/date\";\nimport { ArtifactTimelineCard } from \"./timelineCard\";\n\nexport type TimelineRowProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const TimelineRow = ({ artifact }: TimelineRowProps) => {\n\tconst [date, time] = formatDate(artifact.created ?? \"\", \"dateTime\").split(\n\t\t\" at \",\n\t);\n\treturn (\n\t\t<div data-testid={`timeline-row-${artifact.id}`} className=\"flex\">\n\t\t\t<div\n\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\tstyle={{ width: \"128px\" }}\n\t\t\t>\n\t\t\t\t<Typography variant=\"body\">{time}</Typography>\n\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t{date}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"size-4 rounded-full bg-white my-5 mx-auto border-2\"\n\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% + 2px)\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"grow mt-1\">\n\t\t\t\t<ArtifactTimelineCard artifact={artifact} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TimelineRow } from \"./timelineRow\";\n\nexport type TimelineContainerProps = {\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const TimelineContainer = ({ artifacts }: TimelineContainerProps) => {\n\treturn (\n\t\t<div>\n\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t<TimelineRow key={artifact.id} artifact={artifact} />\n\t\t\t))}\n\t\t\t<div className=\"flex border-b\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\t\tstyle={{ width: \"128px\", height: \"88px\" }}\n\t\t\t\t/>\n\t\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200 pt-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center\"\n\t\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% - 6px)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"size-4 rounded-full border-2 border-black relative\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ padding: \"33px 0 0 5px\" }}>\n\t\t\t\t\t<Typography variant=\"bodyLarge\">\n\t\t\t\t\t\tCreated <span className=\"font-bold\">{artifacts[0].key}</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactsKeyHeader } from \"./artifacts-key-header\";\nimport { TimelineContainer } from \"./timeline/timelineContainer\";\n\ntype ArtifactsKeyPageProps = {\n\tartifactKey: string;\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const ArtifactsKeyPage = ({\n\tartifactKey,\n\tartifacts,\n}: ArtifactsKeyPageProps) => {\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyHeader\n\t\t\t\tartifactKey={artifactKey}\n\t\t\t\tpageHeader={artifacts[0]?.description ?? undefined}\n\t\t\t/>\n\t\t\t<TimelineContainer artifacts={artifacts} />\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { type ArtifactsFilter, buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { useFilterArtifactsFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { ArtifactsKeyPage } from \"@/components/artifacts/key/artifacts-key-page\";\n\nconst buildFilterBody = (key: string): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\tkey: {\n\t\t\tlike_: key, // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/key/$key\")({\n\tcomponent: RouteComponent,\n\tloader: async ({ context, params }) => {\n\t\tconst { key } = params;\n\n\t\tconst artifacts = await context.queryClient.ensureQueryData(\n\t\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t\t);\n\n\t\treturn { artifacts };\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst { key } = Route.useParams();\n\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t);\n\n\tconst artifactWithMetadata = useFilterArtifactsFlowTaskRuns(\n\t\tbuildFilterBody(key),\n\t);\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyPage\n\t\t\t\tartifactKey={key} // can't use \"key\" as it is a reserved word\n\t\t\t\tartifacts={artifactWithMetadata ?? artifacts}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["Menubar","className","props","jsx","MenubarPrimitive.Root","cn","MenubarMenu","MenubarPrimitive.Menu","MenubarPortal","MenubarPrimitive.Portal","MenubarTrigger","MenubarPrimitive.Trigger","MenubarContent","align","alignOffset","sideOffset","MenubarPrimitive.Content","MenubarItem","inset","variant","MenubarPrimitive.Item","ArtifactsKeyHeader","artifactKey","pageHeader","handleCopyId","useCallback","jsxs","Fragment","Header","DocsLink","Icon","Typography","LazyMarkdown","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","ArtifactTimelineCard","artifact","artifactTitle","useMemo","Card","Link","TimelineRow","date","time","formatDate","TimelineContainer","artifacts","ArtifactsKeyPage","buildFilterBody","key","operator","like_","sort","offset","RouteComponent","Route","useParams","data","useSuspenseQuery","buildListArtifactsQuery","artifactWithMetadata","useFilterArtifactsFlowTaskRuns"],"mappings":"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"}
1
+ {"version":3,"file":"key._key-BBVH44_R.js","sources":["../../src/components/ui/menubar.tsx","../../src/components/artifacts/key/artifacts-key-header.tsx","../../src/components/artifacts/key/timeline/timelineCard.tsx","../../src/components/artifacts/key/timeline/timelineRow.tsx","../../src/components/artifacts/key/timeline/timelineContainer.tsx","../../src/components/artifacts/key/artifacts-key-page.tsx","../../src/routes/artifacts/key.$key.tsx?tsr-split=component"],"sourcesContent":["import * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Menubar({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n\treturn (\n\t\t<MenubarPrimitive.Root\n\t\t\tdata-slot=\"menubar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarMenu({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n\treturn <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />;\n}\n\nfunction MenubarGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n\treturn <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />;\n}\n\nfunction MenubarPortal({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n\treturn <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />;\n}\n\nfunction MenubarRadioGroup({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n\t);\n}\n\nfunction MenubarTrigger({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n\treturn (\n\t\t<MenubarPrimitive.Trigger\n\t\t\tdata-slot=\"menubar-trigger\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarContent({\n\tclassName,\n\talign = \"start\",\n\talignOffset = -4,\n\tsideOffset = 8,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n\treturn (\n\t\t<MenubarPortal>\n\t\t\t<MenubarPrimitive.Content\n\t\t\t\tdata-slot=\"menubar-content\"\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</MenubarPortal>\n\t);\n}\n\nfunction MenubarItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Item\n\t\t\tdata-slot=\"menubar-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<MenubarPrimitive.CheckboxItem\n\t\t\tdata-slot=\"menubar-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.CheckboxItem>\n\t);\n}\n\nfunction MenubarRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n\treturn (\n\t\t<MenubarPrimitive.RadioItem\n\t\t\tdata-slot=\"menubar-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<MenubarPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</MenubarPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenubarPrimitive.RadioItem>\n\t);\n}\n\nfunction MenubarLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.Label\n\t\t\tdata-slot=\"menubar-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n\treturn (\n\t\t<MenubarPrimitive.Separator\n\t\t\tdata-slot=\"menubar-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"menubar-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction MenubarSub({\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n\treturn <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />;\n}\n\nfunction MenubarSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<MenubarPrimitive.SubTrigger\n\t\t\tdata-slot=\"menubar-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n\t\t</MenubarPrimitive.SubTrigger>\n\t);\n}\n\nfunction MenubarSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n\treturn (\n\t\t<MenubarPrimitive.SubContent\n\t\t\tdata-slot=\"menubar-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tMenubar,\n\tMenubarPortal,\n\tMenubarMenu,\n\tMenubarTrigger,\n\tMenubarContent,\n\tMenubarGroup,\n\tMenubarSeparator,\n\tMenubarLabel,\n\tMenubarItem,\n\tMenubarShortcut,\n\tMenubarCheckboxItem,\n\tMenubarRadioGroup,\n\tMenubarRadioItem,\n\tMenubarSub,\n\tMenubarSubTrigger,\n\tMenubarSubContent,\n};\n","import { useCallback } from \"react\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport {\n\tMenubar,\n\tMenubarContent,\n\tMenubarItem,\n\tMenubarMenu,\n\tMenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype ArtifactsKeyHeaderProps = {\n\tartifactKey: string;\n\tpageHeader?: string;\n};\n\nexport const ArtifactsKeyHeader = ({\n\tartifactKey,\n\tpageHeader,\n}: ArtifactsKeyHeaderProps) => {\n\tconst handleCopyId = useCallback(() => {\n\t\tvoid navigator.clipboard.writeText(artifactKey);\n\t}, [artifactKey]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Header artifactKey={artifactKey} />\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t\t\t{/* <Button variant=\"outline\" className=\"px-1\"><Icon id=\"EllipsisVertical\" /></Button> */}\n\t\t\t\t\t<Menubar>\n\t\t\t\t\t\t<MenubarMenu>\n\t\t\t\t\t\t\t<MenubarTrigger className=\"px-1\">\n\t\t\t\t\t\t\t\t<Icon id=\"EllipsisVertical\" />\n\t\t\t\t\t\t\t</MenubarTrigger>\n\t\t\t\t\t\t\t<MenubarContent>\n\t\t\t\t\t\t\t\t<MenubarItem onClick={handleCopyId}>Copy Id</MenubarItem>\n\t\t\t\t\t\t\t</MenubarContent>\n\t\t\t\t\t\t</MenubarMenu>\n\t\t\t\t\t</Menubar>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{pageHeader && (\n\t\t\t\t<div className=\"\">\n\t\t\t\t\t<Typography variant=\"h2\" className=\"my-4 font-bold prose lg:prose-xl\">\n\t\t\t\t\t\t<LazyMarkdown>{pageHeader}</LazyMarkdown>\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<hr />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\nconst Header = ({ artifactKey }: ArtifactsKeyHeaderProps) => (\n\t<div className=\"flex items-center gap-2\">\n\t\t<Breadcrumb>\n\t\t\t<BreadcrumbList>\n\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbLink to=\"/artifacts\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t</BreadcrumbItem>\n\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t{artifactKey}\n\t\t\t\t</BreadcrumbItem>\n\t\t\t</BreadcrumbList>\n\t\t</Breadcrumb>\n\t</div>\n);\n","import { Link } from \"@tanstack/react-router\";\nimport { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Card } from \"@/components/ui/card\";\nimport { Typography } from \"@/components/ui/typography\";\n\nexport type ArtifactTimelineCardProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactTimelineCard = ({\n\tartifact,\n}: ArtifactTimelineCardProps) => {\n\tconst artifactTitle = useMemo(() => {\n\t\treturn artifact.id?.split(\"-\")[0];\n\t}, [artifact.id]);\n\n\treturn (\n\t\t<Card\n\t\t\tdata-testid={`timeline-card-${artifact.id}`}\n\t\t\tclassName=\"flex flex-col p-4 m-2 transition-transform hover:translate-x-2 grow\"\n\t\t>\n\t\t\t<Link to=\"/artifacts/artifact/$id\" params={{ id: artifact.id ?? \"\" }}>\n\t\t\t\t<Typography\n\t\t\t\t\tvariant=\"body\"\n\t\t\t\t\tclassName=\"font-bold text-blue-700 hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{artifactTitle}\n\t\t\t\t</Typography>\n\t\t\t</Link>\n\t\t\t{artifact.flow_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tFlow run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/flow-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.flow_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t\t{artifact.task_run && (\n\t\t\t\t<Typography variant=\"bodySmall\">\n\t\t\t\t\tTask run:{\" \"}\n\t\t\t\t\t<Link\n\t\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\t\tto={\"/runs/task-run/$id\"}\n\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{artifact.task_run?.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</Typography>\n\t\t\t)}\n\t\t</Card>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { formatDate } from \"@/utils/date\";\nimport { ArtifactTimelineCard } from \"./timelineCard\";\n\nexport type TimelineRowProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const TimelineRow = ({ artifact }: TimelineRowProps) => {\n\tconst [date, time] = formatDate(artifact.created ?? \"\", \"dateTime\").split(\n\t\t\" at \",\n\t);\n\treturn (\n\t\t<div data-testid={`timeline-row-${artifact.id}`} className=\"flex\">\n\t\t\t<div\n\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\tstyle={{ width: \"128px\" }}\n\t\t\t>\n\t\t\t\t<Typography variant=\"body\">{time}</Typography>\n\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t{date}\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"size-4 rounded-full bg-white my-5 mx-auto border-2\"\n\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% + 2px)\" }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"grow mt-1\">\n\t\t\t\t<ArtifactTimelineCard artifact={artifact} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { TimelineRow } from \"./timelineRow\";\n\nexport type TimelineContainerProps = {\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const TimelineContainer = ({ artifacts }: TimelineContainerProps) => {\n\treturn (\n\t\t<div>\n\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t<TimelineRow key={artifact.id} artifact={artifact} />\n\t\t\t))}\n\t\t\t<div className=\"flex border-b\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"flex flex-col items-end justify-items-start pt-4\"\n\t\t\t\t\tstyle={{ width: \"128px\", height: \"88px\" }}\n\t\t\t\t/>\n\t\t\t\t<div className=\"w-10 flex flex-col\">\n\t\t\t\t\t<div className=\"w-5 h-full border-r border-gray-200 pt-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"size-8 rounded-full bg-white my-5 mx-auto border-2 flex justify-center items-center\"\n\t\t\t\t\t\t\tstyle={{ margin: \"20px calc(50% - 6px)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"size-4 rounded-full border-2 border-black relative\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ padding: \"33px 0 0 5px\" }}>\n\t\t\t\t\t<Typography variant=\"bodyLarge\">\n\t\t\t\t\t\tCreated <span className=\"font-bold\">{artifacts[0].key}</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactsKeyHeader } from \"./artifacts-key-header\";\nimport { TimelineContainer } from \"./timeline/timelineContainer\";\n\ntype ArtifactsKeyPageProps = {\n\tartifactKey: string;\n\tartifacts: ArtifactWithFlowRunAndTaskRun[];\n};\n\nexport const ArtifactsKeyPage = ({\n\tartifactKey,\n\tartifacts,\n}: ArtifactsKeyPageProps) => {\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyHeader\n\t\t\t\tartifactKey={artifactKey}\n\t\t\t\tpageHeader={artifacts[0]?.description ?? undefined}\n\t\t\t/>\n\t\t\t<TimelineContainer artifacts={artifacts} />\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { type ArtifactsFilter, buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { useFilterArtifactsFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { ArtifactsKeyPage } from \"@/components/artifacts/key/artifacts-key-page\";\n\nconst buildFilterBody = (key: string): ArtifactsFilter => ({\n\tartifacts: {\n\t\toperator: \"and_\", // Logical operator for combining filters\n\t\tkey: {\n\t\t\tlike_: key, // Filter by artifact name\n\t\t},\n\t},\n\tsort: \"CREATED_DESC\",\n\toffset: 0,\n});\n\nexport const Route = createFileRoute(\"/artifacts/key/$key\")({\n\tcomponent: RouteComponent,\n\tloader: async ({ context, params }) => {\n\t\tconst { key } = params;\n\n\t\tconst artifacts = await context.queryClient.ensureQueryData(\n\t\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t\t);\n\n\t\treturn { artifacts };\n\t},\n\twrapInSuspense: true,\n});\n\nfunction RouteComponent() {\n\tconst { key } = Route.useParams();\n\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery(buildFilterBody(key)),\n\t);\n\n\tconst artifactWithMetadata = useFilterArtifactsFlowTaskRuns(\n\t\tbuildFilterBody(key),\n\t);\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactsKeyPage\n\t\t\t\tartifactKey={key} // can't use \"key\" as it is a reserved word\n\t\t\t\tartifacts={artifactWithMetadata ?? artifacts}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["Menubar","className","props","jsx","MenubarPrimitive.Root","cn","MenubarMenu","MenubarPrimitive.Menu","MenubarPortal","MenubarPrimitive.Portal","MenubarTrigger","MenubarPrimitive.Trigger","MenubarContent","align","alignOffset","sideOffset","MenubarPrimitive.Content","MenubarItem","inset","variant","MenubarPrimitive.Item","ArtifactsKeyHeader","artifactKey","pageHeader","handleCopyId","useCallback","jsxs","Fragment","Header","DocsLink","Icon","Typography","LazyMarkdown","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","ArtifactTimelineCard","artifact","artifactTitle","useMemo","Card","Link","TimelineRow","date","time","formatDate","TimelineContainer","artifacts","ArtifactsKeyPage","buildFilterBody","key","operator","like_","sort","offset","RouteComponent","Route","useParams","data","useSuspenseQuery","buildListArtifactsQuery","artifactWithMetadata","useFilterArtifactsFlowTaskRuns"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-markdown-Bvx8iWBg.js","assets/vendor-tanstack-BK8oseNA.js","assets/vendor-react-Bce9NwRC.js"])))=>i.map(i=>d[i]);
2
- import{cc as r,b5 as _}from"./index-BvSl3DKP.js";import{r as e,j as s}from"./vendor-tanstack-BK8oseNA.js";function f({children:a,...i}){const[o,u]=e.useState(null),[n,l]=e.useState(null);return e.useEffect(()=>{Promise.all([r(()=>import("./vendor-markdown-Bvx8iWBg.js").then(t=>t.i),__vite__mapDeps([0,1,2])),r(()=>import("./vendor-markdown-Bvx8iWBg.js").then(t=>t.a),__vite__mapDeps([0,1,2]))]).then(([t,m])=>{u(()=>t.default),l(()=>m.default)})},[]),!o||!n?s.jsx(_,{className:"min-h-[100px]"}):s.jsx(o,{remarkPlugins:[n],...i,children:a})}export{f as L};
3
- //# sourceMappingURL=lazy-markdown-BwIwKFRF.js.map
2
+ import{cc as r,b5 as _}from"./index-Cd7pM9pk.js";import{r as e,j as s}from"./vendor-tanstack-BK8oseNA.js";function f({children:a,...i}){const[o,u]=e.useState(null),[n,l]=e.useState(null);return e.useEffect(()=>{Promise.all([r(()=>import("./vendor-markdown-Bvx8iWBg.js").then(t=>t.i),__vite__mapDeps([0,1,2])),r(()=>import("./vendor-markdown-Bvx8iWBg.js").then(t=>t.a),__vite__mapDeps([0,1,2]))]).then(([t,m])=>{u(()=>t.default),l(()=>m.default)})},[]),!o||!n?s.jsx(_,{className:"min-h-[100px]"}):s.jsx(o,{remarkPlugins:[n],...i,children:a})}export{f as L};
3
+ //# sourceMappingURL=lazy-markdown-BoMKGRXo.js.map