@medusajs/dashboard 2.12.3-preview-20251217090412 → 2.12.3-preview-20251217123836

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 (276) hide show
  1. package/dist/{add-campaign-promotions-4QLXO46G.mjs → add-campaign-promotions-OYPGISTF.mjs} +2 -2
  2. package/dist/add-locales-GGNZCABB.mjs +81 -0
  3. package/dist/{adjust-inventory-2MFA656V.mjs → adjust-inventory-26YXAXQL.mjs} +4 -3
  4. package/dist/{api-key-management-create-ZUVF3SLR.mjs → api-key-management-create-EMP32G2D.mjs} +6 -5
  5. package/dist/{api-key-management-detail-THD74G7I.mjs → api-key-management-detail-FRUN2KFK.mjs} +11 -10
  6. package/dist/{api-key-management-edit-42HNUSXL.mjs → api-key-management-edit-IBM3ZXHK.mjs} +6 -5
  7. package/dist/{api-key-management-list-66CFOILY.mjs → api-key-management-list-KC5GOWAU.mjs} +4 -3
  8. package/dist/{api-key-management-sales-channels-HN3THM5J.mjs → api-key-management-sales-channels-LUB5G6RC.mjs} +6 -5
  9. package/dist/app.css +72 -0
  10. package/dist/app.js +13657 -11324
  11. package/dist/app.mjs +12 -11
  12. package/dist/{campaign-budget-edit-6DMZGUCI.mjs → campaign-budget-edit-B5MSE26J.mjs} +2 -2
  13. package/dist/{campaign-configuration-UNFRB5HR.mjs → campaign-configuration-QOE3D2BE.mjs} +2 -2
  14. package/dist/{campaign-create-QXG7PD3S.mjs → campaign-create-FJOECKGT.mjs} +3 -3
  15. package/dist/{campaign-detail-WR3XHHV2.mjs → campaign-detail-HM3GQJLQ.mjs} +11 -10
  16. package/dist/{campaign-edit-HN4US7DV.mjs → campaign-edit-K2POQH7M.mjs} +2 -2
  17. package/dist/{categories-metadata-BCZ463KN.mjs → categories-metadata-WKL3MGD7.mjs} +14 -13
  18. package/dist/{category-create-FFIBWXAH.mjs → category-create-KHJZSC7G.mjs} +5 -4
  19. package/dist/{category-detail-4HXJ5Z7N.mjs → category-detail-UTWWDKFP.mjs} +29 -13
  20. package/dist/{category-edit-74MZ6TXN.mjs → category-edit-CTA2EPDG.mjs} +5 -4
  21. package/dist/{category-list-OCJY2UJV.mjs → category-list-QBYJ4T3R.mjs} +20 -4
  22. package/dist/{category-organize-B6EFBFKB.mjs → category-organize-SXP33XET.mjs} +5 -4
  23. package/dist/{category-products-2HXLZDHL.mjs → category-products-XXBTCXFF.mjs} +14 -13
  24. package/dist/{chunk-XIVBRONM.mjs → chunk-23GTCEOV.mjs} +1 -1
  25. package/dist/{chunk-2NZDHAOE.mjs → chunk-27MGH3HR.mjs} +2 -2
  26. package/dist/{chunk-N3FCYZV6.mjs → chunk-2XTBDCGE.mjs} +1 -1
  27. package/dist/{chunk-RU4ZS47V.mjs → chunk-4JQR6QNW.mjs} +2 -2
  28. package/dist/{chunk-F65T2X7G.mjs → chunk-5F427YCP.mjs} +5 -5
  29. package/dist/{chunk-PNPT4W2F.mjs → chunk-5ISRTMYH.mjs} +1 -1
  30. package/dist/{chunk-Z6NHG5LQ.mjs → chunk-6P4Q4AAP.mjs} +3 -3
  31. package/dist/{chunk-F5NZDW7L.mjs → chunk-A2WBKOXJ.mjs} +2 -2
  32. package/dist/{chunk-F63F3FIT.mjs → chunk-A4XYK3MY.mjs} +2 -2
  33. package/dist/{chunk-NT6C7CHT.mjs → chunk-AWRCV3ME.mjs} +1 -1
  34. package/dist/{chunk-5X6SKB2P.mjs → chunk-BMS2QLJY.mjs} +1 -1
  35. package/dist/{chunk-3YPRDSZ6.mjs → chunk-BZKI5J2M.mjs} +1 -1
  36. package/dist/{chunk-25UWYEJX.mjs → chunk-CQOOXWPZ.mjs} +1 -1
  37. package/dist/{chunk-42OOM4DJ.mjs → chunk-D6UW7URG.mjs} +23 -6
  38. package/dist/{chunk-4YAPXPLM.mjs → chunk-DQUXK4WW.mjs} +1 -1
  39. package/dist/{chunk-MY6I7UJG.mjs → chunk-DTCIBQO2.mjs} +3 -3
  40. package/dist/{chunk-W7SLPIO2.mjs → chunk-FKNW5MLZ.mjs} +676 -151
  41. package/dist/{chunk-N4O5FAUC.mjs → chunk-FYWHE3W5.mjs} +1 -1
  42. package/dist/{chunk-QPKW37WR.mjs → chunk-GLBHPDR4.mjs} +249 -14
  43. package/dist/chunk-HGRIOEAR.mjs +32 -0
  44. package/dist/{chunk-PXJFCRIV.mjs → chunk-HNJ65IND.mjs} +4 -4
  45. package/dist/{chunk-Y5UO73CH.mjs → chunk-HTCYX4VD.mjs} +1 -1
  46. package/dist/{chunk-34KFHPN6.mjs → chunk-IAV7IKJ6.mjs} +1 -1
  47. package/dist/{store-add-locales-JLRTXG3Q.mjs → chunk-IKTGFXWR.mjs} +3 -67
  48. package/dist/{chunk-6W3BKVOC.mjs → chunk-KFYQTOGB.mjs} +1 -1
  49. package/dist/{chunk-EQTBJSBZ.mjs → chunk-KIIT4BNH.mjs} +3 -0
  50. package/dist/{chunk-LHNU4DYZ.mjs → chunk-KSDXSKJ7.mjs} +2 -2
  51. package/dist/{chunk-D4J3CEWH.mjs → chunk-N3SAXQVR.mjs} +2 -2
  52. package/dist/{chunk-Q6MSICBU.mjs → chunk-O333RR6K.mjs} +1 -1
  53. package/dist/{chunk-YAPTGHGP.mjs → chunk-OK6NZN2A.mjs} +1 -1
  54. package/dist/{chunk-7AX6R6G6.mjs → chunk-OSHH5GAS.mjs} +13 -1
  55. package/dist/{chunk-35LSPN2U.mjs → chunk-QKALAT7P.mjs} +1 -1
  56. package/dist/{chunk-UM4OIJZ3.mjs → chunk-S22SJRPO.mjs} +1 -1
  57. package/dist/{chunk-HFT7Q5Y5.mjs → chunk-SG2JZPTG.mjs} +1 -1
  58. package/dist/{chunk-B3AOQW2B.mjs → chunk-U6G4M5LP.mjs} +1 -1
  59. package/dist/{chunk-HWKLNKOY.mjs → chunk-U726TGCM.mjs} +1 -1
  60. package/dist/{chunk-HKIF5HVL.mjs → chunk-UJ2TMPV4.mjs} +12 -0
  61. package/dist/{chunk-5DUMSVP6.mjs → chunk-UMCJYHAD.mjs} +3 -3
  62. package/dist/{chunk-NHDFPGQ3.mjs → chunk-UWY5ZV66.mjs} +13 -1
  63. package/dist/{chunk-7ZYDO3XO.mjs → chunk-VFF5WB7C.mjs} +299 -194
  64. package/dist/{chunk-XXBP2Z5M.mjs → chunk-WVA4O7QS.mjs} +1 -1
  65. package/dist/{chunk-AH4DORIW.mjs → chunk-XY7A7GZJ.mjs} +1 -1
  66. package/dist/{chunk-FQDPOKEK.mjs → chunk-Y2YVTIJI.mjs} +1 -1
  67. package/dist/{chunk-L4NOVTH5.mjs → chunk-YIOBBZUB.mjs} +2 -2
  68. package/dist/{chunk-LEJUZW3P.mjs → chunk-Z6BFNHEO.mjs} +12 -0
  69. package/dist/{collection-add-products-JWAQ277T.mjs → collection-add-products-42F7H77E.mjs} +14 -13
  70. package/dist/{collection-create-DCRW344Z.mjs → collection-create-GWKWVT7B.mjs} +5 -4
  71. package/dist/{collection-detail-F4ON763T.mjs → collection-detail-PXIS3G64.mjs} +28 -12
  72. package/dist/{collection-edit-UNFEW6HT.mjs → collection-edit-EZIO2BR5.mjs} +5 -4
  73. package/dist/{collection-list-4C5HVO6Y.mjs → collection-list-O74CGY24.mjs} +29 -13
  74. package/dist/{collection-metadata-P4A5DXBQ.mjs → collection-metadata-U6FMA4IC.mjs} +14 -13
  75. package/dist/{customer-create-XCLZENJS.mjs → customer-create-IA56MXE6.mjs} +2 -2
  76. package/dist/{customer-create-address-4HZUIAM7.mjs → customer-create-address-27M25HTO.mjs} +2 -2
  77. package/dist/{customer-detail-X3RQJPXP.mjs → customer-detail-OMTFJ6CE.mjs} +12 -11
  78. package/dist/{customer-edit-BW5GVTQI.mjs → customer-edit-XQ5NWIVX.mjs} +2 -2
  79. package/dist/{customer-group-add-customers-SOXMSWQH.mjs → customer-group-add-customers-XMR2WBXX.mjs} +2 -2
  80. package/dist/{customer-group-create-6YV7W6TI.mjs → customer-group-create-RY4FVEIW.mjs} +2 -2
  81. package/dist/{customer-group-detail-NG32WKJT.mjs → customer-group-detail-ADK3M5LG.mjs} +11 -10
  82. package/dist/{customer-group-edit-7NXU34BQ.mjs → customer-group-edit-MQWARIQZ.mjs} +2 -2
  83. package/dist/{customer-group-list-EBETHKKO.mjs → customer-group-list-7ZRQ2HWU.mjs} +11 -10
  84. package/dist/{customer-group-metadata-WK2BGEGO.mjs → customer-group-metadata-JQJRLLXG.mjs} +3 -3
  85. package/dist/{customer-metadata-ZUWCUTM7.mjs → customer-metadata-HN2DYD5I.mjs} +3 -3
  86. package/dist/{customers-add-customer-group-7FYD54MZ.mjs → customers-add-customer-group-5U27WHJB.mjs} +13 -12
  87. package/dist/{edit-inventory-item-Y5W6VTHJ.mjs → edit-inventory-item-H7DAZWIT.mjs} +4 -3
  88. package/dist/{edit-inventory-item-attributes-NAAZDFEJ.mjs → edit-inventory-item-attributes-7HTXXPGZ.mjs} +4 -3
  89. package/dist/{edit-reservation-2UD4RZJX.mjs → edit-reservation-OVTRZHJR.mjs} +5 -4
  90. package/dist/{edit-rules-2W3BXEXR.mjs → edit-rules-BM2ERGVJ.mjs} +13 -12
  91. package/dist/en.json +38 -0
  92. package/dist/{inventory-create-VQEK7C5T.mjs → inventory-create-7MA7B5N2.mjs} +14 -13
  93. package/dist/{inventory-detail-HUHQ6ZNE.mjs → inventory-detail-B4PRHZK3.mjs} +11 -10
  94. package/dist/{inventory-list-RUSSPKHE.mjs → inventory-list-RXJPSVZE.mjs} +2 -1
  95. package/dist/{inventory-metadata-X52VGHA7.mjs → inventory-metadata-C7MJ3GY5.mjs} +14 -13
  96. package/dist/{inventory-stock-EKTOYN2F.mjs → inventory-stock-WVTYPJTX.mjs} +15 -14
  97. package/dist/{invite-VKHAAF4Z.mjs → invite-FVE4ZBKB.mjs} +2 -2
  98. package/dist/{location-create-RPLEXUZR.mjs → location-create-WZ43K3W7.mjs} +2 -2
  99. package/dist/{location-detail-UVWYE6Q2.mjs → location-detail-KO6EBDK5.mjs} +12 -11
  100. package/dist/{location-edit-L4ISEQHX.mjs → location-edit-VCS7GVWQ.mjs} +2 -2
  101. package/dist/{location-fulfillment-providers-HZZUHPVL.mjs → location-fulfillment-providers-IORBE3E3.mjs} +15 -14
  102. package/dist/{location-list-Z42ZYHUF.mjs → location-list-KVBA6J47.mjs} +2 -2
  103. package/dist/{location-sales-channels-XIMOK66B.mjs → location-sales-channels-P3QJTFDT.mjs} +5 -4
  104. package/dist/{location-service-zone-create-7ZNVLEE3.mjs → location-service-zone-create-J43WN6G4.mjs} +3 -3
  105. package/dist/{location-service-zone-edit-6OUAFEZD.mjs → location-service-zone-edit-KHHMSPXD.mjs} +2 -2
  106. package/dist/{location-service-zone-manage-areas-EOULKRYD.mjs → location-service-zone-manage-areas-6ZPMKMSX.mjs} +3 -3
  107. package/dist/{location-service-zone-shipping-option-create-M7G4SKNP.mjs → location-service-zone-shipping-option-create-2R3ZFLVK.mjs} +15 -14
  108. package/dist/{location-service-zone-shipping-option-edit-M2HJAASG.mjs → location-service-zone-shipping-option-edit-4CGPQ3VT.mjs} +2 -2
  109. package/dist/{location-service-zone-shipping-option-pricing-23QLNSBT.mjs → location-service-zone-shipping-option-pricing-5HN2Z5RB.mjs} +4 -4
  110. package/dist/{login-NSCAMAU6.mjs → login-XKB6OR7I.mjs} +13 -12
  111. package/dist/{manage-locations-JD6FSBOT.mjs → manage-locations-7HH6R4UP.mjs} +4 -3
  112. package/dist/{order-allocate-items-5T57NZOB.mjs → order-allocate-items-HZGGYJ42.mjs} +6 -5
  113. package/dist/{order-create-claim-TE56IE7P.mjs → order-create-claim-NKCOGF4A.mjs} +15 -14
  114. package/dist/{order-create-edit-RDFYBVFY.mjs → order-create-edit-UNQYXGLL.mjs} +14 -13
  115. package/dist/{order-create-exchange-B5ZOEQCJ.mjs → order-create-exchange-WI7OA2WO.mjs} +15 -14
  116. package/dist/{order-create-fulfillment-SRRP6X64.mjs → order-create-fulfillment-2LJTEWDY.mjs} +13 -12
  117. package/dist/{order-create-refund-PTOM65QK.mjs → order-create-refund-7K6UJXGP.mjs} +13 -12
  118. package/dist/{order-create-return-3C2QVNYN.mjs → order-create-return-52GHGW5Z.mjs} +7 -6
  119. package/dist/{order-create-shipment-HNILNFXB.mjs → order-create-shipment-ZTDLLUBY.mjs} +13 -12
  120. package/dist/{order-detail-3OUZOQ7G.mjs → order-detail-JTRUMRLO.mjs} +15 -14
  121. package/dist/{order-edit-billing-address-3IO7GXIK.mjs → order-edit-billing-address-YHYNVLOE.mjs} +13 -12
  122. package/dist/{order-edit-email-QIAEOUBV.mjs → order-edit-email-TCQPEVZY.mjs} +13 -12
  123. package/dist/{order-edit-shipping-address-QGGMHGBC.mjs → order-edit-shipping-address-CFSYQLKD.mjs} +13 -12
  124. package/dist/{order-export-JYYFTOWR.mjs → order-export-G4SBNEJ7.mjs} +14 -13
  125. package/dist/{order-list-RFR3HNDQ.mjs → order-list-GRLQWN4L.mjs} +6 -5
  126. package/dist/{order-metadata-ZBDTMBHZ.mjs → order-metadata-KGPB37VL.mjs} +14 -13
  127. package/dist/{order-receive-return-V42FTCFY.mjs → order-receive-return-JER24SEV.mjs} +14 -13
  128. package/dist/{order-request-transfer-A6NNIN2O.mjs → order-request-transfer-3FBUYZNT.mjs} +13 -12
  129. package/dist/{price-list-configuration-RTUEJENE.mjs → price-list-configuration-6S3MLNXQ.mjs} +6 -5
  130. package/dist/{price-list-create-GRT27KOM.mjs → price-list-create-CXZCFFTP.mjs} +17 -16
  131. package/dist/{price-list-detail-VKIWM7HP.mjs → price-list-detail-XOMU6U5J.mjs} +13 -12
  132. package/dist/{price-list-edit-SW7YIR3Z.mjs → price-list-edit-53UW35L3.mjs} +5 -4
  133. package/dist/{price-list-list-LF2PL4B5.mjs → price-list-list-DG5YEZ44.mjs} +4 -3
  134. package/dist/{price-list-prices-add-ISLZDQNI.mjs → price-list-prices-add-SDX5CQME.mjs} +16 -15
  135. package/dist/{price-list-prices-edit-C6SX2TLJ.mjs → price-list-prices-edit-EKB6NI5D.mjs} +7 -6
  136. package/dist/{product-attributes-REJ5NF2D.mjs → product-attributes-MXDPSOWM.mjs} +14 -13
  137. package/dist/{product-create-4TFE3JHQ.mjs → product-create-3O34JJLS.mjs} +16 -15
  138. package/dist/{product-create-option-GEGQNSMQ.mjs → product-create-option-7AOXAA4S.mjs} +4 -3
  139. package/dist/{product-create-variant-WI6D5CDG.mjs → product-create-variant-OTJKT6WI.mjs} +14 -13
  140. package/dist/{product-detail-BEIDGPKY.mjs → product-detail-SYTLG5D3.mjs} +59 -17
  141. package/dist/{product-edit-ZRQUK5OQ.mjs → product-edit-W72S22NM.mjs} +14 -13
  142. package/dist/{product-edit-option-HBIOBQTS.mjs → product-edit-option-LWJT3CYJ.mjs} +4 -3
  143. package/dist/{product-export-GIEFG4MA.mjs → product-export-57UUAGXF.mjs} +15 -14
  144. package/dist/{product-image-variants-edit-AAMRK4KQ.mjs → product-image-variants-edit-2BW5BJON.mjs} +13 -12
  145. package/dist/{product-import-43UXKCL3.mjs → product-import-6EM4VUXP.mjs} +13 -12
  146. package/dist/{product-list-D4CVUBQQ.mjs → product-list-5V5GEH5K.mjs} +25 -12
  147. package/dist/{product-media-EGK66SRX.mjs → product-media-3VJ7KENL.mjs} +4 -3
  148. package/dist/{product-metadata-55CAQTPS.mjs → product-metadata-JZLHBLZQ.mjs} +14 -13
  149. package/dist/{product-organization-7J7MUM6F.mjs → product-organization-SVXTCWIF.mjs} +15 -14
  150. package/dist/{product-prices-WQDE4XYT.mjs → product-prices-5ZL2RP7A.mjs} +5 -4
  151. package/dist/{product-sales-channels-GIJ7Q57M.mjs → product-sales-channels-PPXUG4KT.mjs} +5 -4
  152. package/dist/{product-shipping-profile-KIDRTPWA.mjs → product-shipping-profile-ETQFZ7DC.mjs} +4 -3
  153. package/dist/{product-stock-22S2HGMM.mjs → product-stock-SJJABF6I.mjs} +15 -14
  154. package/dist/{product-tag-create-7GPE246H.mjs → product-tag-create-XXO4AQEC.mjs} +13 -12
  155. package/dist/{product-tag-detail-R6C2TTA4.mjs → product-tag-detail-BSK64HXL.mjs} +30 -14
  156. package/dist/{product-tag-edit-WA6FGSIP.mjs → product-tag-edit-ENCGDT7E.mjs} +13 -12
  157. package/dist/{product-tag-list-U7PLHMLF.mjs → product-tag-list-SLQGCNDZ.mjs} +30 -14
  158. package/dist/{product-tag-metadata-EJ7FEXSE.mjs → product-tag-metadata-EPXHMU2K.mjs} +14 -13
  159. package/dist/{product-type-create-HBDROTGB.mjs → product-type-create-DRFXTL5O.mjs} +4 -3
  160. package/dist/{product-type-detail-TYQ7MJFE.mjs → product-type-detail-4CRRU7YK.mjs} +29 -13
  161. package/dist/{product-type-edit-H3JCMVRV.mjs → product-type-edit-SRHCZDK7.mjs} +4 -3
  162. package/dist/{product-type-list-KIKWBPD7.mjs → product-type-list-QQKAHBJ3.mjs} +19 -3
  163. package/dist/{product-type-metadata-Q6W5GL7Z.mjs → product-type-metadata-73OKOGPP.mjs} +14 -13
  164. package/dist/{product-variant-detail-SPJ7MZTK.mjs → product-variant-detail-RPHLG4HU.mjs} +27 -11
  165. package/dist/{product-variant-edit-BW7QMHC5.mjs → product-variant-edit-JF7NN64Y.mjs} +13 -12
  166. package/dist/{product-variant-manage-inventory-items-BLHCH6QD.mjs → product-variant-manage-inventory-items-Y2VEOHP7.mjs} +4 -3
  167. package/dist/{product-variant-media-KLSUISGH.mjs → product-variant-media-2WLVNGI4.mjs} +4 -3
  168. package/dist/{product-variant-metadata-GDMVC4MZ.mjs → product-variant-metadata-HU2CXGPO.mjs} +14 -13
  169. package/dist/{profile-edit-YBBXXCCK.mjs → profile-edit-ZNXO6WME.mjs} +2 -2
  170. package/dist/{promotion-add-campaign-JRTM7WBR.mjs → promotion-add-campaign-DO67QK6M.mjs} +3 -3
  171. package/dist/{promotion-create-HF6DTKCC.mjs → promotion-create-BHA3FQG2.mjs} +15 -14
  172. package/dist/{promotion-detail-HTM3F2VO.mjs → promotion-detail-F3QSR52W.mjs} +11 -10
  173. package/dist/{promotion-edit-details-AREFQ6O5.mjs → promotion-edit-details-6BSOOWQN.mjs} +2 -2
  174. package/dist/{refund-reason-create-RKIH46D6.mjs → refund-reason-create-ZA5TKW2Z.mjs} +13 -12
  175. package/dist/{refund-reason-edit-V3KC6NMO.mjs → refund-reason-edit-N2CRCLKZ.mjs} +13 -12
  176. package/dist/{refund-reason-list-M5BOHFWU.mjs → refund-reason-list-SE4TMGMT.mjs} +11 -10
  177. package/dist/{region-add-countries-OF5RUSYU.mjs → region-add-countries-2VAVXMJQ.mjs} +2 -2
  178. package/dist/{region-create-BGOWVCTR.mjs → region-create-NA7Y2LN4.mjs} +2 -2
  179. package/dist/{region-edit-5GO25GDF.mjs → region-edit-WAU347DP.mjs} +2 -2
  180. package/dist/{region-metadata-5NGUNAXZ.mjs → region-metadata-O5NZBWXP.mjs} +14 -13
  181. package/dist/{reservation-create-Z2SUMBGT.mjs → reservation-create-ZCIYM6JI.mjs} +5 -4
  182. package/dist/{reservation-detail-JH77TQHN.mjs → reservation-detail-UFK6XIXE.mjs} +11 -10
  183. package/dist/{reservation-list-WHBGZSVH.mjs → reservation-list-B47DXTA7.mjs} +3 -2
  184. package/dist/{reservation-metadata-ERCWXYVL.mjs → reservation-metadata-AEJEKGLV.mjs} +14 -13
  185. package/dist/{reset-password-5TAYQEUV.mjs → reset-password-Y5WVXV4Q.mjs} +2 -2
  186. package/dist/{return-reason-create-NXWDC6AC.mjs → return-reason-create-HM54WRJY.mjs} +2 -2
  187. package/dist/{return-reason-edit-M6IKNNKB.mjs → return-reason-edit-VSIRHVQ6.mjs} +2 -2
  188. package/dist/{sales-channel-add-products-DTAXWL6H.mjs → sales-channel-add-products-2LMB7EF5.mjs} +14 -13
  189. package/dist/{sales-channel-create-E7BDTPWD.mjs → sales-channel-create-MI7HHZYE.mjs} +5 -4
  190. package/dist/{sales-channel-detail-XWHV7J7X.mjs → sales-channel-detail-EUQ4STQI.mjs} +12 -11
  191. package/dist/{sales-channel-edit-HMPA3Y3L.mjs → sales-channel-edit-VSHOIR37.mjs} +5 -4
  192. package/dist/{sales-channel-list-7NSEFCXQ.mjs → sales-channel-list-JXKGHX4G.mjs} +11 -10
  193. package/dist/{sales-channel-metadata-CMZN74K7.mjs → sales-channel-metadata-AJMQ5SQ2.mjs} +14 -13
  194. package/dist/{shipping-option-type-create-4BN2GBHP.mjs → shipping-option-type-create-YVVIA2XC.mjs} +13 -12
  195. package/dist/{shipping-option-type-detail-YB3TCED2.mjs → shipping-option-type-detail-ZZW36XLK.mjs} +12 -11
  196. package/dist/{shipping-option-type-edit-MDO7ALAU.mjs → shipping-option-type-edit-O6F74T3A.mjs} +13 -12
  197. package/dist/{shipping-option-type-list-DJAT4RKX.mjs → shipping-option-type-list-SPTE7MT6.mjs} +12 -11
  198. package/dist/{shipping-profile-create-752TMBBE.mjs → shipping-profile-create-26R64I3Z.mjs} +2 -2
  199. package/dist/{shipping-profile-metadata-HQI7PCPU.mjs → shipping-profile-metadata-7WFE55VG.mjs} +14 -13
  200. package/dist/{store-add-currencies-PEWNEWCH.mjs → store-add-currencies-OX2WXFMS.mjs} +2 -2
  201. package/dist/store-add-locales-GWCGIXHU.mjs +81 -0
  202. package/dist/{store-detail-MOLAYNQZ.mjs → store-detail-YLJLBBZE.mjs} +11 -10
  203. package/dist/{store-edit-FTLPT55E.mjs → store-edit-5ZS562ZO.mjs} +2 -2
  204. package/dist/{store-metadata-ZJD23O4D.mjs → store-metadata-BZ57I2E6.mjs} +14 -13
  205. package/dist/{tax-region-create-NCO2OQ3I.mjs → tax-region-create-FGTV7VJL.mjs} +13 -12
  206. package/dist/{tax-region-detail-RIABXU7D.mjs → tax-region-detail-PPIMD7OX.mjs} +21 -20
  207. package/dist/{tax-region-edit-YZALLSZY.mjs → tax-region-edit-ELZKA7YH.mjs} +13 -12
  208. package/dist/{tax-region-list-BXZBUXRJ.mjs → tax-region-list-P4LDOPZD.mjs} +3 -3
  209. package/dist/{tax-region-province-create-5JP3PVID.mjs → tax-region-province-create-GKJ7WMRS.mjs} +2 -2
  210. package/dist/{tax-region-province-detail-UKLRVJS2.mjs → tax-region-province-detail-FV2NDT3E.mjs} +20 -19
  211. package/dist/{tax-region-tax-override-create-33XGHH7A.mjs → tax-region-tax-override-create-N572MQPZ.mjs} +16 -15
  212. package/dist/{tax-region-tax-override-edit-WOKZSPTY.mjs → tax-region-tax-override-edit-5DCSJW6D.mjs} +17 -16
  213. package/dist/{tax-region-tax-rate-create-O2SDSXCH.mjs → tax-region-tax-rate-create-MECFGVPL.mjs} +2 -2
  214. package/dist/{tax-region-tax-rate-edit-W62VEVKT.mjs → tax-region-tax-rate-edit-7DYSPYOD.mjs} +2 -2
  215. package/dist/translation-list-FK7XYLHX.mjs +527 -0
  216. package/dist/translations-edit-VRXZI5KW.mjs +678 -0
  217. package/dist/{user-detail-KEDJ7N3Q.mjs → user-detail-BJUXLZZQ.mjs} +2 -1
  218. package/dist/{user-edit-LXQCTDGA.mjs → user-edit-ZBB4RMTP.mjs} +2 -2
  219. package/dist/{user-invite-YH33WUC2.mjs → user-invite-GAGIM5DO.mjs} +2 -2
  220. package/dist/{user-metadata-4WOICEE7.mjs → user-metadata-GRJZZ524.mjs} +14 -13
  221. package/dist/{workflow-execution-detail-OKM6P4SX.mjs → workflow-execution-detail-HXTFWGKG.mjs} +11 -10
  222. package/package.json +9 -9
  223. package/src/components/common/icon-avatar/icon-avatar.tsx +4 -0
  224. package/src/components/data-grid/components/data-grid-cell-container.tsx +13 -4
  225. package/src/components/data-grid/components/data-grid-multiline-cell.tsx +103 -0
  226. package/src/components/data-grid/components/data-grid-readonly-cell.tsx +13 -3
  227. package/src/components/data-grid/components/data-grid-root.tsx +271 -60
  228. package/src/components/data-grid/components/data-grid-text-cell.tsx +7 -7
  229. package/src/components/data-grid/components/data-grid-textarea-modal-cell.tsx +233 -0
  230. package/src/components/data-grid/components/index.ts +2 -0
  231. package/src/components/data-grid/data-grid.tsx +16 -1
  232. package/src/components/data-grid/helpers/create-data-grid-column-helper.ts +18 -0
  233. package/src/components/data-grid/hooks/use-data-grid-cell.tsx +13 -1
  234. package/src/components/data-grid/hooks/use-data-grid-form-handlers.tsx +1 -0
  235. package/src/components/data-grid/hooks/use-data-grid-keydown-event.tsx +65 -7
  236. package/src/components/data-grid/types.ts +1 -0
  237. package/src/components/layout/settings-layout/settings-layout.tsx +11 -1
  238. package/src/components/modals/route-focus-modal/route-focus-modal.tsx +8 -3
  239. package/src/components/modals/route-modal-form/route-modal-form.tsx +6 -1
  240. package/src/components/modals/route-modal-provider/route-provider.tsx +16 -4
  241. package/src/dashboard-app/routes/get-route.map.tsx +23 -0
  242. package/src/hooks/api/categories.tsx +32 -0
  243. package/src/hooks/api/collections.tsx +31 -0
  244. package/src/hooks/api/index.ts +1 -0
  245. package/src/hooks/api/product-types.tsx +32 -0
  246. package/src/hooks/api/product-variants.tsx +47 -3
  247. package/src/hooks/api/products.tsx +29 -0
  248. package/src/hooks/api/tags.tsx +32 -0
  249. package/src/hooks/api/translations.tsx +315 -0
  250. package/src/hooks/use-infinite-list.tsx +92 -0
  251. package/src/i18n/translations/$schema.json +122 -0
  252. package/src/i18n/translations/en.json +38 -0
  253. package/src/i18n/translations/es.json +38 -0
  254. package/src/routes/categories/category-detail/components/category-general-section/category-general-section.tsx +16 -1
  255. package/src/routes/categories/category-list/components/category-list-table/category-list-table.tsx +16 -1
  256. package/src/routes/collections/collection-detail/components/collection-general-section/collection-general-section.tsx +16 -1
  257. package/src/routes/collections/collection-list/components/collection-list-table/collection-row-actions.tsx +16 -1
  258. package/src/routes/product-tags/product-tag-detail/components/product-tag-general-section/product-tag-general-section.tsx +16 -1
  259. package/src/routes/product-tags/product-tag-list/components/product-tag-list-table/product-tag-list-table.tsx +16 -1
  260. package/src/routes/product-types/product-type-detail/components/product-type-general-section/product-type-general-section.tsx +16 -1
  261. package/src/routes/product-types/product-type-list/components/product-type-list-table/product-table-row-actions.tsx +16 -1
  262. package/src/routes/product-variants/product-variant-detail/components/variant-general-section/variant-general-section.tsx +16 -1
  263. package/src/routes/products/product-detail/components/product-general-section/product-general-section.tsx +16 -1
  264. package/src/routes/products/product-detail/components/product-variant-section/product-variant-section.tsx +32 -1
  265. package/src/routes/products/product-list/components/product-list-table/product-list-table.tsx +15 -1
  266. package/src/routes/translations/add-locales/add-locales.tsx +29 -0
  267. package/src/routes/translations/add-locales/index.tsx +1 -0
  268. package/src/routes/translations/translation-list/components/active-locales-section/active-locales-section.tsx +93 -0
  269. package/src/routes/translations/translation-list/components/translation-list-section/translation-list-section.tsx +48 -0
  270. package/src/routes/translations/translation-list/components/translations-completion-section/translations-completion-section.tsx +285 -0
  271. package/src/routes/translations/translation-list/index.tsx +1 -0
  272. package/src/routes/translations/translation-list/translation-list.tsx +138 -0
  273. package/src/routes/translations/translations-edit/components/translations-edit-form/index.ts +1 -0
  274. package/src/routes/translations/translations-edit/components/translations-edit-form/translations-edit-form.tsx +747 -0
  275. package/src/routes/translations/translations-edit/index.ts +1 -0
  276. 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,
@@ -128,6 +128,7 @@ export const useDataGridCell = <TData, TValue>({
128
128
  case "number":
129
129
  return numberCharacterRegex.test(key)
130
130
  case "text":
131
+ case "multiline-text":
131
132
  return textCharacterRegex.test(key)
132
133
  default:
133
134
  // KeyboardEvents should not be forwareded to other types of cells
@@ -180,6 +181,17 @@ export const useDataGridCell = <TData, TValue>({
180
181
  )?.set
181
182
  nativeInputValueSetter?.call(inputRef.current, e.key)
182
183
 
184
+ const event = new Event("input", { bubbles: true })
185
+ inputRef.current.dispatchEvent(event)
186
+ } else if (inputRef.current instanceof HTMLTextAreaElement) {
187
+ inputRef.current.value = ""
188
+
189
+ const nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(
190
+ window.HTMLTextAreaElement.prototype,
191
+ "value"
192
+ )?.set
193
+ nativeTextAreaValueSetter?.call(inputRef.current, e.key)
194
+
183
195
  // Trigger input event to notify react-hook-form
184
196
  const event = new Event("input", { bubbles: true })
185
197
  inputRef.current.dispatchEvent(event)
@@ -202,7 +214,7 @@ export const useDataGridCell = <TData, TValue>({
202
214
 
203
215
  useEffect(() => {
204
216
  if (isAnchor && !containerRef.current?.contains(document.activeElement)) {
205
- containerRef.current?.focus()
217
+ containerRef.current?.focus({ preventScroll: true })
206
218
  }
207
219
  }, [isAnchor])
208
220
 
@@ -228,6 +228,7 @@ export function convertArrayToPrimitive(
228
228
  case "boolean":
229
229
  return values.map(convertToBoolean)
230
230
  case "text":
231
+ case "multiline-text":
231
232
  return values.map(covertToString)
232
233
  default:
233
234
  throw new Error(`Unsupported target type "${type}".`)
@@ -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"
@@ -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,29 @@ 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
+ path: "add-locales",
1862
+ lazy: () => import("../../routes/translations/add-locales"),
1863
+ },
1864
+ ],
1865
+ },
1843
1866
  ...(settingsRoutes?.[0]?.children || []),
1844
1867
  ],
1845
1868
  },