@medusajs/dashboard 3.0.0-snapshot-20251216145629 → 3.0.0-snapshot-20260102134455

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 (290) hide show
  1. package/dist/add-locales-2OZXZCT5.mjs +81 -0
  2. package/dist/{adjust-inventory-26YXAXQL.mjs → adjust-inventory-47KGDWME.mjs} +2 -2
  3. package/dist/{api-key-management-create-EMP32G2D.mjs → api-key-management-create-EFPPZPZ7.mjs} +4 -4
  4. package/dist/{api-key-management-detail-6RCDH73M.mjs → api-key-management-detail-4IFED7SF.mjs} +15 -15
  5. package/dist/{api-key-management-edit-IBM3ZXHK.mjs → api-key-management-edit-QGVBNLUL.mjs} +4 -4
  6. package/dist/{api-key-management-list-KC5GOWAU.mjs → api-key-management-list-ROIJIIPQ.mjs} +4 -4
  7. package/dist/{api-key-management-sales-channels-LUB5G6RC.mjs → api-key-management-sales-channels-7P5L45AT.mjs} +6 -6
  8. package/dist/app.css +33 -3
  9. package/dist/app.js +18467 -16698
  10. package/dist/app.mjs +13 -13
  11. package/dist/{campaign-create-FJOECKGT.mjs → campaign-create-EZGZ4SBQ.mjs} +3 -3
  12. package/dist/{campaign-detail-5Q4BYCPX.mjs → campaign-detail-NFKLFPY4.mjs} +12 -12
  13. package/dist/{categories-metadata-J7M3XWI7.mjs → categories-metadata-G7BACZ26.mjs} +12 -12
  14. package/dist/{category-create-KHJZSC7G.mjs → category-create-7MV25HYX.mjs} +6 -6
  15. package/dist/{category-detail-S5IPXMHX.mjs → category-detail-XJQQ7UU4.mjs} +14 -14
  16. package/dist/{category-edit-CTA2EPDG.mjs → category-edit-LV7EARAB.mjs} +3 -3
  17. package/dist/{category-list-QBYJ4T3R.mjs → category-list-NIVLV5S3.mjs} +6 -6
  18. package/dist/{category-organize-SXP33XET.mjs → category-organize-SCRGWKDG.mjs} +3 -3
  19. package/dist/{category-products-KPW6BA5J.mjs → category-products-FXFSMCR6.mjs} +13 -13
  20. package/dist/{chunk-OXPE5TAY.mjs → chunk-24C2YVFU.mjs} +1 -1
  21. package/dist/{chunk-4JQR6QNW.mjs → chunk-333HK6Y6.mjs} +2 -2
  22. package/dist/{chunk-DODQ3KJT.mjs → chunk-3RRA56WC.mjs} +8 -3
  23. package/dist/{chunk-5LGRZSEH.mjs → chunk-3YPZ3R4U.mjs} +1 -1
  24. package/dist/chunk-5BUFAGKR.mjs +13 -0
  25. package/dist/{chunk-2DULKOPN.mjs → chunk-5ISRTMYH.mjs} +1 -1
  26. package/dist/{chunk-PHLCT2HA.mjs → chunk-5ZPKY5XP.mjs} +1 -1
  27. package/dist/{chunk-U6G4M5LP.mjs → chunk-6EXKKRZY.mjs} +1 -1
  28. package/dist/{chunk-GRZSG4EP.mjs → chunk-74WPAWMW.mjs} +127 -226
  29. package/dist/{chunk-UULAOAFM.mjs → chunk-772OR7OQ.mjs} +358 -242
  30. package/dist/chunk-7AXHHXCX.mjs +4 -0
  31. package/dist/{chunk-BMS2QLJY.mjs → chunk-BMJ5RYIO.mjs} +1 -1
  32. package/dist/{chunk-Y2YVTIJI.mjs → chunk-CW5PQUJ6.mjs} +1 -1
  33. package/dist/{chunk-IAV7IKJ6.mjs → chunk-DN5BRKVN.mjs} +1 -1
  34. package/dist/{chunk-RS7DWLEP.mjs → chunk-DQUXK4WW.mjs} +1 -1
  35. package/dist/{chunk-2XTBDCGE.mjs → chunk-DWH2OQFK.mjs} +1 -1
  36. package/dist/{chunk-CCQD65EY.mjs → chunk-FKNW5MLZ.mjs} +360 -288
  37. package/dist/{chunk-HTCYX4VD.mjs → chunk-G35UUG2P.mjs} +1 -1
  38. package/dist/{chunk-QKALAT7P.mjs → chunk-GGONMC2N.mjs} +1 -1
  39. package/dist/{chunk-FYWHE3W5.mjs → chunk-GJN5SXGZ.mjs} +1 -1
  40. package/dist/{chunk-CVHJAKLQ.mjs → chunk-HDO2UCKF.mjs} +1 -1
  41. package/dist/{chunk-3C6WQ7NH.mjs → chunk-IWNNQ6HA.mjs} +37 -3
  42. package/dist/{chunk-OL24RDYM.mjs → chunk-KHJL6MUQ.mjs} +8 -8
  43. package/dist/{chunk-6P4Q4AAP.mjs → chunk-KPI4WFJU.mjs} +3 -3
  44. package/dist/{chunk-AHZLMCZF.mjs → chunk-KSDXSKJ7.mjs} +1 -1
  45. package/dist/{chunk-BZKI5J2M.mjs → chunk-L7A2JIQY.mjs} +3 -3
  46. package/dist/{chunk-XY7A7GZJ.mjs → chunk-LEAMWI5H.mjs} +1 -1
  47. package/dist/{chunk-A4XYK3MY.mjs → chunk-LG5B2BVB.mjs} +2 -2
  48. package/dist/{chunk-23GTCEOV.mjs → chunk-ML7BA2NY.mjs} +1 -1
  49. package/dist/{chunk-OFN7DIZA.mjs → chunk-OYHFHBNL.mjs} +94 -7
  50. package/dist/{chunk-OSHH5GAS.mjs → chunk-Q34TRFIW.mjs} +1 -13
  51. package/dist/{chunk-UJ2TMPV4.mjs → chunk-QBIQEVTU.mjs} +0 -12
  52. package/dist/{chunk-YYOPBKME.mjs → chunk-QHRAWZGA.mjs} +3 -3
  53. package/dist/{chunk-A2WBKOXJ.mjs → chunk-SO2DE6MM.mjs} +2 -2
  54. package/dist/{chunk-EHU67PIM.mjs → chunk-TOCMU7UV.mjs} +7 -3
  55. package/dist/{chunk-YIOBBZUB.mjs → chunk-U7KANQ5A.mjs} +2 -2
  56. package/dist/{chunk-Z6BFNHEO.mjs → chunk-UCYUWNJL.mjs} +109 -62
  57. package/dist/{chunk-WYATCUOM.mjs → chunk-V2RGYIAG.mjs} +10 -10
  58. package/dist/{chunk-UWY5ZV66.mjs → chunk-VQ73B7ZZ.mjs} +1 -13
  59. package/dist/chunk-XD72PXRS.mjs +329 -0
  60. package/dist/{store-add-locales-VJ4RJ7UI.mjs → chunk-YFXI6CWD.mjs} +2 -67
  61. package/dist/{chunk-AWRCV3ME.mjs → chunk-YM4XGCHB.mjs} +1 -1
  62. package/dist/{chunk-ZMG5B4FG.mjs → chunk-ZGV5NOTE.mjs} +1 -1
  63. package/dist/{collection-add-products-FU2BS3D3.mjs → collection-add-products-YDMBU2JY.mjs} +13 -13
  64. package/dist/{collection-create-GWKWVT7B.mjs → collection-create-RXHEXU6T.mjs} +3 -3
  65. package/dist/{collection-detail-VJE7XHLV.mjs → collection-detail-75XPGVOX.mjs} +13 -13
  66. package/dist/{collection-edit-EZIO2BR5.mjs → collection-edit-CGF47VIN.mjs} +3 -3
  67. package/dist/{collection-list-IGA6SCNF.mjs → collection-list-75N5NYXQ.mjs} +18 -17
  68. package/dist/{collection-metadata-QK7MI3D2.mjs → collection-metadata-TGGC6HM2.mjs} +12 -12
  69. package/dist/{customer-detail-MOV2T3LF.mjs → customer-detail-KDLZ23B3.mjs} +17 -16
  70. package/dist/{customer-group-detail-6T7OXGQD.mjs → customer-group-detail-ZIAVMOYS.mjs} +12 -12
  71. package/dist/{customer-group-list-AJEAF5D2.mjs → customer-group-list-BDDC5VVZ.mjs} +15 -15
  72. package/dist/{customers-add-customer-group-QVTVSQYM.mjs → customers-add-customer-group-B3ASQGP6.mjs} +12 -12
  73. package/dist/{edit-inventory-item-H7DAZWIT.mjs → edit-inventory-item-OKAXQRJ5.mjs} +2 -2
  74. package/dist/{edit-inventory-item-attributes-7HTXXPGZ.mjs → edit-inventory-item-attributes-FVWDV6O5.mjs} +2 -2
  75. package/dist/{edit-reservation-OVTRZHJR.mjs → edit-reservation-3PU6YSNJ.mjs} +3 -3
  76. package/dist/{edit-rules-SMVRTCUP.mjs → edit-rules-LOJ3P4YB.mjs} +14 -14
  77. package/dist/en.json +73 -5
  78. package/dist/{inventory-create-ANYUM4P5.mjs → inventory-create-C2WWS7QR.mjs} +13 -13
  79. package/dist/{inventory-detail-ZPSEMYI2.mjs → inventory-detail-AKOZ4T3Z.mjs} +12 -12
  80. package/dist/{inventory-list-RXJPSVZE.mjs → inventory-list-DRFJIU2O.mjs} +2 -2
  81. package/dist/{inventory-metadata-FNEJ3RAT.mjs → inventory-metadata-N6CJZEWD.mjs} +12 -12
  82. package/dist/{inventory-stock-FD4ZM4BB.mjs → inventory-stock-IJ2N7LKC.mjs} +14 -14
  83. package/dist/{location-detail-N3GUZSY7.mjs → location-detail-PL4Y43RS.mjs} +16 -16
  84. package/dist/{location-fulfillment-providers-7ZUJAGNY.mjs → location-fulfillment-providers-2PLOVSXC.mjs} +17 -16
  85. package/dist/{location-sales-channels-P3QJTFDT.mjs → location-sales-channels-SZARSLWT.mjs} +5 -5
  86. package/dist/{location-service-zone-shipping-option-create-ZJ4GIBTJ.mjs → location-service-zone-shipping-option-create-CUNSAP24.mjs} +15 -15
  87. package/dist/{location-service-zone-shipping-option-edit-4CGPQ3VT.mjs → location-service-zone-shipping-option-edit-OJ462SVM.mjs} +1 -1
  88. package/dist/{location-service-zone-shipping-option-pricing-CR4BVYG3.mjs → location-service-zone-shipping-option-pricing-5HN2Z5RB.mjs} +2 -2
  89. package/dist/login-VBUNWZHI.mjs +301 -0
  90. package/dist/{manage-locations-7HH6R4UP.mjs → manage-locations-JPCSBA5D.mjs} +2 -2
  91. package/dist/{order-allocate-items-HZGGYJ42.mjs → order-allocate-items-6QHQASQJ.mjs} +4 -4
  92. package/dist/{order-create-claim-SCDJGM46.mjs → order-create-claim-ECVSH5GC.mjs} +22 -22
  93. package/dist/{order-create-edit-JIE3HDHP.mjs → order-create-edit-EVIOJIXE.mjs} +14 -13
  94. package/dist/{order-create-exchange-LQU4YN7F.mjs → order-create-exchange-ZVYYOGI3.mjs} +22 -22
  95. package/dist/{order-create-fulfillment-OWUVTZXW.mjs → order-create-fulfillment-FDIFEV6X.mjs} +16 -16
  96. package/dist/{order-create-refund-Q6HQY42R.mjs → order-create-refund-TNPGKR5P.mjs} +17 -17
  97. package/dist/{order-create-return-52GHGW5Z.mjs → order-create-return-NR6XQLDD.mjs} +9 -9
  98. package/dist/{order-create-shipment-WAGGEPRW.mjs → order-create-shipment-UP3WGRWB.mjs} +12 -12
  99. package/dist/{order-detail-PVPGEWGY.mjs → order-detail-F6D5DV74.mjs} +28 -28
  100. package/dist/{order-edit-billing-address-UM76J4KX.mjs → order-edit-billing-address-D4AJ6Z5Q.mjs} +44 -12
  101. package/dist/{order-edit-email-CL3KNOCM.mjs → order-edit-email-MXYA5BII.mjs} +12 -12
  102. package/dist/{order-edit-shipping-address-PIESTGVL.mjs → order-edit-shipping-address-GKW2ZPGR.mjs} +42 -12
  103. package/dist/{order-export-LE363ZLB.mjs → order-export-KQUI2TK7.mjs} +14 -14
  104. package/dist/{order-list-GRLQWN4L.mjs → order-list-7A5UKGXR.mjs} +11 -11
  105. package/dist/{order-metadata-FHBB7MTG.mjs → order-metadata-2IXELA7C.mjs} +12 -12
  106. package/dist/{order-receive-return-PRVKP6J2.mjs → order-receive-return-XXHOXGDC.mjs} +13 -13
  107. package/dist/{order-request-transfer-XSAGRUMT.mjs → order-request-transfer-2ENR64VR.mjs} +13 -13
  108. package/dist/{price-list-configuration-6S3MLNXQ.mjs → price-list-configuration-BZ3ZH5FY.mjs} +3 -3
  109. package/dist/{price-list-create-MFRUQADC.mjs → price-list-create-GFGNP6OS.mjs} +16 -16
  110. package/dist/{price-list-detail-Q5VG5VGW.mjs → price-list-detail-SNNOR5N7.mjs} +17 -17
  111. package/dist/{price-list-edit-53UW35L3.mjs → price-list-edit-YW5BXBF2.mjs} +3 -3
  112. package/dist/{price-list-list-DG5YEZ44.mjs → price-list-list-OF562HME.mjs} +4 -4
  113. package/dist/{price-list-prices-add-SDU5YZAT.mjs → price-list-prices-add-F7A2EV7L.mjs} +15 -15
  114. package/dist/{price-list-prices-edit-5USQR4D4.mjs → price-list-prices-edit-PQ26MOJE.mjs} +5 -5
  115. package/dist/{product-attributes-K4FGFORS.mjs → product-attributes-HO2B4OHP.mjs} +13 -13
  116. package/dist/{product-create-7YTRHZQQ.mjs → product-create-UEVW5JO4.mjs} +485 -561
  117. package/dist/{product-create-variant-ERKHTEJZ.mjs → product-create-variant-PLZ5Q2R6.mjs} +14 -14
  118. package/dist/{product-detail-32ZXNWOP.mjs → product-detail-Z7K5TGZY.mjs} +45 -66
  119. package/dist/{product-edit-FBAKONMR.mjs → product-edit-6I6JG4GP.mjs} +13 -13
  120. package/dist/{product-export-5AD7NELI.mjs → product-export-UMMROQ7T.mjs} +18 -17
  121. package/dist/{product-image-variants-edit-M6QF2RLE.mjs → product-image-variants-edit-VRG3AJID.mjs} +12 -12
  122. package/dist/{product-import-V3KQN4TV.mjs → product-import-EPS4KDID.mjs} +12 -12
  123. package/dist/{product-list-EUWZIFTM.mjs → product-list-37O7VB2L.mjs} +20 -20
  124. package/dist/{product-media-3VJ7KENL.mjs → product-media-IV5NUSLW.mjs} +3 -3
  125. package/dist/{product-metadata-GL2MVPDI.mjs → product-metadata-KTVRI7B3.mjs} +12 -12
  126. package/dist/product-option-create-C5BPN6P6.mjs +268 -0
  127. package/dist/product-option-detail-VVK3YBCE.mjs +331 -0
  128. package/dist/product-option-edit-7FQSKI2R.mjs +325 -0
  129. package/dist/product-option-list-YHGRI7OJ.mjs +268 -0
  130. package/dist/product-option-metadata-P2DHDGYR.mjs +73 -0
  131. package/dist/product-options-manage-B4N54NCR.mjs +358 -0
  132. package/dist/{product-organization-IUSVX22S.mjs → product-organization-L23V4JA7.mjs} +15 -15
  133. package/dist/{product-prices-4C36AG4R.mjs → product-prices-GUO3KM2U.mjs} +3 -3
  134. package/dist/{product-sales-channels-PPXUG4KT.mjs → product-sales-channels-BOZD3AC3.mjs} +5 -5
  135. package/dist/{product-shipping-profile-ETQFZ7DC.mjs → product-shipping-profile-FNFRDY47.mjs} +3 -3
  136. package/dist/{product-stock-VEGE6SUZ.mjs → product-stock-2DNYG73L.mjs} +14 -14
  137. package/dist/{product-tag-create-PQMDDKWH.mjs → product-tag-create-CW7GUCZW.mjs} +12 -12
  138. package/dist/{product-tag-detail-I3MBZX7U.mjs → product-tag-detail-IB5VIZ3K.mjs} +26 -25
  139. package/dist/{product-tag-edit-K3BBQLJR.mjs → product-tag-edit-ZSXD3DOC.mjs} +12 -12
  140. package/dist/{product-tag-list-JUWSOMB7.mjs → product-tag-list-MJO5PURP.mjs} +24 -23
  141. package/dist/{product-tag-metadata-MJH5LH7E.mjs → product-tag-metadata-DAKCXWZF.mjs} +12 -12
  142. package/dist/{product-type-create-DRFXTL5O.mjs → product-type-create-NRLNMABQ.mjs} +2 -2
  143. package/dist/{product-type-detail-RKHT5NBL.mjs → product-type-detail-J2IMAZW6.mjs} +14 -14
  144. package/dist/{product-type-edit-SRHCZDK7.mjs → product-type-edit-BHTPMMVI.mjs} +2 -2
  145. package/dist/{product-type-list-QQKAHBJ3.mjs → product-type-list-MQ2PW2IE.mjs} +3 -3
  146. package/dist/{product-type-metadata-CDJDFFGQ.mjs → product-type-metadata-BCZMUG3K.mjs} +12 -12
  147. package/dist/{product-variant-detail-XAYG5CKE.mjs → product-variant-detail-4L6DHT3K.mjs} +12 -12
  148. package/dist/{product-variant-edit-DEZEY2H2.mjs → product-variant-edit-PZU4P65H.mjs} +13 -13
  149. package/dist/{product-variant-manage-inventory-items-Y2VEOHP7.mjs → product-variant-manage-inventory-items-E3GPBPEZ.mjs} +3 -3
  150. package/dist/{product-variant-media-2WLVNGI4.mjs → product-variant-media-BSNCO642.mjs} +2 -2
  151. package/dist/{product-variant-metadata-VTZDNWUT.mjs → product-variant-metadata-FHGGZGPV.mjs} +12 -12
  152. package/dist/{promotion-add-campaign-DO67QK6M.mjs → promotion-add-campaign-NQSIFI33.mjs} +3 -3
  153. package/dist/{promotion-create-HWFNUQXG.mjs → promotion-create-GBZWJVAI.mjs} +24 -21
  154. package/dist/{promotion-detail-QC36KXB3.mjs → promotion-detail-W2OGUESO.mjs} +12 -12
  155. package/dist/{refund-reason-create-YHCDEHGQ.mjs → refund-reason-create-DLVRT5OU.mjs} +12 -12
  156. package/dist/{refund-reason-edit-CZ5QZ2SZ.mjs → refund-reason-edit-XCSU7RMH.mjs} +12 -12
  157. package/dist/{refund-reason-list-OJYYEYJE.mjs → refund-reason-list-G6UNVGPG.mjs} +18 -18
  158. package/dist/{region-create-NA7Y2LN4.mjs → region-create-2CRTF7HJ.mjs} +1 -1
  159. package/dist/{region-edit-WAU347DP.mjs → region-edit-IB3PJE7V.mjs} +1 -1
  160. package/dist/{region-metadata-H6XXUQ4S.mjs → region-metadata-WBEUKOI6.mjs} +12 -12
  161. package/dist/{reservation-create-ZCIYM6JI.mjs → reservation-create-ERFJUBME.mjs} +4 -4
  162. package/dist/{reservation-detail-LZAQL4XA.mjs → reservation-detail-Y6UZRZXY.mjs} +12 -12
  163. package/dist/{reservation-list-B47DXTA7.mjs → reservation-list-LEDZB7KL.mjs} +3 -3
  164. package/dist/{reservation-metadata-5HZSDDOK.mjs → reservation-metadata-7KH4EXMN.mjs} +12 -12
  165. package/dist/{return-reason-list-SCBGTOEI.mjs → return-reason-list-UUQAL464.mjs} +6 -6
  166. package/dist/{sales-channel-add-products-F7YV4MO5.mjs → sales-channel-add-products-GSPG7OTK.mjs} +14 -14
  167. package/dist/{sales-channel-create-MI7HHZYE.mjs → sales-channel-create-MM237EBQ.mjs} +3 -3
  168. package/dist/{sales-channel-detail-MXIPZCGA.mjs → sales-channel-detail-65ZFV2OI.mjs} +14 -14
  169. package/dist/{sales-channel-edit-VSHOIR37.mjs → sales-channel-edit-AC2J4N3M.mjs} +3 -3
  170. package/dist/{sales-channel-list-RLGL7FM3.mjs → sales-channel-list-LXLW7X3U.mjs} +14 -14
  171. package/dist/{sales-channel-metadata-M364R4RJ.mjs → sales-channel-metadata-QUAL2RH6.mjs} +13 -13
  172. package/dist/{shipping-option-type-create-C5WUWON7.mjs → shipping-option-type-create-EU75JC2Q.mjs} +12 -12
  173. package/dist/{shipping-option-type-detail-PENS2K73.mjs → shipping-option-type-detail-5GYEWATD.mjs} +13 -13
  174. package/dist/{shipping-option-type-edit-CIU5EHRP.mjs → shipping-option-type-edit-YR4JXT5M.mjs} +12 -12
  175. package/dist/{shipping-option-type-list-DIOX7VG7.mjs → shipping-option-type-list-BLC4Z5QW.mjs} +13 -13
  176. package/dist/{shipping-profile-metadata-75G2NNMA.mjs → shipping-profile-metadata-64YRWPDA.mjs} +12 -12
  177. package/dist/store-add-locales-TSMLNFZP.mjs +81 -0
  178. package/dist/{store-detail-JSNPOB2F.mjs → store-detail-3SS53LZR.mjs} +13 -13
  179. package/dist/{store-edit-5ZS562ZO.mjs → store-edit-SMEWFETF.mjs} +1 -1
  180. package/dist/{store-metadata-CYXTVJUE.mjs → store-metadata-IJGVDDA6.mjs} +12 -12
  181. package/dist/{tax-region-create-DWGL4EUT.mjs → tax-region-create-XLYIS5XX.mjs} +13 -13
  182. package/dist/{tax-region-detail-2AE2EFI3.mjs → tax-region-detail-66FKEGFB.mjs} +29 -28
  183. package/dist/{tax-region-edit-EEVEEU2Q.mjs → tax-region-edit-GBR4EDW7.mjs} +13 -13
  184. package/dist/{tax-region-province-detail-4ERSEQFF.mjs → tax-region-province-detail-OBA7Q7MQ.mjs} +29 -28
  185. package/dist/{tax-region-tax-override-create-PHCGEF7V.mjs → tax-region-tax-override-create-34WYD2QZ.mjs} +28 -27
  186. package/dist/{tax-region-tax-override-edit-SMRPSILC.mjs → tax-region-tax-override-edit-6WJVOGWA.mjs} +27 -26
  187. package/dist/translation-list-J65VNNAX.mjs +527 -0
  188. package/dist/{translations-edit-KECSHYZY.mjs → translations-edit-6P3KC4MO.mjs} +280 -304
  189. package/dist/{user-detail-BJUXLZZQ.mjs → user-detail-VMOJFHIJ.mjs} +2 -2
  190. package/dist/{user-metadata-2WPJOEJA.mjs → user-metadata-UOPVFX2L.mjs} +12 -12
  191. package/dist/{workflow-execution-detail-H2AKEZJX.mjs → workflow-execution-detail-WAQ7IG4T.mjs} +12 -12
  192. package/package.json +9 -9
  193. package/src/components/data-grid/components/data-grid-cell-container.tsx +7 -10
  194. package/src/components/data-grid/components/data-grid-multiline-cell.tsx +103 -0
  195. package/src/components/data-grid/components/data-grid-readonly-cell.tsx +1 -4
  196. package/src/components/data-grid/components/data-grid-root.tsx +68 -51
  197. package/src/components/data-grid/components/data-grid-text-cell.tsx +6 -76
  198. package/src/components/data-grid/components/index.ts +1 -0
  199. package/src/components/data-grid/data-grid.tsx +2 -0
  200. package/src/components/data-grid/hooks/use-data-grid-cell.tsx +12 -0
  201. package/src/components/data-grid/hooks/use-data-grid-form-handlers.tsx +1 -0
  202. package/src/components/data-grid/hooks/use-data-grid-keydown-event.tsx +65 -7
  203. package/src/components/data-grid/types.ts +1 -0
  204. package/src/components/inputs/combobox/combobox.tsx +185 -95
  205. package/src/components/layout/main-layout/main-layout.tsx +7 -4
  206. package/src/components/table/table-cells/order/country-cell/country-cell.tsx +5 -1
  207. package/src/dashboard-app/routes/get-route.map.tsx +68 -12
  208. package/src/hooks/api/cloud.tsx +41 -0
  209. package/src/hooks/api/index.ts +3 -1
  210. package/src/hooks/api/product-options.tsx +151 -0
  211. package/src/hooks/api/products.tsx +26 -66
  212. package/src/hooks/api/translations.tsx +103 -191
  213. package/src/hooks/table/columns/use-order-table-columns.tsx +5 -3
  214. package/src/hooks/table/columns/use-product-option-table-columns.tsx +44 -0
  215. package/src/hooks/table/filters/index.ts +1 -0
  216. package/src/hooks/table/filters/use-product-option-table-filters.tsx +33 -0
  217. package/src/hooks/table/query/use-product-option-table-query.tsx +34 -0
  218. package/src/i18n/translations/$schema.json +290 -32
  219. package/src/i18n/translations/en.json +73 -5
  220. package/src/i18n/translations/es.json +9 -1
  221. package/src/routes/customers/customer-detail/components/customer-order-section/customer-order-section.tsx +1 -1
  222. package/src/routes/login/components/cloud-auth-login.tsx +114 -0
  223. package/src/routes/login/login.tsx +9 -1
  224. package/src/routes/orders/order-create-edit/components/order-edit-create-form/order-edit-item.tsx +1 -0
  225. package/src/routes/orders/order-edit-billing-address/components/edit-order-billing-address-form/edit-order-billing-address-form.tsx +34 -0
  226. package/src/routes/orders/order-edit-shipping-address/components/edit-order-shipping-address-form/edit-order-shipping-address-form.tsx +32 -0
  227. package/src/routes/product-options/common/hooks/use-delete-product-option-action.tsx +41 -0
  228. package/src/routes/product-options/product-option-create/components/create-product-option-form/create-product-option-details.tsx +71 -0
  229. package/src/routes/product-options/product-option-create/components/create-product-option-form/create-product-option-form.tsx +97 -0
  230. package/src/routes/product-options/product-option-create/components/create-product-option-form/create-product-option-organize.tsx +92 -0
  231. package/src/routes/product-options/product-option-create/components/create-product-option-form/index.ts +1 -0
  232. package/src/routes/product-options/product-option-create/components/create-product-option-form/schema.ts +15 -0
  233. package/src/routes/product-options/product-option-create/index.ts +1 -0
  234. package/src/routes/product-options/product-option-create/product-option-create.tsx +10 -0
  235. package/src/routes/product-options/product-option-detail/breadcrumb.tsx +14 -0
  236. package/src/routes/product-options/product-option-detail/components/product-option-general-section/index.ts +1 -0
  237. package/src/routes/product-options/product-option-detail/components/product-option-general-section/product-option-general-section.tsx +84 -0
  238. package/src/routes/product-options/product-option-detail/components/product-option-product-section/index.ts +1 -0
  239. package/src/routes/product-options/product-option-detail/components/product-option-product-section/product-option-product-section.tsx +82 -0
  240. package/src/routes/product-options/product-option-detail/index.ts +3 -0
  241. package/src/routes/product-options/product-option-detail/loader.ts +18 -0
  242. package/src/routes/product-options/product-option-detail/product-option-detail.tsx +50 -0
  243. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/edit-product-option-details.tsx +94 -0
  244. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/edit-product-option-form.tsx +116 -0
  245. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/edit-product-option-organize.tsx +77 -0
  246. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/index.ts +1 -0
  247. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/schema.ts +13 -0
  248. package/src/routes/product-options/product-option-edit/index.ts +1 -0
  249. package/src/routes/product-options/product-option-edit/product-option-edit.tsx +34 -0
  250. package/src/routes/product-options/product-option-list/components/product-option-list-table/index.ts +1 -0
  251. package/src/routes/product-options/product-option-list/components/product-option-list-table/product-option-list-table.tsx +140 -0
  252. package/src/routes/product-options/product-option-list/index.ts +1 -0
  253. package/src/routes/product-options/product-option-list/product-option-list.tsx +19 -0
  254. package/src/routes/product-options/product-option-metadata/index.ts +1 -0
  255. package/src/routes/product-options/product-option-metadata/product-option-metadata.tsx +27 -0
  256. package/src/routes/products/product-create/components/product-create-details-form/components/product-create-details-general-section/product-create-general-section.tsx +16 -4
  257. package/src/routes/products/product-create/components/product-create-details-form/components/product-create-details-variant-section/product-create-details-variant-section.tsx +327 -194
  258. package/src/routes/products/product-create/components/product-create-form/product-create-form.tsx +4 -7
  259. package/src/routes/products/product-create/constants.ts +2 -0
  260. package/src/routes/products/product-create/utils.ts +6 -1
  261. package/src/routes/products/product-detail/components/product-option-section/product-option-section.tsx +33 -51
  262. package/src/routes/products/product-options-manage/components/product-options-manage-form/index.ts +1 -0
  263. package/src/routes/products/product-options-manage/components/product-options-manage-form/product-options-manage-form.tsx +328 -0
  264. package/src/routes/products/product-options-manage/index.ts +1 -0
  265. package/src/routes/products/product-options-manage/product-options-manage.tsx +35 -0
  266. package/src/routes/promotions/promotion-create/components/create-promotion-form/create-promotion-form.tsx +6 -0
  267. package/src/routes/translations/add-locales/add-locales.tsx +29 -0
  268. package/src/routes/translations/add-locales/index.tsx +1 -0
  269. package/src/routes/translations/translation-list/components/active-locales-section/active-locales-section.tsx +42 -17
  270. package/src/routes/translations/translation-list/components/translation-list-section/translation-list-section.tsx +5 -1
  271. package/src/routes/translations/translation-list/components/translations-completion-section/translations-completion-section.tsx +182 -121
  272. package/src/routes/translations/translations-edit/components/translations-edit-form/translations-edit-form.tsx +330 -361
  273. package/src/routes/translations/translations-edit/translations-edit.tsx +8 -13
  274. package/dist/chunk-HGRIOEAR.mjs +0 -32
  275. package/dist/chunk-XDJ7OMBR.mjs +0 -160
  276. package/dist/login-VNOLI5YG.mjs +0 -201
  277. package/dist/product-create-option-7AOXAA4S.mjs +0 -151
  278. package/dist/product-edit-option-LWJT3CYJ.mjs +0 -156
  279. package/dist/translation-list-UF7FLXOW.mjs +0 -441
  280. package/src/routes/products/product-create-option/components/create-product-option-form/create-product-option-form.tsx +0 -122
  281. package/src/routes/products/product-create-option/components/create-product-option-form/index.ts +0 -1
  282. package/src/routes/products/product-create-option/index.ts +0 -1
  283. package/src/routes/products/product-create-option/product-create-option.tsx +0 -30
  284. package/src/routes/products/product-edit-option/components/edit-product-option-form/edit-product-option-form.tsx +0 -123
  285. package/src/routes/products/product-edit-option/components/edit-product-option-form/index.ts +0 -1
  286. package/src/routes/products/product-edit-option/index.ts +0 -1
  287. package/src/routes/products/product-edit-option/product-edit-option.tsx +0 -35
  288. package/dist/{chunk-FBYTX6K7.mjs → chunk-ORWRXJJT.mjs} +4 -4
  289. package/dist/{location-list-KVBA6J47.mjs → location-list-3WP65J3E.mjs} +1 -1
  290. package/dist/{user-list-YTZQNYSO.mjs → user-list-3EAKK4XC.mjs} +3 -3
@@ -211,7 +211,22 @@ export const useDataGridKeydownEvent = <
211
211
  [rangeEnd, matrix, getSelectionValues, setSelectionValues, execute]
212
212
  )
213
213
 
214
- const handleSpaceKeyTextOrNumber = useCallback(
214
+ const handleSpaceKeyText = useCallback(
215
+ (anchor: DataGridCoordinates) => {
216
+ const field = matrix.getCellField(anchor)
217
+ const input = queryTool?.getInput(anchor)
218
+
219
+ if (!field || !input) {
220
+ return
221
+ }
222
+
223
+ createSnapshot(anchor)
224
+ input.focus()
225
+ },
226
+ [matrix, queryTool, createSnapshot]
227
+ )
228
+
229
+ const handleSpaceKeyNumber = useCallback(
215
230
  (anchor: DataGridCoordinates) => {
216
231
  const field = matrix.getCellField(anchor)
217
232
  const input = queryTool?.getInput(anchor)
@@ -303,9 +318,12 @@ export const useDataGridKeydownEvent = <
303
318
  case "togglable-number":
304
319
  handleSpaceKeyTogglableNumber(anchor)
305
320
  break
306
- case "number":
307
321
  case "text":
308
- handleSpaceKeyTextOrNumber(anchor)
322
+ case "multiline-text":
323
+ handleSpaceKeyText(anchor)
324
+ break
325
+ case "number":
326
+ handleSpaceKeyNumber(anchor)
309
327
  break
310
328
  }
311
329
  },
@@ -314,7 +332,8 @@ export const useDataGridKeydownEvent = <
314
332
  isEditing,
315
333
  matrix,
316
334
  handleSpaceKeyBoolean,
317
- handleSpaceKeyTextOrNumber,
335
+ handleSpaceKeyText,
336
+ handleSpaceKeyNumber,
318
337
  handleSpaceKeyTogglableNumber,
319
338
  ]
320
339
  )
@@ -384,6 +403,30 @@ export const useDataGridKeydownEvent = <
384
403
  [handleMoveOnEnter, handleEditOnEnter, isEditing]
385
404
  )
386
405
 
406
+ /**
407
+ * Handles the enter key for multiline-text cells.
408
+ *
409
+ * The behavior is as follows:
410
+ * - If Shift+Enter is pressed while editing, allow the newline (don't prevent default).
411
+ * - If Enter is pressed while editing (without Shift), move to the next cell.
412
+ * - If the cell is currently not being edited, start editing the cell.
413
+ */
414
+ const handleEnterKeyMultilineText = useCallback(
415
+ (e: KeyboardEvent, anchor: DataGridCoordinates) => {
416
+ if (isEditing) {
417
+ if (e.shiftKey) {
418
+ return
419
+ }
420
+
421
+ handleMoveOnEnter(e, anchor)
422
+ return
423
+ }
424
+
425
+ handleEditOnEnter(anchor)
426
+ },
427
+ [handleMoveOnEnter, handleEditOnEnter, isEditing]
428
+ )
429
+
387
430
  /**
388
431
  * Handles the enter key for boolean cells.
389
432
  *
@@ -432,11 +475,18 @@ export const useDataGridKeydownEvent = <
432
475
  return
433
476
  }
434
477
 
435
- e.preventDefault()
436
-
437
478
  const type = matrix.getCellType(anchor)
438
479
 
480
+ if (type === "multiline-text" && isEditing && e.shiftKey) {
481
+ return
482
+ }
483
+
484
+ e.preventDefault()
485
+
439
486
  switch (type) {
487
+ case "multiline-text":
488
+ handleEnterKeyMultilineText(e, anchor)
489
+ break
440
490
  case "togglable-number":
441
491
  case "text":
442
492
  case "number":
@@ -448,7 +498,14 @@ export const useDataGridKeydownEvent = <
448
498
  }
449
499
  }
450
500
  },
451
- [anchor, matrix, handleEnterKeyTextOrNumber, handleEnterKeyBoolean]
501
+ [
502
+ anchor,
503
+ matrix,
504
+ isEditing,
505
+ handleEnterKeyTextOrNumber,
506
+ handleEnterKeyBoolean,
507
+ handleEnterKeyMultilineText,
508
+ ]
452
509
  )
453
510
 
454
511
  const handleDeleteKeyTogglableNumber = useCallback(
@@ -526,6 +583,7 @@ export const useDataGridKeydownEvent = <
526
583
 
527
584
  switch (type) {
528
585
  case "text":
586
+ case "multiline-text":
529
587
  case "number":
530
588
  handleDeleteKeyTextOrNumber(anchor, rangeEnd)
531
589
  break
@@ -16,6 +16,7 @@ import {
16
16
 
17
17
  export type DataGridColumnType =
18
18
  | "text"
19
+ | "multiline-text"
19
20
  | "number"
20
21
  | "boolean"
21
22
  | "togglable-number"
@@ -15,7 +15,7 @@ import {
15
15
  TrianglesMini,
16
16
  XMarkMini,
17
17
  } from "@medusajs/icons"
18
- import { clx, Text } from "@medusajs/ui"
18
+ import { Badge, clx, Text } from "@medusajs/ui"
19
19
  import { matchSorter } from "match-sorter"
20
20
  import {
21
21
  ComponentPropsWithoutRef,
@@ -59,6 +59,7 @@ interface ComboboxProps<T extends Value = Value>
59
59
  noResultsPlaceholder?: ReactNode
60
60
  allowClear?: boolean
61
61
  forceHideInput?: boolean // always hide input -> used for singe value select that don't have query/filter
62
+ displayMode?: "count" | "chips" // how to display multiple selected values
62
63
  }
63
64
 
64
65
  const ComboboxImpl = <T extends Value = string>(
@@ -76,6 +77,7 @@ const ComboboxImpl = <T extends Value = string>(
76
77
  noResultsPlaceholder,
77
78
  allowClear,
78
79
  forceHideInput,
80
+ displayMode = "count",
79
81
  ...inputProps
80
82
  }: ComboboxProps<T>,
81
83
  ref: ForwardedRef<HTMLInputElement>
@@ -112,8 +114,9 @@ const ComboboxImpl = <T extends Value = string>(
112
114
  const exists = options
113
115
  .filter((o) => !o.disabled)
114
116
  .find((o) => {
115
- if (isArrayValue) {
116
- return newValues?.includes(o.value)
117
+ if (isArrayValue && newValues?.length) {
118
+ // only check if the last added value
119
+ return newValues[newValues.length - 1]?.includes(o.value)
117
120
  }
118
121
  return o.value === newValues
119
122
  })
@@ -143,6 +146,15 @@ const ComboboxImpl = <T extends Value = string>(
143
146
  }
144
147
  }
145
148
 
149
+ const handleRemoveValue = (valueToRemove: string) => {
150
+ if (!isArrayValue || !Array.isArray(selectedValues)) {
151
+ return
152
+ }
153
+
154
+ const newValues = selectedValues.filter((v) => v !== valueToRemove) as T
155
+ handleValueChange(newValues)
156
+ }
157
+
146
158
  /**
147
159
  * Filter and sort the options based on the search value,
148
160
  * and whether the value is already selected.
@@ -229,115 +241,193 @@ const ComboboxImpl = <T extends Value = string>(
229
241
  open={open}
230
242
  setOpen={handleOpenChange}
231
243
  selectedValue={selectedValues}
232
- setSelectedValue={(value) => handleValueChange(value as T)}
244
+ setSelectedValue={(value) => {
245
+ // TMP: fix issue where sometimes first element of the array is empty string
246
+ if (Array.isArray(value) && value[0] === "") {
247
+ value.shift()
248
+ }
249
+ handleValueChange(value as T)
250
+ }}
233
251
  value={uncontrolledSearchValue}
234
252
  setValue={(query) => {
235
253
  startTransition(() => handleSearchChange(query))
236
254
  }}
237
255
  >
238
- <div
239
- className={clx(
240
- "relative flex cursor-pointer items-center gap-x-2 overflow-hidden",
241
- "h-8 w-full rounded-md",
242
- "bg-ui-bg-field transition-fg shadow-borders-base",
243
- "has-[input:focus]:shadow-borders-interactive-with-active",
244
- "has-[:invalid]:shadow-borders-error has-[[aria-invalid=true]]:shadow-borders-error",
245
- "has-[:disabled]:bg-ui-bg-disabled has-[:disabled]:text-ui-fg-disabled has-[:disabled]:cursor-not-allowed",
246
- className
247
- )}
248
- style={
249
- {
250
- "--tag-width": `${tagWidth}px`,
251
- } as CSSProperties
252
- }
253
- >
254
- {showTag && (
255
- <button
256
- type="button"
257
- onClick={(e) => {
258
- e.preventDefault()
259
- handleValueChange(isArrayValue ? ([] as unknown as T) : undefined)
260
- }}
261
- className="bg-ui-bg-base hover:bg-ui-bg-base-hover txt-compact-small-plus text-ui-fg-subtle focus-within:border-ui-fg-interactive transition-fg absolute start-0.5 top-0.5 z-[1] flex h-[28px] items-center rounded-[4px] border py-[3px] pe-1 ps-1.5 outline-none"
262
- >
263
- <span className="tabular-nums">{selectedValues.length}</span>
264
- <XMarkMini className="text-ui-fg-muted" />
265
- </button>
266
- )}
267
- <div className="relative flex size-full items-center">
268
- {showSelected && (
269
- <div
256
+ {displayMode === "chips" && isArrayValue ? (
257
+ <div
258
+ className={clx(
259
+ "relative flex cursor-pointer flex-wrap items-center gap-1.5",
260
+ "min-h-8 w-full rounded-md",
261
+ "bg-ui-bg-field transition-fg shadow-borders-base",
262
+ "has-[input:focus]:shadow-borders-interactive-with-active",
263
+ "has-[:invalid]:shadow-borders-error has-[[aria-invalid=true]]:shadow-borders-error",
264
+ "has-[:disabled]:bg-ui-bg-disabled has-[:disabled]:text-ui-fg-disabled has-[:disabled]:cursor-not-allowed",
265
+ "p-1",
266
+ className
267
+ )}
268
+ >
269
+ {Array.isArray(selectedValues) &&
270
+ selectedValues.map((value) => {
271
+ const option = options.find((o) => o.value === value)
272
+ if (!option) return null
273
+
274
+ return (
275
+ <Badge
276
+ key={value}
277
+ size="2xsmall"
278
+ className="transition-fg gap-x-0.5 pl-1.5 pr-1"
279
+ >
280
+ {option.label}
281
+ <button
282
+ tabIndex={-1}
283
+ type="button"
284
+ onClick={(e) => {
285
+ e.preventDefault()
286
+ handleRemoveValue(value)
287
+ }}
288
+ className="text-ui-fg-subtle transition-fg outline-none"
289
+ >
290
+ <XMarkMini />
291
+ </button>
292
+ </Badge>
293
+ )
294
+ })}
295
+ <div className="relative flex min-w-[120px] flex-1 items-center">
296
+ <PrimitiveCombobox
297
+ autoSelect
298
+ ref={comboboxRef}
299
+ onFocus={() => setOpen(true)}
270
300
  className={clx(
271
- "pointer-events-none absolute inset-y-0 flex size-full items-center",
272
- {
273
- "start-[calc(var(--tag-width)+8px)]": showTag,
274
- "start-2": !showTag,
275
- }
301
+ "txt-compact-small text-ui-fg-base !placeholder:text-ui-fg-muted transition-fg size-full cursor-pointer bg-transparent pe-8 ps-1 outline-none focus:cursor-text"
276
302
  )}
303
+ placeholder={
304
+ Array.isArray(selectedValues) && selectedValues.length > 0
305
+ ? undefined
306
+ : placeholder
307
+ }
308
+ {...inputProps}
309
+ />
310
+ </div>
311
+ <PrimitiveComboboxDisclosure
312
+ render={(props) => {
313
+ return (
314
+ <button
315
+ {...props}
316
+ type="button"
317
+ className="text-ui-fg-muted transition-fg hover:bg-ui-bg-field-hover absolute end-0 top-0 flex h-8 w-8 items-center justify-center rounded-r outline-none"
318
+ >
319
+ <TrianglesMini />
320
+ </button>
321
+ )
322
+ }}
323
+ />
324
+ </div>
325
+ ) : (
326
+ <div
327
+ className={clx(
328
+ "relative flex cursor-pointer items-center gap-x-2 overflow-hidden",
329
+ "h-8 w-full rounded-md",
330
+ "bg-ui-bg-field transition-fg shadow-borders-base",
331
+ "has-[input:focus]:shadow-borders-interactive-with-active",
332
+ "has-[:invalid]:shadow-borders-error has-[[aria-invalid=true]]:shadow-borders-error",
333
+ "has-[:disabled]:bg-ui-bg-disabled has-[:disabled]:text-ui-fg-disabled has-[:disabled]:cursor-not-allowed",
334
+ className
335
+ )}
336
+ style={
337
+ {
338
+ "--tag-width": `${tagWidth}px`,
339
+ } as CSSProperties
340
+ }
341
+ >
342
+ {showTag && (
343
+ <button
344
+ type="button"
345
+ onClick={(e) => {
346
+ e.preventDefault()
347
+ handleValueChange(
348
+ isArrayValue ? ([] as unknown as T) : undefined
349
+ )
350
+ }}
351
+ className="bg-ui-bg-base hover:bg-ui-bg-base-hover txt-compact-small-plus text-ui-fg-subtle focus-within:border-ui-fg-interactive transition-fg absolute start-0.5 top-0.5 z-[1] flex h-[28px] items-center rounded-[4px] border py-[3px] pe-1 ps-1.5 outline-none"
277
352
  >
278
- <Text size="small" leading="compact">
279
- {t("general.selected")}
280
- </Text>
281
- </div>
353
+ <span className="tabular-nums">{selectedValues.length}</span>
354
+ <XMarkMini className="text-ui-fg-muted" />
355
+ </button>
282
356
  )}
283
- {hideInput && (
284
- <div
357
+ <div className="relative flex size-full items-center">
358
+ {showSelected && (
359
+ <div
360
+ className={clx(
361
+ "pointer-events-none absolute inset-y-0 flex size-full items-center",
362
+ {
363
+ "start-[calc(var(--tag-width)+8px)]": showTag,
364
+ "start-2": !showTag,
365
+ }
366
+ )}
367
+ >
368
+ <Text size="small" leading="compact">
369
+ {t("general.selected")}
370
+ </Text>
371
+ </div>
372
+ )}
373
+ {hideInput && (
374
+ <div
375
+ className={clx(
376
+ "pointer-events-none absolute inset-y-0 flex size-full items-center overflow-hidden",
377
+ {
378
+ "start-[calc(var(--tag-width)+8px)]": showTag,
379
+ "start-2": !showTag,
380
+ }
381
+ )}
382
+ >
383
+ <Text size="small" leading="compact" className="truncate">
384
+ {selectedLabel}
385
+ </Text>
386
+ </div>
387
+ )}
388
+ <PrimitiveCombobox
389
+ autoSelect
390
+ ref={comboboxRef}
391
+ onFocus={() => setOpen(true)}
285
392
  className={clx(
286
- "pointer-events-none absolute inset-y-0 flex size-full items-center overflow-hidden",
393
+ "txt-compact-small text-ui-fg-base !placeholder:text-ui-fg-muted transition-fg size-full cursor-pointer bg-transparent pe-8 ps-2 outline-none focus:cursor-text",
287
394
  {
288
- "start-[calc(var(--tag-width)+8px)]": showTag,
289
- "start-2": !showTag,
395
+ "opacity-0": hideInput,
396
+ "ps-2": !showTag,
397
+ "ps-[calc(var(--tag-width)+8px)]": showTag,
290
398
  }
291
399
  )}
400
+ placeholder={hidePlaceholder ? undefined : placeholder}
401
+ {...inputProps}
402
+ />
403
+ </div>
404
+ {allowClear && controlledValue && (
405
+ <button
406
+ type="button"
407
+ onClick={(e) => {
408
+ e.preventDefault()
409
+ handleValueChange(undefined)
410
+ }}
411
+ className="bg-ui-bg-base hover:bg-ui-bg-base-hover txt-compact-small-plus text-ui-fg-subtle focus-within:border-ui-fg-interactive transition-fg absolute end-[28px] top-0.5 z-[1] flex h-[28px] items-center rounded-[4px] border px-1.5 py-[2px] outline-none"
292
412
  >
293
- <Text size="small" leading="compact" className="truncate">
294
- {selectedLabel}
295
- </Text>
296
- </div>
413
+ <XMarkMini className="text-ui-fg-muted" />
414
+ </button>
297
415
  )}
298
- <PrimitiveCombobox
299
- autoSelect
300
- ref={comboboxRef}
301
- onFocus={() => setOpen(true)}
302
- className={clx(
303
- "txt-compact-small text-ui-fg-base !placeholder:text-ui-fg-muted transition-fg size-full cursor-pointer bg-transparent pe-8 ps-2 outline-none focus:cursor-text",
304
- "hover:bg-ui-bg-field-hover",
305
- {
306
- "opacity-0": hideInput,
307
- "ps-2": !showTag,
308
- "ps-[calc(var(--tag-width)+8px)]": showTag,
309
- }
310
- )}
311
- placeholder={hidePlaceholder ? undefined : placeholder}
312
- {...inputProps}
416
+ <PrimitiveComboboxDisclosure
417
+ render={(props) => {
418
+ return (
419
+ <button
420
+ {...props}
421
+ type="button"
422
+ className="text-ui-fg-muted transition-fg hover:bg-ui-bg-field-hover absolute end-0 flex size-8 items-center justify-center rounded-r outline-none"
423
+ >
424
+ <TrianglesMini />
425
+ </button>
426
+ )
427
+ }}
313
428
  />
314
429
  </div>
315
- {allowClear && controlledValue && (
316
- <button
317
- type="button"
318
- onClick={(e) => {
319
- e.preventDefault()
320
- handleValueChange(undefined)
321
- }}
322
- className="bg-ui-bg-base hover:bg-ui-bg-base-hover txt-compact-small-plus text-ui-fg-subtle focus-within:border-ui-fg-interactive transition-fg absolute end-[28px] top-0.5 z-[1] flex h-[28px] items-center rounded-[4px] border px-1.5 py-[2px] outline-none"
323
- >
324
- <XMarkMini className="text-ui-fg-muted" />
325
- </button>
326
- )}
327
- <PrimitiveComboboxDisclosure
328
- render={(props) => {
329
- return (
330
- <button
331
- {...props}
332
- type="button"
333
- className="text-ui-fg-muted transition-fg hover:bg-ui-bg-field-hover absolute end-0 flex size-8 items-center justify-center rounded-r outline-none"
334
- >
335
- <TrianglesMini />
336
- </button>
337
- )
338
- }}
339
- />
340
- </div>
430
+ )}
341
431
  <PrimitiveComboboxPopover
342
432
  gutter={4}
343
433
  sameWidth
@@ -1,6 +1,6 @@
1
1
  import {
2
- BuildingStorefront,
3
2
  Buildings,
3
+ BuildingStorefront,
4
4
  ChevronDownMini,
5
5
  CogSixTooth,
6
6
  CurrencyDollar,
@@ -14,7 +14,7 @@ import {
14
14
  Tag,
15
15
  Users,
16
16
  } from "@medusajs/icons"
17
- import { Avatar, Divider, DropdownMenu, Text, clx } from "@medusajs/ui"
17
+ import { Avatar, clx, Divider, DropdownMenu, Text } from "@medusajs/ui"
18
18
  import { Collapsible as RadixCollapsible } from "radix-ui"
19
19
  import { useTranslation } from "react-i18next"
20
20
 
@@ -107,8 +107,7 @@ const Header = () => {
107
107
 
108
108
  return (
109
109
  <div className="w-full p-3">
110
- <DropdownMenu
111
- dir={direction}>
110
+ <DropdownMenu dir={direction}>
112
111
  <DropdownMenu.Trigger
113
112
  disabled={!isLoaded}
114
113
  className={clx(
@@ -206,6 +205,10 @@ const useCoreRoutes = (): Omit<INavItem, "pathname">[] => {
206
205
  label: t("categories.domain"),
207
206
  to: "/categories",
208
207
  },
208
+ {
209
+ label: t("productOptions.domain"),
210
+ to: "/product-options",
211
+ },
209
212
  // TODO: Enable when domin is introduced
210
213
  // {
211
214
  // label: t("giftCards.domain"),
@@ -3,10 +3,14 @@ import ReactCountryFlag from "react-country-flag"
3
3
  import { PlaceholderCell } from "../../common/placeholder-cell"
4
4
  import { HttpTypes } from "@medusajs/types"
5
5
 
6
+ type Country = Omit<HttpTypes.AdminRegionCountry, "id"> & {
7
+ id?: string
8
+ }
9
+
6
10
  export const CountryCell = ({
7
11
  country,
8
12
  }: {
9
- country?: HttpTypes.AdminRegionCountry | null
13
+ country?: Country | null
10
14
  }) => {
11
15
  if (!country) {
12
16
  return <PlaceholderCell />
@@ -136,18 +136,6 @@ export function getRouteMap({
136
136
  lazy: () =>
137
137
  import("../../routes/products/product-prices"),
138
138
  },
139
- {
140
- path: "options/create",
141
- lazy: () =>
142
- import(
143
- "../../routes/products/product-create-option"
144
- ),
145
- },
146
- {
147
- path: "options/:option_id/edit",
148
- lazy: () =>
149
- import("../../routes/products/product-edit-option"),
150
- },
151
139
  {
152
140
  path: "variants/create",
153
141
  lazy: () =>
@@ -165,6 +153,13 @@ export function getRouteMap({
165
153
  lazy: () =>
166
154
  import("../../routes/products/product-metadata"),
167
155
  },
156
+ {
157
+ path: "options/manage",
158
+ lazy: () =>
159
+ import(
160
+ "../../routes/products/product-options-manage"
161
+ ),
162
+ },
168
163
  ],
169
164
  },
170
165
  {
@@ -225,6 +220,63 @@ export function getRouteMap({
225
220
  },
226
221
  ],
227
222
  },
223
+ {
224
+ path: "/product-options",
225
+ errorElement: <ErrorBoundary />,
226
+ handle: {
227
+ breadcrumb: () => t("productOptions.domain"),
228
+ },
229
+ children: [
230
+ {
231
+ path: "",
232
+ lazy: () =>
233
+ import("../../routes/product-options/product-option-list"),
234
+ children: [
235
+ {
236
+ path: "create",
237
+ lazy: () =>
238
+ import(
239
+ "../../routes/product-options/product-option-create"
240
+ ),
241
+ },
242
+ ],
243
+ },
244
+ {
245
+ path: ":id",
246
+ lazy: async () => {
247
+ const { Component, Breadcrumb, loader } = await import(
248
+ "../../routes/product-options/product-option-detail"
249
+ )
250
+
251
+ return {
252
+ Component,
253
+ loader,
254
+ handle: {
255
+ breadcrumb: (match: UIMatch<any>) => (
256
+ <Breadcrumb {...match} />
257
+ ),
258
+ },
259
+ }
260
+ },
261
+ children: [
262
+ {
263
+ path: "edit",
264
+ lazy: () =>
265
+ import(
266
+ "../../routes/product-options/product-option-edit"
267
+ ),
268
+ },
269
+ {
270
+ path: "metadata/edit",
271
+ lazy: () =>
272
+ import(
273
+ "../../routes/product-options/product-option-metadata"
274
+ ),
275
+ },
276
+ ],
277
+ },
278
+ ],
279
+ },
228
280
  {
229
281
  path: "/categories",
230
282
  errorElement: <ErrorBoundary />,
@@ -1857,6 +1909,10 @@ export function getRouteMap({
1857
1909
  lazy: () =>
1858
1910
  import("../../routes/translations/translations-edit"),
1859
1911
  },
1912
+ {
1913
+ path: "add-locales",
1914
+ lazy: () => import("../../routes/translations/add-locales"),
1915
+ },
1860
1916
  ],
1861
1917
  },
1862
1918
  ...(settingsRoutes?.[0]?.children || []),
@@ -0,0 +1,41 @@
1
+ import { FetchError } from "@medusajs/js-sdk"
2
+ import {
3
+ UseMutationOptions,
4
+ UseQueryOptions,
5
+ useMutation,
6
+ useQuery,
7
+ } from "@tanstack/react-query"
8
+ import { sdk } from "../../lib/client"
9
+
10
+ export const cloudQueryKeys = {
11
+ all: ["cloud"] as const,
12
+ auth: () => [...cloudQueryKeys.all, "auth"] as const,
13
+ }
14
+
15
+ export const useCloudAuthEnabled = (
16
+ options?: Omit<
17
+ UseQueryOptions<{ enabled: boolean }, FetchError>,
18
+ "queryKey" | "queryFn"
19
+ >
20
+ ) => {
21
+ return useQuery({
22
+ queryKey: cloudQueryKeys.auth(),
23
+ queryFn: async () => {
24
+ return await sdk.client.fetch<{ enabled: boolean }>("/cloud/auth")
25
+ },
26
+ ...options,
27
+ })
28
+ }
29
+
30
+ export const useCreateCloudAuthUser = (
31
+ options?: UseMutationOptions<void, FetchError>
32
+ ) => {
33
+ return useMutation({
34
+ mutationFn: async () => {
35
+ await sdk.client.fetch("/cloud/auth/users", {
36
+ method: "POST",
37
+ })
38
+ },
39
+ ...options,
40
+ })
41
+ }