@nextblock-cms/ecom 0.13.4 → 0.13.6

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 (123) hide show
  1. package/lib/CurrencyProvider.cjs.js +1 -1
  2. package/lib/CurrencyProvider.es.js +31 -27
  3. package/lib/components/AccountNavigationMenu.cjs.js +1 -1
  4. package/lib/components/AccountNavigationMenu.es.js +53 -26
  5. package/lib/components/AddToCartButton.cjs.js +1 -1
  6. package/lib/components/AddToCartButton.es.js +49 -25
  7. package/lib/components/Cart.cjs.js +1 -1
  8. package/lib/components/Cart.es.js +367 -115
  9. package/lib/components/CartDrawer.cjs.js +1 -1
  10. package/lib/components/CartDrawer.es.js +272 -88
  11. package/lib/components/CartIcon.cjs.js +1 -1
  12. package/lib/components/CartIcon.es.js +44 -16
  13. package/lib/components/Checkout.cjs.js +1 -1
  14. package/lib/components/Checkout.es.js +1601 -694
  15. package/lib/components/CouponForm.cjs.js +1 -1
  16. package/lib/components/CouponForm.es.js +160 -96
  17. package/lib/components/CurrencySwitcher.cjs.js +1 -1
  18. package/lib/components/CurrencySwitcher.es.js +32 -12
  19. package/lib/components/CustomerProfileForm.cjs.js +1 -1
  20. package/lib/components/CustomerProfileForm.es.js +666 -250
  21. package/lib/components/FeaturedProduct.cjs.js +1 -1
  22. package/lib/components/FeaturedProduct.es.js +126 -42
  23. package/lib/components/FreemiusLicensePanel.cjs.js +1 -1
  24. package/lib/components/FreemiusLicensePanel.es.js +125 -45
  25. package/lib/components/InvoiceDocument.cjs.js +1 -1
  26. package/lib/components/InvoiceDocument.es.js +485 -146
  27. package/lib/components/InvoiceViewerShell.cjs.js +2 -2
  28. package/lib/components/InvoiceViewerShell.es.js +142 -54
  29. package/lib/components/ProductCard.cjs.js +1 -1
  30. package/lib/components/ProductCard.es.js +224 -81
  31. package/lib/components/ProductDetailsLayout.cjs.js +1 -1
  32. package/lib/components/ProductDetailsLayout.es.js +629 -275
  33. package/lib/components/ProductGallery.cjs.js +1 -1
  34. package/lib/components/ProductGallery.es.js +64 -21
  35. package/lib/components/ProductGrid.cjs.js +1 -1
  36. package/lib/components/ProductGrid.es.js +28 -12
  37. package/lib/components/ShippingEstimator.cjs.js +1 -1
  38. package/lib/components/ShippingEstimator.es.js +226 -90
  39. package/lib/components/SimpleTiptapRenderer.cjs.js +1 -1
  40. package/lib/components/SimpleTiptapRenderer.es.js +286 -93
  41. package/lib/components/SubscriptionSelector.cjs.js +1 -1
  42. package/lib/components/SubscriptionSelector.es.js +168 -92
  43. package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +1 -1
  44. package/lib/pages/cms/coupons/CouponEditorForm.es.js +370 -110
  45. package/lib/pages/cms/coupons/CouponsPage.cjs.js +2 -2
  46. package/lib/pages/cms/coupons/CouponsPage.es.js +368 -116
  47. package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +1 -1
  48. package/lib/pages/cms/coupons/CreateCouponDialog.es.js +61 -25
  49. package/lib/pages/cms/coupons/EditCouponPage.cjs.js +1 -1
  50. package/lib/pages/cms/coupons/EditCouponPage.es.js +71 -35
  51. package/lib/pages/cms/coupons/ProductScopePicker.cjs.js +1 -1
  52. package/lib/pages/cms/coupons/ProductScopePicker.es.js +167 -72
  53. package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +1 -1
  54. package/lib/pages/cms/orders/ExportReportsDialog.es.js +247 -87
  55. package/lib/pages/cms/orders/OrderDetailPage.cjs.js +1 -1
  56. package/lib/pages/cms/orders/OrderDetailPage.es.js +283 -95
  57. package/lib/pages/cms/orders/OrderPrintButton.cjs.js +1 -1
  58. package/lib/pages/cms/orders/OrderPrintButton.es.js +21 -9
  59. package/lib/pages/cms/orders/OrderStatusForm.cjs.js +1 -1
  60. package/lib/pages/cms/orders/OrderStatusForm.es.js +106 -46
  61. package/lib/pages/cms/orders/OrdersPage.cjs.js +1 -1
  62. package/lib/pages/cms/orders/OrdersPage.es.js +257 -78
  63. package/lib/pages/cms/payments/PaymentsClient.cjs.js +1 -1
  64. package/lib/pages/cms/payments/PaymentsClient.es.js +551 -155
  65. package/lib/pages/cms/payments/PaymentsPage.cjs.js +1 -1
  66. package/lib/pages/cms/payments/PaymentsPage.es.js +24 -16
  67. package/lib/pages/cms/products/ProductsPage.cjs.js +1 -1
  68. package/lib/pages/cms/products/ProductsPage.es.js +77 -37
  69. package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +1 -1
  70. package/lib/pages/cms/products/_id_/edit/EditProductPage.es.js +176 -96
  71. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +1 -1
  72. package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +85 -41
  73. package/lib/pages/cms/products/attributes/components/AttributeManager.cjs.js +1 -1
  74. package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +455 -192
  75. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +1 -1
  76. package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +72 -28
  77. package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +1 -1
  78. package/lib/pages/cms/products/categories/components/CategoryManager.es.js +490 -183
  79. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +1 -1
  80. package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +175 -67
  81. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +1 -1
  82. package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +211 -100
  83. package/lib/pages/cms/products/components/DeleteProductButton.cjs.js +1 -1
  84. package/lib/pages/cms/products/components/DeleteProductButton.es.js +45 -25
  85. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +1 -1
  86. package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +202 -58
  87. package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +1 -1
  88. package/lib/pages/cms/products/components/ProductCategorySelector.es.js +234 -88
  89. package/lib/pages/cms/products/components/ProductForm.cjs.js +1 -1
  90. package/lib/pages/cms/products/components/ProductForm.es.js +1199 -551
  91. package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +1 -1
  92. package/lib/pages/cms/products/components/ProductMediaManager.es.js +154 -63
  93. package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +1 -1
  94. package/lib/pages/cms/products/components/ProductsBulkTable.es.js +391 -144
  95. package/lib/pages/cms/products/components/SaleScheduleFields.cjs.js +1 -1
  96. package/lib/pages/cms/products/components/SaleScheduleFields.es.js +203 -87
  97. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +1 -1
  98. package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +30 -18
  99. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.cjs.js +2 -2
  100. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +35 -23
  101. package/lib/pages/cms/products/components/VariationsEditor.cjs.js +1 -1
  102. package/lib/pages/cms/products/components/VariationsEditor.es.js +492 -261
  103. package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +1 -1
  104. package/lib/pages/cms/products/inventory/InventoryPage.es.js +33 -13
  105. package/lib/pages/cms/products/inventory/InventoryTableClient.cjs.js +2 -2
  106. package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +365 -145
  107. package/lib/pages/cms/products/new/NewProductPage.cjs.js +1 -1
  108. package/lib/pages/cms/products/new/NewProductPage.es.js +46 -34
  109. package/lib/pages/cms/products/server-actions.cjs.js +1 -1
  110. package/lib/pages/cms/products/server-actions.es.js +163 -139
  111. package/lib/pages/cms/shipping/ShippingPage.cjs.js +2 -2
  112. package/lib/pages/cms/shipping/ShippingPage.es.js +507 -155
  113. package/lib/pages/cms/shipping/components/RateForm.cjs.js +1 -1
  114. package/lib/pages/cms/shipping/components/RateForm.es.js +717 -334
  115. package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +1 -1
  116. package/lib/pages/cms/shipping/components/ZoneForm.es.js +392 -158
  117. package/lib/pages/cms/taxes/TaxesPage.cjs.js +1 -1
  118. package/lib/pages/cms/taxes/TaxesPage.es.js +448 -120
  119. package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +1 -1
  120. package/lib/pages/cms/taxes/components/TaxRateForm.es.js +159 -55
  121. package/lib/product-context.cjs.js +1 -1
  122. package/lib/product-context.es.js +14 -10
  123. package/package.json +4 -4
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("../../../../shared-inventory.cjs.js"),s=require("./InventoryTableClient.cjs.js");async function a(){const t=await n.getInventoryItems();return e.jsxs("div",{className:"p-8 space-y-6",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h1",{className:"text-3xl font-bold",children:"Inventory"}),e.jsx("p",{className:"max-w-3xl text-sm text-muted-foreground",children:"Manage source-of-truth stock for every sellable SKU in one place. Matching SKUs share the same quantity across products, translations, and variants, and you can update those shared quantities inline or in bulk through CSV import and export."})]}),e.jsx(s.InventoryTableClient,{initialItems:t})]})}exports.InventoryPage=a;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-dev-runtime"),n=require("../../../../shared-inventory.cjs.js"),t=require("./InventoryTableClient.cjs.js");async function r(){const s=await n.getInventoryItems();return e.jsxDEV("div",{className:"p-8 space-y-6",children:[e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("h1",{className:"text-3xl font-bold",children:"Inventory"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",lineNumber:10,columnNumber:9},this),e.jsxDEV("p",{className:"max-w-3xl text-sm text-muted-foreground",children:"Manage source-of-truth stock for every sellable SKU in one place. Matching SKUs share the same quantity across products, translations, and variants, and you can update those shared quantities inline or in bulk through CSV import and export."},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",lineNumber:11,columnNumber:9},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",lineNumber:9,columnNumber:7},this),e.jsxDEV(t.InventoryTableClient,{initialItems:s},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",lineNumber:18,columnNumber:7},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",lineNumber:8,columnNumber:5},this)}exports.InventoryPage=r;
@@ -1,16 +1,36 @@
1
- import { jsxs as t, jsx as e } from "react/jsx-runtime";
2
- import { getInventoryItems as a } from "../../../../shared-inventory.es.js";
3
- import { InventoryTableClient as r } from "./InventoryTableClient.es.js";
4
- async function l() {
5
- const n = await a();
6
- return /* @__PURE__ */ t("div", { className: "p-8 space-y-6", children: [
7
- /* @__PURE__ */ t("div", { className: "space-y-2", children: [
8
- /* @__PURE__ */ e("h1", { className: "text-3xl font-bold", children: "Inventory" }),
9
- /* @__PURE__ */ e("p", { className: "max-w-3xl text-sm text-muted-foreground", children: "Manage source-of-truth stock for every sellable SKU in one place. Matching SKUs share the same quantity across products, translations, and variants, and you can update those shared quantities inline or in bulk through CSV import and export." })
10
- ] }),
11
- /* @__PURE__ */ e(r, { initialItems: n })
12
- ] });
1
+ import { jsxDEV as e } from "react/jsx-dev-runtime";
2
+ import { getInventoryItems as n } from "../../../../shared-inventory.es.js";
3
+ import { InventoryTableClient as t } from "./InventoryTableClient.es.js";
4
+ async function a() {
5
+ const s = await n();
6
+ return /* @__PURE__ */ e("div", { className: "p-8 space-y-6", children: [
7
+ /* @__PURE__ */ e("div", { className: "space-y-2", children: [
8
+ /* @__PURE__ */ e("h1", { className: "text-3xl font-bold", children: "Inventory" }, void 0, !1, {
9
+ fileName: "C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",
10
+ lineNumber: 10,
11
+ columnNumber: 9
12
+ }, this),
13
+ /* @__PURE__ */ e("p", { className: "max-w-3xl text-sm text-muted-foreground", children: "Manage source-of-truth stock for every sellable SKU in one place. Matching SKUs share the same quantity across products, translations, and variants, and you can update those shared quantities inline or in bulk through CSV import and export." }, void 0, !1, {
14
+ fileName: "C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",
15
+ lineNumber: 11,
16
+ columnNumber: 9
17
+ }, this)
18
+ ] }, void 0, !0, {
19
+ fileName: "C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",
20
+ lineNumber: 9,
21
+ columnNumber: 7
22
+ }, this),
23
+ /* @__PURE__ */ e(t, { initialItems: s }, void 0, !1, {
24
+ fileName: "C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",
25
+ lineNumber: 18,
26
+ columnNumber: 7
27
+ }, this)
28
+ ] }, void 0, !0, {
29
+ fileName: "C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryPage.tsx",
30
+ lineNumber: 8,
31
+ columnNumber: 5
32
+ }, this);
13
33
  }
14
34
  export {
15
- l as InventoryPage
35
+ a as InventoryPage
16
36
  };
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react"),t=require("@nextblock-cms/ui"),y=require("lucide-react"),j=require("sonner"),S=require("./actions.cjs.js");function R(o){const i=String(o??"");return/[",\n]/.test(i)?`"${i.replace(/"/g,'""')}"`:i}function K(o){const i=["sku","stock","usage_type","product_titles","languages","statuses","parent_product_skus"],b=o.map(c=>[c.sku,c.stock,c.usageType,c.productTitles.join("|"),c.languages.join("|"),c.statuses.join("|"),c.parentProductSkus.join("|")]);return[i,...b].map(c=>c.map(p=>R(p)).join(",")).join(`
2
- `)}function B(o){return o.usageType==="mixed"?"Shared SKU":o.usageType==="variant"?`Variant SKU ${o.sku}`:"Simple Product"}function L(o){return o.usageType==="variant"?"secondary":"outline"}function P({initialItems:o}){const[i,b]=d.useState(o),[c,p]=d.useState(()=>o.reduce((s,n)=>(s[n.key]=String(n.stock),s),{})),[k,T]=d.useState(""),[h,f]=d.useTransition(),[w,x]=d.useState(null),v=d.useRef(null),m=d.useMemo(()=>{const s=k.trim().toLowerCase();return s?i.filter(n=>n.sku.toLowerCase().includes(s)||n.productTitles.join(" ").toLowerCase().includes(s)||n.parentProductSkus.join(" ").toLowerCase().includes(s)||n.languages.join(" ").toLowerCase().includes(s)):i},[i,k]),C=()=>{const s=K(i),n=new Blob([s],{type:"text/csv;charset=utf-8;"}),r=URL.createObjectURL(n),l=document.createElement("a");l.href=r,l.download="inventory-export.csv",l.click(),URL.revokeObjectURL(r)},N=s=>{const n=c[s.key]??String(s.stock),r=Number.parseInt(n,10);if(!Number.isFinite(r)||r<0){j.toast.error("Stock must be a non-negative whole number.");return}x(s.key),f(async()=>{const l=await S.updateInventoryQuantityAction({sku:s.sku,stock:r});if(!l.success){j.toast.error(l.error||"Failed to update inventory."),x(null);return}const u=typeof l.stock=="number"?l.stock:r;b(a=>a.map(g=>g.key===s.key?{...g,stock:u}:g)),p(a=>({...a,[s.key]:String(u)})),x(null),j.toast.success(`Inventory updated for ${s.sku}.`)})},I=()=>{v.current?.click()},U=async s=>{const n=await s.text();x("import"),f(async()=>{const r=await S.importInventoryCsvAction(n);if(!r.success){j.toast.error(r.error||"Failed to import inventory CSV."),x(null);return}const l=r.items||[];b(l),p(l.reduce((u,a)=>(u[a.key]=String(a.stock),u),{})),x(null),j.toast.success(`Imported ${r.updatedCount||0} inventory updates.`)})};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border bg-card p-4",children:[e.jsxs("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between",children:[e.jsxs("div",{className:"relative w-full lg:max-w-md",children:[e.jsx(y.Search,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(t.Input,{value:k,onChange:s=>T(s.target.value),placeholder:"Search by SKU, product title, parent SKU, or language...",className:"pl-9"})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("input",{ref:v,type:"file",accept:".csv,text/csv",className:"hidden",onChange:s=>{const n=s.target.files?.[0];n&&U(n),s.currentTarget.value=""}}),e.jsxs(t.Button,{type:"button",variant:"outline",onClick:I,disabled:h,children:[e.jsx(y.Upload,{className:"mr-2 h-4 w-4"}),"Import CSV"]}),e.jsxs(t.Button,{type:"button",variant:"outline",onClick:C,disabled:h,children:[e.jsx(y.Download,{className:"mr-2 h-4 w-4"}),"Export CSV"]})]})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Inventory is keyed by sellable SKU. Any product or variant using the same SKU shares the same quantity, and CSV imports can update those shared SKU quantities in bulk."})]}),e.jsx("div",{className:"rounded-xl border bg-card",children:e.jsxs(t.Table,{children:[e.jsx(t.TableHeader,{children:e.jsxs(t.TableRow,{children:[e.jsx(t.TableHead,{children:"SKU"}),e.jsx(t.TableHead,{children:"Usage"}),e.jsx(t.TableHead,{children:"Linked Products"}),e.jsx(t.TableHead,{children:"Languages"}),e.jsx(t.TableHead,{children:"Status"}),e.jsx(t.TableHead,{className:"w-[160px]",children:"Quantity"}),e.jsx(t.TableHead,{className:"text-right",children:"Actions"})]})}),e.jsx(t.TableBody,{children:m.length>0?m.map(s=>{const n=c[s.key]??String(s.stock),r=Number.parseInt(n,10),l=Number.isFinite(r)&&r!==s.stock,u=w===s.key;return e.jsxs(t.TableRow,{children:[e.jsx(t.TableCell,{className:"font-mono text-sm",children:s.sku}),e.jsx(t.TableCell,{children:e.jsx(t.Badge,{variant:L(s),children:B(s)})}),e.jsx(t.TableCell,{children:e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"font-medium",children:s.productTitles.join(", ")}),s.usageType!=="product"?e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Parent SKU",s.parentProductSkus.length>1?"s":"",":"," ",e.jsx("span",{className:"font-mono",children:s.parentProductSkus.join(", ")})]}):null]})}),e.jsx(t.TableCell,{children:e.jsx("div",{className:"flex flex-wrap gap-1",children:s.languages.map(a=>e.jsx(t.Badge,{variant:"outline",children:a},`${s.key}:${a}`))})}),e.jsx(t.TableCell,{children:e.jsx("div",{className:"flex flex-wrap gap-1",children:s.statuses.map(a=>e.jsx(t.Badge,{variant:"outline",children:a},`${s.key}:${a}`))})}),e.jsx(t.TableCell,{children:e.jsx(t.Input,{type:"number",min:0,step:1,value:n,disabled:h,onChange:a=>p(g=>({...g,[s.key]:a.target.value})),className:"w-28"})}),e.jsx(t.TableCell,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs(t.Button,{type:"button",size:"sm",variant:"ghost",disabled:!l||h,onClick:()=>p(a=>({...a,[s.key]:String(s.stock)})),children:[e.jsx(y.RotateCcw,{className:"mr-2 h-4 w-4"}),"Reset"]}),e.jsxs(t.Button,{type:"button",size:"sm",disabled:!l||h,onClick:()=>N(s),children:[e.jsx(y.Save,{className:"mr-2 h-4 w-4"}),u?"Saving...":"Save"]})]})})]},s.key)}):e.jsx(t.TableRow,{children:e.jsx(t.TableCell,{colSpan:7,className:"py-10 text-center text-muted-foreground",children:"No inventory rows matched your search."})})})]})})]})}exports.InventoryTableClient=P;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-dev-runtime"),u=require("react"),n=require("@nextblock-cms/ui"),x=require("lucide-react"),N=require("sonner"),g=require("./actions.cjs.js");function E(o){const a=String(o??"");return/[",\n]/.test(a)?`"${a.replace(/"/g,'""')}"`:a}function S(o){const a=["sku","stock","usage_type","product_titles","languages","statuses","parent_product_skus"],y=o.map(c=>[c.sku,c.stock,c.usageType,c.productTitles.join("|"),c.languages.join("|"),c.statuses.join("|"),c.parentProductSkus.join("|")]);return[a,...y].map(c=>c.map(b=>E(b)).join(",")).join(`
2
+ `)}function w(o){return o.usageType==="mixed"?"Shared SKU":o.usageType==="variant"?`Variant SKU ${o.sku}`:"Simple Product"}function R(o){return o.usageType==="variant"?"secondary":"outline"}function K({initialItems:o}){const[a,y]=u.useState(o),[c,b]=u.useState(()=>o.reduce((s,r)=>(s[r.key]=String(r.stock),s),{})),[k,j]=u.useState(""),[p,f]=u.useTransition(),[D,d]=u.useState(null),C=u.useRef(null),h=u.useMemo(()=>{const s=k.trim().toLowerCase();return s?a.filter(r=>r.sku.toLowerCase().includes(s)||r.productTitles.join(" ").toLowerCase().includes(s)||r.parentProductSkus.join(" ").toLowerCase().includes(s)||r.languages.join(" ").toLowerCase().includes(s)):a},[a,k]),T=()=>{const s=S(a),r=new Blob([s],{type:"text/csv;charset=utf-8;"}),l=URL.createObjectURL(r),i=document.createElement("a");i.href=l,i.download="inventory-export.csv",i.click(),URL.revokeObjectURL(l)},I=s=>{const r=c[s.key]??String(s.stock),l=Number.parseInt(r,10);if(!Number.isFinite(l)||l<0){N.toast.error("Stock must be a non-negative whole number.");return}d(s.key),f(async()=>{const i=await g.updateInventoryQuantityAction({sku:s.sku,stock:l});if(!i.success){N.toast.error(i.error||"Failed to update inventory."),d(null);return}const m=typeof i.stock=="number"?i.stock:l;y(t=>t.map(v=>v.key===s.key?{...v,stock:m}:v)),b(t=>({...t,[s.key]:String(m)})),d(null),N.toast.success(`Inventory updated for ${s.sku}.`)})},U=()=>{C.current?.click()},V=async s=>{const r=await s.text();d("import"),f(async()=>{const l=await g.importInventoryCsvAction(r);if(!l.success){N.toast.error(l.error||"Failed to import inventory CSV."),d(null);return}const i=l.items||[];y(i),b(i.reduce((m,t)=>(m[t.key]=String(t.stock),m),{})),d(null),N.toast.success(`Imported ${l.updatedCount||0} inventory updates.`)})};return e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{className:"flex flex-col gap-3 rounded-xl border bg-card p-4",children:[e.jsxDEV("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between",children:[e.jsxDEV("div",{className:"relative w-full lg:max-w-md",children:[e.jsxDEV(x.Search,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:203,columnNumber:13},this),e.jsxDEV(n.Input,{value:k,onChange:s=>j(s.target.value),placeholder:"Search by SKU, product title, parent SKU, or language...",className:"pl-9"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:204,columnNumber:13},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:202,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-2",children:[e.jsxDEV("input",{ref:C,type:"file",accept:".csv,text/csv",className:"hidden",onChange:s=>{const r=s.target.files?.[0];r&&V(r),s.currentTarget.value=""}},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:213,columnNumber:13},this),e.jsxDEV(n.Button,{type:"button",variant:"outline",onClick:U,disabled:p,children:[e.jsxDEV(x.Upload,{className:"mr-2 h-4 w-4"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:227,columnNumber:15},this),"Import CSV"]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:226,columnNumber:13},this),e.jsxDEV(n.Button,{type:"button",variant:"outline",onClick:T,disabled:p,children:[e.jsxDEV(x.Download,{className:"mr-2 h-4 w-4"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:231,columnNumber:15},this),"Export CSV"]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:230,columnNumber:13},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:212,columnNumber:11},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:201,columnNumber:9},this),e.jsxDEV("p",{className:"text-sm text-muted-foreground",children:"Inventory is keyed by sellable SKU. Any product or variant using the same SKU shares the same quantity, and CSV imports can update those shared SKU quantities in bulk."},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:237,columnNumber:9},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:200,columnNumber:7},this),e.jsxDEV("div",{className:"rounded-xl border bg-card",children:e.jsxDEV(n.Table,{children:[e.jsxDEV(n.TableHeader,{children:e.jsxDEV(n.TableRow,{children:[e.jsxDEV(n.TableHead,{children:"SKU"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:247,columnNumber:15},this),e.jsxDEV(n.TableHead,{children:"Usage"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:248,columnNumber:15},this),e.jsxDEV(n.TableHead,{children:"Linked Products"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:249,columnNumber:15},this),e.jsxDEV(n.TableHead,{children:"Languages"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:250,columnNumber:15},this),e.jsxDEV(n.TableHead,{children:"Status"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:251,columnNumber:15},this),e.jsxDEV(n.TableHead,{className:"w-[160px]",children:"Quantity"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:252,columnNumber:15},this),e.jsxDEV(n.TableHead,{className:"text-right",children:"Actions"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:253,columnNumber:15},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:246,columnNumber:13},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:245,columnNumber:11},this),e.jsxDEV(n.TableBody,{children:h.length>0?h.map(s=>{const r=c[s.key]??String(s.stock),l=Number.parseInt(r,10),i=Number.isFinite(l)&&l!==s.stock,m=D===s.key;return e.jsxDEV(n.TableRow,{children:[e.jsxDEV(n.TableCell,{className:"font-mono text-sm",children:s.sku},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:266,columnNumber:21},this),e.jsxDEV(n.TableCell,{children:e.jsxDEV(n.Badge,{variant:R(s),children:w(s)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:268,columnNumber:23},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:267,columnNumber:21},this),e.jsxDEV(n.TableCell,{children:e.jsxDEV("div",{className:"space-y-1",children:[e.jsxDEV("p",{className:"font-medium",children:s.productTitles.join(", ")},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:274,columnNumber:25},this),s.usageType!=="product"?e.jsxDEV("p",{className:"text-xs text-muted-foreground",children:["Parent SKU",s.parentProductSkus.length>1?"s":"",":"," ",e.jsxDEV("span",{className:"font-mono",children:s.parentProductSkus.join(", ")},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:278,columnNumber:29},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:276,columnNumber:27},this):null]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:273,columnNumber:23},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:272,columnNumber:21},this),e.jsxDEV(n.TableCell,{children:e.jsxDEV("div",{className:"flex flex-wrap gap-1",children:s.languages.map(t=>e.jsxDEV(n.Badge,{variant:"outline",children:t},`${s.key}:${t}`,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:286,columnNumber:27},this))},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:284,columnNumber:23},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:283,columnNumber:21},this),e.jsxDEV(n.TableCell,{children:e.jsxDEV("div",{className:"flex flex-wrap gap-1",children:s.statuses.map(t=>e.jsxDEV(n.Badge,{variant:"outline",children:t},`${s.key}:${t}`,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:295,columnNumber:27},this))},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:293,columnNumber:23},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:292,columnNumber:21},this),e.jsxDEV(n.TableCell,{children:e.jsxDEV(n.Input,{type:"number",min:0,step:1,value:r,disabled:p,onChange:t=>b(v=>({...v,[s.key]:t.target.value})),className:"w-28"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:302,columnNumber:23},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:301,columnNumber:21},this),e.jsxDEV(n.TableCell,{className:"text-right",children:e.jsxDEV("div",{className:"flex justify-end gap-2",children:[e.jsxDEV(n.Button,{type:"button",size:"sm",variant:"ghost",disabled:!i||p,onClick:()=>b(t=>({...t,[s.key]:String(s.stock)})),children:[e.jsxDEV(x.RotateCcw,{className:"mr-2 h-4 w-4"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:331,columnNumber:27},this),"Reset"]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:319,columnNumber:25},this),e.jsxDEV(n.Button,{type:"button",size:"sm",disabled:!i||p,onClick:()=>I(s),children:[e.jsxDEV(x.Save,{className:"mr-2 h-4 w-4"},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:340,columnNumber:27},this),m?"Saving...":"Save"]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:334,columnNumber:25},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:318,columnNumber:23},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:317,columnNumber:21},this)]},s.key,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:265,columnNumber:19},this)}):e.jsxDEV(n.TableRow,{children:e.jsxDEV(n.TableCell,{colSpan:7,className:"py-10 text-center text-muted-foreground",children:"No inventory rows matched your search."},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:350,columnNumber:17},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:349,columnNumber:15},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:256,columnNumber:11},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:244,columnNumber:9},this)},void 0,!1,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:243,columnNumber:7},this)]},void 0,!0,{fileName:"C:/Users/desjardinsn/Desktop/nextblock/libs/ecommerce/src/lib/pages/cms/products/inventory/InventoryTableClient.tsx",lineNumber:199,columnNumber:5},this)}exports.InventoryTableClient=K;