@medusajs/dashboard 3.0.0-snapshot-20251202221811 → 3.0.0-snapshot-20251208164410

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 (241) hide show
  1. package/dist/{adjust-inventory-WZOCLB5V.mjs → adjust-inventory-ZB3AVET7.mjs} +1 -1
  2. package/dist/{api-key-management-create-W7NL2IYN.mjs → api-key-management-create-U6VGZK7R.mjs} +3 -3
  3. package/dist/{api-key-management-detail-LDBEO446.mjs → api-key-management-detail-OEAWWV5O.mjs} +13 -13
  4. package/dist/{api-key-management-edit-TLVLXAVK.mjs → api-key-management-edit-TJM737A7.mjs} +3 -3
  5. package/dist/{api-key-management-list-FTLC3ELT.mjs → api-key-management-list-ZRYMMTF5.mjs} +3 -3
  6. package/dist/{api-key-management-sales-channels-NYY3NZOE.mjs → api-key-management-sales-channels-D2RAHI7W.mjs} +4 -4
  7. package/dist/app.css +3 -3
  8. package/dist/app.js +17416 -15980
  9. package/dist/app.mjs +11 -11
  10. package/dist/{campaign-create-LHL7FKQK.mjs → campaign-create-IXOWJQ4L.mjs} +3 -3
  11. package/dist/{campaign-detail-T3V6M3XE.mjs → campaign-detail-TFQCDDIN.mjs} +10 -10
  12. package/dist/{categories-metadata-V6FDXGSN.mjs → categories-metadata-7JFVYYUN.mjs} +10 -10
  13. package/dist/{category-create-ELMCLH4J.mjs → category-create-BTMZYQ5R.mjs} +5 -5
  14. package/dist/{category-detail-DNWTF4FV.mjs → category-detail-UUEMLEVJ.mjs} +14 -14
  15. package/dist/{category-edit-TYKLEYGE.mjs → category-edit-Q3KEELHO.mjs} +2 -2
  16. package/dist/{category-list-IJ3DLPYQ.mjs → category-list-Z6HS6N75.mjs} +5 -5
  17. package/dist/{category-organize-PDLC54E2.mjs → category-organize-45NPSRNG.mjs} +2 -2
  18. package/dist/{category-products-ATK63QHB.mjs → category-products-KW6X3JDW.mjs} +13 -13
  19. package/dist/{chunk-WPXYFJEP.mjs → chunk-2WLOIS3L.mjs} +1 -1
  20. package/dist/{chunk-UHIPGDJZ.mjs → chunk-35G7IXTE.mjs} +15 -15
  21. package/dist/{chunk-DODQ3KJT.mjs → chunk-3RRA56WC.mjs} +8 -3
  22. package/dist/{chunk-DKIUGYWW.mjs → chunk-3ZJ55SFA.mjs} +2 -2
  23. package/dist/{chunk-OXPE5TAY.mjs → chunk-42TMWI76.mjs} +1 -1
  24. package/dist/{chunk-OFN7DIZA.mjs → chunk-5AM254NB.mjs} +83 -3
  25. package/dist/{chunk-56TDUOXV.mjs → chunk-5N33TBBX.mjs} +1 -1
  26. package/dist/{chunk-5LGRZSEH.mjs → chunk-67RC6SEX.mjs} +1 -1
  27. package/dist/{chunk-O4RZ3Y65.mjs → chunk-7H6DB666.mjs} +1 -1
  28. package/dist/{chunk-5EGFR4EO.mjs → chunk-AGBHQZZT.mjs} +318 -236
  29. package/dist/{chunk-E3AFVPLW.mjs → chunk-BWU3ZE4W.mjs} +1 -1
  30. package/dist/{chunk-IKTS7EHT.mjs → chunk-D55WNQYO.mjs} +1 -1
  31. package/dist/{chunk-XDLBQGST.mjs → chunk-EFRTOOI5.mjs} +1 -1
  32. package/dist/{chunk-ETOJCN3Q.mjs → chunk-FJHAGJ5G.mjs} +1 -1
  33. package/dist/{chunk-K5QWNI6V.mjs → chunk-FNQ227BC.mjs} +1 -1
  34. package/dist/{chunk-A6PWH2CK.mjs → chunk-GHBURGZC.mjs} +1 -1
  35. package/dist/{chunk-4MG5LND4.mjs → chunk-HEYM67GY.mjs} +1 -1
  36. package/dist/{chunk-QHRVYT5N.mjs → chunk-HRSO6H4F.mjs} +3 -3
  37. package/dist/{chunk-REUYEF7L.mjs → chunk-MB7M5THW.mjs} +1 -1
  38. package/dist/{chunk-KLNRCI3K.mjs → chunk-MOGV3UZD.mjs} +1 -1
  39. package/dist/{chunk-3C6WQ7NH.mjs → chunk-NFEW5CVI.mjs} +37 -3
  40. package/dist/{chunk-VGXF4DOW.mjs → chunk-NKGKWMUU.mjs} +5 -5
  41. package/dist/{chunk-RLDK4LY5.mjs → chunk-NTYLG6Y3.mjs} +1 -1
  42. package/dist/{chunk-AF7A24XI.mjs → chunk-O5DGX2NZ.mjs} +1 -1
  43. package/dist/{chunk-T2ANPJ36.mjs → chunk-OMRGW7JS.mjs} +3 -3
  44. package/dist/{chunk-7V2JZU2B.mjs → chunk-P23S5LDK.mjs} +2 -2
  45. package/dist/{chunk-OAW7KLET.mjs → chunk-PPRHEG37.mjs} +2 -2
  46. package/dist/{chunk-AENRV3N7.mjs → chunk-QW4SQVMT.mjs} +109 -50
  47. package/dist/{chunk-MWBKAP7W.mjs → chunk-RNYL6AXZ.mjs} +2 -2
  48. package/dist/{chunk-KWP436SM.mjs → chunk-S3MMZPMX.mjs} +2 -2
  49. package/dist/{chunk-ND5YSIPU.mjs → chunk-SAZHCRHS.mjs} +1 -1
  50. package/dist/{chunk-M3CKVBZC.mjs → chunk-YGEJFHC3.mjs} +1 -1
  51. package/dist/chunk-ZHH3W7CN.mjs +171 -0
  52. package/dist/{collection-add-products-7WSD7YU4.mjs → collection-add-products-YSTEEHMF.mjs} +14 -14
  53. package/dist/{collection-create-I2A2X4VK.mjs → collection-create-RIGJHEX5.mjs} +2 -2
  54. package/dist/{collection-detail-NVE55BPK.mjs → collection-detail-P5JWWFHH.mjs} +14 -14
  55. package/dist/{collection-edit-RGH7NCUE.mjs → collection-edit-WX5G3FHR.mjs} +2 -2
  56. package/dist/{collection-list-SXHRKTIU.mjs → collection-list-PU6SWYVL.mjs} +24 -23
  57. package/dist/{collection-metadata-ZREV7BND.mjs → collection-metadata-R55DUZSX.mjs} +11 -11
  58. package/dist/{customer-detail-O4L55RY6.mjs → customer-detail-HVGU3DRM.mjs} +14 -14
  59. package/dist/{customer-group-detail-LSZA4ARM.mjs → customer-group-detail-QKFWIFYH.mjs} +13 -13
  60. package/dist/{customer-group-list-6JTEUJAC.mjs → customer-group-list-WLG2ZMBD.mjs} +13 -13
  61. package/dist/{customers-add-customer-group-MHJ34FDF.mjs → customers-add-customer-group-KL5UXXOR.mjs} +13 -13
  62. package/dist/{edit-inventory-item-LMDNUI6M.mjs → edit-inventory-item-O6JLGZE4.mjs} +1 -1
  63. package/dist/{edit-inventory-item-attributes-DPJIHBP3.mjs → edit-inventory-item-attributes-AUVR3GYY.mjs} +1 -1
  64. package/dist/{edit-reservation-IOOZBJ2T.mjs → edit-reservation-GQ6R6GVA.mjs} +2 -2
  65. package/dist/{edit-rules-CEE2IKS6.mjs → edit-rules-PJWEWMM7.mjs} +12 -12
  66. package/dist/en.json +49 -3
  67. package/dist/{inventory-create-H62EOWR6.mjs → inventory-create-P3WYAGQZ.mjs} +10 -10
  68. package/dist/{inventory-detail-ALOIH3H7.mjs → inventory-detail-C2NU7GTA.mjs} +10 -10
  69. package/dist/{inventory-list-RQBI7UJX.mjs → inventory-list-ADJQDNX5.mjs} +1 -1
  70. package/dist/{inventory-metadata-ICOCEY75.mjs → inventory-metadata-V2N3HOPG.mjs} +10 -10
  71. package/dist/{inventory-stock-LDEZTKU4.mjs → inventory-stock-5DCIGKBI.mjs} +10 -10
  72. package/dist/{location-detail-UNXAQQSZ.mjs → location-detail-2CJWVT5M.mjs} +15 -15
  73. package/dist/{location-fulfillment-providers-XVFFAB6I.mjs → location-fulfillment-providers-PYPUR74W.mjs} +15 -14
  74. package/dist/{location-sales-channels-UVYT52SH.mjs → location-sales-channels-JPH5BTUY.mjs} +3 -3
  75. package/dist/{location-service-zone-shipping-option-create-THNTZX5P.mjs → location-service-zone-shipping-option-create-HLZLP422.mjs} +11 -11
  76. package/dist/{location-service-zone-shipping-option-edit-TQNTCYII.mjs → location-service-zone-shipping-option-edit-OYTEZGGC.mjs} +4 -4
  77. package/dist/{login-EMANCYJH.mjs → login-AKO3BIQT.mjs} +10 -10
  78. package/dist/{manage-locations-2VDQ3ILT.mjs → manage-locations-ATCDVTSR.mjs} +1 -1
  79. package/dist/{order-allocate-items-FCJTB2IB.mjs → order-allocate-items-2H25GRTK.mjs} +3 -3
  80. package/dist/{order-create-claim-P5ADYS5P.mjs → order-create-claim-CWGDAFFU.mjs} +17 -17
  81. package/dist/{order-create-edit-CVPRRPOA.mjs → order-create-edit-KJODOQXN.mjs} +11 -11
  82. package/dist/{order-create-exchange-IHV6VKO5.mjs → order-create-exchange-TM4FQLKM.mjs} +23 -23
  83. package/dist/{order-create-fulfillment-SY6UM3NJ.mjs → order-create-fulfillment-2WJZPAWX.mjs} +14 -14
  84. package/dist/{order-create-refund-AGKPMCF6.mjs → order-create-refund-A6WKCHX7.mjs} +15 -15
  85. package/dist/{order-create-return-5UH7FN3H.mjs → order-create-return-NDKTI4E5.mjs} +5 -5
  86. package/dist/{order-create-shipment-J34CYL32.mjs → order-create-shipment-3AVEAGAY.mjs} +10 -10
  87. package/dist/{order-detail-EVDCA6UP.mjs → order-detail-7HXZEBWJ.mjs} +31 -31
  88. package/dist/{order-edit-billing-address-JH3XNOCQ.mjs → order-edit-billing-address-DPK7HTLM.mjs} +10 -10
  89. package/dist/{order-edit-email-KV2IHQRT.mjs → order-edit-email-UJ2OUKHJ.mjs} +10 -10
  90. package/dist/{order-edit-shipping-address-WMNNU53B.mjs → order-edit-shipping-address-5ZCGHHZE.mjs} +10 -10
  91. package/dist/{order-list-26YQAIRH.mjs → order-list-5C4TVJRH.mjs} +4 -4
  92. package/dist/{order-metadata-F4LZ73LR.mjs → order-metadata-UKTGLYWR.mjs} +10 -10
  93. package/dist/{order-receive-return-LSMD7POH.mjs → order-receive-return-N7VLM2GX.mjs} +11 -11
  94. package/dist/{order-request-transfer-A3EBBZ5N.mjs → order-request-transfer-5ENT7IOT.mjs} +11 -11
  95. package/dist/{price-list-configuration-2G3WFC3J.mjs → price-list-configuration-SS2VMD4N.mjs} +4 -4
  96. package/dist/{price-list-create-RLT7G7KF.mjs → price-list-create-FF4F6M2A.mjs} +17 -17
  97. package/dist/{price-list-detail-TKRELOK2.mjs → price-list-detail-HQF4ZR2U.mjs} +17 -17
  98. package/dist/{price-list-edit-6URYI6AK.mjs → price-list-edit-VRI5T4W3.mjs} +2 -2
  99. package/dist/{price-list-list-FLINOQCK.mjs → price-list-list-S2HWTXKV.mjs} +3 -3
  100. package/dist/{price-list-prices-add-UPUY72HG.mjs → price-list-prices-add-JYZAHKAQ.mjs} +13 -13
  101. package/dist/{price-list-prices-edit-ZHAQDPWX.mjs → price-list-prices-edit-TRCLLGU4.mjs} +2 -2
  102. package/dist/{product-attributes-ZR63AQWA.mjs → product-attributes-NEXVST24.mjs} +12 -12
  103. package/dist/{product-create-EQ6SN5QT.mjs → product-create-WU4YFCMM.mjs} +377 -554
  104. package/dist/{product-create-variant-7C5PKKX7.mjs → product-create-variant-RDEE4IX7.mjs} +11 -11
  105. package/dist/{product-detail-ATPFDPI2.mjs → product-detail-J4JYWH2M.mjs} +38 -54
  106. package/dist/{product-edit-XPUNYMD7.mjs → product-edit-ZF2WYHPB.mjs} +12 -12
  107. package/dist/{product-export-GFLEIKIM.mjs → product-export-QDX6343F.mjs} +23 -22
  108. package/dist/{product-image-variants-edit-TC3M4PGX.mjs → product-image-variants-edit-5L5J32SO.mjs} +10 -10
  109. package/dist/{product-import-2Z5I7RXI.mjs → product-import-6TEVSKGQ.mjs} +10 -10
  110. package/dist/{product-list-33ANLONH.mjs → product-list-BHGGJX6B.mjs} +17 -17
  111. package/dist/{product-media-WCLPCVR3.mjs → product-media-EKXMOSO4.mjs} +2 -2
  112. package/dist/{product-metadata-GQU7EVZ3.mjs → product-metadata-BCJJNWAC.mjs} +10 -10
  113. package/dist/product-option-create-3Z73MSHD.mjs +336 -0
  114. package/dist/product-option-detail-4VRUA7KT.mjs +322 -0
  115. package/dist/product-option-edit-YIKFL6OY.mjs +324 -0
  116. package/dist/product-option-list-CR7NCCMH.mjs +267 -0
  117. package/dist/product-option-metadata-7CSZUQ7M.mjs +71 -0
  118. package/dist/product-options-manage-QOMXMPGW.mjs +304 -0
  119. package/dist/{product-organization-T2TQ5EH6.mjs → product-organization-IG54OB75.mjs} +14 -14
  120. package/dist/{product-prices-MKMKBH6P.mjs → product-prices-UMEIS5AZ.mjs} +1 -1
  121. package/dist/{product-sales-channels-5YIO22UW.mjs → product-sales-channels-2SALTLTF.mjs} +3 -3
  122. package/dist/{product-shipping-profile-PL76UMVZ.mjs → product-shipping-profile-VPHZLKDT.mjs} +13 -13
  123. package/dist/{product-stock-6QHBTDUQ.mjs → product-stock-3ILUPCVN.mjs} +10 -10
  124. package/dist/{product-tag-create-B6EOKDJT.mjs → product-tag-create-OOUTLHHD.mjs} +10 -10
  125. package/dist/{product-tag-detail-TQP7ZWSR.mjs → product-tag-detail-YVKJEAKT.mjs} +28 -27
  126. package/dist/{product-tag-edit-RPLWDG5A.mjs → product-tag-edit-RV5WITSN.mjs} +10 -10
  127. package/dist/{product-tag-list-PZTGHM7M.mjs → product-tag-list-ZSPFYZIL.mjs} +26 -25
  128. package/dist/{product-tag-metadata-FKKOT5CD.mjs → product-tag-metadata-S5YL3FUL.mjs} +10 -10
  129. package/dist/{product-type-detail-DDIBFR7O.mjs → product-type-detail-EFVZRETM.mjs} +13 -13
  130. package/dist/{product-type-metadata-EXCYTTQG.mjs → product-type-metadata-TNAASDKX.mjs} +10 -10
  131. package/dist/{product-variant-detail-GCESZH4H.mjs → product-variant-detail-CLP5FJP6.mjs} +10 -10
  132. package/dist/{product-variant-edit-JHOQJN6U.mjs → product-variant-edit-REMB77V7.mjs} +11 -11
  133. package/dist/{product-variant-manage-inventory-items-B7TUBSD5.mjs → product-variant-manage-inventory-items-IGDCLZQE.mjs} +2 -2
  134. package/dist/{product-variant-media-6WWLRINP.mjs → product-variant-media-EKI4BTEV.mjs} +1 -1
  135. package/dist/{product-variant-metadata-NEZIGTEP.mjs → product-variant-metadata-5JIY5KLN.mjs} +10 -10
  136. package/dist/{promotion-add-campaign-MKDYE7MW.mjs → promotion-add-campaign-DOALJUKJ.mjs} +3 -3
  137. package/dist/{promotion-create-CUAQY2NH.mjs → promotion-create-2PTB6NQI.mjs} +18 -18
  138. package/dist/{promotion-detail-2S7FWTXF.mjs → promotion-detail-RGXCA2XS.mjs} +10 -10
  139. package/dist/{refund-reason-create-4YAO4325.mjs → refund-reason-create-AGEFXEIZ.mjs} +10 -10
  140. package/dist/{refund-reason-edit-5J2VIRIL.mjs → refund-reason-edit-DL56EKBY.mjs} +10 -10
  141. package/dist/{refund-reason-list-453DXONV.mjs → refund-reason-list-RL2ZG7IJ.mjs} +13 -13
  142. package/dist/{region-create-QLPSK6TX.mjs → region-create-UVJICJRX.mjs} +1 -1
  143. package/dist/{region-edit-JCJHA6TY.mjs → region-edit-3NVXQECN.mjs} +1 -1
  144. package/dist/{region-metadata-C7DIBM35.mjs → region-metadata-2HO3SAPM.mjs} +10 -10
  145. package/dist/{reservation-create-BW4CDTWR.mjs → reservation-create-Z7TWUE2L.mjs} +3 -3
  146. package/dist/{reservation-detail-GFNWLSI2.mjs → reservation-detail-2AOBK5EY.mjs} +10 -10
  147. package/dist/{reservation-list-RGL67CIU.mjs → reservation-list-MN22JYAW.mjs} +2 -2
  148. package/dist/{reservation-metadata-OI2G4BDW.mjs → reservation-metadata-BFPJTXK6.mjs} +10 -10
  149. package/dist/{sales-channel-add-products-63NGB37Z.mjs → sales-channel-add-products-4LNP2TUM.mjs} +13 -13
  150. package/dist/{sales-channel-create-TOBEDYFD.mjs → sales-channel-create-UFFXX5HK.mjs} +2 -2
  151. package/dist/{sales-channel-detail-LJPQAJDT.mjs → sales-channel-detail-UMYMS2JA.mjs} +13 -13
  152. package/dist/{sales-channel-edit-XUTE5GB5.mjs → sales-channel-edit-SP2HF4E3.mjs} +2 -2
  153. package/dist/{sales-channel-list-TBAN7UT6.mjs → sales-channel-list-CV4V6R7H.mjs} +11 -11
  154. package/dist/{sales-channel-metadata-SE4TGSDB.mjs → sales-channel-metadata-REOQHHUT.mjs} +10 -10
  155. package/dist/{shipping-option-type-create-MB4ENYKV.mjs → shipping-option-type-create-XAWQO66M.mjs} +10 -10
  156. package/dist/{shipping-option-type-detail-IX4JGSTK.mjs → shipping-option-type-detail-G4WLGIAA.mjs} +11 -11
  157. package/dist/{shipping-option-type-edit-B5KU5LER.mjs → shipping-option-type-edit-OI6TBKGG.mjs} +10 -10
  158. package/dist/{shipping-option-type-list-TVR5OE2C.mjs → shipping-option-type-list-6GNCKAFB.mjs} +11 -11
  159. package/dist/{shipping-profile-metadata-Z35SYLBS.mjs → shipping-profile-metadata-MANQ7ZEI.mjs} +10 -10
  160. package/dist/{store-detail-VUJSSOKZ.mjs → store-detail-N2CP3MTB.mjs} +10 -10
  161. package/dist/{store-edit-3XS6IC2Z.mjs → store-edit-Q25HCMCQ.mjs} +1 -1
  162. package/dist/{store-metadata-TYFTDOEK.mjs → store-metadata-U22TVWK2.mjs} +10 -10
  163. package/dist/{tax-region-create-ZTCTKE4C.mjs → tax-region-create-JZB7NFIG.mjs} +11 -11
  164. package/dist/{tax-region-detail-MHM4MAOS.mjs → tax-region-detail-CBZ3ZJN2.mjs} +29 -28
  165. package/dist/{tax-region-edit-SFJGFTAV.mjs → tax-region-edit-E56XVHW2.mjs} +11 -11
  166. package/dist/{tax-region-province-detail-VMOV4JPV.mjs → tax-region-province-detail-2DC2U4EN.mjs} +29 -28
  167. package/dist/{tax-region-tax-override-create-GRXLTURD.mjs → tax-region-tax-override-create-JWGWGYB4.mjs} +28 -27
  168. package/dist/{tax-region-tax-override-edit-D2YBOBEI.mjs → tax-region-tax-override-edit-7DCU55AS.mjs} +27 -26
  169. package/dist/{user-detail-N6PT3KRP.mjs → user-detail-K5UMPO2L.mjs} +1 -1
  170. package/dist/{user-metadata-D5HNZWZY.mjs → user-metadata-EX5WDGCR.mjs} +10 -10
  171. package/dist/{workflow-execution-detail-GSUDCTN3.mjs → workflow-execution-detail-GBPFVG3O.mjs} +10 -10
  172. package/package.json +9 -9
  173. package/src/components/inputs/combobox/combobox.tsx +173 -92
  174. package/src/components/layout/main-layout/main-layout.tsx +7 -4
  175. package/src/dashboard-app/routes/get-route.map.tsx +64 -12
  176. package/src/hooks/api/index.ts +1 -0
  177. package/src/hooks/api/product-options.tsx +151 -0
  178. package/src/hooks/api/products.tsx +26 -66
  179. package/src/hooks/table/columns/use-product-option-table-columns.tsx +44 -0
  180. package/src/hooks/table/filters/index.ts +1 -0
  181. package/src/hooks/table/filters/use-product-option-table-filters.tsx +33 -0
  182. package/src/hooks/table/query/use-product-option-table-query.tsx +34 -0
  183. package/src/i18n/translations/$schema.json +171 -4
  184. package/src/i18n/translations/en.json +49 -3
  185. package/src/routes/product-options/common/hooks/use-delete-product-option-action.tsx +41 -0
  186. package/src/routes/product-options/product-option-create/components/create-product-option-form/create-product-option-details.tsx +71 -0
  187. package/src/routes/product-options/product-option-create/components/create-product-option-form/create-product-option-form.tsx +192 -0
  188. package/src/routes/product-options/product-option-create/components/create-product-option-form/create-product-option-organize.tsx +77 -0
  189. package/src/routes/product-options/product-option-create/components/create-product-option-form/index.ts +1 -0
  190. package/src/routes/product-options/product-option-create/components/create-product-option-form/schema.ts +15 -0
  191. package/src/routes/product-options/product-option-create/index.ts +1 -0
  192. package/src/routes/product-options/product-option-create/product-option-create.tsx +10 -0
  193. package/src/routes/product-options/product-option-detail/breadcrumb.tsx +14 -0
  194. package/src/routes/product-options/product-option-detail/components/product-option-general-section/index.ts +1 -0
  195. package/src/routes/product-options/product-option-detail/components/product-option-general-section/product-option-general-section.tsx +81 -0
  196. package/src/routes/product-options/product-option-detail/components/product-option-product-section/index.ts +1 -0
  197. package/src/routes/product-options/product-option-detail/components/product-option-product-section/product-option-product-section.tsx +74 -0
  198. package/src/routes/product-options/product-option-detail/index.ts +3 -0
  199. package/src/routes/product-options/product-option-detail/loader.ts +17 -0
  200. package/src/routes/product-options/product-option-detail/product-option-detail.tsx +50 -0
  201. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/edit-product-option-details.tsx +94 -0
  202. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/edit-product-option-form.tsx +116 -0
  203. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/edit-product-option-organize.tsx +77 -0
  204. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/index.ts +1 -0
  205. package/src/routes/product-options/product-option-edit/components/edit-product-option-form/schema.ts +13 -0
  206. package/src/routes/product-options/product-option-edit/index.ts +1 -0
  207. package/src/routes/product-options/product-option-edit/product-option-edit.tsx +34 -0
  208. package/src/routes/product-options/product-option-list/components/product-option-list-table/index.ts +1 -0
  209. package/src/routes/product-options/product-option-list/components/product-option-list-table/product-option-list-table.tsx +140 -0
  210. package/src/routes/product-options/product-option-list/index.ts +1 -0
  211. package/src/routes/product-options/product-option-list/product-option-list.tsx +19 -0
  212. package/src/routes/product-options/product-option-metadata/index.ts +1 -0
  213. package/src/routes/product-options/product-option-metadata/product-option-metadata.tsx +27 -0
  214. package/src/routes/products/product-create/components/product-create-details-form/components/product-create-details-general-section/product-create-general-section.tsx +16 -4
  215. package/src/routes/products/product-create/components/product-create-details-form/components/product-create-details-variant-section/product-create-details-variant-section.tsx +220 -198
  216. package/src/routes/products/product-create/components/product-create-form/product-create-form.tsx +4 -7
  217. package/src/routes/products/product-create/constants.ts +2 -0
  218. package/src/routes/products/product-create/utils.ts +6 -1
  219. package/src/routes/products/product-detail/components/product-option-section/product-option-section.tsx +31 -49
  220. package/src/routes/products/product-options-manage/components/product-options-manage-form/index.ts +1 -0
  221. package/src/routes/products/product-options-manage/components/product-options-manage-form/product-options-manage-form.tsx +284 -0
  222. package/src/routes/products/product-options-manage/index.ts +1 -0
  223. package/src/routes/products/product-options-manage/product-options-manage.tsx +35 -0
  224. package/dist/product-create-option-GAEPSU6J.mjs +0 -145
  225. package/dist/product-edit-option-VIU3ZICO.mjs +0 -150
  226. package/src/routes/products/product-create-option/components/create-product-option-form/create-product-option-form.tsx +0 -122
  227. package/src/routes/products/product-create-option/components/create-product-option-form/index.ts +0 -1
  228. package/src/routes/products/product-create-option/index.ts +0 -1
  229. package/src/routes/products/product-create-option/product-create-option.tsx +0 -26
  230. package/src/routes/products/product-edit-option/components/edit-product-option-form/edit-product-option-form.tsx +0 -123
  231. package/src/routes/products/product-edit-option/components/edit-product-option-form/index.ts +0 -1
  232. package/src/routes/products/product-edit-option/index.ts +0 -1
  233. package/src/routes/products/product-edit-option/product-edit-option.tsx +0 -32
  234. package/dist/{chunk-ACJ3PPQJ.mjs → chunk-2QH2TBJ2.mjs} +3 -3
  235. package/dist/{customer-group-add-customers-QU4Q56SS.mjs → customer-group-add-customers-2Y2GVCDV.mjs} +3 -3
  236. package/dist/{customer-list-ZXCGIXJC.mjs → customer-list-TG4D4QOT.mjs} +3 -3
  237. package/dist/{location-list-OYBI7EGV.mjs → location-list-ZJMZZ6T3.mjs} +1 -1
  238. package/dist/{product-type-list-QX7QC6RI.mjs → product-type-list-7WQ5D2KV.mjs} +3 -3
  239. package/dist/{region-list-XQRIBDMF.mjs → region-list-JAQXIBYD.mjs} +3 -3
  240. package/dist/{return-reason-list-VYLLXDG4.mjs → return-reason-list-ATE2XU4H.mjs} +3 -3
  241. package/dist/{user-list-6KATHOTJ.mjs → user-list-KPI3BTOA.mjs} +3 -3
@@ -0,0 +1,116 @@
1
+ import { zodResolver } from "@hookform/resolvers/zod"
2
+ import { HttpTypes } from "@medusajs/types"
3
+ import { Button, toast } from "@medusajs/ui"
4
+ import { useMemo } from "react"
5
+ import { useForm } from "react-hook-form"
6
+ import { useTranslation } from "react-i18next"
7
+
8
+ import { RouteDrawer, useRouteModal } from "../../../../../components/modals"
9
+ import { KeyboundForm } from "../../../../../components/utilities/keybound-form"
10
+ import { useUpdateProductOption } from "../../../../../hooks/api"
11
+ import { EditProductOptionDetails } from "./edit-product-option-details"
12
+ import { EditProductOptionOrganize } from "./edit-product-option-organize"
13
+ import { EditProductOptionSchema } from "./schema"
14
+
15
+ type EditProductOptionFormProps = {
16
+ productOption: HttpTypes.AdminProductOption
17
+ }
18
+
19
+ export const EditProductOptionForm = ({
20
+ productOption,
21
+ }: EditProductOptionFormProps) => {
22
+ const { t } = useTranslation()
23
+ const { handleSuccess } = useRouteModal()
24
+
25
+ const { sortedValues, existingRanks } = useMemo(() => {
26
+ if (!productOption.values) {
27
+ return { sortedValues: [], existingRanks: {} }
28
+ }
29
+
30
+ const ranks: Record<string, number> = {}
31
+ productOption.values.forEach((v: any) => {
32
+ if (v.rank !== undefined && v.rank !== null) {
33
+ ranks[v.value] = v.rank
34
+ }
35
+ })
36
+
37
+ const sorted = [...productOption.values].sort((a: any, b: any) => {
38
+ const rankA = a.rank ?? Number.MAX_VALUE
39
+ const rankB = b.rank ?? Number.MAX_VALUE
40
+ return rankA - rankB
41
+ })
42
+
43
+ return {
44
+ sortedValues: sorted.map((v: any) => v.value),
45
+ existingRanks: ranks,
46
+ }
47
+ }, [productOption.values])
48
+
49
+ const form = useForm<EditProductOptionSchema>({
50
+ defaultValues: {
51
+ title: productOption.title,
52
+ values: sortedValues,
53
+ value_ranks: existingRanks,
54
+ },
55
+ resolver: zodResolver(EditProductOptionSchema),
56
+ })
57
+
58
+ const { mutateAsync, isPending } = useUpdateProductOption(productOption.id)
59
+
60
+ const handleSubmit = form.handleSubmit((data) => {
61
+ const { title, values, value_ranks } = data
62
+
63
+ mutateAsync(
64
+ {
65
+ title,
66
+ values,
67
+ ranks: value_ranks,
68
+ },
69
+ {
70
+ onSuccess: ({ product_option }) => {
71
+ toast.success(
72
+ t("productOptions.edit.successToast", {
73
+ title: product_option.title,
74
+ })
75
+ )
76
+
77
+ handleSuccess()
78
+ },
79
+ onError: (error) => {
80
+ toast.error(error.message)
81
+ },
82
+ }
83
+ )
84
+ })
85
+
86
+ return (
87
+ <RouteDrawer.Form form={form}>
88
+ <KeyboundForm
89
+ onSubmit={handleSubmit}
90
+ className="flex size-full flex-col overflow-hidden"
91
+ >
92
+ <RouteDrawer.Body className="flex flex-col gap-y-4 overflow-auto p-4">
93
+ <EditProductOptionDetails form={form} />
94
+ <EditProductOptionOrganize form={form} />
95
+ </RouteDrawer.Body>
96
+ <RouteDrawer.Footer>
97
+ <div className="flex items-center justify-end gap-x-2">
98
+ <RouteDrawer.Close asChild>
99
+ <Button size="small" variant="secondary">
100
+ {t("actions.cancel")}
101
+ </Button>
102
+ </RouteDrawer.Close>
103
+ <Button
104
+ size="small"
105
+ variant="primary"
106
+ type="submit"
107
+ isLoading={isPending}
108
+ >
109
+ {t("actions.save")}
110
+ </Button>
111
+ </div>
112
+ </RouteDrawer.Footer>
113
+ </KeyboundForm>
114
+ </RouteDrawer.Form>
115
+ )
116
+ }
@@ -0,0 +1,77 @@
1
+ import { Text } from "@medusajs/ui"
2
+ import { useMemo } from "react"
3
+ import { UseFormReturn, useWatch } from "react-hook-form"
4
+ import { SortableList } from "../../../../../components/common/sortable-list"
5
+ import { EditProductOptionSchema } from "./schema"
6
+
7
+ type EditProductOptionOrganizeProps = {
8
+ form: UseFormReturn<EditProductOptionSchema>
9
+ }
10
+
11
+ type ValueItem = {
12
+ id: string
13
+ value: string
14
+ rank: number
15
+ }
16
+
17
+ export const EditProductOptionOrganize = ({
18
+ form,
19
+ }: EditProductOptionOrganizeProps) => {
20
+ const values = useWatch({
21
+ control: form.control,
22
+ name: "values",
23
+ })
24
+
25
+ const valueRanks = useWatch({
26
+ control: form.control,
27
+ name: "value_ranks",
28
+ })
29
+
30
+ const items = useMemo<ValueItem[]>(() => {
31
+ if (!values || values.length === 0) {
32
+ return []
33
+ }
34
+
35
+ return values
36
+ .map((value, index) => ({
37
+ id: value,
38
+ value,
39
+ rank: valueRanks?.[value] ?? index,
40
+ }))
41
+ .sort((a, b) => a.rank - b.rank)
42
+ }, [values, valueRanks])
43
+
44
+ const handleChange = (newItems: ValueItem[]) => {
45
+ const newRanks: Record<string, number> = {}
46
+ newItems.forEach((item, index) => {
47
+ newRanks[item.value] = index
48
+ })
49
+
50
+ form.setValue("value_ranks", newRanks, {
51
+ shouldDirty: true,
52
+ shouldTouch: true,
53
+ })
54
+ }
55
+
56
+ if (!values || values.length === 0) {
57
+ return null
58
+ }
59
+
60
+ return (
61
+ <SortableList
62
+ items={items}
63
+ onChange={handleChange}
64
+ renderItem={(item) => (
65
+ <SortableList.Item
66
+ id={item.id}
67
+ className="border-ui-border-base border-b last:border-b-0"
68
+ >
69
+ <div className="flex flex-1 items-center gap-x-3 px-4 py-3">
70
+ <SortableList.DragHandle />
71
+ <Text size="small">{item.value}</Text>
72
+ </div>
73
+ </SortableList.Item>
74
+ )}
75
+ />
76
+ )
77
+ }
@@ -0,0 +1 @@
1
+ export { EditProductOptionForm } from "./edit-product-option-form"
@@ -0,0 +1,13 @@
1
+ import { z } from "zod"
2
+
3
+ export const EditProductOptionDetailsSchema = z.object({
4
+ title: z.string().min(1),
5
+ values: z.array(z.string()).min(1, "At least one value is required"),
6
+ })
7
+
8
+ export type EditProductOptionSchema = z.infer<typeof EditProductOptionSchema>
9
+ export const EditProductOptionSchema = z
10
+ .object({
11
+ value_ranks: z.record(z.string(), z.number()).optional(),
12
+ })
13
+ .merge(EditProductOptionDetailsSchema)
@@ -0,0 +1 @@
1
+ export { ProductOptionEdit as Component } from "./product-option-edit"
@@ -0,0 +1,34 @@
1
+ import { Heading } from "@medusajs/ui"
2
+ import { useTranslation } from "react-i18next"
3
+ import { useParams } from "react-router-dom"
4
+
5
+ import { RouteDrawer } from "../../../components/modals"
6
+ import { useProductOption } from "../../../hooks/api"
7
+ import { EditProductOptionForm } from "./components/edit-product-option-form"
8
+
9
+ export const ProductOptionEdit = () => {
10
+ const { id } = useParams()
11
+ const { t } = useTranslation()
12
+
13
+ const { product_option, isPending, isError, error } = useProductOption(id!)
14
+
15
+ const ready = !isPending && !!product_option
16
+
17
+ if (isError) {
18
+ throw error
19
+ }
20
+
21
+ return (
22
+ <RouteDrawer>
23
+ <RouteDrawer.Header>
24
+ <RouteDrawer.Title asChild>
25
+ <Heading>{t("productOptions.edit.header")}</Heading>
26
+ </RouteDrawer.Title>
27
+ <RouteDrawer.Description className="sr-only">
28
+ {t("productOptions.edit.description")}
29
+ </RouteDrawer.Description>
30
+ </RouteDrawer.Header>
31
+ {ready && <EditProductOptionForm productOption={product_option} />}
32
+ </RouteDrawer>
33
+ )
34
+ }
@@ -0,0 +1 @@
1
+ export { ProductOptionListTable } from "./product-option-list-table"
@@ -0,0 +1,140 @@
1
+ import {
2
+ Container,
3
+ createDataTableColumnHelper,
4
+ toast,
5
+ usePrompt,
6
+ } from "@medusajs/ui"
7
+ import { useTranslation } from "react-i18next"
8
+ import { keepPreviousData } from "@tanstack/react-query"
9
+ import { useCallback, useMemo } from "react"
10
+ import { HttpTypes } from "@medusajs/types"
11
+ import { useNavigate } from "react-router-dom"
12
+ import { PencilSquare, Trash } from "@medusajs/icons"
13
+
14
+ import {
15
+ useDeleteProductOptionLazy,
16
+ useProductOptions,
17
+ } from "../../../../../hooks/api/product-options"
18
+ import { useProductOptionTableColumns } from "../../../../../hooks/table/columns/use-product-option-table-columns"
19
+ import { useProductOptionTableFilters } from "../../../../../hooks/table/filters"
20
+ import { useProductOptionTableQuery } from "../../../../../hooks/table/query/use-product-option-table-query"
21
+ import { DataTable } from "../../../../../components/data-table"
22
+
23
+ const PAGE_SIZE = 20
24
+
25
+ export const ProductOptionListTable = () => {
26
+ const { t } = useTranslation()
27
+
28
+ const { searchParams } = useProductOptionTableQuery({
29
+ pageSize: PAGE_SIZE,
30
+ })
31
+
32
+ const { product_options, count, isError, error, isLoading } =
33
+ useProductOptions(searchParams, {
34
+ placeholderData: keepPreviousData,
35
+ })
36
+
37
+ const filters = useProductOptionTableFilters()
38
+ const columns = useColumns()
39
+
40
+ if (isError) {
41
+ throw error
42
+ }
43
+
44
+ return (
45
+ <Container className="divide-y p-0">
46
+ <DataTable
47
+ data={product_options}
48
+ columns={columns}
49
+ filters={filters}
50
+ rowCount={count}
51
+ pageSize={PAGE_SIZE}
52
+ getRowId={(row) => row.id}
53
+ heading={t("productOptions.domain")}
54
+ subHeading={t("productOptions.subtitle")}
55
+ emptyState={{
56
+ empty: {
57
+ heading: t("general.noRecordsMessage"),
58
+ },
59
+ filtered: {
60
+ heading: t("general.noRecordsMessage"),
61
+ description: t("general.noRecordsMessageFiltered"),
62
+ },
63
+ }}
64
+ actions={[
65
+ {
66
+ label: t("actions.create"),
67
+ to: "create",
68
+ },
69
+ ]}
70
+ isLoading={isLoading}
71
+ enableSearch={true}
72
+ rowHref={(row) => `/product-options/${row.id}`}
73
+ />
74
+ </Container>
75
+ )
76
+ }
77
+
78
+ const columnHelper = createDataTableColumnHelper<HttpTypes.AdminProductOption>()
79
+
80
+ const useColumns = () => {
81
+ const { t } = useTranslation()
82
+ const prompt = usePrompt()
83
+ const navigate = useNavigate()
84
+ const base = useProductOptionTableColumns()
85
+
86
+ const { mutateAsync } = useDeleteProductOptionLazy()
87
+
88
+ const handleDelete = useCallback(
89
+ async (productOption: HttpTypes.AdminProductOption) => {
90
+ const confirm = await prompt({
91
+ title: t("general.areYouSure"),
92
+ description: t("productOptions.delete.confirmation", {
93
+ title: productOption.title,
94
+ }),
95
+ confirmText: t("actions.delete"),
96
+ cancelText: t("actions.cancel"),
97
+ })
98
+
99
+ if (!confirm) {
100
+ return
101
+ }
102
+
103
+ await mutateAsync(productOption.id, {
104
+ onSuccess: () => {
105
+ toast.success(t("productOptions.delete.successToast"))
106
+ },
107
+ onError: (e) => {
108
+ toast.error(e.message)
109
+ },
110
+ })
111
+ },
112
+ [t, prompt, mutateAsync]
113
+ )
114
+
115
+ return useMemo(
116
+ () => [
117
+ ...base,
118
+ columnHelper.action({
119
+ actions: (ctx) => [
120
+ [
121
+ {
122
+ icon: <PencilSquare />,
123
+ label: t("actions.edit"),
124
+ onClick: () =>
125
+ navigate(`/product-options/${ctx.row.original.id}/edit`),
126
+ },
127
+ ],
128
+ [
129
+ {
130
+ icon: <Trash />,
131
+ label: t("actions.delete"),
132
+ onClick: () => handleDelete(ctx.row.original),
133
+ },
134
+ ],
135
+ ],
136
+ }),
137
+ ],
138
+ [base, handleDelete, navigate, t]
139
+ )
140
+ }
@@ -0,0 +1 @@
1
+ export { ProductOptionList as Component } from "./product-option-list"
@@ -0,0 +1,19 @@
1
+ import { SingleColumnPage } from "../../../components/layout/pages"
2
+ import { useExtension } from "../../../providers/extension-provider"
3
+ import { ProductOptionListTable } from "./components/product-option-list-table"
4
+
5
+ export const ProductOptionList = () => {
6
+ const { getWidgets } = useExtension()
7
+
8
+ return (
9
+ <SingleColumnPage
10
+ widgets={{
11
+ after: getWidgets("product_option.list.after"),
12
+ before: getWidgets("product_option.list.before"),
13
+ }}
14
+ hasOutlet
15
+ >
16
+ <ProductOptionListTable />
17
+ </SingleColumnPage>
18
+ )
19
+ }
@@ -0,0 +1 @@
1
+ export { ProductOptionMetadata as Component } from "./product-option-metadata.tsx"
@@ -0,0 +1,27 @@
1
+ import { useParams } from "react-router-dom"
2
+
3
+ import { useProductOption, useUpdateProductOption } from "../../../hooks/api"
4
+ import { MetadataForm } from "../../../components/forms/metadata-form"
5
+ import { RouteDrawer } from "../../../components/modals"
6
+
7
+ export const ProductOptionMetadata = () => {
8
+ const { id } = useParams()
9
+
10
+ const { product_option, isPending, isError, error } = useProductOption(id!)
11
+ const { mutateAsync, isPending: isMutating } = useUpdateProductOption(id!)
12
+
13
+ if (isError) {
14
+ throw error
15
+ }
16
+
17
+ return (
18
+ <RouteDrawer>
19
+ <MetadataForm
20
+ isPending={isPending}
21
+ isMutating={isMutating}
22
+ hook={mutateAsync}
23
+ metadata={product_option?.metadata}
24
+ />
25
+ </RouteDrawer>
26
+ )
27
+ }
@@ -27,7 +27,10 @@ export const ProductCreateGeneralSection = ({
27
27
  <Form.Item>
28
28
  <Form.Label>{t("products.fields.title.label")}</Form.Label>
29
29
  <Form.Control>
30
- <Input {...field} placeholder={t("products.fields.title.placeholder")} />
30
+ <Input
31
+ {...field}
32
+ placeholder={t("products.fields.title.placeholder")}
33
+ />
31
34
  </Form.Control>
32
35
  </Form.Item>
33
36
  )
@@ -43,7 +46,10 @@ export const ProductCreateGeneralSection = ({
43
46
  {t("products.fields.subtitle.label")}
44
47
  </Form.Label>
45
48
  <Form.Control>
46
- <Input {...field} placeholder={t("products.fields.subtitle.placeholder")} />
49
+ <Input
50
+ {...field}
51
+ placeholder={t("products.fields.subtitle.placeholder")}
52
+ />
47
53
  </Form.Control>
48
54
  </Form.Item>
49
55
  )
@@ -62,7 +68,10 @@ export const ProductCreateGeneralSection = ({
62
68
  {t("fields.handle")}
63
69
  </Form.Label>
64
70
  <Form.Control>
65
- <HandleInput {...field} placeholder={t("products.fields.handle.placeholder")} />
71
+ <HandleInput
72
+ {...field}
73
+ placeholder={t("products.fields.handle.placeholder")}
74
+ />
66
75
  </Form.Control>
67
76
  </Form.Item>
68
77
  )
@@ -80,7 +89,10 @@ export const ProductCreateGeneralSection = ({
80
89
  {t("products.fields.description.label")}
81
90
  </Form.Label>
82
91
  <Form.Control>
83
- <Textarea {...field} placeholder={t("products.fields.description.placeholder")} />
92
+ <Textarea
93
+ {...field}
94
+ placeholder={t("products.fields.description.placeholder")}
95
+ />
84
96
  </Form.Control>
85
97
  </Form.Item>
86
98
  )