@nextblock-cms/ecom 0.21.0 → 0.21.1

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 (359) hide show
  1. package/README.md +43 -0
  2. package/index.cjs +1 -0
  3. package/lib/CurrencyProvider.cjs +1 -0
  4. package/lib/CurrencyProvider.es.js +1 -1
  5. package/lib/PaymentReadinessProvider.cjs +1 -0
  6. package/lib/PaymentReadinessProvider.es.js +1 -1
  7. package/lib/cart-store.cjs +1 -0
  8. package/lib/cart-store.es.js +1 -1
  9. package/lib/components/AccountNavigationMenu.cjs +1 -0
  10. package/lib/components/AccountNavigationMenu.es.js +1 -1
  11. package/lib/components/AddToCartButton.cjs +1 -0
  12. package/lib/components/AddToCartButton.es.js +1 -1
  13. package/lib/components/Cart.cjs +1 -0
  14. package/lib/components/Cart.es.js +1 -1
  15. package/lib/components/CartDrawer.cjs +1 -0
  16. package/lib/components/CartDrawer.es.js +1 -1
  17. package/lib/components/CartIcon.cjs +1 -0
  18. package/lib/components/CartIcon.es.js +1 -1
  19. package/lib/components/Checkout.cjs +1 -0
  20. package/lib/components/Checkout.es.js +1 -1
  21. package/lib/components/CouponForm.cjs +1 -0
  22. package/lib/components/CouponForm.es.js +1 -1
  23. package/lib/components/CurrencySwitcher.cjs +1 -0
  24. package/lib/components/CurrencySwitcher.es.js +1 -1
  25. package/lib/components/CustomerProfileForm.cjs +1 -0
  26. package/lib/components/CustomerProfileForm.es.js +1 -1
  27. package/lib/components/FeaturedProduct.cjs +1 -0
  28. package/lib/components/FeaturedProduct.es.js +1 -1
  29. package/lib/components/FreemiusLicensePanel.cjs +1 -0
  30. package/lib/components/FreemiusLicensePanel.es.js +1 -1
  31. package/lib/components/InvoiceDocument.cjs +1 -0
  32. package/lib/components/InvoiceDocument.es.js +1 -1
  33. package/lib/components/{InvoiceViewerShell.cjs.js → InvoiceViewerShell.cjs} +1 -1
  34. package/lib/components/InvoiceViewerShell.es.js +1 -1
  35. package/lib/components/ProductCard.cjs +1 -0
  36. package/lib/components/ProductCard.es.js +1 -1
  37. package/lib/components/ProductDetailsLayout.cjs +1 -0
  38. package/lib/components/ProductDetailsLayout.es.js +1 -1
  39. package/lib/components/ProductGallery.cjs +1 -0
  40. package/lib/components/ProductGallery.es.js +1 -1
  41. package/lib/components/ProductGrid.cjs +1 -0
  42. package/lib/components/ProductGrid.es.js +1 -1
  43. package/lib/components/ShippingEstimator.cjs +1 -0
  44. package/lib/components/ShippingEstimator.es.js +1 -1
  45. package/lib/components/ShortDescription.cjs +1 -0
  46. package/lib/components/ShortDescription.es.js +1 -1
  47. package/lib/components/SimpleTiptapRenderer.cjs +1 -0
  48. package/lib/components/SimpleTiptapRenderer.es.js +1 -1
  49. package/lib/components/SubscriptionSelector.cjs +1 -0
  50. package/lib/components/SubscriptionSelector.es.js +1 -1
  51. package/lib/countries.es.js +1 -1
  52. package/lib/coupon-server.cjs +1 -0
  53. package/lib/coupon-server.es.js +1 -1
  54. package/lib/coupons.es.js +1 -1
  55. package/lib/currency-constants.es.js +1 -1
  56. package/lib/currency-rest-client.es.js +1 -1
  57. package/lib/currency-store.es.js +1 -1
  58. package/lib/currency-sync.cjs +1 -0
  59. package/lib/currency-sync.es.js +1 -1
  60. package/lib/currency.es.js +1 -1
  61. package/lib/customer-addresses.cjs +1 -0
  62. package/lib/customer-addresses.es.js +1 -1
  63. package/lib/customer-orders.cjs +1 -0
  64. package/lib/customer-orders.es.js +1 -1
  65. package/lib/customer.cjs +1 -0
  66. package/lib/customer.es.js +1 -1
  67. package/lib/export-helpers.cjs +1 -0
  68. package/lib/export-helpers.es.js +1 -1
  69. package/lib/factory.cjs +1 -0
  70. package/lib/factory.es.js +1 -1
  71. package/lib/freemius-coupons.cjs +1 -0
  72. package/lib/freemius-coupons.es.js +1 -1
  73. package/lib/freemius-license-claim.cjs +1 -0
  74. package/lib/freemius-license-claim.es.js +1 -1
  75. package/lib/freemius-license.cjs +1 -0
  76. package/lib/freemius-license.es.js +1 -1
  77. package/lib/freemius-order-sync.cjs +1 -0
  78. package/lib/freemius-order-sync.es.js +1 -1
  79. package/lib/freemius-trial-provision.cjs +1 -0
  80. package/lib/freemius-trial-provision.es.js +1 -1
  81. package/lib/inventory-settings.es.js +1 -1
  82. package/lib/{invoice-server.cjs.js → invoice-server.cjs} +1 -1
  83. package/lib/invoice-server.es.js +1 -1
  84. package/lib/invoice-ui.es.js +1 -1
  85. package/lib/invoice.es.js +1 -1
  86. package/lib/{order-inventory.cjs.js → order-inventory.cjs} +1 -1
  87. package/lib/order-inventory.es.js +1 -1
  88. package/lib/order-tax-details.es.js +1 -1
  89. package/lib/pages/cms/coupons/CouponEditorForm.cjs +1 -0
  90. package/lib/pages/cms/coupons/CouponEditorForm.es.js +1 -1
  91. package/lib/pages/cms/coupons/{CouponsPage.cjs.js → CouponsPage.cjs} +1 -1
  92. package/lib/pages/cms/coupons/CouponsPage.es.js +1 -1
  93. package/lib/pages/cms/coupons/CreateCouponDialog.cjs +1 -0
  94. package/lib/pages/cms/coupons/CreateCouponDialog.es.js +1 -1
  95. package/lib/pages/cms/coupons/EditCouponPage.cjs +1 -0
  96. package/lib/pages/cms/coupons/EditCouponPage.es.js +1 -1
  97. package/lib/pages/cms/coupons/ProductScopePicker.es.js +1 -1
  98. package/lib/pages/cms/coupons/actions.cjs +1 -0
  99. package/lib/pages/cms/coupons/actions.es.js +1 -1
  100. package/lib/pages/cms/coupons/index.cjs +1 -0
  101. package/lib/pages/cms/coupons/product-options.es.js +1 -1
  102. package/lib/pages/cms/orders/ExportReportsDialog.cjs +1 -0
  103. package/lib/pages/cms/orders/ExportReportsDialog.es.js +1 -1
  104. package/lib/pages/cms/orders/OrderDetailPage.cjs +1 -0
  105. package/lib/pages/cms/orders/OrderDetailPage.es.js +1 -1
  106. package/lib/pages/cms/orders/OrderPrintButton.es.js +1 -1
  107. package/lib/pages/cms/orders/OrderStatusForm.cjs +1 -0
  108. package/lib/pages/cms/orders/OrderStatusForm.es.js +1 -1
  109. package/lib/pages/cms/orders/OrdersPage.cjs +1 -0
  110. package/lib/pages/cms/orders/OrdersPage.es.js +1 -1
  111. package/lib/pages/cms/orders/actions.es.js +1 -1
  112. package/lib/pages/cms/orders/export-actions.es.js +1 -1
  113. package/lib/pages/cms/orders/index.cjs +1 -0
  114. package/lib/pages/cms/orders/server-actions.cjs +1 -0
  115. package/lib/pages/cms/orders/server-actions.es.js +1 -1
  116. package/lib/pages/cms/payments/PaymentsClient.es.js +1 -1
  117. package/lib/pages/cms/payments/PaymentsPage.cjs +1 -0
  118. package/lib/pages/cms/payments/PaymentsPage.es.js +1 -1
  119. package/lib/pages/cms/payments/actions.cjs +1 -0
  120. package/lib/pages/cms/payments/actions.es.js +1 -1
  121. package/lib/pages/cms/payments/index.cjs +1 -0
  122. package/lib/pages/cms/payments/queries.cjs +1 -0
  123. package/lib/pages/cms/payments/queries.es.js +1 -1
  124. package/lib/pages/cms/products/ProductsPage.cjs +1 -0
  125. package/lib/pages/cms/products/ProductsPage.es.js +1 -1
  126. package/lib/pages/cms/products/[id]/edit/EditProductPage.cjs +1 -0
  127. package/lib/pages/cms/products/{_id_ → [id]}/edit/EditProductPage.es.js +1 -1
  128. package/lib/pages/cms/products/{actions.cjs.js → actions.cjs} +1 -1
  129. package/lib/pages/cms/products/actions.es.js +1 -1
  130. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs +1 -0
  131. package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +1 -1
  132. package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +1 -1
  133. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs +1 -0
  134. package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +1 -1
  135. package/lib/pages/cms/products/categories/components/CategoryManager.cjs +1 -0
  136. package/lib/pages/cms/products/categories/components/CategoryManager.es.js +1 -1
  137. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs +1 -0
  138. package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +1 -1
  139. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs +1 -0
  140. package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +1 -1
  141. package/lib/pages/cms/products/components/DeleteProductButton.es.js +1 -1
  142. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs +1 -0
  143. package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +1 -1
  144. package/lib/pages/cms/products/components/ProductCategorySelector.cjs +1 -0
  145. package/lib/pages/cms/products/components/ProductCategorySelector.es.js +1 -1
  146. package/lib/pages/cms/products/components/ProductForm.cjs +1 -0
  147. package/lib/pages/cms/products/components/ProductForm.es.js +1 -1
  148. package/lib/pages/cms/products/components/ProductMediaManager.cjs +1 -0
  149. package/lib/pages/cms/products/components/ProductMediaManager.es.js +1 -1
  150. package/lib/pages/cms/products/components/ProductsBulkTable.cjs +1 -0
  151. package/lib/pages/cms/products/components/ProductsBulkTable.es.js +1 -1
  152. package/lib/pages/cms/products/components/SaleScheduleFields.es.js +1 -1
  153. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs +1 -0
  154. package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +1 -1
  155. package/lib/pages/cms/products/components/{SyncFreemiusPricingButton.cjs.js → SyncFreemiusPricingButton.cjs} +1 -1
  156. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +1 -1
  157. package/lib/pages/cms/products/components/VariationsEditor.cjs +1 -0
  158. package/lib/pages/cms/products/components/VariationsEditor.es.js +1 -1
  159. package/lib/pages/cms/products/index.cjs +1 -0
  160. package/lib/pages/cms/products/index.es.js +1 -1
  161. package/lib/pages/cms/products/inventory/InventoryPage.cjs +1 -0
  162. package/lib/pages/cms/products/inventory/InventoryPage.es.js +1 -1
  163. package/lib/pages/cms/products/inventory/{InventoryTableClient.cjs.js → InventoryTableClient.cjs} +1 -1
  164. package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +1 -1
  165. package/lib/pages/cms/products/inventory/{actions.cjs.js → actions.cjs} +1 -1
  166. package/lib/pages/cms/products/inventory/actions.es.js +1 -1
  167. package/lib/pages/cms/products/new/NewProductPage.cjs +1 -0
  168. package/lib/pages/cms/products/new/NewProductPage.es.js +1 -1
  169. package/lib/pages/cms/products/product-price-sync.cjs +1 -0
  170. package/lib/pages/cms/products/product-price-sync.es.js +1 -1
  171. package/lib/pages/cms/products/server-actions.cjs +1 -0
  172. package/lib/pages/cms/products/server-actions.es.js +1 -1
  173. package/lib/pages/cms/shipping/{ShippingPage.cjs.js → ShippingPage.cjs} +1 -1
  174. package/lib/pages/cms/shipping/ShippingPage.es.js +1 -1
  175. package/lib/pages/cms/shipping/components/RateForm.cjs +1 -0
  176. package/lib/pages/cms/shipping/components/RateForm.es.js +1 -1
  177. package/lib/pages/cms/shipping/components/ZoneForm.cjs +1 -0
  178. package/lib/pages/cms/shipping/components/ZoneForm.es.js +1 -1
  179. package/lib/pages/cms/shipping/index.cjs +1 -0
  180. package/lib/pages/cms/shipping/server-actions.cjs +1 -0
  181. package/lib/pages/cms/shipping/server-actions.es.js +1 -1
  182. package/lib/pages/cms/taxes/TaxesPage.cjs +1 -0
  183. package/lib/pages/cms/taxes/TaxesPage.es.js +1 -1
  184. package/lib/pages/cms/taxes/actions.cjs +1 -0
  185. package/lib/pages/cms/taxes/actions.es.js +1 -1
  186. package/lib/pages/cms/taxes/components/TaxRateForm.cjs +1 -0
  187. package/lib/pages/cms/taxes/components/TaxRateForm.es.js +1 -1
  188. package/lib/pages/cms/taxes/index.cjs +1 -0
  189. package/lib/payment-config.es.js +1 -1
  190. package/lib/{product-actions.cjs.js → product-actions.cjs} +1 -1
  191. package/lib/product-actions.es.js +1 -1
  192. package/lib/product-context.cjs +1 -0
  193. package/lib/product-context.es.js +1 -1
  194. package/lib/product-schema.cjs +1 -0
  195. package/lib/product-schema.es.js +1 -1
  196. package/lib/providers/freemius.cjs +1 -0
  197. package/lib/providers/freemius.es.js +1 -1
  198. package/lib/providers/stripe.cjs +1 -0
  199. package/lib/providers/stripe.es.js +1 -1
  200. package/lib/server-actions/coupon-actions.cjs +1 -0
  201. package/lib/server-actions/coupon-actions.es.js +1 -1
  202. package/lib/server-actions/customer-actions.cjs +1 -0
  203. package/lib/server-actions/customer-actions.es.js +1 -1
  204. package/lib/server-actions/product-actions.cjs +1 -0
  205. package/lib/server-actions/product-actions.es.js +1 -1
  206. package/lib/server-actions/shipping-actions.cjs +1 -0
  207. package/lib/server-actions/shipping-actions.es.js +1 -1
  208. package/lib/server-actions/tax-actions.cjs +1 -0
  209. package/lib/server-actions/tax-actions.es.js +1 -1
  210. package/lib/shared-inventory.es.js +1 -1
  211. package/lib/shipping/{resolver.cjs.js → resolver.cjs} +1 -1
  212. package/lib/shipping/resolver.es.js +1 -1
  213. package/lib/shipping-rate-currency.cjs +1 -0
  214. package/lib/shipping-rate-currency.es.js +1 -1
  215. package/lib/states.cjs +1 -0
  216. package/lib/stripe/checkout.cjs +1 -0
  217. package/lib/stripe/checkout.es.js +1 -1
  218. package/lib/stripe/client.cjs +1 -0
  219. package/lib/stripe/client.es.js +1 -1
  220. package/lib/stripe/order-sync.cjs +1 -0
  221. package/lib/stripe/order-sync.es.js +1 -1
  222. package/lib/stripe/webhooks.cjs +1 -0
  223. package/lib/stripe/webhooks.es.js +1 -1
  224. package/lib/tax-calculation.cjs +1 -0
  225. package/lib/tax-calculation.es.js +1 -1
  226. package/lib/trials.es.js +1 -1
  227. package/lib/types.es.js +1 -1
  228. package/lib/use-cart.cjs +1 -0
  229. package/lib/use-cart.es.js +1 -1
  230. package/lib/use-price-formatter.es.js +1 -1
  231. package/lib/variation-utils.cjs +1 -0
  232. package/lib/variation-utils.es.js +1 -1
  233. package/lib/zod-config.es.js +1 -1
  234. package/package.json +10 -9
  235. package/server.cjs +1 -0
  236. package/server.es.js +1 -1
  237. package/index.cjs.js +0 -1
  238. package/lib/CurrencyProvider.cjs.js +0 -1
  239. package/lib/PaymentReadinessProvider.cjs.js +0 -1
  240. package/lib/cart-store.cjs.js +0 -1
  241. package/lib/components/AccountNavigationMenu.cjs.js +0 -1
  242. package/lib/components/AddToCartButton.cjs.js +0 -1
  243. package/lib/components/Cart.cjs.js +0 -1
  244. package/lib/components/CartDrawer.cjs.js +0 -1
  245. package/lib/components/CartIcon.cjs.js +0 -1
  246. package/lib/components/Checkout.cjs.js +0 -1
  247. package/lib/components/CouponForm.cjs.js +0 -1
  248. package/lib/components/CurrencySwitcher.cjs.js +0 -1
  249. package/lib/components/CustomerProfileForm.cjs.js +0 -1
  250. package/lib/components/FeaturedProduct.cjs.js +0 -1
  251. package/lib/components/FreemiusLicensePanel.cjs.js +0 -1
  252. package/lib/components/InvoiceDocument.cjs.js +0 -1
  253. package/lib/components/ProductCard.cjs.js +0 -1
  254. package/lib/components/ProductDetailsLayout.cjs.js +0 -1
  255. package/lib/components/ProductGallery.cjs.js +0 -1
  256. package/lib/components/ProductGrid.cjs.js +0 -1
  257. package/lib/components/ShippingEstimator.cjs.js +0 -1
  258. package/lib/components/ShortDescription.cjs.js +0 -1
  259. package/lib/components/SimpleTiptapRenderer.cjs.js +0 -1
  260. package/lib/components/SubscriptionSelector.cjs.js +0 -1
  261. package/lib/coupon-server.cjs.js +0 -1
  262. package/lib/currency-sync.cjs.js +0 -1
  263. package/lib/customer-addresses.cjs.js +0 -1
  264. package/lib/customer-orders.cjs.js +0 -1
  265. package/lib/customer.cjs.js +0 -1
  266. package/lib/export-helpers.cjs.js +0 -1
  267. package/lib/factory.cjs.js +0 -1
  268. package/lib/freemius-coupons.cjs.js +0 -1
  269. package/lib/freemius-license-claim.cjs.js +0 -1
  270. package/lib/freemius-license.cjs.js +0 -1
  271. package/lib/freemius-order-sync.cjs.js +0 -1
  272. package/lib/freemius-trial-provision.cjs.js +0 -1
  273. package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +0 -1
  274. package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +0 -1
  275. package/lib/pages/cms/coupons/EditCouponPage.cjs.js +0 -1
  276. package/lib/pages/cms/coupons/actions.cjs.js +0 -1
  277. package/lib/pages/cms/coupons/index.cjs.js +0 -1
  278. package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +0 -1
  279. package/lib/pages/cms/orders/OrderDetailPage.cjs.js +0 -1
  280. package/lib/pages/cms/orders/OrderStatusForm.cjs.js +0 -1
  281. package/lib/pages/cms/orders/OrdersPage.cjs.js +0 -1
  282. package/lib/pages/cms/orders/index.cjs.js +0 -1
  283. package/lib/pages/cms/orders/server-actions.cjs.js +0 -1
  284. package/lib/pages/cms/payments/PaymentsPage.cjs.js +0 -1
  285. package/lib/pages/cms/payments/actions.cjs.js +0 -1
  286. package/lib/pages/cms/payments/index.cjs.js +0 -1
  287. package/lib/pages/cms/payments/queries.cjs.js +0 -1
  288. package/lib/pages/cms/products/ProductsPage.cjs.js +0 -1
  289. package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +0 -1
  290. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +0 -1
  291. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +0 -1
  292. package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +0 -1
  293. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +0 -1
  294. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +0 -1
  295. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +0 -1
  296. package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +0 -1
  297. package/lib/pages/cms/products/components/ProductForm.cjs.js +0 -1
  298. package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +0 -1
  299. package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +0 -1
  300. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +0 -1
  301. package/lib/pages/cms/products/components/VariationsEditor.cjs.js +0 -1
  302. package/lib/pages/cms/products/index.cjs.js +0 -1
  303. package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +0 -1
  304. package/lib/pages/cms/products/new/NewProductPage.cjs.js +0 -1
  305. package/lib/pages/cms/products/product-price-sync.cjs.js +0 -1
  306. package/lib/pages/cms/products/server-actions.cjs.js +0 -1
  307. package/lib/pages/cms/shipping/components/RateForm.cjs.js +0 -1
  308. package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +0 -1
  309. package/lib/pages/cms/shipping/index.cjs.js +0 -1
  310. package/lib/pages/cms/shipping/server-actions.cjs.js +0 -1
  311. package/lib/pages/cms/taxes/TaxesPage.cjs.js +0 -1
  312. package/lib/pages/cms/taxes/actions.cjs.js +0 -1
  313. package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +0 -1
  314. package/lib/pages/cms/taxes/index.cjs.js +0 -1
  315. package/lib/product-context.cjs.js +0 -1
  316. package/lib/product-schema.cjs.js +0 -1
  317. package/lib/providers/freemius.cjs.js +0 -1
  318. package/lib/providers/stripe.cjs.js +0 -1
  319. package/lib/server-actions/coupon-actions.cjs.js +0 -1
  320. package/lib/server-actions/customer-actions.cjs.js +0 -1
  321. package/lib/server-actions/product-actions.cjs.js +0 -1
  322. package/lib/server-actions/shipping-actions.cjs.js +0 -1
  323. package/lib/server-actions/tax-actions.cjs.js +0 -1
  324. package/lib/shipping-rate-currency.cjs.js +0 -1
  325. package/lib/states.cjs.js +0 -1
  326. package/lib/stripe/checkout.cjs.js +0 -1
  327. package/lib/stripe/client.cjs.js +0 -1
  328. package/lib/stripe/order-sync.cjs.js +0 -1
  329. package/lib/stripe/webhooks.cjs.js +0 -1
  330. package/lib/tax-calculation.cjs.js +0 -1
  331. package/lib/use-cart.cjs.js +0 -1
  332. package/lib/variation-utils.cjs.js +0 -1
  333. package/server.cjs.js +0 -1
  334. /package/_virtual/_rolldown/{runtime.cjs.js → runtime.cjs} +0 -0
  335. /package/lib/{countries.cjs.js → countries.cjs} +0 -0
  336. /package/lib/{coupons.cjs.js → coupons.cjs} +0 -0
  337. /package/lib/{currency-constants.cjs.js → currency-constants.cjs} +0 -0
  338. /package/lib/{currency-rest-client.cjs.js → currency-rest-client.cjs} +0 -0
  339. /package/lib/{currency-store.cjs.js → currency-store.cjs} +0 -0
  340. /package/lib/{currency.cjs.js → currency.cjs} +0 -0
  341. /package/lib/{inventory-settings.cjs.js → inventory-settings.cjs} +0 -0
  342. /package/lib/{invoice-ui.cjs.js → invoice-ui.cjs} +0 -0
  343. /package/lib/{invoice.cjs.js → invoice.cjs} +0 -0
  344. /package/lib/{order-tax-details.cjs.js → order-tax-details.cjs} +0 -0
  345. /package/lib/pages/cms/coupons/{ProductScopePicker.cjs.js → ProductScopePicker.cjs} +0 -0
  346. /package/lib/pages/cms/coupons/{product-options.cjs.js → product-options.cjs} +0 -0
  347. /package/lib/pages/cms/orders/{OrderPrintButton.cjs.js → OrderPrintButton.cjs} +0 -0
  348. /package/lib/pages/cms/orders/{actions.cjs.js → actions.cjs} +0 -0
  349. /package/lib/pages/cms/orders/{export-actions.cjs.js → export-actions.cjs} +0 -0
  350. /package/lib/pages/cms/payments/{PaymentsClient.cjs.js → PaymentsClient.cjs} +0 -0
  351. /package/lib/pages/cms/products/attributes/components/{AttributeManager.cjs.js → AttributeManager.cjs} +0 -0
  352. /package/lib/pages/cms/products/components/{DeleteProductButton.cjs.js → DeleteProductButton.cjs} +0 -0
  353. /package/lib/pages/cms/products/components/{SaleScheduleFields.cjs.js → SaleScheduleFields.cjs} +0 -0
  354. /package/lib/{payment-config.cjs.js → payment-config.cjs} +0 -0
  355. /package/lib/{shared-inventory.cjs.js → shared-inventory.cjs} +0 -0
  356. /package/lib/{trials.cjs.js → trials.cjs} +0 -0
  357. /package/lib/{types.cjs.js → types.cjs} +0 -0
  358. /package/lib/{use-price-formatter.cjs.js → use-price-formatter.cjs} +0 -0
  359. /package/lib/{zod-config.cjs.js → zod-config.cjs} +0 -0
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/pages/cms/coupons/product-options.ts
1
+ //#region src/lib/pages/cms/coupons/product-options.ts
2
2
  function e(e) {
3
3
  return Array.isArray(e) ? e[0] ?? null : e ?? null;
4
4
  }
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("./export-actions.cjs"),n=require("../../../export-helpers.cjs");let r=require("react");r=e.__toESM(r,1);let i=require("lucide-react"),a=require("react/jsx-runtime"),o=require("sonner"),s=require("@nextblock-cms/ui");function c(){let[e,c]=(0,r.useState)(!1),[l,u]=(0,r.useState)(!1),[d,f]=(0,r.useState)(``),[p,m]=(0,r.useState)(``),[h,g]=(0,r.useState)(`general_ledger`);return(0,a.jsxs)(s.Dialog,{open:e,onOpenChange:c,children:[(0,a.jsx)(s.DialogTrigger,{asChild:!0,children:(0,a.jsxs)(s.Button,{variant:`outline`,className:`flex items-center gap-2`,children:[(0,a.jsx)(i.Download,{className:`h-4 w-4`}),`Export Reports`]})}),(0,a.jsxs)(s.DialogContent,{className:`sm:max-w-[425px]`,children:[(0,a.jsxs)(s.DialogHeader,{children:[(0,a.jsxs)(s.DialogTitle,{className:`flex items-center gap-2`,children:[(0,a.jsx)(i.FileDown,{className:`h-5 w-5 text-blue-600`}),`Accounting Reports`]}),(0,a.jsx)(s.DialogDescription,{children:`Generate and download accountant-friendly order reports.`})]}),(0,a.jsxs)(`div`,{className:`grid gap-6 py-4`,children:[(0,a.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,a.jsxs)(`div`,{className:`grid gap-2`,children:[(0,a.jsx)(s.Label,{htmlFor:`start-date`,className:`text-xs font-semibold uppercase text-gray-500 tracking-wider`,children:`Start Date`}),(0,a.jsxs)(`div`,{className:`relative`,children:[(0,a.jsx)(s.Input,{id:`start-date`,type:`date`,value:d,onChange:e=>f(e.target.value),className:`pl-8`}),(0,a.jsx)(i.Calendar,{className:`absolute left-2.5 top-2.5 h-4 w-4 text-gray-400`})]})]}),(0,a.jsxs)(`div`,{className:`grid gap-2`,children:[(0,a.jsx)(s.Label,{htmlFor:`end-date`,className:`text-xs font-semibold uppercase text-gray-500 tracking-wider`,children:`End Date`}),(0,a.jsxs)(`div`,{className:`relative`,children:[(0,a.jsx)(s.Input,{id:`end-date`,type:`date`,value:p,onChange:e=>m(e.target.value),className:`pl-8`}),(0,a.jsx)(i.Calendar,{className:`absolute left-2.5 top-2.5 h-4 w-4 text-gray-400`})]})]})]}),(0,a.jsxs)(`div`,{className:`grid gap-2`,children:[(0,a.jsx)(s.Label,{htmlFor:`report-type`,className:`text-xs font-semibold uppercase text-gray-500 tracking-wider`,children:`Report Type`}),(0,a.jsxs)(s.Select,{value:h,onValueChange:e=>g(e),children:[(0,a.jsx)(s.SelectTrigger,{id:`report-type`,className:`w-full`,children:(0,a.jsx)(s.SelectValue,{placeholder:`Select report type`})}),(0,a.jsxs)(s.SelectContent,{children:[(0,a.jsx)(s.SelectItem,{value:`general_ledger`,children:`General Sales Ledger`}),(0,a.jsx)(s.SelectItem,{value:`tax_liability`,children:`Tax Liability Summary`}),(0,a.jsx)(s.SelectItem,{value:`currency_summary`,children:`Multi-Currency Revenue Summary`})]})]})]})]}),(0,a.jsx)(s.DialogFooter,{children:(0,a.jsx)(s.Button,{onClick:async()=>{if(!d||!p){o.toast.error(`Please select both start and end dates`);return}u(!0);try{o.toast.info(`Generating report...`);let e=await t.fetchOrderReportData(d,p);if(!e||e.length===0){o.toast.error(`No orders found for the selected date range`),u(!1);return}let r=[],i=`report_${h}_${d}_to_${p}`;switch(h){case`general_ledger`:r=n.mapGeneralSalesLedger(e);break;case`tax_liability`:r=n.mapTaxLiabilitySummary(e);break;case`currency_summary`:r=n.mapMultiCurrencyRevenue(e)}n.generateCSV(r,`${i}.csv`),o.toast.success(`Download complete!`),c(!1)}catch(e){console.error(`Export error:`,e),o.toast.error(`Failed to generate report`)}finally{u(!1)}},disabled:l,className:`w-full bg-blue-600 hover:bg-blue-700 text-white`,children:l?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.Loader2,{className:`mr-2 h-4 w-4 animate-spin`}),`Generating...`]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.Download,{className:`mr-2 h-4 w-4`}),`Download Report`]})})})]})]})}exports.ExportReportsDialog=c;
@@ -6,7 +6,7 @@ import { Calendar as o, Download as s, FileDown as c, Loader2 as l } from "lucid
6
6
  import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
7
7
  import { toast as p } from "sonner";
8
8
  import { Button as m, Dialog as h, DialogContent as g, DialogDescription as _, DialogFooter as v, DialogHeader as y, DialogTitle as b, DialogTrigger as x, Input as S, Label as C, Select as w, SelectContent as T, SelectItem as E, SelectTrigger as D, SelectValue as O } from "@nextblock-cms/ui";
9
- //#region libs/ecommerce/src/lib/pages/cms/orders/ExportReportsDialog.tsx
9
+ //#region src/lib/pages/cms/orders/ExportReportsDialog.tsx
10
10
  function k() {
11
11
  let [k, A] = a(!1), [j, M] = a(!1), [N, P] = a(""), [F, I] = a(""), [L, R] = a("general_ledger");
12
12
  return /* @__PURE__ */ f(h, {
@@ -0,0 +1 @@
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../invoice-ui.cjs"),n=require("../../../components/InvoiceViewerShell.cjs"),r=require("../../../invoice-server.cjs"),i=require("./actions.cjs"),a=require("./OrderPrintButton.cjs"),o=require("./OrderStatusForm.cjs");let s=require("next/link");s=e.__toESM(s,1);let c=require("react/jsx-runtime"),l=require("next/navigation");var u=(e,t=`usd`)=>new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t}).format(e/100);async function d({params:e}){let{id:d}=await e,[m,h]=await Promise.all([i.getOrderDetails(d),r.getInvoicePresentationData(d).catch(()=>null)]);m||(0,l.notFound)();let g=h?.order.customer_details??m.customer_details,_=t.buildInvoiceDocumentLabels(e=>e);return(0,c.jsxs)(`div`,{className:`mx-auto w-full max-w-6xl px-4 py-10 md:px-6`,children:[(0,c.jsxs)(`div`,{className:`flex flex-col gap-4 border-b pb-6 md:flex-row md:items-start md:justify-between`,children:[(0,c.jsxs)(`div`,{children:[(0,c.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 text-sm text-gray-500`,children:[(0,c.jsx)(s.default,{href:`/cms/orders`,className:`hover:underline`,children:`Orders`}),(0,c.jsx)(`span`,{children:`/`}),(0,c.jsx)(`span`,{className:`font-mono`,children:m.id})]}),(0,c.jsxs)(`h1`,{className:`flex flex-wrap items-center gap-3 text-3xl font-bold tracking-tight`,children:[`Order`,(0,c.jsx)(p,{status:m.status,size:`lg`})]}),(0,c.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:`Review the finalized invoice, customer details, and payment metadata in one place.`})]}),(0,c.jsx)(`div`,{className:`w-full max-w-md`,children:(0,c.jsx)(o.OrderStatusForm,{orderId:d,currentStatus:m.status})})]}),(0,c.jsxs)(`div`,{className:`mt-6 grid gap-4 md:grid-cols-2`,children:[(0,c.jsxs)(`div`,{className:`rounded-lg border bg-white p-4 dark:border-slate-800 dark:bg-slate-900`,children:[(0,c.jsx)(`h3`,{className:`mb-3 text-[11px] font-semibold uppercase tracking-[0.18em] text-slate-500`,children:`Customer`}),(0,c.jsxs)(`div`,{className:`space-y-2 text-sm`,children:[g?.name?(0,c.jsx)(`p`,{className:`font-semibold text-gray-900 dark:text-white`,children:g.name}):null,g?.email?(0,c.jsx)(`p`,{className:`text-gray-600 dark:text-gray-400`,children:g.email}):null,g?.phone?(0,c.jsx)(`p`,{className:`text-gray-600 dark:text-gray-400`,children:g.phone}):null,!g?.name&&!g?.email&&!g?.phone?(0,c.jsx)(`p`,{className:`italic text-gray-400`,children:`No contact info captured.`}):null,m.user_id?(0,c.jsxs)(`p`,{className:`pt-1 font-mono text-[10px] uppercase tracking-wider text-gray-400`,children:[`User ID: `,m.user_id.slice(0,13),`...`]}):null]})]}),(0,c.jsxs)(`div`,{className:`rounded-lg border bg-white p-4 dark:border-slate-800 dark:bg-slate-900`,children:[(0,c.jsx)(`h3`,{className:`mb-3 text-[11px] font-semibold uppercase tracking-[0.18em] text-slate-500`,children:`Payment Details`}),(0,c.jsxs)(`div`,{className:`space-y-2 text-sm`,children:[(0,c.jsx)(f,{label:`Provider`,value:m.provider||`stripe`,capitalize:!0}),(0,c.jsx)(f,{label:`Currency`,value:(m.currency||`usd`).toUpperCase()}),(0,c.jsx)(f,{label:`Created`,value:new Date(m.created_at||``).toLocaleDateString()}),(0,c.jsx)(f,{label:`Invoice #`,value:h?.order.invoice_number||`Pending assignment`}),(0,c.jsx)(f,{label:`Paid on`,value:h?.order.paid_at?new Date(h.order.paid_at).toLocaleString():`Pending payment`}),(0,c.jsx)(f,{label:`Total`,value:typeof m.total==`number`?u(m.total,m.currency||`usd`):`--`}),m.discount_total?(0,c.jsx)(f,{label:`Discount`,value:`${m.coupon_code?`${m.coupon_code} `:``}-${u(m.discount_total,m.currency||`usd`)}`}):null,m.stripe_session_id?(0,c.jsxs)(`div`,{className:`mt-3 border-t pt-3 dark:border-slate-800`,children:[(0,c.jsx)(`p`,{className:`mb-1 text-xs text-gray-500`,children:`Session ID`}),(0,c.jsx)(`p`,{className:`break-all rounded bg-gray-50 p-1 font-mono text-xs dark:bg-slate-800`,children:m.stripe_session_id})]}):null]})]})]}),(0,c.jsx)(`div`,{className:`mt-6 flex justify-end print:hidden`,children:(0,c.jsx)(a.OrderPrintButton,{disabled:!h})}),(0,c.jsx)(n.InvoiceViewerShell,{invoice:h,labels:_,locale:`en-US`,title:h?.order.invoice_number||`Order invoice`,description:`Open the printable invoice below and update the order status whenever you need to.`,printLabel:`Print / Save as PDF`,action:{href:`/cms/orders`,label:`Back to orders`,variant:`outline`},emptyMessage:`The printable invoice will appear here after the order payment metadata is synced.`,className:`max-w-none px-0 py-6 md:px-0`,showHeader:!1})]})}function f({label:e,value:t,capitalize:n=!1}){return(0,c.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,c.jsx)(`span`,{className:`text-gray-500`,children:e}),(0,c.jsx)(`span`,{className:n?`capitalize font-medium`:`font-medium`,children:t})]})}function p({status:e,size:t=`md`}){let n=`bg-gray-100 text-gray-700 dark:bg-slate-800 dark:text-gray-300`;return e===`paid`&&(n=`bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400`),e===`trial`&&(n=`bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300`),e===`pending`&&(n=`bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400`),e===`shipped`&&(n=`bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400`),e===`cancelled`&&(n=`bg-slate-200 text-slate-700 dark:bg-slate-800 dark:text-slate-300`),e===`refunded`&&(n=`bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300`),e===`failed`&&(n=`bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400`),(0,c.jsx)(`span`,{className:`${t===`lg`?`px-3 py-1 text-sm`:`px-2 py-0.5 text-xs`} rounded-full font-medium capitalize ${n}`,children:e})}exports.OrderDetailPage=d;
@@ -7,7 +7,7 @@ import { OrderStatusForm as a } from "./OrderStatusForm.es.js";
7
7
  import o from "next/link";
8
8
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
9
9
  import { notFound as l } from "next/navigation";
10
- //#region libs/ecommerce/src/lib/pages/cms/orders/OrderDetailPage.tsx
10
+ //#region src/lib/pages/cms/orders/OrderDetailPage.tsx
11
11
  var u = (e, t = "usd") => new Intl.NumberFormat("en-US", {
12
12
  style: "currency",
13
13
  currency: t
@@ -2,7 +2,7 @@
2
2
  import { Printer as e } from "lucide-react";
3
3
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
4
  import { Button as r } from "@nextblock-cms/ui";
5
- //#region libs/ecommerce/src/lib/pages/cms/orders/OrderPrintButton.tsx
5
+ //#region src/lib/pages/cms/orders/OrderPrintButton.tsx
6
6
  function i({ disabled: i = !1 }) {
7
7
  return /* @__PURE__ */ n(r, {
8
8
  type: "button",
@@ -0,0 +1 @@
1
+ "use client";const e=require("./server-actions.cjs");let t=require("react"),n=require("react/jsx-runtime"),r=require("next/navigation"),i=require("@nextblock-cms/ui");var a=[{value:`pending`,label:`Pending`},{value:`trial`,label:`Trial`},{value:`paid`,label:`Paid`},{value:`shipped`,label:`Shipped`},{value:`cancelled`,label:`Cancelled`},{value:`refunded`,label:`Refunded`}];function o({orderId:o,currentStatus:s}){let c=(0,r.useRouter)(),[l,u]=(0,t.useState)(a.some(e=>e.value===s)?s:`pending`),[d,f]=(0,t.useState)(null),[p,m]=(0,t.useTransition)(),h=(0,t.useMemo)(()=>l!==s,[s,l]);return(0,n.jsxs)(`div`,{className:`rounded-lg border bg-white p-4 dark:border-slate-800 dark:bg-slate-900`,children:[(0,n.jsxs)(`div`,{className:`flex flex-col gap-3 sm:flex-row sm:items-end`,children:[(0,n.jsxs)(`div`,{className:`min-w-[220px] flex-1 space-y-2`,children:[(0,n.jsx)(`p`,{className:`text-[11px] font-semibold uppercase tracking-[0.18em] text-slate-500`,children:`Order Status`}),(0,n.jsxs)(i.Select,{value:l,onValueChange:e=>{u(e),f(null)},children:[(0,n.jsx)(i.SelectTrigger,{children:(0,n.jsx)(i.SelectValue,{placeholder:`Select status`})}),(0,n.jsx)(i.SelectContent,{children:a.map(e=>(0,n.jsx)(i.SelectItem,{value:e.value,children:e.label},e.value))})]})]}),(0,n.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,n.jsx)(i.Button,{type:`button`,onClick:()=>{h&&(f(null),m(async()=>{try{let t=await e.updateOrderStatus(o,l);if(!t.success){f(t.error||`Failed to update order status.`);return}c.refresh()}catch(e){console.error(e),f(`Unexpected error while saving the order status.`)}}))},disabled:p||!h,children:p?`Saving...`:`Save`})})]}),d?(0,n.jsx)(`p`,{className:`mt-2 text-xs text-red-600 dark:text-red-400`,children:d}):h?null:(0,n.jsx)(`p`,{className:`mt-2 text-xs text-slate-500`,children:`Status is already up to date.`})]})}exports.OrderStatusForm=o;
@@ -4,7 +4,7 @@ import { useMemo as t, useState as n, useTransition as r } from "react";
4
4
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
5
  import { useRouter as o } from "next/navigation";
6
6
  import { Button as s, Select as c, SelectContent as l, SelectItem as u, SelectTrigger as d, SelectValue as f } from "@nextblock-cms/ui";
7
- //#region libs/ecommerce/src/lib/pages/cms/orders/OrderStatusForm.tsx
7
+ //#region src/lib/pages/cms/orders/OrderStatusForm.tsx
8
8
  var p = [
9
9
  {
10
10
  value: "pending",
@@ -0,0 +1 @@
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("./actions.cjs"),n=require("./ExportReportsDialog.cjs");let r=require("next/link");r=e.__toESM(r,1);let i=require("react/jsx-runtime");var a=(e,t=`usd`)=>new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t}).format(e/100);async function o({searchParams:e}){let o=await e,c=Number(o.page)||1,l=o.status||`all`,{data:u,totalPages:d}=await t.getOrders(c,l);return(0,i.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,i.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,i.jsx)(`h1`,{className:`text-2xl font-bold tracking-tight`,children:`Orders`}),(0,i.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,i.jsx)(n.ExportReportsDialog,{}),(0,i.jsx)(r.default,{href:`/cms/orders?page=${c}&status=${l}`,className:`px-3 py-2 text-sm font-medium border rounded hover:bg-gray-50 dark:hover:bg-slate-800`,children:`Refresh`})]})]}),(0,i.jsx)(`div`,{className:`flex gap-2 border-b pb-4`,children:[`all`,`paid`,`trial`,`pending`,`failed`].map(e=>(0,i.jsx)(r.default,{href:`/cms/orders?page=1&status=${e}`,className:`px-3 py-1 rounded-full text-sm font-medium capitalize ${l===e?`bg-black text-white dark:bg-white dark:text-black`:`bg-gray-100 text-gray-600 hover:bg-gray-200 dark:bg-slate-800 dark:text-gray-300 dark:hover:bg-slate-700`}`,children:e},e))}),(0,i.jsx)(`div`,{className:`border rounded-lg overflow-hidden dark:border-slate-800`,children:(0,i.jsxs)(`table`,{className:`w-full text-sm text-left align-middle`,children:[(0,i.jsx)(`thead`,{className:`bg-gray-50 text-gray-500 font-medium border-b dark:bg-slate-900 dark:text-slate-400 dark:border-slate-800`,children:(0,i.jsxs)(`tr`,{children:[(0,i.jsx)(`th`,{className:`px-4 py-3`,children:`ID`}),(0,i.jsx)(`th`,{className:`px-4 py-3`,children:`Customer`}),(0,i.jsx)(`th`,{className:`px-4 py-3`,children:`Status`}),(0,i.jsx)(`th`,{className:`px-4 py-3`,children:`Provider`}),(0,i.jsx)(`th`,{className:`px-4 py-3 text-right`,children:`Amount`}),(0,i.jsx)(`th`,{className:`px-4 py-3 text-right`,children:`Date`}),(0,i.jsx)(`th`,{className:`px-4 py-3 text-right`,children:`Actions`})]})}),(0,i.jsx)(`tbody`,{className:`divide-y dark:divide-slate-800`,children:u.length===0?(0,i.jsx)(`tr`,{children:(0,i.jsx)(`td`,{colSpan:7,className:`px-4 py-8 text-center text-gray-500`,children:`No orders found.`})}):u.map(e=>{let t=e.customer_details,n=t?.name||t?.email||e.customer?.full_name||`Guest Customer`;return(0,i.jsxs)(`tr`,{className:`hover:bg-gray-50 dark:hover:bg-slate-800/50`,children:[(0,i.jsxs)(`td`,{className:`px-4 py-3 font-mono text-gray-500`,children:[e.id.slice(0,8),`...`]}),(0,i.jsx)(`td`,{className:`px-4 py-3 font-medium`,children:n}),(0,i.jsx)(`td`,{className:`px-4 py-3`,children:(0,i.jsx)(s,{status:e.status})}),(0,i.jsx)(`td`,{className:`px-4 py-3 capitalize text-gray-600 dark:text-gray-400`,children:e.provider===`freemius`?`Freemius`:`Stripe`}),(0,i.jsx)(`td`,{className:`px-4 py-3 text-right`,children:(0,i.jsxs)(`div`,{className:`flex flex-col items-end`,children:[(0,i.jsx)(`span`,{children:a(e.total,e.currency||`usd`)}),e.discount_total?(0,i.jsxs)(`span`,{className:`text-[10px] text-emerald-600`,children:[e.coupon_code,` -`,a(e.discount_total,e.currency||`usd`)]}):null]})}),(0,i.jsx)(`td`,{className:`px-4 py-3 text-right text-gray-500 whitespace-nowrap`,children:new Date(e.created_at||``).toLocaleDateString()}),(0,i.jsx)(`td`,{className:`px-4 py-3 text-right`,children:(0,i.jsx)(r.default,{href:`/cms/orders/${e.id}`,className:`text-blue-600 hover:underline dark:text-blue-400`,children:`View`})})]},e.id)})})]})}),(0,i.jsxs)(`div`,{className:`flex justify-between items-center pt-4`,children:[(0,i.jsxs)(`div`,{className:`text-sm text-gray-500`,children:[`Page `,c,` of `,d]}),(0,i.jsxs)(`div`,{className:`flex gap-2`,children:[(0,i.jsx)(r.default,{href:`/cms/orders?page=${Math.max(1,c-1)}&status=${l}`,className:`px-3 py-1 border rounded text-sm ${c<=1?`pointer-events-none opacity-50`:`hover:bg-gray-50 dark:hover:bg-slate-800`}`,children:`Previous`}),(0,i.jsx)(r.default,{href:`/cms/orders?page=${Math.min(d,c+1)}&status=${l}`,className:`px-3 py-1 border rounded text-sm ${c>=d?`pointer-events-none opacity-50`:`hover:bg-gray-50 dark:hover:bg-slate-800`}`,children:`Next`})]})]})]})}function s({status:e}){let t=`bg-gray-100 text-gray-700 dark:bg-slate-800 dark:text-gray-300`;return e===`paid`&&(t=`bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400`),e===`trial`&&(t=`bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300`),e===`pending`&&(t=`bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400`),e===`failed`&&(t=`bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400`),(0,i.jsx)(`span`,{className:`px-2 py-0.5 rounded-full text-xs font-medium capitalize ${t}`,children:e})}exports.OrdersPage=o;
@@ -2,7 +2,7 @@ import { getOrders as e } from "./actions.es.js";
2
2
  import { ExportReportsDialog as t } from "./ExportReportsDialog.es.js";
3
3
  import n from "next/link";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
- //#region libs/ecommerce/src/lib/pages/cms/orders/OrdersPage.tsx
5
+ //#region src/lib/pages/cms/orders/OrdersPage.tsx
6
6
  var a = (e, t = "usd") => new Intl.NumberFormat("en-US", {
7
7
  style: "currency",
8
8
  currency: t
@@ -1,6 +1,6 @@
1
1
  "use server";
2
2
  import { createClient as e } from "@nextblock-cms/db/server";
3
- //#region libs/ecommerce/src/lib/pages/cms/orders/actions.ts
3
+ //#region src/lib/pages/cms/orders/actions.ts
4
4
  var t = 20;
5
5
  async function n(n = 1, r, i) {
6
6
  let a = await e(), o = (n - 1) * t, s = o + t - 1, c = a.from("orders").select("\n *,\n order_items (*)\n ", { count: "exact" }).order("created_at", { ascending: !1 }).range(o, s);
@@ -1,6 +1,6 @@
1
1
  "use server";
2
2
  import { createClient as e } from "@nextblock-cms/db/server";
3
- //#region libs/ecommerce/src/lib/pages/cms/orders/export-actions.ts
3
+ //#region src/lib/pages/cms/orders/export-actions.ts
4
4
  async function t(t, n) {
5
5
  let r = e(), i = r.from("orders").select("*, order_items(*)");
6
6
  if (t && (i = i.gte("created_at", t)), n) {
@@ -0,0 +1 @@
1
+ const e=require("./actions.cjs"),t=require("./export-actions.cjs"),n=require("./ExportReportsDialog.cjs"),r=require("./OrdersPage.cjs"),i=require("./OrderDetailPage.cjs");exports.ExportReportsDialog=n.ExportReportsDialog,exports.OrderDetailPage=i.OrderDetailPage,exports.OrdersPage=r.OrdersPage,exports.fetchOrderReportData=t.fetchOrderReportData,exports.getOrderDetails=e.getOrderDetails,exports.getOrders=e.getOrders;
@@ -0,0 +1 @@
1
+ "use server";const e=require("../../../order-inventory.cjs"),t=require("../../../invoice-server.cjs");let n=require("@nextblock-cms/db/server"),r=require("@supabase/supabase-js");var i=[`pending`,`trial`,`paid`,`shipped`,`cancelled`,`refunded`];async function a(){let e=(0,n.createClient)(),{data:{user:t},error:r}=await e.auth.getUser();if(r||!t)return{error:`Unauthorized`};let{data:i,error:a}=await e.from(`profiles`).select(`role`).eq(`id`,t.id).single();return a||!i||![`ADMIN`,`WRITER`].includes(i.role)?{error:`Forbidden`}:{supabase:e,user:t}}function o(){let e=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY,t=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL;if(!e||!t)throw Error(`Server configuration error`);return(0,r.createClient)(t,e,{auth:{autoRefreshToken:!1,persistSession:!1}})}async function s(n,r){let s=await a();if(`error`in s)return{success:!1,error:s.error};if(!i.includes(r))return{success:!1,error:`Invalid order status`};let c;try{c=o()}catch(e){return{success:!1,error:e instanceof Error?e.message:`Server configuration error`}}let{data:l,error:u}=await c.from(`orders`).update({status:r}).eq(`id`,n).select();return u?(console.error(`Order status update error:`,u),{success:!1,error:u.message}):!l||l.length===0?{success:!1,error:`Order not found or update failed.`}:(r===`paid`&&(await t.assignInvoiceMetadata({orderId:n,client:c}),await e.applyOrderInventoryDeduction(c,n)),{success:!0})}exports.updateOrderStatus=s;
@@ -3,7 +3,7 @@ import { applyOrderInventoryDeduction as e } from "../../../order-inventory.es.j
3
3
  import { assignInvoiceMetadata as t } from "../../../invoice-server.es.js";
4
4
  import { createClient as n } from "@nextblock-cms/db/server";
5
5
  import { createClient as r } from "@supabase/supabase-js";
6
- //#region libs/ecommerce/src/lib/pages/cms/orders/server-actions.ts
6
+ //#region src/lib/pages/cms/orders/server-actions.ts
7
7
  var i = [
8
8
  "pending",
9
9
  "trial",
@@ -5,7 +5,7 @@ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
5
  import { useRouter as o } from "next/navigation";
6
6
  import { Button as s, Card as c, CardContent as l, CardDescription as u, CardHeader as d, CardTitle as f, Checkbox as p, Input as m, Label as h } from "@nextblock-cms/ui";
7
7
  import { useFormStatus as g } from "react-dom";
8
- //#region libs/ecommerce/src/lib/pages/cms/payments/PaymentsClient.tsx
8
+ //#region src/lib/pages/cms/payments/PaymentsClient.tsx
9
9
  function _({ initialEnabledProviders: n, configStatus: p, credentials: m, saveAction: h, saveCredentialsAction: g }) {
10
10
  let _ = o(), [v, y] = t(), C = p.stripe.hasKeys, w = p.freemius.hasKeys, [T, E] = e(() => ({
11
11
  stripe: n.stripe && C,
@@ -0,0 +1 @@
1
+ const e=require("../../../payment-config.cjs"),t=require("./queries.cjs"),n=require("./actions.cjs"),r=require("./PaymentsClient.cjs");let i=require("react/jsx-runtime");async function a(){let[a,o,s]=await Promise.all([t.getEnabledPaymentProviders(),t.getStoreConfigStatus(),e.getPaymentCredentialsView()]);async function c(e){"use server";let t={stripe:e.get(`stripe_enabled`)===`true`&&o.stripe.hasKeys,freemius:e.get(`freemius_enabled`)===`true`&&o.freemius.hasKeys};await n.updatePaymentSettings(t)}return(0,i.jsx)(r.PaymentsClient,{initialEnabledProviders:a,configStatus:o,credentials:s,saveAction:c,saveCredentialsAction:n.savePaymentProviderCredentials})}exports.PaymentsPage=a;
@@ -3,7 +3,7 @@ import { getEnabledPaymentProviders as t, getStoreConfigStatus as n } from "./qu
3
3
  import { savePaymentProviderCredentials as r, updatePaymentSettings as i } from "./actions.es.js";
4
4
  import { PaymentsClient as a } from "./PaymentsClient.es.js";
5
5
  import { jsx as o } from "react/jsx-runtime";
6
- //#region libs/ecommerce/src/lib/pages/cms/payments/PaymentsPage.tsx
6
+ //#region src/lib/pages/cms/payments/PaymentsPage.tsx
7
7
  async function s() {
8
8
  let [s, c, l] = await Promise.all([
9
9
  t(),
@@ -0,0 +1 @@
1
+ "use server";const e=require("../../../payment-config.cjs");let t=require("@nextblock-cms/db/server"),n=require("next/cache");async function r(){let e=await(0,t.createClient)(),{data:{user:n}}=await e.auth.getUser();if(!n)throw Error(`Unauthorized`);let{data:r}=await e.from(`profiles`).select(`role`).eq(`id`,n.id).single();if(!r||r.role!==`ADMIN`)throw Error(`Forbidden`)}async function i(t){await r(),await e.savePaymentCredentials({stripe:{publishableKey:String(t.get(`stripe_publishableKey`)??``),secretKey:String(t.get(`stripe_secretKey`)??``),webhookSecret:String(t.get(`stripe_webhookSecret`)??``)},freemius:{developerId:String(t.get(`freemius_developerId`)??``),publicKey:String(t.get(`freemius_publicKey`)??``),productId:String(t.get(`freemius_productId`)??``),secretKey:String(t.get(`freemius_secretKey`)??``),apiKey:String(t.get(`freemius_apiKey`)??``)}}),(0,n.revalidatePath)(`/cms/payments`),(0,n.revalidatePath)(`/cms/dashboard`),(0,n.revalidatePath)(`/`,`layout`)}async function a(e){let r=await(0,t.createClient)(),{data:{user:i}}=await r.auth.getUser();if(!i)throw Error(`Unauthorized`);let{data:a}=await r.from(`profiles`).select(`role`).eq(`id`,i.id).single();if(!a||a.role!==`ADMIN`)throw Error(`Forbidden`);let{error:o}=await r.from(`site_settings`).upsert({key:`enabled_payment_providers`,value:e});if(o)throw console.error(`Error updating payment providers:`,o),Error(`Failed to update settings`);return(0,n.revalidatePath)(`/cms/payments`),(0,n.revalidatePath)(`/cms/taxes`),(0,n.revalidatePath)(`/`,`layout`),{success:!0}}exports.savePaymentProviderCredentials=i,exports.updatePaymentSettings=a;
@@ -2,7 +2,7 @@
2
2
  import { savePaymentCredentials as e } from "../../../payment-config.es.js";
3
3
  import { createClient as t } from "@nextblock-cms/db/server";
4
4
  import { revalidatePath as n } from "next/cache";
5
- //#region libs/ecommerce/src/lib/pages/cms/payments/actions.ts
5
+ //#region src/lib/pages/cms/payments/actions.ts
6
6
  async function r() {
7
7
  let e = await t(), { data: { user: n } } = await e.auth.getUser();
8
8
  if (!n) throw Error("Unauthorized");
@@ -0,0 +1 @@
1
+ const e=require("./actions.cjs"),t=require("./PaymentsPage.cjs");exports.PaymentsPage=t.PaymentsPage,exports.savePaymentProviderCredentials=e.savePaymentProviderCredentials,exports.updatePaymentSettings=e.updatePaymentSettings;
@@ -0,0 +1 @@
1
+ const e=require("../../../types.cjs"),t=require("../../../payment-config.cjs");let n=require("react"),r=require("@nextblock-cms/db/server");async function i(){return t.getPaymentConfigStatus()}async function a(){let{data:t,error:n}=await(0,r.createClient)().from(`site_settings`).select(`value`).eq(`key`,`enabled_payment_providers`).maybeSingle();return n||!t?{...e.DEFAULT_ENABLED_PAYMENT_PROVIDERS}:e.normalizeEnabledPaymentProviders(t.value)}async function o(){let e=await a();return e.stripe?`stripe`:e.freemius?`freemius`:`stripe`}var s={stripe:`Stripe`,freemius:`Freemius`};function c(e,t,n){let r=t[e],{hasKeys:i,missing:a}=n[e];return{provider:e,label:s[e],enabled:r,hasKeys:i,ready:r&&i,missing:i&&!r?[`Not enabled in CMS → Payments`]:a}}var l=(0,n.cache)(async()=>{let[e,t]=await Promise.all([a(),i()]);return{stripe:c(`stripe`,e,t),freemius:c(`freemius`,e,t)}});async function u(e){return(await l())[e]}async function d(t){return u(e.derivePaymentProviderFromProductType(t))}exports.getEnabledPaymentProviders=a,exports.getPaymentSettings=o,exports.getProviderReadiness=u,exports.getReadinessForProductType=d,exports.getStoreConfigStatus=i,exports.getStoreReadiness=l;
@@ -2,7 +2,7 @@ import { DEFAULT_ENABLED_PAYMENT_PROVIDERS as e, derivePaymentProviderFromProduc
2
2
  import { getPaymentConfigStatus as r } from "../../../payment-config.es.js";
3
3
  import { cache as i } from "react";
4
4
  import { createClient as a } from "@nextblock-cms/db/server";
5
- //#region libs/ecommerce/src/lib/pages/cms/payments/queries.ts
5
+ //#region src/lib/pages/cms/payments/queries.ts
6
6
  async function o() {
7
7
  return r();
8
8
  }
@@ -0,0 +1 @@
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("./actions.cjs"),n=require("./server-actions.cjs"),r=require("./components/ProductsBulkTable.cjs"),i=require("./components/SyncFreemiusButton.cjs");let a=require("next/link");a=e.__toESM(a,1);let o=require("react/jsx-runtime"),s=require("@nextblock-cms/db/server"),c=require("@nextblock-cms/ui"),l=require("@nextblock-cms/utils/seo");async function u({searchParams:e,languageFilterNode:u,transferControlsNode:d}){let f=(0,s.getServiceRoleSupabaseClient)(),[p,{data:m}]=await Promise.all([(0,s.getActiveLanguagesServerSide)(),f.from(`currencies`).select(`code, is_default`).eq(`is_active`,!0).order(`is_default`,{ascending:!1}).order(`code`,{ascending:!0})]),h=e?.lang?parseInt(e.lang,10):void 0,{data:g}=await t.getProducts({languageId:h}),_=g||[],v=_.map(e=>e.id),{data:y}=v.length>0?await f.from(`blocks`).select(`id, product_id, block_type, content, order`).in(`product_id`,v).order(`order`,{ascending:!0}):{data:[]},b=new Map;for(let e of y||[]){if(!e.product_id)continue;let t=b.get(e.product_id)||[];t.push(e),b.set(e.product_id,t)}let x=_.map(e=>{let t=b.get(e.id)||[],n=(0,l.buildPageSeoDocument)(t,{documentTitle:e.title,documentType:`product`}),r=(0,l.auditSeo)({document:n,metaTitle:e.meta_title??void 0,metaDescription:e.meta_description??void 0,scope:`page`});return{...e,seo_score:r.score}}),S=Object.fromEntries(p.map(e=>[String(e.id),e.code.toUpperCase()])),C=m?.find(e=>e.is_default)?.code||m?.[0]?.code||`USD`;return(0,o.jsxs)(`div`,{className:`p-8 space-y-6`,children:[(0,o.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,o.jsx)(`h1`,{className:`text-3xl font-bold`,children:`Products`}),(0,o.jsxs)(`div`,{className:`flex flex-wrap items-center gap-4`,children:[(0,o.jsx)(`div`,{className:`h-10 w-[1px] bg-slate-200 dark:bg-slate-800 mx-2 hidden sm:block`}),d,u,(0,o.jsx)(i.SyncFreemiusButton,{title:`Sync Full Store`}),(0,o.jsx)(a.default,{href:`/cms/products/new`,children:(0,o.jsx)(c.Button,{children:`New Product`})})]})]}),(0,o.jsx)(r.ProductsBulkTable,{products:x,languageLabels:S,defaultCurrencyCode:C,deleteProductAction:n.deleteProductAction,bulkDeleteProductsAction:n.bulkDeleteProductsAction,bulkDraftProductsAction:n.bulkDraftProductsAction})]})}exports.ProductsPage=u;
@@ -7,7 +7,7 @@ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
7
  import { getActiveLanguagesServerSide as l, getServiceRoleSupabaseClient as u } from "@nextblock-cms/db/server";
8
8
  import { Button as d } from "@nextblock-cms/ui";
9
9
  import { auditSeo as f, buildPageSeoDocument as p } from "@nextblock-cms/utils/seo";
10
- //#region libs/ecommerce/src/lib/pages/cms/products/ProductsPage.tsx
10
+ //#region src/lib/pages/cms/products/ProductsPage.tsx
11
11
  async function m({ searchParams: m, languageFilterNode: h, transferControlsNode: g }) {
12
12
  let _ = u(), [v, { data: y }] = await Promise.all([l(), _.from("currencies").select("code, is_default").eq("is_active", !0).order("is_default", { ascending: !1 }).order("code", { ascending: !0 })]), b = m?.lang ? parseInt(m.lang, 10) : void 0, { data: x } = await e({ languageId: b }), S = x || [], C = S.map((e) => e.id), { data: w } = C.length > 0 ? await _.from("blocks").select("id, product_id, block_type, content, order").in("product_id", C).order("order", { ascending: !0 }) : { data: [] }, T = /* @__PURE__ */ new Map();
13
13
  for (let e of w || []) {
@@ -0,0 +1 @@
1
+ const e=require("../../../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../../currency.cjs"),n=require("../../../../../variation-utils.cjs"),r=require("../../actions.cjs"),i=require("../../server-actions.cjs"),a=require("../../components/ProductForm.cjs"),o=require("../../../payments/queries.cjs"),s=require("../../components/DeleteProductButton.cjs"),c=require("../../components/FreemiusPricingDashboard.cjs");let l=require("next/link");l=e.__toESM(l,1);let u=require("lucide-react"),d=require("@nextblock-cms/utils"),f=require("react/jsx-runtime"),p=require("@nextblock-cms/db/server"),m=require("next/navigation"),h=require("@nextblock-cms/ui");async function g({params:e,mediaPickerNode:g,availableLanguagesProp:_,languageSwitcherNode:v,copyContentNode:y,translationCtaNode:b}){let{id:x}=await e,S=await r.getProduct(x);S||(0,m.notFound)();let C=S.product_type===`digital`||S.payment_provider===`freemius`,[w,T,E,D,O]=await Promise.all([o.getEnabledPaymentProviders(),o.getStoreConfigStatus(),C&&S.freemius_product_id?r.getFreemiusPricingByProductId(S.id):Promise.resolve(null),r.getGlobalProductAttributes(),(0,p.getServiceRoleSupabaseClient)().from(`currencies`).select(`code, symbol, exchange_rate, is_default, is_active, auto_sync_product_prices, auto_update_exchange_rate, exchange_rate_source, exchange_rate_updated_at, rounding_mode, rounding_increment, rounding_charm_amount`).eq(`is_active`,!0).order(`code`,{ascending:!0}).then(e=>e.data||[])]),k=(O||[]).map(e=>t.normalizeCurrencyRecord(e)),A=_.find(e=>e.id===S.language_id)?.code,{attributes:j,variants:M}=n.mapRawVariantRelations(S.product_variants||[],A),N=(D||[]).map(e=>({id:e.id,name:e.name,name_translations:e.name_translations||{},slug:e.slug,terms:(e.product_attribute_terms||[]).map(e=>({...e,value_translations:e.value_translations||{}}))})),P=s.DeleteProductButton,F=c.FreemiusPricingDashboard;return(0,f.jsxs)(`div`,{className:`space-y-8 w-full max-w-[1400px] mx-auto px-6 py-8`,children:[(0,f.jsxs)(`div`,{className:`flex justify-between items-center flex-wrap gap-4 w-full`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,f.jsx)(h.Button,{variant:`outline`,size:`icon`,"aria-label":`Back to products`,asChild:!0,children:(0,f.jsx)(l.default,{href:`/cms/products`,children:(0,f.jsx)(u.ArrowLeft,{className:`h-4 w-4`})})}),(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`h1`,{className:`text-2xl font-bold`,children:`Edit Product`}),(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground truncate max-w-md`,title:S.title,children:S.title})]})]}),(0,f.jsxs)(`div`,{className:`flex items-center gap-3 flex-wrap`,children:[v,y,b,P?(0,f.jsx)(P,{productName:S.title,redirectTo:`/cms/products`,className:`border-red-200 hover:bg-red-50 hover:text-red-700`,deleteAction:i.deleteProductAction.bind(null,S.id)}):null,S.slug&&S.status===`active`&&(0,f.jsx)(h.Button,{variant:`outline`,asChild:!0,children:(0,f.jsxs)(l.default,{href:`/product/${S.slug}`,target:`_blank`,children:[(0,f.jsx)(u.ExternalLink,{className:`w-4 h-4 mr-2`}),`View`]})})]})]}),(0,f.jsx)(a.ProductForm,{initialData:{id:S.id,title:S.title,slug:S.slug,sku:S.sku,upc:S.upc??void 0,stock:S.stock||0,price:S.price||0,prices:Object.entries(S.prices||{}).reduce((e,[t,n])=>(e[t]=(0,d.minorUnitAmountToMajor)(n,t),e),{}),is_taxable:typeof S.is_taxable!=`boolean`||S.is_taxable,product_type:S.product_type,payment_provider:S.payment_provider,status:S.status,short_description:S.short_description??void 0,description_json:S.description_json,sale_price:typeof S.sale_price==`number`?S.sale_price:void 0,sale_prices:Object.entries(S.sale_prices||{}).reduce((e,[t,n])=>(e[t]=typeof n==`number`?(0,d.minorUnitAmountToMajor)(n,t):null,e),{}),freemius_plan_id:S.freemius_plan_id??void 0,freemius_product_id:S.freemius_product_id??void 0,trial_period_days:S.trial_period_days??0,trial_requires_payment_method:S.trial_requires_payment_method??!1,language_id:S.language_id,translation_group_id:S.translation_group_id,product_media:S.product_media,variation_attributes:j.map(e=>({attribute_id:e.id,term_ids:e.terms.map(e=>e.id)})),variants:M.map(e=>({...e,upc:e.upc??null,price:e.price/100,prices:Object.entries(e.prices||{}).reduce((e,[t,n])=>(e[t]=(0,d.minorUnitAmountToMajor)(n,t),e),{}),sale_price:typeof e.sale_price==`number`?e.sale_price/100:null,sale_prices:Object.entries(e.sale_prices||{}).reduce((e,[t,n])=>(e[t]=typeof n==`number`?(0,d.minorUnitAmountToMajor)(n,t):null,e),{}),main_media_id:e.main_media_id??null,main_image_url:e.image_url??null}))},isEdit:!0,mediaPickerNode:g,availableLanguagesProp:_,globalAttributesProp:N,currenciesProp:k,enabledProviders:w,configStatus:T,updateAction:i.updateProductAction.bind(null,S.id),freemiusDashboardNode:C&&S.freemius_product_id&&E&&F?(0,f.jsx)(F,{productId:S.id,freemiusProductId:S.freemius_product_id,plans:E}):void 0})]})}exports.EditProductPage=g;
@@ -13,7 +13,7 @@ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
13
13
  import { getServiceRoleSupabaseClient as v } from "@nextblock-cms/db/server";
14
14
  import { notFound as y } from "next/navigation";
15
15
  import { Button as b } from "@nextblock-cms/ui";
16
- //#region libs/ecommerce/src/lib/pages/cms/products/[id]/edit/EditProductPage.tsx
16
+ //#region src/lib/pages/cms/products/[id]/edit/EditProductPage.tsx
17
17
  async function x({ params: x, mediaPickerNode: S, availableLanguagesProp: C, languageSwitcherNode: w, copyContentNode: T, translationCtaNode: E }) {
18
18
  let { id: D } = await x, O = await i(D);
19
19
  O || y();
@@ -1,4 +1,4 @@
1
- "use server";const e=require("../../../product-actions.cjs.js"),t=require("../../../providers/freemius.cjs.js");let n=require("@nextblock-cms/db/server"),r=require("next/cache");async function i(t){let r=(0,n.createClient)(),{data:i,count:a,error:o}=await await e.getProducts(r,{...t,status:`all`});if(o)throw Error(o.message);return{data:i,count:a}}async function a(t){let r=(0,n.createClient)(),{data:i,error:a}=await e.getProduct(r,t);if(a)throw Error(a.message);return i}async function o(){try{let e=await t.syncFreemiusProductsToSupabase();return(0,r.revalidatePath)(`/cms/products`,`page`),{success:!0,data:e}}catch(e){return{error:e.message||`Failed to sync with Freemius`}}}async function s(e){try{let n=await t.syncSingleFreemiusProduct(e);return(0,r.revalidatePath)(`/cms/products`,`page`),(0,r.revalidatePath)(`/cms/products/[id]/edit`,`page`),{success:!0,data:n}}catch(e){return{error:e.message||`Failed to sync product with Freemius`}}}async function c(t,i){try{let a=(0,n.createClient)();return await e.copyProductFromLanguage(a,t,i),(0,r.revalidatePath)(`/cms/products`),(0,r.revalidatePath)(`/cms/products/${t}/edit`),{success:!0}}catch(e){return{success:!1,error:e.message||`Failed to copy product content`}}}async function l(e){let{data:t,error:r}=await(0,n.createClient)().from(`products`).select(`id, title, language_id, slug`).eq(`translation_group_id`,e);if(r)throw Error(r.message);return t}async function u(){let{data:e,error:t}=await(0,n.getServiceRoleSupabaseClient)().from(`product_attributes`).select(`
1
+ "use server";const e=require("../../../product-actions.cjs"),t=require("../../../providers/freemius.cjs");let n=require("@nextblock-cms/db/server"),r=require("next/cache");async function i(t){let r=(0,n.createClient)(),{data:i,count:a,error:o}=await await e.getProducts(r,{...t,status:`all`});if(o)throw Error(o.message);return{data:i,count:a}}async function a(t){let r=(0,n.createClient)(),{data:i,error:a}=await e.getProduct(r,t);if(a)throw Error(a.message);return i}async function o(){try{let e=await t.syncFreemiusProductsToSupabase();return(0,r.revalidatePath)(`/cms/products`,`page`),{success:!0,data:e}}catch(e){return{error:e.message||`Failed to sync with Freemius`}}}async function s(e){try{let n=await t.syncSingleFreemiusProduct(e);return(0,r.revalidatePath)(`/cms/products`,`page`),(0,r.revalidatePath)(`/cms/products/[id]/edit`,`page`),{success:!0,data:n}}catch(e){return{error:e.message||`Failed to sync product with Freemius`}}}async function c(t,i){try{let a=(0,n.createClient)();return await e.copyProductFromLanguage(a,t,i),(0,r.revalidatePath)(`/cms/products`),(0,r.revalidatePath)(`/cms/products/${t}/edit`),{success:!0}}catch(e){return{success:!1,error:e.message||`Failed to copy product content`}}}async function l(e){let{data:t,error:r}=await(0,n.createClient)().from(`products`).select(`id, title, language_id, slug`).eq(`translation_group_id`,e);if(r)throw Error(r.message);return t}async function u(){let{data:e,error:t}=await(0,n.getServiceRoleSupabaseClient)().from(`product_attributes`).select(`
2
2
  id,
3
3
  name,
4
4
  name_translations,
@@ -3,7 +3,7 @@ import { copyProductFromLanguage as e, getProduct as t, getProducts as n } from
3
3
  import { syncFreemiusProductsToSupabase as r, syncSingleFreemiusProduct as i } from "../../../providers/freemius.es.js";
4
4
  import { createClient as a, getServiceRoleSupabaseClient as o } from "@nextblock-cms/db/server";
5
5
  import { revalidatePath as s } from "next/cache";
6
- //#region libs/ecommerce/src/lib/pages/cms/products/actions.ts
6
+ //#region src/lib/pages/cms/products/actions.ts
7
7
  async function c(e) {
8
8
  let t = a(), { data: r, count: i, error: o } = await await n(t, {
9
9
  ...e,
@@ -0,0 +1 @@
1
+ const e=require("../../../../../_virtual/_rolldown/runtime.cjs"),t=require("../actions.cjs"),n=require("../server-actions.cjs"),r=require("./components/AttributeManager.cjs");let i=require("next/link");i=e.__toESM(i,1);let a=require("lucide-react"),o=require("react/jsx-runtime"),s=require("@nextblock-cms/db/server"),c=require("@nextblock-cms/ui");async function l(){let[e,l]=await Promise.all([t.getGlobalProductAttributes(),(0,s.getActiveLanguagesServerSide)()]),u=(e||[]).map(e=>({id:e.id,name:e.name,name_translations:e.name_translations||{},slug:e.slug,terms:(e.product_attribute_terms||[]).map(e=>({...e,value_translations:e.value_translations||{}}))}));return(0,o.jsxs)(`div`,{className:`space-y-8 w-full max-w-[1200px] mx-auto px-6 py-8`,children:[(0,o.jsx)(`div`,{className:`flex flex-wrap items-center justify-between gap-4`,children:(0,o.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,o.jsx)(c.Button,{variant:`outline`,size:`icon`,asChild:!0,children:(0,o.jsx)(i.default,{href:`/cms/products`,children:(0,o.jsx)(a.ArrowLeft,{className:`h-4 w-4`})})}),(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`h1`,{className:`text-2xl font-bold`,children:`Global Attribute Management`}),(0,o.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Define reusable attributes and terms for variation-based physical products.`})]})]})}),(0,o.jsx)(r.AttributeManager,{attributes:u,createAttributeAction:n.createProductAttributeAction,deleteAttributeAction:n.deleteProductAttributeAction,createTermAction:n.createProductAttributeTermAction,deleteTermAction:n.deleteProductAttributeTermAction,reorderTermsAction:n.reorderProductAttributeTermsAction,updateTranslationsAction:n.updateProductAttributeTranslationsAction,languages:l})]})}exports.AttributeManagementPage=l;
@@ -6,7 +6,7 @@ import { ArrowLeft as l } from "lucide-react";
6
6
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
7
  import { getActiveLanguagesServerSide as f } from "@nextblock-cms/db/server";
8
8
  import { Button as p } from "@nextblock-cms/ui";
9
- //#region libs/ecommerce/src/lib/pages/cms/products/attributes/AttributeManagementPage.tsx
9
+ //#region src/lib/pages/cms/products/attributes/AttributeManagementPage.tsx
10
10
  async function m() {
11
11
  let [m, h] = await Promise.all([e(), f()]), g = (m || []).map((e) => ({
12
12
  id: e.id,
@@ -4,7 +4,7 @@ import { ChevronDown as t, ChevronUp as n, Plus as r, Trash2 as i } from "lucide
4
4
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
5
  import { useRouter as s } from "next/navigation";
6
6
  import { Badge as c, Button as l, Input as u, Label as d } from "@nextblock-cms/ui";
7
- //#region libs/ecommerce/src/lib/pages/cms/products/attributes/components/AttributeManager.tsx
7
+ //#region src/lib/pages/cms/products/attributes/components/AttributeManager.tsx
8
8
  function f({ attributes: f, languages: p, createAttributeAction: m, deleteAttributeAction: h, createTermAction: g, deleteTermAction: _, reorderTermsAction: v, updateTranslationsAction: y }) {
9
9
  let b = s(), [x, S] = e(""), [C, w] = e(null), [T, E] = e(null), [D, O] = e(null), [k, A] = e(null), [j, M] = e({}), [N, P] = e(() => f.reduce((e, t) => (e[t.id] = t.name_translations || {}, e), {})), [F, I] = e(() => f.reduce((e, t) => {
10
10
  for (let n of t.terms) e[n.id] = n.value_translations || {};
@@ -0,0 +1 @@
1
+ const e=require("../../../../../_virtual/_rolldown/runtime.cjs"),t=require("../actions.cjs"),n=require("../server-actions.cjs"),r=require("./components/CategoryManager.cjs");let i=require("next/link");i=e.__toESM(i,1);let a=require("lucide-react"),o=require("react/jsx-runtime"),s=require("@nextblock-cms/db/server"),c=require("@nextblock-cms/ui");async function l(){let[e,l]=await Promise.all([t.getCategoriesWithCount(),(0,s.getActiveLanguagesServerSide)()]);return(0,o.jsxs)(`div`,{className:`space-y-8 w-full max-w-[1200px] mx-auto px-6 py-8`,children:[(0,o.jsx)(`div`,{className:`flex flex-wrap items-center justify-between gap-4`,children:(0,o.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,o.jsx)(c.Button,{variant:`outline`,size:`icon`,asChild:!0,children:(0,o.jsx)(i.default,{href:`/cms/products`,children:(0,o.jsx)(a.ArrowLeft,{className:`h-4 w-4`})})}),(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`h1`,{className:`text-2xl font-bold`,children:`Category Management`}),(0,o.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Create and manage product categories for organizing your e-commerce catalog.`})]})]})}),(0,o.jsx)(r.CategoryManager,{initialCategories:e,createCategory:n.createCategoryAction,updateCategory:n.updateCategoryAction,deleteCategory:n.deleteCategoryAction,languages:l})]})}exports.CategoryManagementPage=l;
@@ -6,7 +6,7 @@ import { ArrowLeft as o } from "lucide-react";
6
6
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
7
  import { getActiveLanguagesServerSide as l } from "@nextblock-cms/db/server";
8
8
  import { Button as u } from "@nextblock-cms/ui";
9
- //#region libs/ecommerce/src/lib/pages/cms/products/categories/CategoryManagementPage.tsx
9
+ //#region src/lib/pages/cms/products/categories/CategoryManagementPage.tsx
10
10
  async function d() {
11
11
  let [d, f] = await Promise.all([e(), l()]);
12
12
  return /* @__PURE__ */ c("div", {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../../../_virtual/_rolldown/runtime.cjs");let t=require("react");t=e.__toESM(t,1);let n=require("lucide-react"),r=require("react/jsx-runtime"),i=require("sonner"),a=require("next/navigation"),o=require("@nextblock-cms/ui");function s({initialCategories:e=[],languages:s=[],createCategory:c,updateCategory:l,deleteCategory:u}){let d=(0,a.useRouter)(),[f,p]=(0,t.useState)(e),[m,h]=(0,t.useState)(!1),[g,_]=(0,t.useState)(null),[v,y]=(0,t.useState)(``),[b,x]=(0,t.useState)(``),[S,C]=(0,t.useState)(``),[w,T]=(0,t.useState)({}),[E,D]=(0,t.useState)({}),[O,k]=(0,t.useState)(!1),A=(s||[]).filter(e=>!e.is_default);(0,t.useEffect)(()=>{p(e)},[e]);let j=e=>e.toLowerCase().trim().replace(/\s+/g,`-`).replace(/[^a-z0-9-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``),M=e=>{let t=e.target.value;y(t),!O&&!g&&x(j(t))},N=e=>{x(j(e.target.value)),k(!0)},P=e=>{_(e),y(e.name),x(e.slug),C(e.description||``),T(e.name_translations||{}),D(e.description_translations||{}),k(!0)},F=()=>{_(null),y(``),x(``),C(``),T({}),D({}),k(!1)},I=async e=>{if(e.preventDefault(),!v.trim()){i.toast.error(`Category name is required.`);return}h(!0);let t=i.toast.loading(g?`Updating category...`:`Creating category...`);try{let e={name:v.trim(),slug:b.trim()||void 0,description:S.trim()||void 0,nameTranslations:w,descriptionTranslations:E},n;n=g?await l(g.id,e):await c(e),n.success?(i.toast.success(g?`Category updated successfully!`:`Category created successfully!`,{id:t}),F(),d.refresh()):i.toast.error(n.error||`Failed to save category.`,{id:t})}catch(e){i.toast.error(e.message||`An unexpected error occurred.`,{id:t})}finally{h(!1)}},L=async e=>{let t=`Are you sure you want to delete the category "${e.name}"? This will detach it from any assigned products.`;if(!window.confirm(t))return;h(!0);let n=i.toast.loading(`Deleting category...`);try{let t=await u(e.id);t.success?(i.toast.success(`Category deleted successfully!`,{id:n}),g?.id===e.id&&F(),d.refresh()):i.toast.error(t.error||`Failed to delete category.`,{id:n})}catch(e){i.toast.error(e.message||`An unexpected error occurred.`,{id:n})}finally{h(!1)}};return(0,r.jsxs)(`div`,{className:`grid gap-6 md:grid-cols-12 items-start`,children:[(0,r.jsx)(`div`,{className:`md:col-span-4 space-y-4`,children:(0,r.jsxs)(o.Card,{className:`p-5 shadow-lg border-t-4 border-t-amber-500 bg-card/65 backdrop-blur-md transition-all duration-300`,children:[(0,r.jsxs)(`div`,{className:`flex items-center gap-2 mb-4`,children:[(0,r.jsx)(n.FolderPlus,{className:`h-5 w-5 text-amber-500`}),(0,r.jsx)(`h2`,{className:`text-base font-bold tracking-tight`,children:g?`Edit Category`:`Add New Category`})]}),(0,r.jsxs)(`form`,{onSubmit:I,className:`space-y-4`,children:[(0,r.jsxs)(`div`,{className:`space-y-1`,children:[(0,r.jsx)(o.Label,{htmlFor:`name`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Name`}),(0,r.jsx)(o.Input,{id:`name`,placeholder:`e.g. T-Shirts`,value:v,onChange:M,disabled:m,className:`h-8 text-sm`,required:!0})]}),(0,r.jsxs)(`div`,{className:`space-y-1`,children:[(0,r.jsxs)(o.Label,{htmlFor:`slug`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none flex items-center justify-between w-full`,children:[(0,r.jsx)(`span`,{children:`Slug`}),!O&&!g&&(0,r.jsx)(`span`,{className:`text-[10px] text-amber-600 dark:text-amber-400 capitalize`,children:`Auto-generating`})]}),(0,r.jsx)(o.Input,{id:`slug`,placeholder:`e.g. t-shirts`,value:b,onChange:N,disabled:m,className:`h-8 text-sm font-mono`})]}),(0,r.jsxs)(`div`,{className:`space-y-1`,children:[(0,r.jsx)(o.Label,{htmlFor:`description`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Description`}),(0,r.jsx)(o.Textarea,{id:`description`,placeholder:`Optional description of the category...`,value:S,onChange:e=>C(e.target.value),disabled:m,className:`text-sm min-h-[90px] resize-none`})]}),A.length>0&&(0,r.jsxs)(`div`,{className:`border-t border-border/50 pt-4 mt-4 space-y-4`,children:[(0,r.jsx)(`h3`,{className:`text-xs uppercase font-bold text-muted-foreground tracking-wider`,children:`Translations`}),A.map(e=>(0,r.jsxs)(`div`,{className:`space-y-3 p-3 rounded-md bg-muted/30 border border-border/30`,children:[(0,r.jsx)(`span`,{className:`text-[11px] font-bold text-amber-600 dark:text-amber-400 uppercase tracking-wider`,children:e.name}),(0,r.jsxs)(`div`,{className:`space-y-1`,children:[(0,r.jsxs)(o.Label,{htmlFor:`name-${e.code}`,className:`text-[10px] uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:[`Name (`,e.code,`)`]}),(0,r.jsx)(o.Input,{id:`name-${e.code}`,placeholder:`Translation for ${v||`Name`}`,value:w[e.code]||``,onChange:t=>T(n=>({...n,[e.code]:t.target.value})),disabled:m,className:`h-8 text-sm`})]}),(0,r.jsxs)(`div`,{className:`space-y-1`,children:[(0,r.jsxs)(o.Label,{htmlFor:`desc-${e.code}`,className:`text-[10px] uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:[`Description (`,e.code,`)`]}),(0,r.jsx)(o.Textarea,{id:`desc-${e.code}`,placeholder:`Translation for Description`,value:E[e.code]||``,onChange:t=>D(n=>({...n,[e.code]:t.target.value})),disabled:m,className:`text-sm min-h-[60px] resize-none`})]})]},e.code))]}),(0,r.jsxs)(`div`,{className:`flex items-center gap-2 pt-2`,children:[(0,r.jsx)(o.Button,{type:`submit`,disabled:m,size:`sm`,className:`flex-1 bg-amber-600 hover:bg-amber-500 text-white font-medium shadow-md shadow-amber-600/10 h-8 text-xs cursor-pointer`,children:m?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.Loader2,{className:`mr-1.5 h-3.5 w-3.5 animate-spin`}),`Saving...`]}):g?`Update Category`:`Create Category`}),g&&(0,r.jsx)(o.Button,{type:`button`,onClick:F,disabled:m,variant:`outline`,size:`sm`,className:`h-8 text-xs border-dashed cursor-pointer`,children:`Cancel`})]})]})]})}),(0,r.jsx)(`div`,{className:`md:col-span-8`,children:(0,r.jsxs)(o.Card,{className:`p-4 shadow-lg bg-card/65 backdrop-blur-md border border-border/40`,children:[(0,r.jsxs)(`div`,{className:`flex items-center gap-2 mb-4 pb-2 border-b border-border/50`,children:[(0,r.jsx)(n.FolderKanban,{className:`h-5 w-5 text-muted-foreground`}),(0,r.jsxs)(`div`,{children:[(0,r.jsx)(`h2`,{className:`text-base font-bold tracking-tight`,children:`Active Categories`}),(0,r.jsx)(`p`,{className:`text-[11px] text-muted-foreground leading-none mt-0.5`,children:`Categories are shared globally across languages.`})]})]}),f.length===0?(0,r.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-12 px-4 text-center border-2 border-dashed border-border/60 rounded-lg bg-muted/20 animate-in fade-in duration-300`,children:[(0,r.jsx)(n.HelpCircle,{className:`h-10 w-10 text-muted-foreground/50 mb-3`}),(0,r.jsx)(`h3`,{className:`text-sm font-bold text-muted-foreground`,children:`No Categories Found`}),(0,r.jsx)(`p`,{className:`text-xs text-muted-foreground/80 max-w-sm mt-1`,children:`Add your first category using the form on the left to start organizing your catalog products.`})]}):(0,r.jsx)(`div`,{className:`overflow-x-auto border rounded-lg bg-background/50`,children:(0,r.jsxs)(`table`,{className:`w-full text-left border-collapse text-xs`,children:[(0,r.jsx)(`thead`,{children:(0,r.jsxs)(`tr`,{className:`border-b bg-muted/40 font-bold uppercase tracking-wider text-muted-foreground/85 select-none`,children:[(0,r.jsx)(`th`,{className:`p-3 pl-4`,children:`Name`}),(0,r.jsx)(`th`,{className:`p-3`,children:`Slug`}),(0,r.jsx)(`th`,{className:`p-3 text-center`,children:`Products`}),(0,r.jsx)(`th`,{className:`p-3 pr-4 text-right`,children:`Actions`})]})}),(0,r.jsx)(`tbody`,{className:`divide-y divide-border/60`,children:f.map(e=>(0,r.jsxs)(`tr`,{className:`hover:bg-muted/10 transition-colors group`,children:[(0,r.jsxs)(`td`,{className:`p-3 pl-4`,children:[(0,r.jsx)(`div`,{className:`font-semibold text-slate-800 dark:text-slate-100`,children:e.name}),e.description&&(0,r.jsx)(`div`,{className:`text-[10px] text-muted-foreground mt-0.5 max-w-xs truncate leading-normal`,title:e.description,children:e.description})]}),(0,r.jsx)(`td`,{className:`p-3`,children:(0,r.jsxs)(`code`,{className:`px-1.5 py-0.5 rounded bg-muted/65 font-mono text-[10px]`,children:[`/`,e.slug]})}),(0,r.jsx)(`td`,{className:`p-3 text-center`,children:(0,r.jsx)(`span`,{className:`inline-flex items-center justify-center px-2 py-0.5 rounded-full text-[10px] font-bold bg-amber-500/10 text-amber-800 dark:text-amber-300 border border-amber-500/15`,children:e.productCount})}),(0,r.jsx)(`td`,{className:`p-3 pr-4 text-right`,children:(0,r.jsxs)(`div`,{className:`flex items-center justify-end gap-1.5`,children:[(0,r.jsx)(o.Button,{variant:`outline`,size:`icon`,disabled:m,onClick:()=>P(e),className:`h-7 w-7 opacity-85 hover:opacity-100 group-hover:border-amber-500/30 cursor-pointer`,title:`Edit Category`,children:(0,r.jsx)(n.Edit2,{className:`h-3.5 w-3.5 text-muted-foreground group-hover:text-amber-600 dark:group-hover:text-amber-400`})}),(0,r.jsx)(o.Button,{variant:`outline`,size:`icon`,disabled:m,onClick:()=>L(e),className:`h-7 w-7 opacity-85 hover:opacity-100 group-hover:border-red-500/30 cursor-pointer`,title:`Delete Category`,children:(0,r.jsx)(n.Trash2,{className:`h-3.5 w-3.5 text-muted-foreground group-hover:text-red-500`})})]})})]},e.id))})]})})]})})]})}exports.CategoryManager=s;
@@ -5,7 +5,7 @@ import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
5
5
  import { toast as d } from "sonner";
6
6
  import { useRouter as f } from "next/navigation";
7
7
  import { Button as p, Card as m, Input as h, Label as g, Textarea as _ } from "@nextblock-cms/ui";
8
- //#region libs/ecommerce/src/lib/pages/cms/products/categories/components/CategoryManager.tsx
8
+ //#region src/lib/pages/cms/products/categories/components/CategoryManager.tsx
9
9
  function v({ initialCategories: v = [], languages: y = [], createCategory: b, updateCategory: x, deleteCategory: S }) {
10
10
  let C = f(), [w, T] = t(v), [E, D] = t(!1), [O, k] = t(null), [A, j] = t(""), [M, N] = t(""), [P, F] = t(""), [I, L] = t({}), [R, z] = t({}), [B, V] = t(!1), H = (y || []).filter((e) => !e.is_default);
11
11
  e(() => {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../../_virtual/_rolldown/runtime.cjs"),t=require("../actions.cjs");let n=require("react");n=e.__toESM(n,1);let r=require("lucide-react"),i=require("react/jsx-runtime"),a=require("next/navigation"),o=require("@nextblock-cms/ui");function s({productId:e,currentLanguageId:s,translationGroupId:c,allSiteLanguages:l}){let[u,d]=(0,n.useState)(!1),[f,p]=(0,n.useState)(null),[m,h]=(0,n.useState)([]),[g,_]=(0,n.useState)(!1),[v,y]=(0,n.useState)(null),[b,x]=(0,n.useTransition)(),S=(0,a.useRouter)();(0,n.useEffect)(()=>{u&&c&&(async()=>{_(!0);try{let n=(await t.getProductTranslations(c)).filter(t=>t.id!==e);h(n)}catch(e){console.error(`Error fetching translations:`,e)}finally{_(!1)}})()},[u,c,e]);let C=async()=>{if(!f){y({type:`error`,text:`Please select a source version to copy from.`});return}y(null),x(async()=>{let n=await t.copyProductFromLanguageAction(e,f);n.success?(y({type:`success`,text:`Content copied successfully. The page will now refresh.`}),setTimeout(()=>{d(!1),S.refresh()},1500)):y({type:`error`,text:n.error||`Failed to copy content.`})})},w=l.find(e=>e.id===s);return(0,i.jsxs)(o.Dialog,{open:u,onOpenChange:d,children:[(0,i.jsx)(o.DialogTrigger,{asChild:!0,children:(0,i.jsxs)(o.Button,{variant:`outline`,title:`Copy content from another language`,children:[(0,i.jsx)(r.Copy,{className:`h-4 w-4 mr-2`}),`Copy Content...`]})}),(0,i.jsxs)(o.DialogContent,{children:[(0,i.jsxs)(o.DialogHeader,{children:[(0,i.jsx)(o.DialogTitle,{children:`Copy Content from Another Language`}),(0,i.jsxs)(o.DialogDescription,{children:[`Select a source version to copy from. This will replace the title, description, and media of the current product (`,w?.name,`). This action cannot be undone.`]})]}),(0,i.jsxs)(`div`,{className:`space-y-4 py-4`,children:[(0,i.jsxs)(`div`,{className:`space-y-2`,children:[(0,i.jsx)(o.Label,{htmlFor:`sourceProduct`,children:`Select Source Version`}),(0,i.jsxs)(o.Select,{onValueChange:e=>p(e),disabled:b||g,value:f||void 0,children:[(0,i.jsx)(o.SelectTrigger,{id:`sourceProduct`,children:(0,i.jsx)(o.SelectValue,{placeholder:g?`Loading versions...`:`Select a version...`})}),(0,i.jsx)(o.SelectContent,{children:m.length>0?m.map(e=>{let t=l.find(t=>t.id===e.language_id);return(0,i.jsxs)(o.SelectItem,{value:e.id,children:[e.title,` (`,t?.name||`Unknown Language`,`)`]},e.id)}):(0,i.jsx)(o.SelectItem,{value:`none`,disabled:!0,children:`No other versions available`})})]})]}),v&&(0,i.jsxs)(`div`,{className:`p-3 rounded-md text-sm flex items-center gap-2 ${v.type===`success`?`bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400`:`bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400`}`,children:[v.type===`success`?(0,i.jsx)(r.CheckCircle2,{className:`h-5 w-5`}):(0,i.jsx)(r.AlertCircle,{className:`h-5 w-5`}),v.text]})]}),(0,i.jsxs)(o.DialogFooter,{children:[(0,i.jsx)(o.DialogClose,{asChild:!0,children:(0,i.jsx)(o.Button,{variant:`outline`,children:`Cancel`})}),(0,i.jsx)(o.Button,{onClick:C,disabled:b||!f||f===`none`,children:b?`Copying...`:`Copy Content & Replace`})]})]})]})}exports.CopyProductFromLanguage=s;
@@ -5,7 +5,7 @@ import { AlertCircle as a, CheckCircle2 as o, Copy as s } from "lucide-react";
5
5
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
6
  import { useRouter as u } from "next/navigation";
7
7
  import { Button as d, Dialog as f, DialogClose as p, DialogContent as m, DialogDescription as h, DialogFooter as g, DialogHeader as _, DialogTitle as v, DialogTrigger as y, Label as b, Select as x, SelectContent as S, SelectItem as C, SelectTrigger as w, SelectValue as T } from "@nextblock-cms/ui";
8
- //#region libs/ecommerce/src/lib/pages/cms/products/components/CopyProductFromLanguage.tsx
8
+ //#region src/lib/pages/cms/products/components/CopyProductFromLanguage.tsx
9
9
  function E({ productId: E, currentLanguageId: D, translationGroupId: O, allSiteLanguages: k }) {
10
10
  let [A, j] = r(!1), [M, N] = r(null), [P, F] = r([]), [I, L] = r(!1), [R, z] = r(null), [B, V] = i(), H = u();
11
11
  n(() => {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../currency.cjs");let t=require("react"),n=require("@nextblock-cms/utils"),r=require("react/jsx-runtime"),i=require("@nextblock-cms/ui");function a(e){return(0,n.getCurrencyMinorUnitFactor)(e)===1?0:2}function o(e,t){return e==null||Number.isNaN(e)?``:e.toFixed(t)}function s({id:e,currencyCode:n,value:s,disabled:c,placeholder:l,className:u,allowEmpty:d=!1,onValueChange:f}){let p=a(n),[m,h]=(0,t.useState)(!1),[g,_]=(0,t.useState)(()=>o(s,p));return(0,t.useEffect)(()=>{m||_(o(s,p))},[s,p,m]),(0,r.jsx)(i.Input,{id:e,type:`text`,inputMode:`decimal`,value:g,disabled:c,placeholder:l,className:u,onFocus:()=>h(!0),onChange:e=>{let t=e.target.value.replace(/[^0-9.]/g,``),n=t.indexOf(`.`);if(n!==-1&&(t=t.slice(0,n+1)+t.slice(n+1).replace(/\./g,``)),_(t),t===``||t===`.`){f(d?null:0);return}let r=Number(t);Number.isNaN(r)||f(r)},onBlur:()=>{if(h(!1),s!=null&&!Number.isNaN(s)){let e=Number(s.toFixed(p));e!==s&&f(e)}}})}function c({idPrefix:t=`currency`,currencies:n,prices:a,salePrices:o,managedCurrencyCodes:c=[],onPriceChange:l,onSalePriceChange:u,readOnly:d=!1,helperText:f,trailing:p}){let m=n.find(e=>e.is_default)??n[0],h=new Set(c);return m?(0,r.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[f&&(0,r.jsx)(`p`,{className:`text-xs text-muted-foreground bg-muted/20 p-2 rounded-md border`,children:f}),(0,r.jsx)(`div`,{className:`divide-y divide-muted/50`,children:n.map(n=>{let c=e.normalizeCurrencyRecord(n),f=c.is_default!==!0&&h.has(c.code),m=d||f;return(0,r.jsxs)(`div`,{className:`flex flex-wrap items-stretch gap-4 py-3 first:pt-0 last:pb-0`,children:[(0,r.jsxs)(`div`,{className:`flex items-center gap-2 w-[160px] shrink-0 self-stretch border-r border-border/50 pr-4`,children:[(0,r.jsx)(`span`,{className:`text-sm font-black tracking-tighter text-foreground`,children:c.code}),(0,r.jsx)(`span`,{className:`text-[11px] text-muted-foreground font-medium`,children:c.symbol}),c.is_default?(0,r.jsx)(`span`,{className:`text-[9px] uppercase font-bold bg-primary/10 text-primary px-1.5 py-0.5 rounded tracking-widest leading-none`,children:`Default`}):f?(0,r.jsx)(`span`,{className:`text-[9px] uppercase font-bold bg-muted text-muted-foreground px-1.5 py-0.5 rounded tracking-widest leading-none`,children:`Auto`}):null,!c.is_default&&(0,r.jsxs)(`span`,{className:`text-[9px] text-muted-foreground/80 font-medium tracking-wide leading-none ml-auto`,children:[`x`,c.exchange_rate]})]}),(0,r.jsxs)(`div`,{className:`grid flex-1 grid-cols-2 items-end gap-3 sm:grid-cols-4`,children:[(0,r.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,r.jsx)(i.Label,{htmlFor:`${t}-price-${c.code}`,className:`block text-[10px] uppercase font-bold text-muted-foreground tracking-widest`,children:`Price`}),(0,r.jsxs)(`div`,{className:`relative`,children:[(0,r.jsx)(`span`,{className:`absolute left-2.5 top-1/2 -translate-y-1/2 text-xs text-muted-foreground font-bold pointer-events-none`,children:c.symbol}),(0,r.jsx)(s,{id:`${t}-price-${c.code}`,currencyCode:c.code,value:a[c.code],disabled:m,className:`h-8 w-full text-sm pl-6`,onValueChange:e=>l(c.code,e??0)})]})]}),(0,r.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,r.jsx)(i.Label,{htmlFor:`${t}-sale-price-${c.code}`,className:`block text-[10px] uppercase font-bold text-muted-foreground tracking-widest`,children:`Sale`}),(0,r.jsxs)(`div`,{className:`relative`,children:[(0,r.jsx)(`span`,{className:`absolute left-2.5 top-1/2 -translate-y-1/2 text-xs text-muted-foreground font-bold pointer-events-none`,children:c.symbol}),(0,r.jsx)(s,{id:`${t}-sale-price-${c.code}`,currencyCode:c.code,value:o[c.code],disabled:m,placeholder:f?`Auto`:`—`,allowEmpty:!0,className:`h-8 w-full text-sm pl-6`,onValueChange:e=>u(c.code,e)})]})]}),p&&c.is_default?p:null]})]},c.code)})})]}):null}exports.CurrencyPriceFields=c;
@@ -4,7 +4,7 @@ import { useEffect as t, useState as n } from "react";
4
4
  import { getCurrencyMinorUnitFactor as r } from "@nextblock-cms/utils";
5
5
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
6
  import { Input as o, Label as s } from "@nextblock-cms/ui";
7
- //#region libs/ecommerce/src/lib/pages/cms/products/components/CurrencyPriceFields.tsx
7
+ //#region src/lib/pages/cms/products/components/CurrencyPriceFields.tsx
8
8
  function c(e) {
9
9
  return r(e) === 1 ? 0 : 2;
10
10
  }
@@ -4,7 +4,7 @@ import { Trash2 as t } from "lucide-react";
4
4
  import { jsx as n } from "react/jsx-runtime";
5
5
  import { useRouter as r } from "next/navigation";
6
6
  import { Button as i } from "@nextblock-cms/ui";
7
- //#region libs/ecommerce/src/lib/pages/cms/products/components/DeleteProductButton.tsx
7
+ //#region src/lib/pages/cms/products/components/DeleteProductButton.tsx
8
8
  function a({ productName: a, isIcon: o = !1, className: s, redirectTo: c, deleteAction: l }) {
9
9
  let [u, d] = e(), f = r(), p = async (e) => {
10
10
  e.preventDefault(), e.stopPropagation(), window.confirm(`Are you sure you want to delete "${a}"? This action cannot be undone.`) && d(async () => {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../actions.cjs");let t=require("react"),n=require("react/jsx-runtime"),r=require("sonner"),i=require("@nextblock-cms/ui");function a({plans:e}){return(0,n.jsx)(`div`,{className:`w-full`,children:e&&e.length>0?(0,n.jsx)(`div`,{className:`space-y-8`,children:e.map(t=>(0,n.jsxs)(`div`,{className:`w-full`,children:[e.length>1&&(0,n.jsx)(`h3`,{className:`font-semibold text-lg text-slate-700 dark:text-slate-300 border-b pb-2 mb-4 mt-6`,children:t.title||t.name}),(0,n.jsx)(`div`,{className:`${e.length>1?`rounded-lg border`:`rounded-b-lg border-x border-b`} overflow-x-auto dark:border-slate-700 bg-card`,children:(0,n.jsxs)(i.Table,{children:[(0,n.jsx)(i.TableHeader,{children:(0,n.jsxs)(i.TableRow,{children:[(0,n.jsx)(i.TableHead,{children:`Licenses`}),(0,n.jsx)(i.TableHead,{children:`API Monthly`}),(0,n.jsx)(i.TableHead,{children:`Override Monthly`}),(0,n.jsx)(i.TableHead,{children:`API Annual`}),(0,n.jsx)(i.TableHead,{children:`Override Annual`}),(0,n.jsx)(i.TableHead,{children:`API Lifetime`}),(0,n.jsx)(i.TableHead,{children:`Override Lifetime`})]})}),(0,n.jsx)(i.TableBody,{children:t.freemius_pricing&&t.freemius_pricing.length>0?t.freemius_pricing.map(e=>(0,n.jsx)(o,{pricing:e},e.id)):(0,n.jsx)(i.TableRow,{children:(0,n.jsx)(i.TableCell,{colSpan:7,className:`text-center text-slate-500 py-4`,children:`No pricing configurations found for this plan.`})})})]})})]},t.id))}):(0,n.jsxs)(`div`,{className:`text-center py-10 bg-slate-50 dark:bg-slate-800/50 rounded border border-dashed border-slate-300 dark:border-slate-700`,children:[(0,n.jsx)(`p`,{className:`text-slate-500`,children:`No Freemius plans synchronized yet.`}),(0,n.jsx)(`p`,{className:`text-xs mt-2 text-slate-400`,children:`Click the full synchronization button to import from Freemius.`})]})})}function o({pricing:a}){let[o,s]=(0,t.useTransition)(),c=(t,n)=>{let i=n===``?null:parseFloat(n);n!==``&&Number.isNaN(i)||s(async()=>{let{success:n,error:o}=await e.updateFreemiusOverride(a.id,{[t]:i});n?r.toast.success(`Pricing override saved`):r.toast.error(o||`Failed to update pricing`)})};return(0,n.jsxs)(i.TableRow,{children:[(0,n.jsx)(i.TableCell,{className:`font-medium`,children:a.license_quota||`Unlimited`}),(0,n.jsx)(i.TableCell,{className:`text-slate-500`,children:a.api_monthly_price?`$${a.api_monthly_price}`:`-`}),(0,n.jsx)(i.TableCell,{children:(0,n.jsx)(i.Input,{type:`number`,step:`0.01`,placeholder:`Override...`,defaultValue:a.override_monthly_price||``,onBlur:e=>{e.target.value!==(a.override_monthly_price?.toString()||``)&&c(`override_monthly_price`,e.target.value)},className:`w-24 h-8`,disabled:o})}),(0,n.jsx)(i.TableCell,{className:`text-slate-500`,children:a.api_annual_price?`$${a.api_annual_price}`:`-`}),(0,n.jsx)(i.TableCell,{children:(0,n.jsx)(i.Input,{type:`number`,step:`0.01`,placeholder:`Override...`,defaultValue:a.override_annual_price||``,onBlur:e=>{e.target.value!==(a.override_annual_price?.toString()||``)&&c(`override_annual_price`,e.target.value)},className:`w-24 h-8`,disabled:o})}),(0,n.jsx)(i.TableCell,{className:`text-slate-500`,children:a.api_lifetime_price?`$${a.api_lifetime_price}`:`-`}),(0,n.jsx)(i.TableCell,{children:(0,n.jsx)(i.Input,{type:`number`,step:`0.01`,placeholder:`Override...`,defaultValue:a.override_lifetime_price||``,onBlur:e=>{e.target.value!==(a.override_lifetime_price?.toString()||``)&&c(`override_lifetime_price`,e.target.value)},className:`w-24 h-8`,disabled:o})})]})}exports.FreemiusPricingDashboard=a;
@@ -4,7 +4,7 @@ import { useTransition as t } from "react";
4
4
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
5
  import { toast as i } from "sonner";
6
6
  import { Input as a, Table as o, TableBody as s, TableCell as c, TableHead as l, TableHeader as u, TableRow as d } from "@nextblock-cms/ui";
7
- //#region libs/ecommerce/src/lib/pages/cms/products/components/FreemiusPricingDashboard.tsx
7
+ //#region src/lib/pages/cms/products/components/FreemiusPricingDashboard.tsx
8
8
  function f({ plans: e }) {
9
9
  return /* @__PURE__ */ n("div", {
10
10
  className: "w-full",
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../../_virtual/_rolldown/runtime.cjs"),t=require("../server-actions.cjs");let n=require("react");n=e.__toESM(n,1);let r=require("lucide-react"),i=require("@nextblock-cms/utils"),a=require("react/jsx-runtime"),o=require("sonner"),s=require("@nextblock-cms/ui");function c({categories:e=[],selectedIds:c=[],onChange:l,placeholder:u=`Select categories...`}){let[d,f]=(0,n.useState)(!1),[p,m]=(0,n.useState)(``),[h,g]=(0,n.useState)(e),[_,v]=(0,n.useState)(!1);(0,n.useEffect)(()=>{g(e)},[e]);let y=(0,n.useMemo)(()=>h.filter(e=>c.includes(e.id)),[h,c]),b=(0,n.useMemo)(()=>{if(!p)return h;let e=p.toLowerCase();return h.filter(t=>t.name.toLowerCase().includes(e)||t.slug.toLowerCase().includes(e))},[h,p]),x=p.trim(),S=(0,n.useMemo)(()=>{if(!x)return!1;let e=x.toLowerCase();return!h.some(t=>t.name.toLowerCase()===e)},[h,x]),C=async()=>{if(x){v(!0);try{let e=await t.createCategoryAction({name:x});if(e.success&&e.category){let t={id:e.category.id,name:e.category.name,slug:e.category.slug};g(e=>[...e,t]),l([...c,t.id]),m(``),o.toast.success(`Category "${t.name}" created successfully.`)}else o.toast.error(e.error||`Failed to create category.`)}catch(e){o.toast.error(e.message||`An error occurred while creating category.`)}finally{v(!1)}}},w=e=>{l(c.includes(e)?c.filter(t=>t!==e):[...c,e])},T=(e,t)=>{t.stopPropagation(),l(c.filter(t=>t!==e))};return(0,a.jsxs)(`div`,{className:`space-y-2`,children:[(0,a.jsx)(`div`,{className:`flex flex-wrap gap-1.5 min-h-[32px] p-1 border rounded-md bg-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2`,children:y.length===0?(0,a.jsx)(`span`,{className:`text-xs text-muted-foreground self-center px-2 py-1 select-none`,children:`No categories selected.`}):y.map(e=>(0,a.jsxs)(s.Badge,{variant:`secondary`,className:`pl-2 pr-1.5 py-0.5 text-xs flex items-center gap-1 bg-amber-500/10 text-amber-800 dark:text-amber-300 border border-amber-500/20 rounded-full`,children:[e.name,(0,a.jsx)(`button`,{type:`button`,onClick:t=>T(e.id,t),className:`rounded-full p-0.5 text-muted-foreground hover:bg-amber-500/20 hover:text-amber-950 dark:hover:text-amber-50 transition-colors cursor-pointer`,"aria-label":`Remove ${e.name}`,children:(0,a.jsx)(r.X,{className:`h-3 w-3`})})]},e.id))}),(0,a.jsxs)(s.Popover,{open:d,onOpenChange:f,children:[(0,a.jsx)(s.PopoverTrigger,{asChild:!0,children:(0,a.jsxs)(s.Button,{variant:`outline`,role:`combobox`,"aria-expanded":d,className:`w-full justify-between h-8 text-xs font-normal`,children:[(0,a.jsx)(`span`,{className:`truncate`,children:c.length>0?`${c.length} categor${c.length===1?`y`:`ies`} selected`:u}),(0,a.jsx)(r.ChevronsUpDown,{className:`ml-2 h-4 w-4 shrink-0 opacity-50`})]})}),(0,a.jsxs)(s.PopoverContent,{className:`w-(--radix-popover-trigger-width) p-0`,align:`start`,children:[(0,a.jsxs)(`div`,{className:`flex items-center border-b px-3`,children:[(0,a.jsx)(r.Search,{className:`mr-2 h-4 w-4 shrink-0 opacity-50`}),(0,a.jsx)(s.Input,{className:`flex h-9 w-full rounded-md bg-transparent py-2 text-xs outline-none border-0 focus-visible:ring-0 focus-visible:ring-offset-0`,placeholder:`Search categories...`,value:p,onChange:e=>m(e.target.value)})]}),S&&(0,a.jsx)(`div`,{className:`border-b border-border/50 p-1`,children:(0,a.jsxs)(s.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`w-full justify-start text-xs h-8 text-amber-600 dark:text-amber-400 hover:text-amber-700 hover:bg-amber-500/10 cursor-pointer`,onClick:C,disabled:_,children:[_?(0,a.jsx)(r.Loader2,{className:`mr-2 h-3 w-3 animate-spin`}):(0,a.jsx)(`span`,{className:`font-bold mr-1.5`,children:`+`}),`Create category "`,x,`"`]})}),(0,a.jsx)(`div`,{className:`max-h-60 overflow-y-auto p-1`,children:b.length===0?(0,a.jsx)(`p`,{className:`py-4 text-center text-xs text-muted-foreground`,children:`No categories found.`}):(0,a.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:b.map(e=>{let t=c.includes(e.id);return(0,a.jsxs)(`div`,{onClick:()=>w(e.id),className:(0,i.cn)(`relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-xs outline-none hover:bg-accent hover:text-accent-foreground text-left transition-colors`,t&&`bg-accent/40 font-medium`),children:[(0,a.jsx)(`span`,{className:`absolute left-2 flex h-3.5 w-3.5 items-center justify-center pointer-events-none`,children:(0,a.jsx)(s.Checkbox,{checked:t,tabIndex:-1,"aria-label":`Toggle ${e.name}`,className:`h-3.5 w-3.5`})}),(0,a.jsxs)(`span`,{className:`flex flex-col`,children:[(0,a.jsx)(`span`,{children:e.name}),(0,a.jsxs)(`span`,{className:`font-mono text-[9px] text-muted-foreground leading-none`,children:[`/`,e.slug]})]}),t&&(0,a.jsx)(`span`,{className:`absolute right-2 flex h-3.5 w-3.5 items-center justify-center`,children:(0,a.jsx)(r.Check,{className:`h-3.5 w-3.5 text-primary`})})]},e.id)})})})]})]})]})}exports.ProductCategorySelector=c;
@@ -6,7 +6,7 @@ import { cn as l } from "@nextblock-cms/utils";
6
6
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
7
  import { toast as f } from "sonner";
8
8
  import { Badge as p, Button as m, Checkbox as h, Input as g, Popover as _, PopoverContent as v, PopoverTrigger as y } from "@nextblock-cms/ui";
9
- //#region libs/ecommerce/src/lib/pages/cms/products/components/ProductCategorySelector.tsx
9
+ //#region src/lib/pages/cms/products/components/ProductCategorySelector.tsx
10
10
  function b({ categories: b = [], selectedIds: x = [], onChange: S, placeholder: C = "Select categories..." }) {
11
11
  let [w, T] = r(!1), [E, D] = r(""), [O, k] = r(b), [A, j] = r(!1);
12
12
  t(() => {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../types.cjs"),n=require("../../../../currency.cjs"),r=require("../../../../product-schema.cjs"),i=require("./ProductMediaManager.cjs"),a=require("./SyncFreemiusPricingButton.cjs"),o=require("./CurrencyPriceFields.cjs"),s=require("./SaleScheduleFields.cjs"),c=require("../product-price-sync.cjs"),ee=require("./VariationsEditor.cjs"),l=require("./ProductCategorySelector.cjs");let u=require("react");u=e.__toESM(u,1);let d=require("lucide-react"),f=require("@nextblock-cms/utils"),p=require("react/jsx-runtime"),te=require("react-hook-form"),ne=require("@hookform/resolvers/zod"),m=require("@nextblock-cms/ui");function h({title:e,description:t,action:n,children:r,hideHeader:i}){return(0,p.jsxs)(`section`,{className:`rounded-lg border bg-card p-3 shadow-sm space-y-3`,children:[!i&&(0,p.jsxs)(`div`,{className:`flex items-start justify-between gap-4 flex-wrap border-b border-muted/50 pb-2 mb-1`,children:[(0,p.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,p.jsx)(`h2`,{className:`text-sm font-bold tracking-tight`,children:e}),t?(0,p.jsx)(`p`,{className:`text-[11px] text-muted-foreground leading-none`,children:t}):null]}),n]}),(0,p.jsx)(`div`,{className:i?``:`pt-1`,children:r})]})}function re(e,t,n){let r=t?Number.parseInt(t,10):void 0;return e?.language_id||(Number.isFinite(r)?r:void 0)||n.find(e=>e.is_default)?.id||n[0]?.id||1}function g(e,n,r,i,a){let o=(i.find(e=>e.is_default)??i[0])?.code||`USD`,s=e?.prices&&Object.keys(e.prices).length>0?e.prices:{[o]:typeof e?.price==`number`?e.price/100:0},ee=e?.sale_prices&&Object.keys(e.sale_prices).length>0?e.sale_prices:typeof e?.sale_price==`number`?{[o]:e.sale_price/100}:{},l=e?.product_type||``,u=e?.payment_provider||(e?.product_type?t.derivePaymentProviderFromProductType(e.product_type):`stripe`);return{...c.sanitizeProductFormValuesForStoreManagedCurrencies({product_type:l||`physical`,payment_provider:u,title:e?.title||``,slug:e?.slug||``,sku:e?.sku||``,upc:e?.upc||``,is_taxable:e?.is_taxable??!0,price:typeof e?.price==`number`?e.price/100:0,prices:s,sale_price:typeof e?.sale_price==`number`?e.sale_price/100:null,sale_prices:ee,stock:e?.stock||0,meta_title:e?.meta_title||``,meta_description:e?.meta_description||``,custom_canonical:e?.custom_canonical||``,short_description:e?.short_description||``,description_json:e?.description_json||{type:`doc`,content:[{type:`paragraph`}]},freemius_product_id:e?.freemius_product_id||``,freemius_plan_id:e?.freemius_plan_id||``,trial_period_days:e?.trial_period_days??0,trial_requires_payment_method:e?.trial_requires_payment_method??!1,status:e?.status||`draft`,language_id:re(e,n,r),translation_group_id:e?.translation_group_id||a||void 0,product_media:e?.product_media?.map(e=>({media_id:e.media_id}))||[],category_ids:e?.category_ids||[],variation_attributes:e?.variation_attributes||[],variants:e?.variants?.map(e=>({...e,prices:e.prices||{},sale_prices:e.sale_prices||{}}))||[]},i),product_type:l,payment_provider:u}}function ie(e){return e?e.map(e=>({id:e.id||e.media_id,media_id:e.media_id,file_path:e.media?.file_path||e.media?.object_key||``,alt:e.media?.alt_text||``,sort_order:e.sort_order??0})).sort((e,t)=>e.sort_order-t.sort_order):[]}function ae(e){return e.map(e=>({media_id:e.media_id}))}function oe(e){return e.map(e=>({media_id:e.media_id,file_path:e.file_path,alt:e.alt}))}var se=e=>e.toString().toLowerCase().trim().replace(/\s+/g,`-`).replace(/[^\w-]+/g,``).replace(/--+/g,`-`).replace(/^-+/,``).replace(/-+$/,``);function _({initialData:e,isEdit:t=!1,mediaPickerNode:re,availableLanguagesProp:_,globalAttributesProp:ce,currenciesProp:le,translationGroupId:v,targetLanguageId:y,freemiusDashboardNode:b,enabledProviders:ue,configStatus:x,createAction:S,updateAction:de,availableCategoriesProp:fe=[],hasOpenDraft:pe=!1,onSeoChange:me}){let[C,w]=(0,u.useState)(!1),[T,E]=(0,u.useState)(()=>!!e?.variants?.length),D=u.default.useMemo(()=>le.filter(e=>e.is_active!==!1).sort((e,t)=>e.is_default===t.is_default?e.code.localeCompare(t.code):e.is_default?-1:1),[le]),O=u.default.useMemo(()=>D.find(e=>e.is_default)??D[0],[D]),k=u.default.useMemo(()=>c.getStoreManagedPriceCurrencyCodes(D),[D]),he=(0,te.useForm)({resolver:(0,ne.zodResolver)(r.productSchema),defaultValues:g(e,y,_,D,v)}),{register:A,handleSubmit:j,setValue:M,reset:ge,watch:N,setError:P,formState:{errors:F,dirtyFields:I}}=he,L=(0,u.useRef)(!0),R=(0,u.useRef)(null),[_e,z]=(0,u.useState)(!1),[ve,B]=(0,u.useState)(null),[ye,be]=(0,u.useState)(null),V=N(),xe=he.formState.isDirty,Se=V.title,Ce=V.meta_title,we=V.meta_description;(0,u.useEffect)(()=>{me?.({title:Se,meta_title:Ce,meta_description:we})},[Se,Ce,we,me]),(0,u.useEffect)(()=>{if(!t)return;if(L.current){L.current=!1,R.current=JSON.stringify(V);return}if(!xe)return;let e=JSON.stringify(V);if(e===R.current)return;let n=setTimeout(()=>{C||(R.current=e,j(He)())},400);return()=>clearTimeout(n)},[V,t,xe,C,j]);let Te=N(`title`),H=N(`product_type`),U=H===`digital`?`freemius`:H===`physical`?`stripe`:void 0,W=H===`physical`,Ee=H===`digital`,De=U?ue[U]:!1,Oe=U?x[U].hasKeys:!1,ke=!!N(`freemius_product_id`),Ae=Number(N(`trial_period_days`)||0),je=!!N(`trial_requires_payment_method`),Me=N(`variants`)||[],G=N(`price`),K=N(`sale_price`),q=N(`prices`)||{},J=N(`sale_prices`)||{},Y=(Me?.length||0)>0,Ne=N(`language_id`),Pe=_.find(e=>e.id===Ne)?.code||_.find(e=>e.is_default)?.code||_[0]?.code,X=u.default.useMemo(()=>c.resolveEditorCurrencyPriceMaps({currencies:D,prices:q,salePrices:J,fallbackPrice:G,fallbackSalePrice:K}),[G,K,D,q,J]),Fe=u.default.useMemo(()=>e?.variants?.map(e=>({...e,prices:e.prices||{},sale_prices:e.sale_prices||{}})),[e?.variants]);(0,u.useEffect)(()=>{if(I.title&&!t){let e=se(Te);M(`slug`,e,{shouldValidate:!0})}},[Te,I.title,M,t]);let[Z,Ie]=(0,u.useState)(()=>ie(e?.product_media)),[Q,$]=(0,u.useState)(new Set);(0,u.useEffect)(()=>{ge(g(e,y,_,D,v)),Ie(ie(e?.product_media)),$(new Set),E(!!e?.variants?.length)},[_,D,e,ge,y,v]);let Le=e=>{let t=new Set(e.map(e=>e.id)),n=Z.filter(e=>!t.has(e.id)),r=new Set(Q);n.forEach(e=>{e.media_id&&r.add(e.media_id)}),$(r),Ie(e),M(`product_media`,ae(e),{shouldDirty:!0}),M(`explicitly_removed_media_ids`,Array.from(r),{shouldDirty:!0})};(0,u.useEffect)(()=>{M(`explicitly_removed_media_ids`,Array.from(Q))},[Q,M]),(0,u.useEffect)(()=>{Y&&E(!0)},[Y]),(0,u.useEffect)(()=>{A(`is_taxable`),A(`price`),A(`sale_price`),A(`payment_provider`),A(`trial_requires_payment_method`)},[A]),(0,u.useEffect)(()=>{if(!Ee){M(`trial_period_days`,0,{shouldDirty:!1,shouldValidate:!0}),M(`trial_requires_payment_method`,!1,{shouldDirty:!1,shouldValidate:!0});return}Ae<=0&&M(`trial_requires_payment_method`,!1,{shouldDirty:!1,shouldValidate:!0})},[Ee,M,Ae]),(0,u.useEffect)(()=>{U&&M(`payment_provider`,U,{shouldDirty:!1,shouldValidate:!0})},[U,M]),(0,u.useEffect)(()=>{O&&q[O.code]===void 0&&M(`prices`,{...q,[O.code]:G||0},{shouldDirty:!1})},[G,O,q,M]);let Re=(0,u.useCallback)((e,t)=>{let n={...q,[e]:t};M(`prices`,n,{shouldDirty:!0,shouldValidate:!0}),e===O?.code&&M(`price`,t,{shouldDirty:!0,shouldValidate:!0})},[O?.code,q,M]),ze=(0,u.useCallback)((e,t)=>{let n={...J,[e]:t};M(`sale_prices`,n,{shouldDirty:!0,shouldValidate:!0}),e===O?.code&&M(`sale_price`,t,{shouldDirty:!0,shouldValidate:!0})},[O?.code,J,M]),Be=(0,u.useCallback)(()=>{if(!O)return;let e=new Set(k),t=q[O.code]??G??0,r=J[O.code]??K??null,i=D.reduce((r,i)=>{if(i.code!==O.code&&e.has(i.code))return r;let a=n.convertMinorUnitAmount({amount:(0,f.majorUnitAmountToMinor)(t,O.code),fromCurrencyCode:O.code,toCurrencyCode:i.code,currencies:D,applyRounding:!0});return r[i.code]=(0,f.minorUnitAmountToMajor)(a,i.code),r},{}),a=D.reduce((t,i)=>{if(i.code!==O.code&&e.has(i.code))return t;if(typeof r!=`number`)return(i.code===O.code||!e.has(i.code))&&(t[i.code]=null),t;let a=n.convertMinorUnitAmount({amount:(0,f.majorUnitAmountToMinor)(r,O.code),fromCurrencyCode:O.code,toCurrencyCode:i.code,currencies:D,applyRounding:!0});return t[i.code]=(0,f.minorUnitAmountToMajor)(a,i.code),t},{});M(`prices`,i,{shouldDirty:!0,shouldValidate:!0}),M(`sale_prices`,a,{shouldDirty:!0,shouldValidate:!0}),M(`price`,i[O.code]??t,{shouldDirty:!0,shouldValidate:!0}),M(`sale_price`,a[O.code]??null,{shouldDirty:!0,shouldValidate:!0})},[D,O,q,J,M,k,G,K]),Ve=(0,u.useCallback)(({variationAttributes:e,variants:t})=>{M(`variation_attributes`,e,{shouldDirty:!0}),M(`variants`,t,{shouldDirty:!0,shouldValidate:!0})},[M]),He=async e=>{w(!0),z(!0),B(null);try{if(!U){let e=`Select whether this product is physical or digital before saving.`;P(`product_type`,{type:`manual`,message:e}),t?B(e):alert(e),w(!1),z(!1);return}let n=W?0:Math.max(0,Number(e.trial_period_days||0)),r={...e,product_type:e.product_type,payment_provider:U,freemius_product_id:W?``:e.freemius_product_id,freemius_plan_id:W?``:e.freemius_plan_id,trial_period_days:n,trial_requires_payment_method:!W&&n>0&&e.trial_requires_payment_method,upc:W?e.upc:null,is_taxable:W?e.is_taxable:!1,variation_attributes:W?e.variation_attributes:[],variants:W?e.variants:[]},i=c.sanitizeProductFormValuesForStoreManagedCurrencies(r,D);if(t&&de)await de(i),be(new Date);else if(S)await S(i);else throw Error(`Product form action is not configured.`)}catch(e){if(console.error(e),e.message===`NEXT_REDIRECT`)return;let n=e.message||`An error occurred while saving.`;if(e.code===`23505`){let t=e.message?.toLowerCase()||``;t.includes(`products_slug_key`)||t.includes(`slug`)?(n=`This slug is already in use. Please choose another one.`,P(`slug`,{type:`manual`,message:n})):(t.includes(`products_sku_key`)||t.includes(`sku`))&&(n=`This SKU is already in use.`,P(`sku`,{type:`manual`,message:n}))}t?B(n):alert(n)}finally{w(!1),z(!1)}},Ue=Y?`bg-muted/60 text-muted-foreground opacity-70`:``,We=oe(Z);return(0,p.jsxs)(`form`,{onSubmit:j(He),className:`space-y-2.5 pb-4`,children:[(0,p.jsx)(`input`,{type:`hidden`,...A(`translation_group_id`)}),(0,p.jsx)(`input`,{type:`hidden`,...A(`payment_provider`)}),(0,p.jsxs)(`div`,{className:`space-y-2.5 w-full`,children:[(0,p.jsxs)(`div`,{className:`rounded-lg border bg-card p-2.5 px-4 shadow-sm flex items-center justify-between gap-3 flex-wrap`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,p.jsxs)(`div`,{className:`flex h-9 items-center gap-2`,children:[(0,p.jsx)(`span`,{className:`text-sm font-bold whitespace-nowrap leading-none pt-0.5`,children:`Product Type`}),F.product_type&&(0,p.jsx)(d.AlertCircle,{className:`h-4 w-4 text-destructive`})]}),(0,p.jsx)(`div`,{className:`flex h-9 items-center`,children:(0,p.jsxs)(m.Select,{onValueChange:e=>M(`product_type`,e,{shouldDirty:!0,shouldValidate:!0}),value:H||void 0,children:[(0,p.jsx)(m.SelectTrigger,{className:`w-[160px] h-9 text-xs`,children:(0,p.jsx)(m.SelectValue,{placeholder:`Select Type`})}),(0,p.jsxs)(m.SelectContent,{children:[(0,p.jsx)(m.SelectItem,{value:`physical`,children:`Physical Product`}),(0,p.jsx)(m.SelectItem,{value:`digital`,children:`Digital Product`})]})]})})]}),(0,p.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,p.jsxs)(`div`,{className:`flex h-9 items-center gap-3`,children:[(0,p.jsx)(`span`,{className:`text-[11px] font-semibold text-muted-foreground uppercase tracking-wider leading-none`,children:`Payment Provider`}),(0,p.jsx)(m.Badge,{variant:`outline`,className:`text-xs py-1 font-bold bg-muted/30 leading-none`,children:U?U===`stripe`?`Stripe`:`Freemius`:`—`})]}),U&&(0,p.jsx)(`div`,{className:`flex h-9 items-center gap-2`,children:De&&Oe?(0,p.jsxs)(`span`,{className:`flex items-center gap-1.5 text-emerald-600 text-[10px] font-bold bg-emerald-50 px-2 py-1 rounded-full border border-emerald-100 uppercase leading-none`,children:[(0,p.jsx)(d.CheckCircle2,{className:`h-3 w-3`}),`Ready`]}):(0,p.jsxs)(`span`,{className:`flex items-center gap-1.5 text-amber-600 text-[10px] font-bold bg-amber-50 px-2 py-1 rounded-full border border-amber-100 uppercase leading-none`,children:[(0,p.jsx)(d.AlertCircle,{className:`h-3 w-3`}),De?`Keys Missing`:`Disabled`]})}),!Oe&&U&&x[U].missing.length>0&&(0,p.jsxs)(`a`,{href:`/cms/payments`,className:`hidden xl:flex h-9 items-center gap-1 text-[10px] text-muted-foreground bg-muted/50 px-2 py-1 rounded border border-dashed leading-none hover:text-foreground hover:border-solid`,children:[(0,p.jsx)(d.Info,{className:`h-3 w-3`}),`Missing: `,x[U].missing.join(`, `),` — set up payments`]})]})]}),(0,p.jsxs)(h,{title:`Product Information`,hideHeader:!0,children:[t&&(0,p.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-muted-foreground pb-2 border-b border-border/40 mb-2.5`,children:[(0,p.jsx)(`span`,{className:`font-semibold text-[11px] uppercase tracking-wider text-muted-foreground/80`,children:`Product Settings`}),(0,p.jsx)(`div`,{className:`flex items-center gap-1.5 min-h-[16px]`,children:_e?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`div`,{className:`relative flex h-2 w-2`,children:[(0,p.jsx)(`span`,{className:`animate-ping absolute inline-flex h-full w-full rounded-full bg-amber-400 opacity-75`}),(0,p.jsx)(`span`,{className:`relative inline-flex rounded-full h-2 w-2 bg-amber-500`})]}),(0,p.jsx)(`span`,{className:`text-amber-600 dark:text-amber-400 font-medium`,children:`Autosaving settings...`})]}):ve?(0,p.jsxs)(`span`,{className:`text-red-500 font-medium`,children:[`Error saving settings: `,ve]}):ye?(0,p.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 font-medium`,children:[`Settings autosaved at `,ye.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,second:`2-digit`})]}):(0,p.jsx)(`span`,{className:`text-muted-foreground/60`,children:`Settings autosave in draft mode`})})]}),(0,p.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-2.5`,children:[(0,p.jsxs)(`div`,{className:`col-span-2 space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`title`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Title`}),(0,p.jsx)(m.Input,{id:`title`,placeholder:`Product title`,...A(`title`),className:`h-8 text-sm`}),F.title&&(0,p.jsx)(`p`,{className:`text-destructive text-[11px] leading-none`,children:F.title.message})]}),(0,p.jsxs)(`div`,{className:`col-span-2 space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`slug`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Slug`}),(0,p.jsx)(m.Input,{id:`slug`,placeholder:`product-slug`,...A(`slug`),className:`h-8 text-sm`}),F.slug&&(0,p.jsx)(`p`,{className:`text-destructive text-[11px] leading-none`,children:F.slug.message})]}),(0,p.jsxs)(`div`,{className:`col-span-1 space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`sku`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`SKU`}),(0,p.jsx)(m.Input,{id:`sku`,placeholder:`SKU`,...A(`sku`),className:`h-8 text-sm font-mono`}),F.sku&&(0,p.jsx)(`p`,{className:`text-destructive text-[11px] leading-none`,children:F.sku.message})]}),(0,p.jsxs)(`div`,{className:`col-span-1 space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`upc_ean`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`UPC / EAN`}),(0,p.jsx)(m.Input,{id:`upc_ean`,placeholder:`000000000`,...A(`upc`),className:`h-8 text-sm font-mono`,readOnly:Y})]})]}),(0,p.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-3 lg:grid-cols-12 gap-2.5 mt-2`,children:[(0,p.jsxs)(`div`,{className:`${t?`lg:col-span-3`:`lg:col-span-4`} col-span-2 space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`meta_title`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Meta Title`}),(0,p.jsx)(m.Input,{id:`meta_title`,...A(`meta_title`),placeholder:`SEO page title (50-60 chars)`,className:`h-8 text-sm`})]}),(0,p.jsxs)(`div`,{className:`lg:col-span-4 col-span-2 space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`meta_description`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Meta Description`}),(0,p.jsx)(m.Input,{id:`meta_description`,...A(`meta_description`),placeholder:`SEO description (150-160 chars)`,className:`h-8 text-sm`})]}),(0,p.jsxs)(`div`,{className:`${t?`lg:col-span-3`:`lg:col-span-4`} col-span-2 space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`custom_canonical`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Canonical URL (optional)`}),(0,p.jsx)(m.Input,{id:`custom_canonical`,...A(`custom_canonical`),placeholder:`Blank = self-referencing. Absolute https://… URL or /relative path to override.`,className:`h-8 text-sm`})]})]})]}),(0,p.jsx)(h,{title:`Product Categories`,description:`Assign this product to one or more categories.`,children:(0,p.jsx)(l.ProductCategorySelector,{categories:fe,selectedIds:N(`category_ids`)||[],onChange:e=>M(`category_ids`,e,{shouldDirty:!0,shouldValidate:!0})})}),(0,p.jsxs)(`section`,{className:`rounded-lg border bg-card p-3 shadow-sm space-y-3`,children:[W&&(0,p.jsxs)(`div`,{className:`flex items-center justify-between gap-4 flex-wrap border-b border-muted/50 pb-2`,children:[(0,p.jsx)(`div`,{className:`flex items-center gap-4`,children:(0,p.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,p.jsx)(`h2`,{className:`text-sm font-bold tracking-tight`,children:`Pricing & Inventory`}),(0,p.jsx)(`p`,{className:`text-[11px] text-muted-foreground leading-none`,children:`Manage simple or variant pricing.`})]})}),(0,p.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-2 bg-muted/40 rounded-md px-2.5 py-1.5`,children:[(0,p.jsx)(`span`,{className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Stock`}),(0,p.jsx)(m.Input,{id:`stock`,type:`number`,min:`0`,...A(`stock`,{valueAsNumber:!0}),placeholder:`0`,readOnly:Y,className:`${Ue} h-8 w-20 text-sm text-center font-mono bg-background`})]}),Y?(0,p.jsx)(m.Badge,{variant:`secondary`,className:`text-[11px] py-0 px-2 h-5`,children:`Variant pricing`}):null]})]}),W?(0,p.jsxs)(`div`,{className:`space-y-3`,children:[(0,p.jsxs)(`div`,{className:`w-full`,children:[(0,p.jsx)(o.CurrencyPriceFields,{idPrefix:`product`,currencies:D,prices:X.prices,salePrices:X.salePrices,managedCurrencyCodes:k,onPriceChange:Re,onSalePriceChange:ze,onAutoFill:Be,readOnly:Y,helperText:Y?`Parent prices stay as a fallback, but active variants define the live shopper price.`:void 0,trailing:(0,p.jsx)(s.SaleScheduleFields,{idPrefix:`product`,startAt:N(`sale_start_at`),endAt:N(`sale_end_at`),onChange:(e,t)=>M(e,t,{shouldDirty:!0,shouldValidate:!0}),error:F.sale_end_at?.message,bare:!0})}),F.price&&(0,p.jsx)(`p`,{className:`text-destructive text-sm mt-1`,children:F.price.message}),F.sale_price&&(0,p.jsx)(`p`,{className:`text-destructive text-sm mt-1`,children:F.sale_price.message}),F.stock&&(0,p.jsx)(`p`,{className:`text-destructive text-[10px] font-medium leading-none mt-1`,children:F.stock.message})]}),(0,p.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded border border-dashed p-2.5 bg-muted/5`,children:[(0,p.jsx)(`span`,{className:`text-xs font-bold uppercase tracking-wider text-muted-foreground`,children:Y?`Variations Active`:`Variations`}),(0,p.jsx)(m.Button,{type:`button`,variant:T?`outline`:`default`,onClick:()=>E(e=>!e),size:`sm`,className:`h-7 text-xs px-3`,children:T?`Hide`:`Manage`})]}),T&&(0,p.jsx)(`div`,{className:`border-t pt-3`,children:(0,p.jsx)(ee.VariationsEditor,{globalAttributes:ce,currentLanguageCode:Pe,baseSku:N(`sku`)||``,basePrice:G||0,basePrices:q,baseSalePrice:typeof K==`number`?K:null,baseSalePrices:J,currencies:D,availableVariantImages:We,initialVariationAttributes:e?.variation_attributes,initialVariants:Fe,onChange:Ve})})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`div`,{className:`space-y-4`,children:[(0,p.jsxs)(`div`,{className:`flex items-end gap-4 w-full`,children:[(0,p.jsxs)(`div`,{className:`flex-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`freemius_product_id`,className:`text-[11px] uppercase tracking-wider text-muted-foreground font-bold mb-1.5 block`,children:`Freemius Product ID`}),(0,p.jsx)(m.Input,{id:`freemius_product_id`,...A(`freemius_product_id`),className:`h-9`})]}),(0,p.jsxs)(`div`,{className:`flex-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`freemius_plan_id`,className:`text-[11px] uppercase tracking-wider text-muted-foreground font-bold mb-1.5 block`,children:`Freemius Plan ID`}),(0,p.jsx)(m.Input,{id:`freemius_plan_id`,...A(`freemius_plan_id`),className:`h-9`})]}),ke?(0,p.jsx)(a.SyncFreemiusPricingButton,{productId:N(`freemius_product_id`),hasOpenDraft:pe}):null]}),(0,p.jsxs)(`div`,{className:`bg-muted/10 border rounded-md overflow-hidden`,children:[(0,p.jsxs)(`div`,{className:`flex flex-wrap items-center gap-6 bg-muted/20 border-b p-2.5 px-4`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,p.jsx)(`span`,{className:`text-[11px] font-bold uppercase tracking-wider text-muted-foreground`,children:`Free Trial`}),(0,p.jsxs)(m.Badge,{variant:`outline`,className:`font-mono text-xs shadow-sm bg-background`,children:[String(N(`trial_period_days`)||0),` Days`]})]}),(0,p.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,p.jsx)(`span`,{className:`text-[11px] font-bold uppercase tracking-wider text-muted-foreground`,children:`Card Required`}),(0,p.jsx)(m.Badge,{variant:je?`default`:`secondary`,className:`text-xs shadow-sm`,children:je?`Yes`:`No`})]}),(0,p.jsx)(`span`,{className:`text-[10px] text-muted-foreground ml-auto`,children:`Managed in Freemius dashboard`}),(0,p.jsx)(`input`,{type:`hidden`,...A(`trial_period_days`,{valueAsNumber:!0})})]}),(0,p.jsxs)(`div`,{className:`w-full p-4 pt-3 space-y-2`,children:[(0,p.jsx)(o.CurrencyPriceFields,{idPrefix:`product`,currencies:D,prices:X.prices,salePrices:X.salePrices,managedCurrencyCodes:k,onPriceChange:Re,onSalePriceChange:ze,onAutoFill:Be,readOnly:!0,trailing:(0,p.jsx)(s.SaleScheduleFields,{idPrefix:`product`,startAt:N(`sale_start_at`),endAt:N(`sale_end_at`),onChange:(e,t)=>M(e,t,{shouldDirty:!0,shouldValidate:!0}),error:F.sale_end_at?.message,bare:!0})}),(0,p.jsx)(`p`,{className:`text-[10px] leading-snug text-muted-foreground`,children:`Scheduling a sale on a Freemius product generates a time-bounded Freemius coupon so the discount is enforced at Freemius checkout.`})]})]})]}),b&&(0,p.jsx)(`div`,{className:`pt-2 border-t`,children:b})]})]}),(0,p.jsx)(h,{title:`Product Description`,hideHeader:!0,children:(0,p.jsx)(`div`,{className:`space-y-2`,children:(0,p.jsxs)(`div`,{className:`space-y-1`,children:[(0,p.jsx)(m.Label,{htmlFor:`short_description`,className:`text-xs uppercase font-bold text-muted-foreground tracking-wider leading-none`,children:`Short Description`}),(0,p.jsx)(m.Input,{id:`short_description`,...A(`short_description`),placeholder:`Brief summary for product cards...`,className:`h-8 text-sm`})]})})}),(0,p.jsxs)(h,{title:`Media Gallery`,description:`Drag to reorder. First image is the hero.`,children:[(0,p.jsx)(i.ProductMediaManager,{initialMedia:Z,onUpdate:Le,mediaPickerNode:re}),(0,p.jsx)(`input`,{type:`hidden`,...A(`product_media`)})]}),!t&&(0,p.jsxs)(`div`,{className:`rounded-lg border bg-card p-3 px-4 shadow-sm flex items-center justify-between gap-3 flex-wrap`,children:[(0,p.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`New products start as a draft. Publish it from the top bar once it's ready.`}),(0,p.jsx)(m.Button,{disabled:C,type:`submit`,size:`sm`,className:`h-8 text-sm px-5`,children:C?`Saving...`:`Save Changes`})]})]})]})}exports.ProductForm=_;
@@ -16,7 +16,7 @@ import { Fragment as le, jsx as p, jsxs as m } from "react/jsx-runtime";
16
16
  import { useForm as ue } from "react-hook-form";
17
17
  import { zodResolver as de } from "@hookform/resolvers/zod";
18
18
  import { Badge as h, Button as fe, Input as g, Label as _, Select as pe, SelectContent as me, SelectItem as he, SelectTrigger as ge, SelectValue as _e } from "@nextblock-cms/ui";
19
- //#region libs/ecommerce/src/lib/pages/cms/products/components/ProductForm.tsx
19
+ //#region src/lib/pages/cms/products/components/ProductForm.tsx
20
20
  function v({ title: e, description: t, action: n, children: r, hideHeader: i }) {
21
21
  return /* @__PURE__ */ m("section", {
22
22
  className: "rounded-lg border bg-card p-3 shadow-sm space-y-3",
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../../_virtual/_rolldown/runtime.cjs");let t=require("react");t=e.__toESM(t,1);let n=require("lucide-react"),r=require("react/jsx-runtime"),i=require("next/image");i=e.__toESM(i,1);var a=process.env.NEXT_PUBLIC_R2_BASE_URL||``,o=e=>e?e.startsWith(`http`)||!a?e:`${a.replace(/\/+$/,``)}/${e.replace(/^\/+/,``)}`:``,s=({initialMedia:e,onUpdate:a,mediaPickerNode:s})=>{let[c,l]=(0,t.useState)(e),u=(0,t.useRef)(null),d=(0,t.useRef)(null);(0,t.useEffect)(()=>{l(e)},[e]);let f=(e,t)=>{u.current=t,e.dataTransfer.effectAllowed=`move`},p=(e,t)=>{d.current=t,e.preventDefault()},m=e=>{e.preventDefault()},h=e=>{if(e.preventDefault(),u.current===null||d.current===null)return;let t=[...c],n=t[u.current];t.splice(u.current,1),t.splice(d.current,0,n),u.current=null,d.current=null;let r=t.map((e,t)=>({...e,sort_order:t}));l(r),a(r)},g=e=>{if(!e||c.some(t=>t.media_id===e.id))return;let t={id:`temp-${Date.now()}`,media_id:e.id,file_path:e.file_path||e.object_key,alt:e.description||e.file_name||``,sort_order:c.length,isNew:!0},n=[...c,t];l(n),a(n)},_=e=>{let t=c.filter((t,n)=>n!==e).map((e,t)=>({...e,sort_order:t}));l(t),a(t)};return(0,r.jsxs)(`div`,{className:`space-y-4`,children:[(0,r.jsxs)(`div`,{className:`grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 gap-4`,children:[c.map((e,t)=>(0,r.jsxs)(`div`,{className:`group relative aspect-square bg-muted/40 rounded-lg border overflow-hidden cursor-move transition-all hover:shadow-md`,draggable:!0,onDragStart:e=>f(e,t),onDragEnter:e=>p(e,t),onDragOver:m,onDrop:h,children:[t===0&&(0,r.jsx)(`div`,{className:`absolute top-2 left-2 z-10 bg-primary text-primary-foreground text-[10px] font-bold px-2 py-0.5 rounded shadow-sm`,children:`MAIN`}),(0,r.jsx)(`button`,{type:`button`,onClick:()=>_(t),className:`absolute top-1 right-1 z-20 p-1 bg-destructive/90 text-destructive-foreground rounded-full opacity-0 group-hover:opacity-100 transition-opacity`,children:(0,r.jsx)(n.X,{className:`w-3 h-3`})}),(0,r.jsx)(`div`,{className:`absolute inset-0 bg-black/0 group-hover:bg-black/5 transition-colors pointer-events-none`}),(0,r.jsx)(`div`,{className:`absolute bottom-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity`,children:(0,r.jsx)(n.GripVertical,{className:`w-4 h-4 text-white drop-shadow-md`})}),o(e.file_path)?(0,r.jsx)(i.default,{src:o(e.file_path),alt:e.alt,fill:!0,className:`object-cover`,sizes:`(max-width: 768px) 50vw, 33vw`}):(0,r.jsx)(`div`,{className:`flex h-full w-full items-center justify-center text-muted-foreground`,children:(0,r.jsx)(n.Image,{className:`w-8 h-8 opacity-30`})})]},e.id)),s?t.default.cloneElement(s,{onSelect:g,children:(0,r.jsxs)(`button`,{type:`button`,className:`group relative aspect-square flex flex-col items-center justify-center border-2 border-dashed rounded-lg bg-muted/10 text-muted-foreground hover:bg-muted/20 hover:border-muted-foreground/50 transition-all focus:outline-none focus:ring-2 focus:ring-primary`,children:[(0,r.jsx)(n.Image,{className:`w-8 h-8 mb-2 opacity-50 group-hover:opacity-75 transition-opacity`}),(0,r.jsx)(`span`,{className:`text-sm font-medium`,children:`Add Image`})]})}):(0,r.jsxs)(`div`,{className:`relative aspect-square flex flex-col items-center justify-center border-2 border-dashed rounded-lg bg-muted/10 text-muted-foreground`,children:[(0,r.jsx)(n.Image,{className:`w-8 h-8 mb-2 opacity-30`}),(0,r.jsx)(`span`,{className:`text-xs text-center px-2`,children:`Media Picker not injected`})]})]}),(0,r.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Drag and drop images to reorder. The first image will be used as the main product image.`})]})};exports.ProductMediaManager=s;
@@ -3,7 +3,7 @@ import e, { useEffect as t, useRef as n, useState as r } from "react";
3
3
  import { GripVertical as i, Image as a, X as o } from "lucide-react";
4
4
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
5
  import l from "next/image";
6
- //#region libs/ecommerce/src/lib/pages/cms/products/components/ProductMediaManager.tsx
6
+ //#region src/lib/pages/cms/products/components/ProductMediaManager.tsx
7
7
  var u = process.env.NEXT_PUBLIC_R2_BASE_URL || "", d = (e) => e ? e.startsWith("http") || !u ? e : `${u.replace(/\/+$/, "")}/${e.replace(/^\/+/, "")}` : "", f = ({ initialMedia: u, onUpdate: f, mediaPickerNode: p }) => {
8
8
  let [m, h] = r(u), g = n(null), _ = n(null);
9
9
  t(() => {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../../../../_virtual/_rolldown/runtime.cjs"),t=require("./DeleteProductButton.cjs");let n=require("next/link");n=e.__toESM(n,1);let r=require("react"),i=require("lucide-react"),a=require("@nextblock-cms/utils"),o=require("react/jsx-runtime"),s=require("next/navigation"),c=require("next/image");c=e.__toESM(c,1);let l=require("@nextblock-cms/ui");var u=process.env.NEXT_PUBLIC_R2_BASE_URL||``;function d(e){return e?e.startsWith(`http`)||!u?e:`${u.replace(/\/+$/,``)}/${e.replace(/^\/+/,``)}`:null}function f({products:e,languageLabels:u,defaultCurrencyCode:f,deleteProductAction:p,bulkDeleteProductsAction:m,bulkDraftProductsAction:h}){let g=(0,s.useRouter)(),[_,v]=(0,r.useState)(()=>new Set),[y,b]=(0,r.useState)(``),[x,S]=(0,r.useState)(null),[C,w]=(0,r.useState)(null),[T,E]=(0,r.useTransition)(),D=(0,r.useMemo)(()=>{let t=y.trim().toLowerCase();return t?e.filter(e=>{let n=u[String(e.language_id)]||``;return[e.title,e.sku,e.slug,e.status,n].filter(Boolean).join(` `).toLowerCase().includes(t)}):e},[u,e,y]),[O,k]=(0,r.useState)(1),[A,j]=(0,r.useState)(25);(0,r.useEffect)(()=>{k(1)},[y]);let M=D.length,N=Math.max(1,Math.ceil(M/A)),P=Math.min(O,N),F=(0,r.useMemo)(()=>{let e=(P-1)*A;return D.slice(e,e+A)},[D,P,A]),I=(0,r.useMemo)(()=>e.map(e=>e.id),[e]),L=(0,r.useMemo)(()=>F.map(e=>e.id),[F]),R=(0,r.useMemo)(()=>e.filter(e=>_.has(e.id)),[e,_]).length,z=R>1,B=L.filter(e=>_.has(e)).length,V=L.length>0&&L.every(e=>_.has(e)),H=B>0&&!V;(0,r.useEffect)(()=>{let e=new Set(I);v(t=>{let n=new Set(Array.from(t).filter(t=>e.has(t)));return n.size===t.size?t:n})},[I]);let U=e=>{v(t=>{let n=new Set(t);return e?L.forEach(e=>n.add(e)):L.forEach(e=>n.delete(e)),n})},W=(e,t)=>{v(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r})},G=(e,t,n)=>{if(R===0){S(`Select at least one product first.`);return}window.confirm(t)&&(S(null),w(e),E(async()=>{try{let e=await n(Array.from(_));if(!e.success){S(e.error||`Bulk action failed. Please try again.`),w(null);return}v(new Set),g.refresh()}catch(e){console.error(`Bulk product action failed:`,e),S(`Bulk action failed. Please try again.`)}finally{w(null)}}))};return(0,o.jsxs)(`div`,{className:`rounded-lg border overflow-hidden dark:border-slate-700`,children:[(0,o.jsxs)(`div`,{className:`flex min-h-14 flex-wrap items-center justify-between gap-3 border-b bg-muted/20 px-4 py-3`,children:[(0,o.jsxs)(`div`,{className:`flex min-w-[260px] flex-1 flex-wrap items-center gap-3`,children:[(0,o.jsxs)(`div`,{className:`relative w-full max-w-sm`,children:[(0,o.jsx)(i.Search,{className:`pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground`}),(0,o.jsx)(l.Input,{value:y,onChange:e=>b(e.target.value),placeholder:`Search products...`,className:`h-9 pl-9`,"aria-label":`Search products`})]}),R>0?(0,o.jsxs)(`span`,{className:`text-sm font-medium text-foreground`,children:[R,` selected`]}):null,x?(0,o.jsx)(`span`,{className:`text-sm text-destructive`,children:x}):null]}),z?(0,o.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,o.jsxs)(l.Button,{variant:`outline`,size:`sm`,disabled:T,onClick:()=>G(`Moving to draft...`,`Move ${R} selected products to draft?`,h),children:[(0,o.jsx)(i.Archive,{className:`mr-2 h-4 w-4`}),C===`Moving to draft...`?C:`Set Draft`]}),(0,o.jsxs)(l.Button,{variant:`destructive`,size:`sm`,disabled:T,onClick:()=>G(`Deleting...`,`Delete ${R} selected products? This action cannot be undone.`,m),children:[(0,o.jsx)(i.Trash2,{className:`mr-2 h-4 w-4`}),C===`Deleting...`?C:`Delete`]})]}):null]}),(0,o.jsxs)(l.Table,{children:[(0,o.jsx)(l.TableHeader,{children:(0,o.jsxs)(l.TableRow,{children:[(0,o.jsx)(l.TableHead,{className:`w-12`,children:(0,o.jsx)(l.Checkbox,{checked:V?!0:H?`indeterminate`:!1,onCheckedChange:e=>U(e===!0),"aria-label":`Select all products on this page`})}),(0,o.jsx)(l.TableHead,{children:`Image`}),(0,o.jsx)(l.TableHead,{children:`Title`}),(0,o.jsx)(l.TableHead,{children:`SKU`}),(0,o.jsx)(l.TableHead,{children:`Price`}),(0,o.jsx)(l.TableHead,{children:`Language`}),(0,o.jsx)(l.TableHead,{children:`SEO`}),(0,o.jsx)(l.TableHead,{children:`Stock`}),(0,o.jsx)(l.TableHead,{children:`Status`}),(0,o.jsx)(l.TableHead,{className:`text-right`,children:`Actions`})]})}),(0,o.jsx)(l.TableBody,{children:F.length>0?F.map(e=>{let r=d(e.product_media?.[0]?.media?.file_path||e.product_media?.[0]?.media?.object_key);return(0,o.jsxs)(l.TableRow,{"data-state":_.has(e.id)?`selected`:void 0,children:[(0,o.jsx)(l.TableCell,{children:(0,o.jsx)(l.Checkbox,{checked:_.has(e.id),onCheckedChange:t=>W(e.id,t===!0),"aria-label":`Select ${e.title}`})}),(0,o.jsx)(l.TableCell,{children:r?(0,o.jsx)(c.default,{src:r,alt:e.title,width:40,height:40,className:`w-10 h-10 object-cover rounded`}):(0,o.jsx)(`div`,{className:`w-10 h-10 bg-gray-200 rounded flex items-center justify-center text-xs text-gray-500`,children:`No Img`})}),(0,o.jsx)(l.TableCell,{className:`font-medium`,children:(0,o.jsx)(n.default,{href:`/cms/products/${e.id}/edit`,className:`hover:underline`,children:e.title})}),(0,o.jsx)(l.TableCell,{children:e.sku}),(0,o.jsx)(l.TableCell,{children:(0,o.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,o.jsx)(`span`,{className:e.sale_price?`font-semibold text-primary`:``,children:typeof(e.sale_price??e.price)==`number`?(0,a.formatPrice)(e.sale_price??e.price??0,f):`N/A`}),e.sale_price?(0,o.jsx)(`span`,{className:`text-sm text-muted-foreground line-through`,children:(0,a.formatPrice)(e.price??0,f)}):null]})}),(0,o.jsx)(l.TableCell,{children:(0,o.jsx)(l.Badge,{variant:`outline`,children:u[String(e.language_id)]||`N/A`})}),(0,o.jsx)(l.TableCell,{children:(0,o.jsx)(l.SeoScoreBadge,{score:e.seo_score})}),(0,o.jsx)(l.TableCell,{children:e.stock}),(0,o.jsx)(l.TableCell,{children:(0,o.jsx)(`span`,{className:`px-2 py-1 rounded text-xs ${e.status===`active`?`bg-green-100 text-green-800`:e.status===`archived`?`bg-gray-100 text-gray-800`:`bg-yellow-100 text-yellow-800`}`,children:e.status})}),(0,o.jsxs)(l.TableCell,{className:`text-right flex justify-end gap-2 items-center`,children:[e.slug?(0,o.jsx)(n.default,{href:`/product/${e.slug}`,target:`_blank`,rel:`noopener noreferrer`,children:(0,o.jsx)(l.Button,{variant:`outline`,size:`sm`,children:`View Product`})}):null,(0,o.jsx)(n.default,{href:`/cms/products/${e.id}/edit`,children:(0,o.jsx)(l.Button,{variant:`ghost`,size:`sm`,children:`Edit`})}),(0,o.jsx)(t.DeleteProductButton,{productName:e.title,isIcon:!0,deleteAction:()=>p(e.id)})]})]},e.id)}):(0,o.jsx)(l.TableRow,{children:(0,o.jsx)(l.TableCell,{colSpan:10,className:`text-center py-10`,children:e.length===0?`No products found.`:`No products match your search.`})})})]}),M>0&&(0,o.jsxs)(`div`,{className:`flex flex-col sm:flex-row items-center justify-between gap-4 px-2 py-4 text-sm text-muted-foreground`,children:[(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,o.jsx)(`span`,{children:`Rows per page:`}),(0,o.jsxs)(l.Select,{value:String(A),onValueChange:e=>{j(Number(e)),k(1)},children:[(0,o.jsx)(l.SelectTrigger,{className:`h-8 w-[70px]`,children:(0,o.jsx)(l.SelectValue,{placeholder:String(A)})}),(0,o.jsx)(l.SelectContent,{side:`top`,children:[10,25,50,100].map(e=>(0,o.jsx)(l.SelectItem,{value:String(e),children:e},e))})]}),(0,o.jsxs)(`span`,{className:`ml-2`,children:[`Showing `,(P-1)*A+1,` to `,Math.min(P*A,M),` of `,M,` products`]})]}),(0,o.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,o.jsxs)(`span`,{children:[`Page `,P,` of `,N]}),(0,o.jsx)(l.Button,{variant:`outline`,size:`sm`,className:`h-8 w-8 p-0`,onClick:()=>k(e=>Math.max(1,e-1)),disabled:P<=1,"aria-label":`Previous page`,children:(0,o.jsx)(i.ChevronLeft,{className:`h-4 w-4`})}),(0,o.jsx)(l.Button,{variant:`outline`,size:`sm`,className:`h-8 w-8 p-0`,onClick:()=>k(e=>Math.min(N,e+1)),disabled:P>=N,"aria-label":`Next page`,children:(0,o.jsx)(i.ChevronRight,{className:`h-4 w-4`})})]})]})]})}exports.ProductsBulkTable=f;