@medusajs/dashboard 2.12.3-preview-20251217120154 → 2.12.3-snapshot-20251216185234

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 (271) hide show
  1. package/dist/{add-campaign-promotions-4QLXO46G.mjs → add-campaign-promotions-OYPGISTF.mjs} +2 -2
  2. package/dist/{adjust-inventory-2MFA656V.mjs → adjust-inventory-26YXAXQL.mjs} +4 -3
  3. package/dist/{api-key-management-create-ZUVF3SLR.mjs → api-key-management-create-EMP32G2D.mjs} +6 -5
  4. package/dist/{api-key-management-detail-THD74G7I.mjs → api-key-management-detail-6RCDH73M.mjs} +11 -10
  5. package/dist/{api-key-management-edit-42HNUSXL.mjs → api-key-management-edit-IBM3ZXHK.mjs} +6 -5
  6. package/dist/{api-key-management-list-66CFOILY.mjs → api-key-management-list-KC5GOWAU.mjs} +4 -3
  7. package/dist/{api-key-management-sales-channels-HN3THM5J.mjs → api-key-management-sales-channels-LUB5G6RC.mjs} +6 -5
  8. package/dist/app.css +53 -0
  9. package/dist/app.js +13537 -11320
  10. package/dist/app.mjs +12 -11
  11. package/dist/{campaign-budget-edit-6DMZGUCI.mjs → campaign-budget-edit-B5MSE26J.mjs} +2 -2
  12. package/dist/{campaign-configuration-UNFRB5HR.mjs → campaign-configuration-QOE3D2BE.mjs} +2 -2
  13. package/dist/{campaign-create-QXG7PD3S.mjs → campaign-create-FJOECKGT.mjs} +3 -3
  14. package/dist/{campaign-detail-WR3XHHV2.mjs → campaign-detail-5Q4BYCPX.mjs} +11 -10
  15. package/dist/{campaign-edit-HN4US7DV.mjs → campaign-edit-K2POQH7M.mjs} +2 -2
  16. package/dist/{categories-metadata-BCZ463KN.mjs → categories-metadata-J7M3XWI7.mjs} +14 -13
  17. package/dist/{category-create-FFIBWXAH.mjs → category-create-KHJZSC7G.mjs} +5 -4
  18. package/dist/{category-detail-4HXJ5Z7N.mjs → category-detail-S5IPXMHX.mjs} +29 -13
  19. package/dist/{category-edit-74MZ6TXN.mjs → category-edit-CTA2EPDG.mjs} +5 -4
  20. package/dist/{category-list-OCJY2UJV.mjs → category-list-QBYJ4T3R.mjs} +20 -4
  21. package/dist/{category-organize-B6EFBFKB.mjs → category-organize-SXP33XET.mjs} +5 -4
  22. package/dist/{category-products-2HXLZDHL.mjs → category-products-KPW6BA5J.mjs} +14 -13
  23. package/dist/{chunk-XIVBRONM.mjs → chunk-23GTCEOV.mjs} +1 -1
  24. package/dist/{chunk-2NZDHAOE.mjs → chunk-27MGH3HR.mjs} +2 -2
  25. package/dist/{chunk-N3FCYZV6.mjs → chunk-2XTBDCGE.mjs} +1 -1
  26. package/dist/{chunk-RU4ZS47V.mjs → chunk-4JQR6QNW.mjs} +2 -2
  27. package/dist/{chunk-Z6NHG5LQ.mjs → chunk-6P4Q4AAP.mjs} +3 -3
  28. package/dist/{chunk-F5NZDW7L.mjs → chunk-A2WBKOXJ.mjs} +2 -2
  29. package/dist/{chunk-F63F3FIT.mjs → chunk-A4XYK3MY.mjs} +2 -2
  30. package/dist/{chunk-NT6C7CHT.mjs → chunk-AWRCV3ME.mjs} +1 -1
  31. package/dist/{chunk-5X6SKB2P.mjs → chunk-BMS2QLJY.mjs} +1 -1
  32. package/dist/{chunk-3YPRDSZ6.mjs → chunk-BZKI5J2M.mjs} +1 -1
  33. package/dist/{chunk-25UWYEJX.mjs → chunk-CQOOXWPZ.mjs} +1 -1
  34. package/dist/{chunk-5DUMSVP6.mjs → chunk-CVHJAKLQ.mjs} +3 -3
  35. package/dist/{chunk-42OOM4DJ.mjs → chunk-D6UW7URG.mjs} +23 -6
  36. package/dist/{chunk-LHNU4DYZ.mjs → chunk-DBXWB3RF.mjs} +2 -2
  37. package/dist/{chunk-N4O5FAUC.mjs → chunk-FYWHE3W5.mjs} +1 -1
  38. package/dist/{chunk-QPKW37WR.mjs → chunk-GRZSG4EP.mjs} +244 -14
  39. package/dist/chunk-HGRIOEAR.mjs +32 -0
  40. package/dist/{chunk-Y5UO73CH.mjs → chunk-HTCYX4VD.mjs} +1 -1
  41. package/dist/{chunk-34KFHPN6.mjs → chunk-IAV7IKJ6.mjs} +1 -1
  42. package/dist/{chunk-6W3BKVOC.mjs → chunk-KFYQTOGB.mjs} +1 -1
  43. package/dist/{chunk-EQTBJSBZ.mjs → chunk-KIIT4BNH.mjs} +3 -0
  44. package/dist/{chunk-W7SLPIO2.mjs → chunk-LZFWCKOF.mjs} +655 -147
  45. package/dist/{chunk-PNPT4W2F.mjs → chunk-MJDHVDOW.mjs} +1 -1
  46. package/dist/{chunk-D4J3CEWH.mjs → chunk-N3SAXQVR.mjs} +2 -2
  47. package/dist/{chunk-Q6MSICBU.mjs → chunk-O333RR6K.mjs} +1 -1
  48. package/dist/{chunk-F65T2X7G.mjs → chunk-OL24RDYM.mjs} +5 -5
  49. package/dist/{chunk-7ZYDO3XO.mjs → chunk-OL6MEUKW.mjs} +295 -194
  50. package/dist/{chunk-7AX6R6G6.mjs → chunk-OSHH5GAS.mjs} +13 -1
  51. package/dist/{chunk-YAPTGHGP.mjs → chunk-PHLCT2HA.mjs} +1 -1
  52. package/dist/{chunk-35LSPN2U.mjs → chunk-QKALAT7P.mjs} +1 -1
  53. package/dist/{chunk-UM4OIJZ3.mjs → chunk-S22SJRPO.mjs} +1 -1
  54. package/dist/{chunk-4YAPXPLM.mjs → chunk-ST4P6BQN.mjs} +1 -1
  55. package/dist/{chunk-B3AOQW2B.mjs → chunk-U6G4M5LP.mjs} +1 -1
  56. package/dist/{chunk-HWKLNKOY.mjs → chunk-U726TGCM.mjs} +1 -1
  57. package/dist/{chunk-HKIF5HVL.mjs → chunk-UJ2TMPV4.mjs} +12 -0
  58. package/dist/{chunk-NHDFPGQ3.mjs → chunk-UWY5ZV66.mjs} +13 -1
  59. package/dist/{chunk-XXBP2Z5M.mjs → chunk-WVA4O7QS.mjs} +1 -1
  60. package/dist/{chunk-PXJFCRIV.mjs → chunk-WYATCUOM.mjs} +4 -4
  61. package/dist/{chunk-AH4DORIW.mjs → chunk-XY7A7GZJ.mjs} +1 -1
  62. package/dist/{chunk-FQDPOKEK.mjs → chunk-Y2YVTIJI.mjs} +1 -1
  63. package/dist/{chunk-L4NOVTH5.mjs → chunk-YIOBBZUB.mjs} +2 -2
  64. package/dist/{chunk-MY6I7UJG.mjs → chunk-YYOPBKME.mjs} +3 -3
  65. package/dist/{chunk-LEJUZW3P.mjs → chunk-Z6BFNHEO.mjs} +12 -0
  66. package/dist/{chunk-HFT7Q5Y5.mjs → chunk-ZMG5B4FG.mjs} +1 -1
  67. package/dist/{collection-add-products-JWAQ277T.mjs → collection-add-products-FU2BS3D3.mjs} +14 -13
  68. package/dist/{collection-create-DCRW344Z.mjs → collection-create-GWKWVT7B.mjs} +5 -4
  69. package/dist/{collection-detail-F4ON763T.mjs → collection-detail-VJE7XHLV.mjs} +28 -12
  70. package/dist/{collection-edit-UNFEW6HT.mjs → collection-edit-EZIO2BR5.mjs} +5 -4
  71. package/dist/{collection-list-4C5HVO6Y.mjs → collection-list-IGA6SCNF.mjs} +29 -13
  72. package/dist/{collection-metadata-P4A5DXBQ.mjs → collection-metadata-QK7MI3D2.mjs} +14 -13
  73. package/dist/{customer-create-XCLZENJS.mjs → customer-create-IA56MXE6.mjs} +2 -2
  74. package/dist/{customer-create-address-4HZUIAM7.mjs → customer-create-address-27M25HTO.mjs} +2 -2
  75. package/dist/{customer-detail-X3RQJPXP.mjs → customer-detail-MOV2T3LF.mjs} +12 -11
  76. package/dist/{customer-edit-BW5GVTQI.mjs → customer-edit-XQ5NWIVX.mjs} +2 -2
  77. package/dist/{customer-group-add-customers-SOXMSWQH.mjs → customer-group-add-customers-XMR2WBXX.mjs} +2 -2
  78. package/dist/{customer-group-create-6YV7W6TI.mjs → customer-group-create-RY4FVEIW.mjs} +2 -2
  79. package/dist/{customer-group-detail-NG32WKJT.mjs → customer-group-detail-6T7OXGQD.mjs} +11 -10
  80. package/dist/{customer-group-edit-7NXU34BQ.mjs → customer-group-edit-MQWARIQZ.mjs} +2 -2
  81. package/dist/{customer-group-list-EBETHKKO.mjs → customer-group-list-AJEAF5D2.mjs} +11 -10
  82. package/dist/{customer-group-metadata-WK2BGEGO.mjs → customer-group-metadata-JQJRLLXG.mjs} +3 -3
  83. package/dist/{customer-metadata-ZUWCUTM7.mjs → customer-metadata-HN2DYD5I.mjs} +3 -3
  84. package/dist/{customers-add-customer-group-7FYD54MZ.mjs → customers-add-customer-group-QVTVSQYM.mjs} +13 -12
  85. package/dist/{edit-inventory-item-Y5W6VTHJ.mjs → edit-inventory-item-H7DAZWIT.mjs} +4 -3
  86. package/dist/{edit-inventory-item-attributes-NAAZDFEJ.mjs → edit-inventory-item-attributes-7HTXXPGZ.mjs} +4 -3
  87. package/dist/{edit-reservation-2UD4RZJX.mjs → edit-reservation-OVTRZHJR.mjs} +5 -4
  88. package/dist/{edit-rules-2W3BXEXR.mjs → edit-rules-SMVRTCUP.mjs} +13 -12
  89. package/dist/en.json +38 -0
  90. package/dist/{inventory-create-VQEK7C5T.mjs → inventory-create-BK52VALF.mjs} +14 -13
  91. package/dist/{inventory-detail-HUHQ6ZNE.mjs → inventory-detail-ZPSEMYI2.mjs} +11 -10
  92. package/dist/{inventory-list-RUSSPKHE.mjs → inventory-list-RXJPSVZE.mjs} +2 -1
  93. package/dist/{inventory-metadata-X52VGHA7.mjs → inventory-metadata-FNEJ3RAT.mjs} +14 -13
  94. package/dist/{inventory-stock-EKTOYN2F.mjs → inventory-stock-6WYWLWJ7.mjs} +15 -14
  95. package/dist/{invite-VKHAAF4Z.mjs → invite-FVE4ZBKB.mjs} +2 -2
  96. package/dist/{location-create-RPLEXUZR.mjs → location-create-WZ43K3W7.mjs} +2 -2
  97. package/dist/{location-detail-UVWYE6Q2.mjs → location-detail-N3GUZSY7.mjs} +12 -11
  98. package/dist/{location-edit-L4ISEQHX.mjs → location-edit-VCS7GVWQ.mjs} +2 -2
  99. package/dist/{location-fulfillment-providers-HZZUHPVL.mjs → location-fulfillment-providers-7ZUJAGNY.mjs} +15 -14
  100. package/dist/{location-list-Z42ZYHUF.mjs → location-list-KVBA6J47.mjs} +2 -2
  101. package/dist/{location-sales-channels-XIMOK66B.mjs → location-sales-channels-P3QJTFDT.mjs} +5 -4
  102. package/dist/{location-service-zone-create-7ZNVLEE3.mjs → location-service-zone-create-J43WN6G4.mjs} +3 -3
  103. package/dist/{location-service-zone-edit-6OUAFEZD.mjs → location-service-zone-edit-KHHMSPXD.mjs} +2 -2
  104. package/dist/{location-service-zone-manage-areas-EOULKRYD.mjs → location-service-zone-manage-areas-6ZPMKMSX.mjs} +3 -3
  105. package/dist/{location-service-zone-shipping-option-create-M7G4SKNP.mjs → location-service-zone-shipping-option-create-CNRWYZQC.mjs} +15 -14
  106. package/dist/{location-service-zone-shipping-option-edit-M2HJAASG.mjs → location-service-zone-shipping-option-edit-4CGPQ3VT.mjs} +2 -2
  107. package/dist/{location-service-zone-shipping-option-pricing-23QLNSBT.mjs → location-service-zone-shipping-option-pricing-OGWI7VPT.mjs} +4 -4
  108. package/dist/{login-NSCAMAU6.mjs → login-VNOLI5YG.mjs} +13 -12
  109. package/dist/{manage-locations-JD6FSBOT.mjs → manage-locations-7HH6R4UP.mjs} +4 -3
  110. package/dist/{order-allocate-items-5T57NZOB.mjs → order-allocate-items-HZGGYJ42.mjs} +6 -5
  111. package/dist/{order-create-claim-TE56IE7P.mjs → order-create-claim-SCDJGM46.mjs} +15 -14
  112. package/dist/{order-create-edit-RDFYBVFY.mjs → order-create-edit-2WALBPXS.mjs} +14 -13
  113. package/dist/{order-create-exchange-B5ZOEQCJ.mjs → order-create-exchange-LQU4YN7F.mjs} +15 -14
  114. package/dist/{order-create-fulfillment-SRRP6X64.mjs → order-create-fulfillment-OWUVTZXW.mjs} +13 -12
  115. package/dist/{order-create-refund-PTOM65QK.mjs → order-create-refund-Q6HQY42R.mjs} +13 -12
  116. package/dist/{order-create-return-3C2QVNYN.mjs → order-create-return-52GHGW5Z.mjs} +7 -6
  117. package/dist/{order-create-shipment-HNILNFXB.mjs → order-create-shipment-WAGGEPRW.mjs} +13 -12
  118. package/dist/{order-detail-3OUZOQ7G.mjs → order-detail-PVPGEWGY.mjs} +15 -14
  119. package/dist/{order-edit-billing-address-3IO7GXIK.mjs → order-edit-billing-address-UM76J4KX.mjs} +13 -12
  120. package/dist/{order-edit-email-QIAEOUBV.mjs → order-edit-email-CL3KNOCM.mjs} +13 -12
  121. package/dist/{order-edit-shipping-address-QGGMHGBC.mjs → order-edit-shipping-address-PIESTGVL.mjs} +13 -12
  122. package/dist/{order-export-JYYFTOWR.mjs → order-export-LE363ZLB.mjs} +14 -13
  123. package/dist/{order-list-RFR3HNDQ.mjs → order-list-GRLQWN4L.mjs} +6 -5
  124. package/dist/{order-metadata-ZBDTMBHZ.mjs → order-metadata-FHBB7MTG.mjs} +14 -13
  125. package/dist/{order-receive-return-V42FTCFY.mjs → order-receive-return-PRVKP6J2.mjs} +14 -13
  126. package/dist/{order-request-transfer-A6NNIN2O.mjs → order-request-transfer-XSAGRUMT.mjs} +13 -12
  127. package/dist/{price-list-configuration-RTUEJENE.mjs → price-list-configuration-6S3MLNXQ.mjs} +6 -5
  128. package/dist/{price-list-create-GRT27KOM.mjs → price-list-create-K5JEZT57.mjs} +17 -16
  129. package/dist/{price-list-detail-VKIWM7HP.mjs → price-list-detail-Q5VG5VGW.mjs} +13 -12
  130. package/dist/{price-list-edit-SW7YIR3Z.mjs → price-list-edit-53UW35L3.mjs} +5 -4
  131. package/dist/{price-list-list-LF2PL4B5.mjs → price-list-list-DG5YEZ44.mjs} +4 -3
  132. package/dist/{price-list-prices-add-ISLZDQNI.mjs → price-list-prices-add-2MQ226U4.mjs} +16 -15
  133. package/dist/{price-list-prices-edit-C6SX2TLJ.mjs → price-list-prices-edit-OJZLV7OS.mjs} +7 -6
  134. package/dist/{product-attributes-REJ5NF2D.mjs → product-attributes-YF4TZOIO.mjs} +14 -13
  135. package/dist/{product-create-4TFE3JHQ.mjs → product-create-KJML2332.mjs} +16 -15
  136. package/dist/{product-create-option-GEGQNSMQ.mjs → product-create-option-7AOXAA4S.mjs} +4 -3
  137. package/dist/{product-create-variant-WI6D5CDG.mjs → product-create-variant-5EBCLM54.mjs} +14 -13
  138. package/dist/{product-detail-BEIDGPKY.mjs → product-detail-QG72542C.mjs} +59 -17
  139. package/dist/{product-edit-ZRQUK5OQ.mjs → product-edit-DZZR775Q.mjs} +14 -13
  140. package/dist/{product-edit-option-HBIOBQTS.mjs → product-edit-option-LWJT3CYJ.mjs} +4 -3
  141. package/dist/{product-export-GIEFG4MA.mjs → product-export-5AD7NELI.mjs} +15 -14
  142. package/dist/{product-image-variants-edit-AAMRK4KQ.mjs → product-image-variants-edit-M6QF2RLE.mjs} +13 -12
  143. package/dist/{product-import-43UXKCL3.mjs → product-import-V3KQN4TV.mjs} +13 -12
  144. package/dist/{product-list-D4CVUBQQ.mjs → product-list-EUWZIFTM.mjs} +25 -12
  145. package/dist/{product-media-EGK66SRX.mjs → product-media-3VJ7KENL.mjs} +4 -3
  146. package/dist/{product-metadata-55CAQTPS.mjs → product-metadata-GL2MVPDI.mjs} +14 -13
  147. package/dist/{product-organization-7J7MUM6F.mjs → product-organization-O7RHELMQ.mjs} +15 -14
  148. package/dist/{product-prices-WQDE4XYT.mjs → product-prices-YWV6MSM6.mjs} +5 -4
  149. package/dist/{product-sales-channels-GIJ7Q57M.mjs → product-sales-channels-PPXUG4KT.mjs} +5 -4
  150. package/dist/{product-shipping-profile-KIDRTPWA.mjs → product-shipping-profile-ETQFZ7DC.mjs} +4 -3
  151. package/dist/{product-stock-22S2HGMM.mjs → product-stock-AKEFMK5O.mjs} +15 -14
  152. package/dist/{product-tag-create-7GPE246H.mjs → product-tag-create-PQMDDKWH.mjs} +13 -12
  153. package/dist/{product-tag-detail-R6C2TTA4.mjs → product-tag-detail-I3MBZX7U.mjs} +30 -14
  154. package/dist/{product-tag-edit-WA6FGSIP.mjs → product-tag-edit-K3BBQLJR.mjs} +13 -12
  155. package/dist/{product-tag-list-U7PLHMLF.mjs → product-tag-list-JUWSOMB7.mjs} +30 -14
  156. package/dist/{product-tag-metadata-EJ7FEXSE.mjs → product-tag-metadata-MJH5LH7E.mjs} +14 -13
  157. package/dist/{product-type-create-HBDROTGB.mjs → product-type-create-DRFXTL5O.mjs} +4 -3
  158. package/dist/{product-type-detail-TYQ7MJFE.mjs → product-type-detail-RKHT5NBL.mjs} +29 -13
  159. package/dist/{product-type-edit-H3JCMVRV.mjs → product-type-edit-SRHCZDK7.mjs} +4 -3
  160. package/dist/{product-type-list-KIKWBPD7.mjs → product-type-list-QQKAHBJ3.mjs} +19 -3
  161. package/dist/{product-type-metadata-Q6W5GL7Z.mjs → product-type-metadata-CDJDFFGQ.mjs} +14 -13
  162. package/dist/{product-variant-detail-SPJ7MZTK.mjs → product-variant-detail-XAYG5CKE.mjs} +27 -11
  163. package/dist/{product-variant-edit-BW7QMHC5.mjs → product-variant-edit-DEZEY2H2.mjs} +13 -12
  164. package/dist/{product-variant-manage-inventory-items-BLHCH6QD.mjs → product-variant-manage-inventory-items-Y2VEOHP7.mjs} +4 -3
  165. package/dist/{product-variant-media-KLSUISGH.mjs → product-variant-media-2WLVNGI4.mjs} +4 -3
  166. package/dist/{product-variant-metadata-GDMVC4MZ.mjs → product-variant-metadata-VTZDNWUT.mjs} +14 -13
  167. package/dist/{profile-edit-YBBXXCCK.mjs → profile-edit-ZNXO6WME.mjs} +2 -2
  168. package/dist/{promotion-add-campaign-JRTM7WBR.mjs → promotion-add-campaign-DO67QK6M.mjs} +3 -3
  169. package/dist/{promotion-create-HF6DTKCC.mjs → promotion-create-HWFNUQXG.mjs} +15 -14
  170. package/dist/{promotion-detail-HTM3F2VO.mjs → promotion-detail-QC36KXB3.mjs} +11 -10
  171. package/dist/{promotion-edit-details-AREFQ6O5.mjs → promotion-edit-details-6BSOOWQN.mjs} +2 -2
  172. package/dist/{refund-reason-create-RKIH46D6.mjs → refund-reason-create-YHCDEHGQ.mjs} +13 -12
  173. package/dist/{refund-reason-edit-V3KC6NMO.mjs → refund-reason-edit-CZ5QZ2SZ.mjs} +13 -12
  174. package/dist/{refund-reason-list-M5BOHFWU.mjs → refund-reason-list-OJYYEYJE.mjs} +11 -10
  175. package/dist/{region-add-countries-OF5RUSYU.mjs → region-add-countries-2VAVXMJQ.mjs} +2 -2
  176. package/dist/{region-create-BGOWVCTR.mjs → region-create-NA7Y2LN4.mjs} +2 -2
  177. package/dist/{region-edit-5GO25GDF.mjs → region-edit-WAU347DP.mjs} +2 -2
  178. package/dist/{region-metadata-5NGUNAXZ.mjs → region-metadata-H6XXUQ4S.mjs} +14 -13
  179. package/dist/{reservation-create-Z2SUMBGT.mjs → reservation-create-ZCIYM6JI.mjs} +5 -4
  180. package/dist/{reservation-detail-JH77TQHN.mjs → reservation-detail-LZAQL4XA.mjs} +11 -10
  181. package/dist/{reservation-list-WHBGZSVH.mjs → reservation-list-B47DXTA7.mjs} +3 -2
  182. package/dist/{reservation-metadata-ERCWXYVL.mjs → reservation-metadata-5HZSDDOK.mjs} +14 -13
  183. package/dist/{reset-password-5TAYQEUV.mjs → reset-password-Y5WVXV4Q.mjs} +2 -2
  184. package/dist/{return-reason-create-NXWDC6AC.mjs → return-reason-create-HM54WRJY.mjs} +2 -2
  185. package/dist/{return-reason-edit-M6IKNNKB.mjs → return-reason-edit-VSIRHVQ6.mjs} +2 -2
  186. package/dist/{sales-channel-add-products-DTAXWL6H.mjs → sales-channel-add-products-F7YV4MO5.mjs} +14 -13
  187. package/dist/{sales-channel-create-E7BDTPWD.mjs → sales-channel-create-MI7HHZYE.mjs} +5 -4
  188. package/dist/{sales-channel-detail-XWHV7J7X.mjs → sales-channel-detail-MXIPZCGA.mjs} +12 -11
  189. package/dist/{sales-channel-edit-HMPA3Y3L.mjs → sales-channel-edit-VSHOIR37.mjs} +5 -4
  190. package/dist/{sales-channel-list-7NSEFCXQ.mjs → sales-channel-list-RLGL7FM3.mjs} +11 -10
  191. package/dist/{sales-channel-metadata-CMZN74K7.mjs → sales-channel-metadata-M364R4RJ.mjs} +14 -13
  192. package/dist/{shipping-option-type-create-4BN2GBHP.mjs → shipping-option-type-create-C5WUWON7.mjs} +13 -12
  193. package/dist/{shipping-option-type-detail-YB3TCED2.mjs → shipping-option-type-detail-PENS2K73.mjs} +12 -11
  194. package/dist/{shipping-option-type-edit-MDO7ALAU.mjs → shipping-option-type-edit-CIU5EHRP.mjs} +13 -12
  195. package/dist/{shipping-option-type-list-DJAT4RKX.mjs → shipping-option-type-list-DIOX7VG7.mjs} +12 -11
  196. package/dist/{shipping-profile-create-752TMBBE.mjs → shipping-profile-create-26R64I3Z.mjs} +2 -2
  197. package/dist/{shipping-profile-metadata-HQI7PCPU.mjs → shipping-profile-metadata-75G2NNMA.mjs} +14 -13
  198. package/dist/{store-add-currencies-PEWNEWCH.mjs → store-add-currencies-OX2WXFMS.mjs} +2 -2
  199. package/dist/{store-add-locales-JLRTXG3Q.mjs → store-add-locales-VJ4RJ7UI.mjs} +12 -11
  200. package/dist/{store-detail-MOLAYNQZ.mjs → store-detail-JSNPOB2F.mjs} +11 -10
  201. package/dist/{store-edit-FTLPT55E.mjs → store-edit-5ZS562ZO.mjs} +2 -2
  202. package/dist/{store-metadata-ZJD23O4D.mjs → store-metadata-CYXTVJUE.mjs} +14 -13
  203. package/dist/{tax-region-create-NCO2OQ3I.mjs → tax-region-create-DWGL4EUT.mjs} +13 -12
  204. package/dist/{tax-region-detail-RIABXU7D.mjs → tax-region-detail-2AE2EFI3.mjs} +21 -20
  205. package/dist/{tax-region-edit-YZALLSZY.mjs → tax-region-edit-EEVEEU2Q.mjs} +13 -12
  206. package/dist/{tax-region-list-BXZBUXRJ.mjs → tax-region-list-P4LDOPZD.mjs} +3 -3
  207. package/dist/{tax-region-province-create-5JP3PVID.mjs → tax-region-province-create-GKJ7WMRS.mjs} +2 -2
  208. package/dist/{tax-region-province-detail-UKLRVJS2.mjs → tax-region-province-detail-4ERSEQFF.mjs} +20 -19
  209. package/dist/{tax-region-tax-override-create-33XGHH7A.mjs → tax-region-tax-override-create-PHCGEF7V.mjs} +16 -15
  210. package/dist/{tax-region-tax-override-edit-WOKZSPTY.mjs → tax-region-tax-override-edit-SMRPSILC.mjs} +17 -16
  211. package/dist/{tax-region-tax-rate-create-O2SDSXCH.mjs → tax-region-tax-rate-create-MECFGVPL.mjs} +2 -2
  212. package/dist/{tax-region-tax-rate-edit-W62VEVKT.mjs → tax-region-tax-rate-edit-7DYSPYOD.mjs} +2 -2
  213. package/dist/translation-list-UF7FLXOW.mjs +441 -0
  214. package/dist/translations-edit-USQJNMAY.mjs +707 -0
  215. package/dist/{user-detail-KEDJ7N3Q.mjs → user-detail-BJUXLZZQ.mjs} +2 -1
  216. package/dist/{user-edit-LXQCTDGA.mjs → user-edit-ZBB4RMTP.mjs} +2 -2
  217. package/dist/{user-invite-YH33WUC2.mjs → user-invite-GAGIM5DO.mjs} +2 -2
  218. package/dist/{user-metadata-4WOICEE7.mjs → user-metadata-2WPJOEJA.mjs} +14 -13
  219. package/dist/{workflow-execution-detail-OKM6P4SX.mjs → workflow-execution-detail-H2AKEZJX.mjs} +11 -10
  220. package/package.json +9 -9
  221. package/src/components/common/icon-avatar/icon-avatar.tsx +4 -0
  222. package/src/components/data-grid/components/data-grid-cell-container.tsx +13 -4
  223. package/src/components/data-grid/components/data-grid-multiline-cell.tsx +103 -0
  224. package/src/components/data-grid/components/data-grid-readonly-cell.tsx +13 -3
  225. package/src/components/data-grid/components/data-grid-root.tsx +271 -60
  226. package/src/components/data-grid/components/data-grid-text-cell.tsx +7 -7
  227. package/src/components/data-grid/components/data-grid-textarea-modal-cell.tsx +233 -0
  228. package/src/components/data-grid/components/index.ts +2 -0
  229. package/src/components/data-grid/data-grid.tsx +16 -1
  230. package/src/components/data-grid/helpers/create-data-grid-column-helper.ts +18 -0
  231. package/src/components/data-grid/hooks/use-data-grid-cell.tsx +12 -1
  232. package/src/components/data-grid/hooks/use-data-grid-keydown-event.tsx +43 -3
  233. package/src/components/data-grid/types.ts +1 -0
  234. package/src/components/layout/settings-layout/settings-layout.tsx +11 -1
  235. package/src/components/modals/route-focus-modal/route-focus-modal.tsx +8 -3
  236. package/src/components/modals/route-modal-form/route-modal-form.tsx +6 -1
  237. package/src/components/modals/route-modal-provider/route-provider.tsx +16 -4
  238. package/src/dashboard-app/routes/get-route.map.tsx +19 -0
  239. package/src/hooks/api/categories.tsx +32 -0
  240. package/src/hooks/api/collections.tsx +31 -0
  241. package/src/hooks/api/index.ts +1 -0
  242. package/src/hooks/api/product-types.tsx +32 -0
  243. package/src/hooks/api/product-variants.tsx +47 -3
  244. package/src/hooks/api/products.tsx +29 -0
  245. package/src/hooks/api/tags.tsx +32 -0
  246. package/src/hooks/api/translations.tsx +306 -0
  247. package/src/hooks/use-infinite-list.tsx +92 -0
  248. package/src/i18n/translations/$schema.json +122 -0
  249. package/src/i18n/translations/en.json +38 -0
  250. package/src/i18n/translations/es.json +38 -0
  251. package/src/routes/categories/category-detail/components/category-general-section/category-general-section.tsx +16 -1
  252. package/src/routes/categories/category-list/components/category-list-table/category-list-table.tsx +16 -1
  253. package/src/routes/collections/collection-detail/components/collection-general-section/collection-general-section.tsx +16 -1
  254. package/src/routes/collections/collection-list/components/collection-list-table/collection-row-actions.tsx +16 -1
  255. package/src/routes/product-tags/product-tag-detail/components/product-tag-general-section/product-tag-general-section.tsx +16 -1
  256. package/src/routes/product-tags/product-tag-list/components/product-tag-list-table/product-tag-list-table.tsx +16 -1
  257. package/src/routes/product-types/product-type-detail/components/product-type-general-section/product-type-general-section.tsx +16 -1
  258. package/src/routes/product-types/product-type-list/components/product-type-list-table/product-table-row-actions.tsx +16 -1
  259. package/src/routes/product-variants/product-variant-detail/components/variant-general-section/variant-general-section.tsx +16 -1
  260. package/src/routes/products/product-detail/components/product-general-section/product-general-section.tsx +16 -1
  261. package/src/routes/products/product-detail/components/product-variant-section/product-variant-section.tsx +32 -1
  262. package/src/routes/products/product-list/components/product-list-table/product-list-table.tsx +15 -1
  263. package/src/routes/translations/translation-list/components/active-locales-section/active-locales-section.tsx +68 -0
  264. package/src/routes/translations/translation-list/components/translation-list-section/translation-list-section.tsx +44 -0
  265. package/src/routes/translations/translation-list/components/translations-completion-section/translations-completion-section.tsx +224 -0
  266. package/src/routes/translations/translation-list/index.tsx +1 -0
  267. package/src/routes/translations/translation-list/translation-list.tsx +138 -0
  268. package/src/routes/translations/translations-edit/components/translations-edit-form/index.ts +1 -0
  269. package/src/routes/translations/translations-edit/components/translations-edit-form/translations-edit-form.tsx +792 -0
  270. package/src/routes/translations/translations-edit/index.ts +1 -0
  271. package/src/routes/translations/translations-edit/translations-edit.tsx +90 -0
@@ -0,0 +1,233 @@
1
+ import { clx, Textarea } from "@medusajs/ui"
2
+ import { Popover as RadixPopover } from "radix-ui"
3
+ import { useCallback, useEffect, useRef, useState } from "react"
4
+ import { Controller, ControllerRenderProps } from "react-hook-form"
5
+
6
+ import { useCombinedRefs } from "../../../hooks/use-combined-refs"
7
+ import { useDataGridCell, useDataGridCellError } from "../hooks"
8
+ import { useDataGridContext } from "../context"
9
+ import { DataGridCellProps, InputProps, DataGridCellContext } from "../types"
10
+ import { DataGridCellContainer } from "./data-grid-cell-container"
11
+
12
+ type DataGridExpandableTextCellProps<TData, TValue = any> = DataGridCellProps<
13
+ TData,
14
+ TValue
15
+ > & {
16
+ fieldLabel?: string
17
+ }
18
+
19
+ export const DataGridExpandableTextCell = <TData, TValue = any>({
20
+ context,
21
+ fieldLabel,
22
+ }: DataGridExpandableTextCellProps<TData, TValue>) => {
23
+ const { field, control, renderProps } = useDataGridCell({
24
+ context,
25
+ })
26
+ const errorProps = useDataGridCellError({ context })
27
+
28
+ const { container, input } = renderProps
29
+
30
+ return (
31
+ <Controller
32
+ control={control}
33
+ name={field}
34
+ render={({ field }) => {
35
+ return (
36
+ <Inner
37
+ field={field}
38
+ inputProps={input}
39
+ fieldLabel={fieldLabel}
40
+ container={container}
41
+ errorProps={errorProps}
42
+ />
43
+ )
44
+ }}
45
+ />
46
+ )
47
+ }
48
+
49
+ const Inner = ({
50
+ field,
51
+ inputProps,
52
+ fieldLabel: _fieldLabel,
53
+ container,
54
+ errorProps,
55
+ }: {
56
+ field: ControllerRenderProps<any, string>
57
+ inputProps: InputProps
58
+ fieldLabel?: string
59
+ container: any
60
+ errorProps: any
61
+ }) => {
62
+ const { onChange: _, onBlur, ref, value, ...rest } = field
63
+ const { ref: inputRef, onBlur: onInputBlur, onChange, ...input } = inputProps
64
+ const { setSingleRange, anchor } = useDataGridContext()
65
+ const { row, col } = anchor || { row: 0, col: 0 }
66
+
67
+ const [localValue, setLocalValue] = useState(value || "")
68
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false)
69
+ const [popoverValue, setPopoverValue] = useState(value || "")
70
+ const popoverContentRef = useRef<HTMLDivElement>(null)
71
+
72
+ useEffect(() => {
73
+ setLocalValue(value || "")
74
+ }, [value])
75
+
76
+ useEffect(() => {
77
+ if (isPopoverOpen) {
78
+ setPopoverValue(value || "")
79
+ }
80
+ }, [isPopoverOpen, value])
81
+
82
+ // Prevent DataGrid keyboard handlers from intercepting keys when popover is open
83
+ useEffect(() => {
84
+ if (!isPopoverOpen || !popoverContentRef.current) {
85
+ return
86
+ }
87
+
88
+ const handleKeyDownCapture = (e: KeyboardEvent) => {
89
+ const target = e.target as HTMLElement
90
+ const isTextarea = target.tagName === "TEXTAREA"
91
+ const isInPopover =
92
+ popoverContentRef.current && popoverContentRef.current.contains(target)
93
+
94
+ if (isTextarea || isInPopover) {
95
+ const dataGridKeys = [
96
+ "Enter",
97
+ "Delete",
98
+ "Backspace",
99
+ "ArrowUp",
100
+ "ArrowDown",
101
+ "ArrowLeft",
102
+ "ArrowRight",
103
+ "Tab",
104
+ " ",
105
+ ]
106
+
107
+ // Stop the keys from reaching DataGrid, so the textarea can handle them
108
+ if (dataGridKeys.includes(e.key) && e.key !== "Escape") {
109
+ e.stopImmediatePropagation()
110
+ }
111
+ }
112
+ }
113
+
114
+ window.addEventListener("keydown", handleKeyDownCapture, true)
115
+
116
+ return () => {
117
+ window.removeEventListener("keydown", handleKeyDownCapture, true)
118
+ }
119
+ }, [isPopoverOpen])
120
+
121
+ const combinedRefs = useCombinedRefs(inputRef, ref)
122
+
123
+ const handleOverlayMouseDown = useCallback(
124
+ (e: React.MouseEvent) => {
125
+ if (e.detail === 2) {
126
+ e.preventDefault()
127
+ e.stopPropagation()
128
+ setSingleRange({ row, col })
129
+ setIsPopoverOpen(true)
130
+ return
131
+ }
132
+ // For single clicks, use the normal handler which sets anchor and focuses container
133
+ container.overlayProps.onMouseDown?.(e)
134
+ },
135
+ [container.overlayProps, setSingleRange, row, col]
136
+ )
137
+
138
+ const customContainer = {
139
+ ...container,
140
+ overlayProps: {
141
+ ...container.overlayProps,
142
+ onMouseDown: handleOverlayMouseDown,
143
+ },
144
+ }
145
+
146
+ const handlePopoverSave = () => {
147
+ onChange(popoverValue, value)
148
+ setLocalValue(popoverValue)
149
+ setIsPopoverOpen(false)
150
+ onBlur()
151
+ onInputBlur()
152
+ }
153
+
154
+ const handlePopoverKeyDown = useCallback((e: React.KeyboardEvent) => {
155
+ if (e.key !== "Escape") {
156
+ e.stopPropagation()
157
+ }
158
+ }, [])
159
+
160
+ const displayValue = localValue || ""
161
+ const truncatedValue =
162
+ displayValue.length > 50
163
+ ? `${displayValue.substring(0, 50)}...`
164
+ : displayValue
165
+
166
+ return (
167
+ <RadixPopover.Root
168
+ open={isPopoverOpen}
169
+ onOpenChange={(open) => {
170
+ if (!open) {
171
+ handlePopoverSave()
172
+ } else {
173
+ setIsPopoverOpen(true)
174
+ }
175
+ }}
176
+ >
177
+ <DataGridCellContainer {...customContainer} {...errorProps}>
178
+ <RadixPopover.Anchor asChild>
179
+ <div
180
+ className={clx(
181
+ "txt-compact-small text-ui-fg-subtle flex size-full cursor-pointer items-center justify-center bg-transparent outline-none",
182
+ "focus:cursor-text"
183
+ )}
184
+ >
185
+ <span className="w-full truncate text-center">
186
+ {truncatedValue}
187
+ </span>
188
+ </div>
189
+ </RadixPopover.Anchor>
190
+ <input
191
+ className="sr-only"
192
+ autoComplete="off"
193
+ tabIndex={-1}
194
+ value={localValue}
195
+ onChange={(e) => setLocalValue(e.target.value)}
196
+ ref={combinedRefs}
197
+ onBlur={() => {
198
+ onBlur()
199
+ onInputBlur()
200
+ onChange(localValue, value)
201
+ }}
202
+ {...input}
203
+ {...rest}
204
+ />
205
+ </DataGridCellContainer>
206
+ <RadixPopover.Portal>
207
+ <RadixPopover.Content
208
+ className={clx(
209
+ "bg-ui-bg-base shadow-elevation-flyout flex max-h-[80vh] w-[600px] overflow-hidden p-0 outline-none"
210
+ )}
211
+ align="start"
212
+ side="bottom"
213
+ sideOffset={-29}
214
+ alignOffset={-16}
215
+ collisionPadding={24}
216
+ onEscapeKeyDown={handlePopoverSave}
217
+ onKeyDown={handlePopoverKeyDown}
218
+ >
219
+ <div ref={popoverContentRef} className="h-full w-full">
220
+ <Textarea
221
+ value={popoverValue}
222
+ onChange={(e) => setPopoverValue(e.target.value)}
223
+ onKeyDown={(e) => {
224
+ e.stopPropagation()
225
+ }}
226
+ className="!bg-ui-bg-base h-full min-h-[300px] w-full resize-none border-0 p-4 !shadow-none focus-visible:!shadow-none"
227
+ />
228
+ </div>
229
+ </RadixPopover.Content>
230
+ </RadixPopover.Portal>
231
+ </RadixPopover.Root>
232
+ )
233
+ }
@@ -1,7 +1,9 @@
1
1
  export { DataGridBooleanCell } from "./data-grid-boolean-cell"
2
2
  export { DataGridCurrencyCell } from "./data-grid-currency-cell"
3
+ export { DataGridMultilineCell } from "./data-grid-multiline-cell"
3
4
  export { DataGridNumberCell } from "./data-grid-number-cell"
4
5
  export { DataGridReadonlyCell as DataGridReadOnlyCell } from "./data-grid-readonly-cell"
5
6
  export { DataGridRoot, type DataGridRootProps } from "./data-grid-root"
6
7
  export { DataGridSkeleton } from "./data-grid-skeleton"
7
8
  export { DataGridTextCell } from "./data-grid-text-cell"
9
+ export { DataGridExpandableTextCell } from "./data-grid-textarea-modal-cell"
@@ -3,11 +3,13 @@ import { FieldValues } from "react-hook-form"
3
3
  import {
4
4
  DataGridBooleanCell,
5
5
  DataGridCurrencyCell,
6
+ DataGridMultilineCell,
6
7
  DataGridNumberCell,
7
8
  DataGridReadOnlyCell,
8
9
  DataGridRoot,
9
10
  DataGridSkeleton,
10
11
  DataGridTextCell,
12
+ DataGridExpandableTextCell,
11
13
  type DataGridRootProps,
12
14
  } from "./components"
13
15
 
@@ -18,6 +20,11 @@ interface DataGridProps<TData, TFieldValues extends FieldValues = FieldValues>
18
20
 
19
21
  const _DataGrid = <TData, TFieldValues extends FieldValues = FieldValues>({
20
22
  isLoading,
23
+ // Lazy loading props - passed through to DataGridRoot
24
+ totalRowCount,
25
+ onFetchMore,
26
+ isFetchingMore,
27
+ hasNextPage,
21
28
  ...props
22
29
  }: DataGridProps<TData, TFieldValues>) => {
23
30
  return isLoading ? (
@@ -28,13 +35,21 @@ const _DataGrid = <TData, TFieldValues extends FieldValues = FieldValues>({
28
35
  }
29
36
  />
30
37
  ) : (
31
- <DataGridRoot {...props} />
38
+ <DataGridRoot
39
+ {...props}
40
+ totalRowCount={totalRowCount}
41
+ onFetchMore={onFetchMore}
42
+ isFetchingMore={isFetchingMore}
43
+ hasNextPage={hasNextPage}
44
+ />
32
45
  )
33
46
  }
34
47
 
35
48
  export const DataGrid = Object.assign(_DataGrid, {
36
49
  BooleanCell: DataGridBooleanCell,
37
50
  TextCell: DataGridTextCell,
51
+ MultilineCell: DataGridMultilineCell,
52
+ ExpandableTextCell: DataGridExpandableTextCell,
38
53
  NumberCell: DataGridNumberCell,
39
54
  CurrencyCell: DataGridCurrencyCell,
40
55
  ReadonlyCell: DataGridReadOnlyCell,
@@ -36,6 +36,18 @@ type DataGridHelperColumnsProps<TData, TFieldValues extends FieldValues> = {
36
36
  * @default false
37
37
  */
38
38
  disableHiding?: boolean
39
+ /**
40
+ * The size of the column in pixels.
41
+ */
42
+ size?: number
43
+ /**
44
+ * The minimum size of the column in pixels.
45
+ */
46
+ minSize?: number
47
+ /**
48
+ * The maximum size of the column in pixels.
49
+ */
50
+ maxSize?: number
39
51
  } & (
40
52
  | {
41
53
  field: FieldFunction<TData, TFieldValues>
@@ -59,12 +71,18 @@ export function createDataGridHelper<
59
71
  disableHiding = false,
60
72
  field,
61
73
  type,
74
+ size,
75
+ minSize,
76
+ maxSize,
62
77
  }: DataGridHelperColumnsProps<TData, TFieldValues>) =>
63
78
  columnHelper.display({
64
79
  id,
65
80
  header,
66
81
  cell,
67
82
  enableHiding: !disableHiding,
83
+ size,
84
+ minSize,
85
+ maxSize,
68
86
  meta: {
69
87
  name,
70
88
  field,
@@ -180,6 +180,17 @@ export const useDataGridCell = <TData, TValue>({
180
180
  )?.set
181
181
  nativeInputValueSetter?.call(inputRef.current, e.key)
182
182
 
183
+ const event = new Event("input", { bubbles: true })
184
+ inputRef.current.dispatchEvent(event)
185
+ } else if (inputRef.current instanceof HTMLTextAreaElement) {
186
+ inputRef.current.value = ""
187
+
188
+ const nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(
189
+ window.HTMLTextAreaElement.prototype,
190
+ "value"
191
+ )?.set
192
+ nativeTextAreaValueSetter?.call(inputRef.current, e.key)
193
+
183
194
  // Trigger input event to notify react-hook-form
184
195
  const event = new Event("input", { bubbles: true })
185
196
  inputRef.current.dispatchEvent(event)
@@ -202,7 +213,7 @@ export const useDataGridCell = <TData, TValue>({
202
213
 
203
214
  useEffect(() => {
204
215
  if (isAnchor && !containerRef.current?.contains(document.activeElement)) {
205
- containerRef.current?.focus()
216
+ containerRef.current?.focus({ preventScroll: true })
206
217
  }
207
218
  }, [isAnchor])
208
219
 
@@ -305,6 +305,7 @@ export const useDataGridKeydownEvent = <
305
305
  break
306
306
  case "number":
307
307
  case "text":
308
+ case "multiline-text":
308
309
  handleSpaceKeyTextOrNumber(anchor)
309
310
  break
310
311
  }
@@ -384,6 +385,30 @@ export const useDataGridKeydownEvent = <
384
385
  [handleMoveOnEnter, handleEditOnEnter, isEditing]
385
386
  )
386
387
 
388
+ /**
389
+ * Handles the enter key for multiline-text cells.
390
+ *
391
+ * The behavior is as follows:
392
+ * - If Shift+Enter is pressed while editing, allow the newline (don't prevent default).
393
+ * - If Enter is pressed while editing (without Shift), move to the next cell.
394
+ * - If the cell is currently not being edited, start editing the cell.
395
+ */
396
+ const handleEnterKeyMultilineText = useCallback(
397
+ (e: KeyboardEvent, anchor: DataGridCoordinates) => {
398
+ if (isEditing) {
399
+ if (e.shiftKey) {
400
+ return
401
+ }
402
+
403
+ handleMoveOnEnter(e, anchor)
404
+ return
405
+ }
406
+
407
+ handleEditOnEnter(anchor)
408
+ },
409
+ [handleMoveOnEnter, handleEditOnEnter, isEditing]
410
+ )
411
+
387
412
  /**
388
413
  * Handles the enter key for boolean cells.
389
414
  *
@@ -432,11 +457,18 @@ export const useDataGridKeydownEvent = <
432
457
  return
433
458
  }
434
459
 
435
- e.preventDefault()
436
-
437
460
  const type = matrix.getCellType(anchor)
438
461
 
462
+ if (type === "multiline-text" && isEditing && e.shiftKey) {
463
+ return
464
+ }
465
+
466
+ e.preventDefault()
467
+
439
468
  switch (type) {
469
+ case "multiline-text":
470
+ handleEnterKeyMultilineText(e, anchor)
471
+ break
440
472
  case "togglable-number":
441
473
  case "text":
442
474
  case "number":
@@ -448,7 +480,14 @@ export const useDataGridKeydownEvent = <
448
480
  }
449
481
  }
450
482
  },
451
- [anchor, matrix, handleEnterKeyTextOrNumber, handleEnterKeyBoolean]
483
+ [
484
+ anchor,
485
+ matrix,
486
+ isEditing,
487
+ handleEnterKeyTextOrNumber,
488
+ handleEnterKeyBoolean,
489
+ handleEnterKeyMultilineText,
490
+ ]
452
491
  )
453
492
 
454
493
  const handleDeleteKeyTogglableNumber = useCallback(
@@ -526,6 +565,7 @@ export const useDataGridKeydownEvent = <
526
565
 
527
566
  switch (type) {
528
567
  case "text":
568
+ case "multiline-text":
529
569
  case "number":
530
570
  handleDeleteKeyTextOrNumber(anchor, rangeEnd)
531
571
  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"
@@ -9,6 +9,7 @@ import { useExtension } from "../../../providers/extension-provider"
9
9
  import { INavItem, NavItem } from "../nav-item"
10
10
  import { Shell } from "../shell"
11
11
  import { UserMenu } from "../user-menu"
12
+ import { useFeatureFlag } from "../../../providers/feature-flag-provider"
12
13
 
13
14
  export const SettingsLayout = () => {
14
15
  return (
@@ -19,6 +20,7 @@ export const SettingsLayout = () => {
19
20
  }
20
21
 
21
22
  const useSettingRoutes = (): INavItem[] => {
23
+ const isTranslationsEnabled = useFeatureFlag("translation")
22
24
  const { t } = useTranslation()
23
25
 
24
26
  return useMemo(
@@ -63,8 +65,16 @@ const useSettingRoutes = (): INavItem[] => {
63
65
  label: t("stockLocations.domain"),
64
66
  to: "/settings/locations",
65
67
  },
68
+ ...(isTranslationsEnabled
69
+ ? [
70
+ {
71
+ label: t("translations.domain"),
72
+ to: "/settings/translations",
73
+ },
74
+ ]
75
+ : []),
66
76
  ],
67
- [t]
77
+ [t, isTranslationsEnabled]
68
78
  )
69
79
  }
70
80
 
@@ -8,7 +8,7 @@ import { RouteModalProvider } from "../route-modal-provider/route-provider"
8
8
  import { StackedModalProvider } from "../stacked-modal-provider"
9
9
 
10
10
  type RouteFocusModalProps = PropsWithChildren<{
11
- prev?: string | Partial<Path>
11
+ prev?: string | Partial<Path> | number
12
12
  }>
13
13
 
14
14
  const Root = ({ prev = "..", children }: RouteFocusModalProps) => {
@@ -16,7 +16,8 @@ const Root = ({ prev = "..", children }: RouteFocusModalProps) => {
16
16
  const [open, setOpen] = useState(false)
17
17
  const [stackedModalOpen, onStackedModalOpen] = useState(false)
18
18
 
19
- const to = useStateAwareTo(prev)
19
+ const to: string | Partial<Path> | number =
20
+ typeof prev === "number" ? prev : useStateAwareTo(prev)
20
21
 
21
22
  /**
22
23
  * Open the modal when the component mounts. This
@@ -34,7 +35,11 @@ const Root = ({ prev = "..", children }: RouteFocusModalProps) => {
34
35
  const handleOpenChange = (open: boolean) => {
35
36
  if (!open) {
36
37
  document.body.style.pointerEvents = "auto"
37
- navigate(to, { replace: true })
38
+ if (typeof to === "number") {
39
+ navigate(to)
40
+ } else {
41
+ navigate(to, { replace: true })
42
+ }
38
43
  return
39
44
  }
40
45
 
@@ -24,7 +24,12 @@ export const RouteModalForm = <TFieldValues extends FieldValues = any>({
24
24
  } = form
25
25
 
26
26
  const blocker = useBlocker(({ currentLocation, nextLocation }) => {
27
- const { isSubmitSuccessful } = nextLocation.state || {}
27
+ // Check both nextLocation and currentLocation state for successful submission
28
+ // This handles browser history navigation (-1) where we set state on current location
29
+ const { isSubmitSuccessful: nextIsSuccessful } = nextLocation.state || {}
30
+ const { isSubmitSuccessful: currentIsSuccessful } =
31
+ currentLocation.state || {}
32
+ const isSubmitSuccessful = nextIsSuccessful || currentIsSuccessful
28
33
 
29
34
  if (isSubmitSuccessful) {
30
35
  onClose?.(true)
@@ -1,9 +1,9 @@
1
1
  import { PropsWithChildren, useCallback, useMemo, useState } from "react"
2
- import { Path, useNavigate } from "react-router-dom"
2
+ import { Path, useLocation, useNavigate } from "react-router-dom"
3
3
  import { RouteModalProviderContext } from "./route-modal-context"
4
4
 
5
5
  type RouteModalProviderProps = PropsWithChildren<{
6
- prev: string | Partial<Path>
6
+ prev: string | Partial<Path> | number
7
7
  }>
8
8
 
9
9
  export const RouteModalProvider = ({
@@ -11,15 +11,27 @@ export const RouteModalProvider = ({
11
11
  children,
12
12
  }: RouteModalProviderProps) => {
13
13
  const navigate = useNavigate()
14
+ const location = useLocation()
14
15
 
15
16
  const [closeOnEscape, setCloseOnEscape] = useState(true)
16
17
 
17
18
  const handleSuccess = useCallback(
18
19
  (path?: string) => {
19
20
  const to = path || prev
20
- navigate(to, { replace: true, state: { isSubmitSuccessful: true } })
21
+ if (typeof to === "number") {
22
+ // Replace current location with success state, then navigate back
23
+ navigate(location.pathname + location.search, {
24
+ replace: true,
25
+ state: { ...location.state, isSubmitSuccessful: true },
26
+ })
27
+ setTimeout(() => {
28
+ navigate(to)
29
+ }, 0)
30
+ } else {
31
+ navigate(to, { replace: true, state: { isSubmitSuccessful: true } })
32
+ }
21
33
  },
22
- [navigate, prev]
34
+ [navigate, prev, location]
23
35
  )
24
36
 
25
37
  const value = useMemo(
@@ -1840,6 +1840,25 @@ export function getRouteMap({
1840
1840
  },
1841
1841
  ],
1842
1842
  },
1843
+ {
1844
+ path: "translations",
1845
+ errorElement: <ErrorBoundary />,
1846
+ handle: {
1847
+ breadcrumb: () => t("translations.domain"),
1848
+ },
1849
+ children: [
1850
+ {
1851
+ path: "",
1852
+ lazy: () =>
1853
+ import("../../routes/translations/translation-list"),
1854
+ },
1855
+ {
1856
+ path: "edit",
1857
+ lazy: () =>
1858
+ import("../../routes/translations/translations-edit"),
1859
+ },
1860
+ ],
1861
+ },
1843
1862
  ...(settingsRoutes?.[0]?.children || []),
1844
1863
  ],
1845
1864
  },
@@ -1,7 +1,9 @@
1
1
  import { FetchError } from "@medusajs/js-sdk"
2
2
  import { HttpTypes } from "@medusajs/types"
3
3
  import {
4
+ InfiniteData,
4
5
  QueryKey,
6
+ UseInfiniteQueryOptions,
5
7
  UseMutationOptions,
6
8
  UseQueryOptions,
7
9
  useMutation,
@@ -11,6 +13,7 @@ import { sdk } from "../../lib/client"
11
13
  import { queryClient } from "../../lib/query-client"
12
14
  import { queryKeysFactory } from "../../lib/query-key-factory"
13
15
  import { productsQueryKeys } from "./products"
16
+ import { useInfiniteList } from "../use-infinite-list"
14
17
 
15
18
  const CATEGORIES_QUERY_KEY = "categories" as const
16
19
  export const categoriesQueryKeys = queryKeysFactory(CATEGORIES_QUERY_KEY)
@@ -58,6 +61,35 @@ export const useProductCategories = (
58
61
  return { ...data, ...rest }
59
62
  }
60
63
 
64
+ export const useInfiniteCategories = (
65
+ query?: Omit<HttpTypes.AdminProductCategoryListParams, "offset" | "limit"> & {
66
+ limit?: number
67
+ },
68
+ options?: Omit<
69
+ UseInfiniteQueryOptions<
70
+ HttpTypes.AdminProductCategoryListResponse,
71
+ FetchError,
72
+ InfiniteData<HttpTypes.AdminProductCategoryListResponse, number>,
73
+ HttpTypes.AdminProductCategoryListResponse,
74
+ QueryKey,
75
+ number
76
+ >,
77
+ "queryFn" | "queryKey" | "initialPageParam" | "getNextPageParam"
78
+ >
79
+ ) => {
80
+ return useInfiniteList<
81
+ HttpTypes.AdminProductCategoryListResponse,
82
+ HttpTypes.AdminProductCategoryListParams,
83
+ FetchError,
84
+ QueryKey
85
+ >({
86
+ queryKey: (params) => categoriesQueryKeys.list(params),
87
+ queryFn: (params) => sdk.admin.productCategory.list(params),
88
+ query,
89
+ options,
90
+ })
91
+ }
92
+
61
93
  export const useCreateProductCategory = (
62
94
  options?: UseMutationOptions<
63
95
  HttpTypes.AdminProductCategoryResponse,