@dropins/storefront-quick-order 0.1.2-alpha3 → 1.0.0-beta2

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.
package/api.js CHANGED
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{c as i,f as o,g as p,a as h,i as c,r as f,s as g,b as n,d}from"./chunks/initialize.js";import"@dropins/tools/lib.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/event-bus.js";export{i as config,o as fetchGraphQl,p as getConfig,h as getStoreConfig,c as initialize,f as removeFetchGraphQlHeader,g as setEndpoint,n as setFetchGraphQlHeader,d as setFetchGraphQlHeaders};
3
+ import{c as i,f as o,g as p,a as h,i as c,r as f,s as g,b as n,d}from"./chunks/getStoreConfig.js";import"@dropins/tools/lib.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/event-bus.js";export{i as config,o as fetchGraphQl,p as getConfig,h as getStoreConfig,c as initialize,f as removeFetchGraphQlHeader,g as setEndpoint,n as setFetchGraphQlHeader,d as setFetchGraphQlHeaders};
4
4
  //# sourceMappingURL=api.js.map
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as i,jsxs as v}from"@dropins/tools/preact-jsx-runtime.js";import{memo as w,useMemo as N,useState as K}from"@dropins/tools/preact-compat.js";import{PriceRange as $,Incrementer as L,Tag as U,Table as j,Button as g}from"@dropins/tools/components.js";import{Slot as d}from"@dropins/tools/lib.js";const _=a=>a.reduce((c,l)=>{if(!l)return c;if(typeof l=="string"&&(c+=` ${l}`),Array.isArray(l)){const[r,b]=l;r&&b&&(c+=` ${r}`)}return c},"").trim(),E=({t:a,variants:m,loading:c=!1,className:l,onQuantityChange:r,initialVisibleVariantsCount:b=10,columns:k,slots:e})=>{const I=N(()=>[{key:"image",label:a.imageColumn||"Image"},{key:"variant",label:a.variantColumn||"Variant"},{key:"sku",label:a.skuColumn||"SKU"},{key:"availability",label:a.availabilityColumn||"Availability"},{key:"price",label:a.priceColumn||"Price"},{key:"quantity",label:a.quantityColumn||"Quantity"},{key:"subtotal",label:a.subtotalColumn||"Subtotal"}],[a]),O=k||I,y=N(()=>m.map((o,T)=>{var S;const{product:t,quantity:n}=o,q=t.price.final.amount.value,C=t.price.final.amount.currency,B=q*n,P=t.inStock?a.inStock||"In Stock":a.outOfStock||"Out of Stock",f={id:`${t.sku}-${T}`,image:i(d,{name:"ImageCell",slot:e==null?void 0:e.ImageCell,context:{variant:o,quantity:n,onQuantityChange:r},children:((S=t.images[0])==null?void 0:S.url)&&i("img",{src:t.images[0].url,alt:t.name,className:"b2b-quick-order-variants-grid__image"})}),variant:i(d,{name:"VariantCell",slot:e==null?void 0:e.VariantCell,context:{variant:o,quantity:n,onQuantityChange:r},children:i("div",{className:"b2b-quick-order-variants-grid__variant",children:t.attributes.filter(u=>u.value&&u.value!=="").map((u,s)=>v("div",{className:"b2b-quick-order-variants-grid__attribute",children:[v("strong",{children:[u.label,":"]})," ",u.value]},s))})}),sku:i(d,{name:"SKUCell",slot:e==null?void 0:e.SKUCell,context:{variant:o,quantity:n,onQuantityChange:r},children:t.sku}),availability:i(d,{name:"AvailabilityCell",slot:e==null?void 0:e.AvailabilityCell,context:{variant:o,quantity:n,onQuantityChange:r},children:i(U,{label:P,className:_(["b2b-quick-order-variants-grid__availability",["b2b-quick-order-variants-grid__availability--in-stock",t.inStock],["b2b-quick-order-variants-grid__availability--out-of-stock",!t.inStock]])})}),price:i(d,{name:"PriceCell",slot:e==null?void 0:e.PriceCell,context:{variant:o,quantity:n,onQuantityChange:r},children:i($,{amount:q,currency:C,size:"small"})}),quantity:i(d,{name:"QuantityCell",slot:e==null?void 0:e.QuantityCell,context:{variant:o,quantity:n,onQuantityChange:r},children:i(L,{value:n,min:0,disabled:!t.inStock,onValue:u=>{r(t.sku,u)},size:"medium",className:"b2b-quick-order-variants-grid__quantity-input","aria-label":`${a.quantityLabel||"Quantity for"} ${t.sku}`})}),subtotal:i(d,{name:"SubtotalCell",slot:e==null?void 0:e.SubtotalCell,context:{variant:o,quantity:n,onQuantityChange:r},children:i($,{amount:B,currency:C,size:"small"})})};if(k){const u=["image","variant","sku","availability","price","quantity","subtotal"];k.forEach(s=>{if(!u.includes(s.key)&&!Object.prototype.hasOwnProperty.call(f,s.key)){const x=`${s.key.charAt(0).toUpperCase()+s.key.slice(1)}Cell`,A=e==null?void 0:e[x];A&&(f[s.key]=i(d,{name:x,slot:A,context:{variant:o,quantity:n,onQuantityChange:r}}))}})}return f}),[m,a,r,e,k]),[p,V]=K(!1),h=y.length>b,z=h&&!p?y.slice(0,b):y;return v("div",{className:_(["b2b-quick-order-variants-grid",l]),"data-testid":"variants-grid",children:[i(j,{columns:O,rowData:z,loading:c,mobileLayout:"stacked",caption:a.tableCaption,className:"b2b-quick-order-variants-grid__table"}),h&&i("div",{className:"b2b-quick-order-variants-grid__footer",children:i(g,{variant:"secondary",size:"medium",onClick:()=>V(!p),className:"b2b-quick-order-variants-grid__toggle-button",children:p?`${a.showLess||"Show Less"}`:`${a.showAll||"Show All"} (${y.length})`})})]})},H=w(E),D=({t:a,onClear:m,onSaveToCsv:c,onCollectData:l,isDisabled:r=!1,variantsCount:b=0,className:k,slots:e})=>i("div",{className:_(["b2b-quick-order-variants-actions",k]),"data-testid":"variants-actions",children:i(d,{name:"Actions",slot:e==null?void 0:e.Actions,context:{onClear:m,onSaveToCsv:c,onCollectData:l||(()=>[]),isDisabled:r,variantsCount:b},children:v("div",{className:"b2b-quick-order-variants-actions__buttons",children:[i(g,{variant:"secondary",size:"medium",onClick:m,disabled:r||b===0,"aria-label":a.clearButton,children:a.clearButton}),i(g,{variant:"primary",size:"medium",onClick:c,disabled:r||b===0,"aria-label":a.saveToCsvButton,children:a.saveToCsvButton})]})})}),J=w(D),Q=(a,m)=>{let c;const l=function(...r){clearTimeout(c),c=setTimeout(()=>a.apply(this,r),m)};return l.cancel=()=>{clearTimeout(c)},l};export{J as Q,H as a,_ as c,Q as d};
3
+ import{jsx as i,jsxs as w}from"@dropins/tools/preact-jsx-runtime.js";import{memo as I,useMemo as N,useState as K}from"@dropins/tools/preact-compat.js";import{Price as $,Incrementer as U,Tag as j,Table as E,Button as f}from"@dropins/tools/components.js";import{Slot as s}from"@dropins/tools/lib.js";const g=a=>a.reduce((r,n)=>{if(!n)return r;if(typeof n=="string"&&(r+=` ${n}`),Array.isArray(n)){const[t,u]=n;t&&u&&(r+=` ${t}`)}return r},"").trim(),L=({t:a,variants:o,loading:r=!1,className:n,onQuantityChange:t,visibleVariantsLimit:u=10,columns:m,slots:e})=>{const O=N(()=>[{key:"image",label:a.imageColumn||"Image"},{key:"sku",label:a.skuColumn||"SKU"},{key:"availability",label:a.availabilityColumn||"Availability"},{key:"price",label:a.priceColumn||"Price"},{key:"quantity",label:a.quantityColumn||"Quantity"},{key:"subtotal",label:a.subtotalColumn||"Subtotal"}],[a]),z=m||O,k=N(()=>o.map((d,h)=>{var S;const{product:c,quantity:l}=d,C=c.price.final.amount.value,_=c.price.final.amount.currency,P=C*l,V=c.inStock?a.inStock||"In Stock":a.outOfStock||"Out of Stock",v={id:`${c.sku}-${h}`,image:i(s,{name:"ImageCell",slot:e==null?void 0:e.ImageCell,context:{variant:d,quantity:l,onQuantityChange:t},children:((S=c.images[0])==null?void 0:S.url)&&i("img",{src:c.images[0].url,alt:c.name,className:"b2b-quick-order-variants-grid__image"})}),sku:i(s,{name:"SKUCell",slot:e==null?void 0:e.SKUCell,context:{variant:d,quantity:l,onQuantityChange:t},children:c.sku}),availability:i(s,{name:"AvailabilityCell",slot:e==null?void 0:e.AvailabilityCell,context:{variant:d,quantity:l,onQuantityChange:t},children:i(j,{label:V,className:g(["b2b-quick-order-variants-grid__availability",["b2b-quick-order-variants-grid__availability--in-stock",c.inStock],["b2b-quick-order-variants-grid__availability--out-of-stock",!c.inStock]])})}),price:i(s,{name:"PriceCell",slot:e==null?void 0:e.PriceCell,context:{variant:d,quantity:l,onQuantityChange:t},children:i($,{amount:C,currency:_,size:"small"})}),quantity:i(s,{name:"QuantityCell",slot:e==null?void 0:e.QuantityCell,context:{variant:d,quantity:l,onQuantityChange:t},children:i("div",{"data-testid":`variant-quantity-input-${h}`,children:i(U,{value:l,min:0,disabled:!c.inStock,onValue:p=>{t(c.sku,p)},size:"medium",className:"b2b-quick-order-variants-grid__quantity-input","aria-label":`${a.quantityLabel||"Quantity for"} ${c.sku}`})})}),subtotal:i(s,{name:"SubtotalCell",slot:e==null?void 0:e.SubtotalCell,context:{variant:d,quantity:l,onQuantityChange:t},children:i($,{amount:P,currency:_,size:"small"})})};if(m){const p=["image","variant","sku","availability","price","quantity","subtotal"];m.forEach(b=>{if(!p.includes(b.key)&&!Object.prototype.hasOwnProperty.call(v,b.key)){const A=`${b.key.charAt(0).toUpperCase()+b.key.slice(1)}Cell`,x=e==null?void 0:e[A];x&&(v[b.key]=i(s,{name:A,slot:x,context:{variant:d,quantity:l,onQuantityChange:t}}))}})}return v}),[o,a,t,e,m]),[y,T]=K(!1),q=k.length>u,B=q&&!y?k.slice(0,u):k;return w("div",{className:g(["b2b-quick-order-variants-grid",n]),"data-testid":"variants-grid",children:[i(E,{columns:z,rowData:B,loading:r,mobileLayout:"stacked",className:"b2b-quick-order-variants-grid__table"}),q&&i("div",{className:"b2b-quick-order-variants-grid__footer",children:i(f,{variant:"secondary",size:"medium",onClick:()=>T(!y),className:"b2b-quick-order-variants-grid__toggle-button",children:y?`${a.showLess||"Show Less"}`:`${a.showAll||"Show All"} (${k.length})`})})]})},R=I(L),D=({t:a,onClear:o,onSaveToCsv:r,onCollectData:n,isDisabled:t=!1,variantsCount:u=0,className:m,slots:e})=>i("div",{className:g(["b2b-quick-order-variants-actions",m]),"data-testid":"variants-actions",children:i(s,{name:"Actions",slot:e==null?void 0:e.Actions,context:{onClear:o,onSaveToCsv:r,onCollectData:n||(()=>[]),isDisabled:t,variantsCount:u},children:w("div",{className:"b2b-quick-order-variants-actions__buttons",children:[i(f,{variant:"secondary",size:"medium",onClick:o,disabled:t||u===0,"aria-label":a.clearButton,"data-testid":"variants-clear-button",children:a.clearButton}),i(f,{variant:"primary",size:"medium",onClick:r,disabled:t||u===0,"aria-label":a.saveToCsvButton,"data-testid":"variants-save-csv-button",children:a.saveToCsvButton})]})})}),H=I(D),J=(a,o)=>{let r;const n=function(...t){clearTimeout(r),r=setTimeout(()=>a.apply(this,t),o)};return n.cancel=()=>{clearTimeout(r)},n};export{H as Q,R as a,g as c,J as d};
4
4
  //# sourceMappingURL=debounce.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.js","sources":["../../node_modules/@adobe-commerce/elsie/src/lib/classes.ts","/@dropins/storefront-quick-order/src/components/QuickOrderVariantsGrid/QuickOrderVariantsGrid.tsx","/@dropins/storefront-quick-order/src/components/QuickOrderVariantsActions/QuickOrderVariantsActions.tsx","../../node_modules/@adobe-commerce/elsie/src/lib/debounce.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\n// @ts-ignore\nimport { JSXInternal } from 'preact/src/jsx';\n\ntype ClassName = string | JSXInternal.SignalLike<string | undefined>;\n\nexport const classes = (\n classes: Array<ClassName | [ClassName, boolean] | undefined>\n) => {\n const result = classes.reduce((result, item) => {\n if (!item) return result;\n\n if (typeof item === 'string') result += ` ${item}`;\n\n if (Array.isArray(item)) {\n const [className, isActive] = item;\n if (className && isActive) {\n result += ` ${className}`;\n }\n }\n\n return result;\n }, '') as string;\n\n return result.trim();\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, memo, useMemo, useState } from 'preact/compat';\nimport {\n Table,\n Button,\n PriceRange,\n Tag,\n Incrementer,\n} from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport {\n QuickOrderVariantsGridComponentProps,\n VariantRow,\n} from '@/b2b-quick-order/types';\nimport { Slot } from '@adobe-commerce/elsie/lib';\nimport '@/b2b-quick-order/components/QuickOrderVariantsGrid/QuickOrderVariantsGrid.css';\n\nconst QuickOrderVariantsGridComponent: FunctionComponent<\n QuickOrderVariantsGridComponentProps\n> = ({\n t,\n variants,\n loading = false,\n className,\n onQuantityChange,\n initialVisibleVariantsCount = 10,\n columns,\n slots,\n}) => {\n const defaultColumns = useMemo(\n () => [\n { key: 'image', label: t.imageColumn || 'Image' },\n { key: 'variant', label: t.variantColumn || 'Variant' },\n { key: 'sku', label: t.skuColumn || 'SKU' },\n { key: 'availability', label: t.availabilityColumn || 'Availability' },\n { key: 'price', label: t.priceColumn || 'Price' },\n { key: 'quantity', label: t.quantityColumn || 'Quantity' },\n { key: 'subtotal', label: t.subtotalColumn || 'Subtotal' },\n ],\n [t]\n );\n\n const tableColumns = columns || defaultColumns;\n\n const rowData = useMemo<VariantRow[]>(() => {\n return variants.map((variant, index) => {\n const { product, quantity } = variant;\n\n const priceValue = product.price.final.amount.value;\n const currency = product.price.final.amount.currency;\n\n const subtotal = priceValue * quantity;\n\n const availability = product.inStock\n ? t.inStock || 'In Stock'\n : t.outOfStock || 'Out of Stock';\n\n const row: VariantRow = {\n id: `${product.sku}-${index}`,\n image: (\n <Slot\n name=\"ImageCell\"\n slot={slots?.ImageCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n {product.images[0]?.url && (\n <img\n src={product.images[0].url}\n alt={product.name}\n className=\"b2b-quick-order-variants-grid__image\"\n />\n )}\n </Slot>\n ),\n variant: (\n <Slot\n name=\"VariantCell\"\n slot={slots?.VariantCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <div className=\"b2b-quick-order-variants-grid__variant\">\n {product.attributes\n .filter((attr) => attr.value && attr.value !== '')\n .map((attr, idx) => (\n <div\n key={idx}\n className=\"b2b-quick-order-variants-grid__attribute\"\n >\n <strong>{attr.label}:</strong> {attr.value}\n </div>\n ))}\n </div>\n </Slot>\n ),\n sku: (\n <Slot\n name=\"SKUCell\"\n slot={slots?.SKUCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n {product.sku}\n </Slot>\n ),\n availability: (\n <Slot\n name=\"AvailabilityCell\"\n slot={slots?.AvailabilityCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <Tag\n label={availability}\n className={classes([\n 'b2b-quick-order-variants-grid__availability',\n [\n 'b2b-quick-order-variants-grid__availability--in-stock',\n product.inStock,\n ],\n [\n 'b2b-quick-order-variants-grid__availability--out-of-stock',\n !product.inStock,\n ],\n ])}\n />\n </Slot>\n ),\n price: (\n <Slot\n name=\"PriceCell\"\n slot={slots?.PriceCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <PriceRange amount={priceValue} currency={currency} size=\"small\" />\n </Slot>\n ),\n quantity: (\n <Slot\n name=\"QuantityCell\"\n slot={slots?.QuantityCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <Incrementer\n value={quantity}\n min={0}\n disabled={!product.inStock}\n onValue={(newQuantity: number) => {\n onQuantityChange(product.sku, newQuantity);\n }}\n size=\"medium\"\n className=\"b2b-quick-order-variants-grid__quantity-input\"\n aria-label={`${t.quantityLabel || 'Quantity for'} ${product.sku}`}\n />\n </Slot>\n ),\n subtotal: (\n <Slot\n name=\"SubtotalCell\"\n slot={slots?.SubtotalCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <PriceRange amount={subtotal} currency={currency} size=\"small\" />\n </Slot>\n ),\n };\n\n if (columns) {\n const standardKeys = [\n 'image',\n 'variant',\n 'sku',\n 'availability',\n 'price',\n 'quantity',\n 'subtotal',\n ];\n columns.forEach((col) => {\n if (\n !standardKeys.includes(col.key) &&\n !Object.prototype.hasOwnProperty.call(row, col.key)\n ) {\n const slotName = `${\n col.key.charAt(0).toUpperCase() + col.key.slice(1)\n }Cell`;\n const slot = (slots as any)?.[slotName];\n if (slot) {\n row[col.key] = (\n <Slot\n name={slotName}\n slot={slot}\n context={{ variant, quantity, onQuantityChange }}\n />\n );\n }\n }\n });\n }\n\n return row;\n });\n }, [variants, t, onQuantityChange, slots, columns]);\n\n const [isExpanded, setIsExpanded] = useState(false);\n const hasMoreItems = rowData.length > initialVisibleVariantsCount;\n const displayedRowData =\n hasMoreItems && !isExpanded\n ? rowData.slice(0, initialVisibleVariantsCount)\n : rowData;\n\n return (\n <div\n className={classes(['b2b-quick-order-variants-grid', className])}\n data-testid=\"variants-grid\"\n >\n <Table\n columns={tableColumns}\n rowData={displayedRowData}\n loading={loading}\n mobileLayout=\"stacked\"\n caption={t.tableCaption}\n className=\"b2b-quick-order-variants-grid__table\"\n />\n\n {hasMoreItems && (\n <div className=\"b2b-quick-order-variants-grid__footer\">\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"b2b-quick-order-variants-grid__toggle-button\"\n >\n {isExpanded\n ? `${t.showLess || 'Show Less'}`\n : `${t.showAll || 'Show All'} (${rowData.length})`}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nexport const QuickOrderVariantsGrid = memo(QuickOrderVariantsGridComponent);\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, memo } from 'preact/compat';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { QuickOrderVariantsActionsProps } from '@/b2b-quick-order/types';\nimport { Slot } from '@adobe-commerce/elsie/lib';\nimport '@/b2b-quick-order/components/QuickOrderVariantsActions/QuickOrderVariantsActions.css';\n\nconst QuickOrderVariantsActionsComponent: FunctionComponent<\n QuickOrderVariantsActionsProps\n> = ({\n t,\n onClear,\n onSaveToCsv,\n onCollectData,\n isDisabled = false,\n variantsCount = 0,\n className,\n slots,\n}) => {\n return (\n <div\n className={classes(['b2b-quick-order-variants-actions', className])}\n data-testid=\"variants-actions\"\n >\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n onClear,\n onSaveToCsv,\n onCollectData: onCollectData || (() => []),\n isDisabled,\n variantsCount,\n }}\n >\n <div className=\"b2b-quick-order-variants-actions__buttons\">\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={onClear}\n disabled={isDisabled || variantsCount === 0}\n aria-label={t.clearButton}\n >\n {t.clearButton}\n </Button>\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={onSaveToCsv}\n disabled={isDisabled || variantsCount === 0}\n aria-label={t.saveToCsvButton}\n >\n {t.saveToCsvButton}\n </Button>\n </div>\n </Slot>\n </div>\n );\n};\n\nexport const QuickOrderVariantsActions = memo(\n QuickOrderVariantsActionsComponent\n);\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const debounce = (fn: Function, ms: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n const debouncedFn = function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n debouncedFn.cancel = () => {\n clearTimeout(timeoutId);\n };\n return debouncedFn;\n};\n"],"names":["classes","result","item","className","isActive","QuickOrderVariantsGridComponent","t","variants","loading","onQuantityChange","initialVisibleVariantsCount","columns","slots","defaultColumns","useMemo","tableColumns","rowData","variant","index","product","quantity","priceValue","currency","subtotal","availability","row","jsx","Slot","_a","attr","idx","jsxs","Tag","PriceRange","Incrementer","newQuantity","standardKeys","col","slotName","slot","isExpanded","setIsExpanded","useState","hasMoreItems","displayedRowData","Table","Button","QuickOrderVariantsGrid","memo","QuickOrderVariantsActionsComponent","onClear","onSaveToCsv","onCollectData","isDisabled","variantsCount","QuickOrderVariantsActions","debounce","fn","ms","timeoutId","debouncedFn","args"],"mappings":"+SAcO,MAAMA,EACXA,GAEeA,EAAQ,OAAO,CAACC,EAAQC,IAAS,CAC9C,GAAI,CAACA,EAAM,OAAOD,EAIlB,GAFI,OAAOC,GAAS,WAAUD,GAAU,IAAIC,CAAI,IAE5C,MAAM,QAAQA,CAAI,EAAG,CACvB,KAAM,CAACC,EAAWC,CAAQ,EAAIF,EAC1BC,GAAaC,IACfH,GAAU,IAAIE,CAAS,GAE3B,CAEA,OAAOF,CACT,EAAG,EAAE,EAES,KAAA,ECCVI,EAEF,CAAC,CACH,EAAAC,EACA,SAAAC,EACA,QAAAC,EAAU,GACV,UAAAL,EACA,iBAAAM,EACA,4BAAAC,EAA8B,GAC9B,QAAAC,EACA,MAAAC,CACF,IAAM,CACJ,MAAMC,EAAiBC,EACrB,IAAM,CACJ,CAAE,IAAK,QAAS,MAAOR,EAAE,aAAe,OAAA,EACxC,CAAE,IAAK,UAAW,MAAOA,EAAE,eAAiB,SAAA,EAC5C,CAAE,IAAK,MAAO,MAAOA,EAAE,WAAa,KAAA,EACpC,CAAE,IAAK,eAAgB,MAAOA,EAAE,oBAAsB,cAAA,EACtD,CAAE,IAAK,QAAS,MAAOA,EAAE,aAAe,OAAA,EACxC,CAAE,IAAK,WAAY,MAAOA,EAAE,gBAAkB,UAAA,EAC9C,CAAE,IAAK,WAAY,MAAOA,EAAE,gBAAkB,UAAA,CAAW,EAE3D,CAACA,CAAC,CAAA,EAGES,EAAeJ,GAAWE,EAE1BG,EAAUF,EAAsB,IAC7BP,EAAS,IAAI,CAACU,EAASC,IAAU,OACtC,KAAM,CAAE,QAAAC,EAAS,SAAAC,CAAA,EAAaH,EAExBI,EAAaF,EAAQ,MAAM,MAAM,OAAO,MACxCG,EAAWH,EAAQ,MAAM,MAAM,OAAO,SAEtCI,EAAWF,EAAaD,EAExBI,EAAeL,EAAQ,QACzBb,EAAE,SAAW,WACbA,EAAE,YAAc,eAEdmB,EAAkB,CACtB,GAAI,GAAGN,EAAQ,GAAG,IAAID,CAAK,GAC3B,MACEQ,EAACC,EAAA,CACC,KAAK,YACL,KAAMf,GAAA,YAAAA,EAAO,UACb,QAAS,CAAE,QAAAK,EAAS,SAAAG,EAAU,iBAAAX,CAAA,EAE7B,WAAAmB,EAAAT,EAAQ,OAAO,CAAC,IAAhB,YAAAS,EAAmB,MAClBF,EAAC,MAAA,CACC,IAAKP,EAAQ,OAAO,CAAC,EAAE,IACvB,IAAKA,EAAQ,KACb,UAAU,sCAAA,CAAA,CACZ,CAAA,EAIN,QACEO,EAACC,EAAA,CACC,KAAK,cACL,KAAMf,GAAA,YAAAA,EAAO,YACb,QAAS,CAAE,QAAAK,EAAS,SAAAG,EAAU,iBAAAX,CAAA,EAE9B,WAAC,MAAA,CAAI,UAAU,yCACZ,SAAAU,EAAQ,WACN,OAAQU,GAASA,EAAK,OAASA,EAAK,QAAU,EAAE,EAChD,IAAI,CAACA,EAAMC,IACVC,EAAC,MAAA,CAEC,UAAU,2CAEV,SAAA,CAAAA,EAAC,SAAA,CAAQ,SAAA,CAAAF,EAAK,MAAM,GAAA,EAAC,EAAS,IAAEA,EAAK,KAAA,CAAA,EAHhCC,CAAA,CAKR,CAAA,CACL,CAAA,CAAA,EAGJ,IACEJ,EAACC,EAAA,CACC,KAAK,UACL,KAAMf,GAAA,YAAAA,EAAO,QACb,QAAS,CAAE,QAAAK,EAAS,SAAAG,EAAU,iBAAAX,CAAA,EAE7B,SAAAU,EAAQ,GAAA,CAAA,EAGb,aACEO,EAACC,EAAA,CACC,KAAK,mBACL,KAAMf,GAAA,YAAAA,EAAO,iBACb,QAAS,CAAE,QAAAK,EAAS,SAAAG,EAAU,iBAAAX,CAAA,EAE9B,SAAAiB,EAACM,EAAA,CACC,MAAOR,EACP,UAAWxB,EAAQ,CACjB,8CACA,CACE,wDACAmB,EAAQ,OAAA,EAEV,CACE,4DACA,CAACA,EAAQ,OAAA,CACX,CACD,CAAA,CAAA,CACH,CAAA,EAGJ,MACEO,EAACC,EAAA,CACC,KAAK,YACL,KAAMf,GAAA,YAAAA,EAAO,UACb,QAAS,CAAE,QAAAK,EAAS,SAAAG,EAAU,iBAAAX,CAAA,EAE9B,WAACwB,EAAA,CAAW,OAAQZ,EAAY,SAAAC,EAAoB,KAAK,OAAA,CAAQ,CAAA,CAAA,EAGrE,SACEI,EAACC,EAAA,CACC,KAAK,eACL,KAAMf,GAAA,YAAAA,EAAO,aACb,QAAS,CAAE,QAAAK,EAAS,SAAAG,EAAU,iBAAAX,CAAA,EAE9B,SAAAiB,EAACQ,EAAA,CACC,MAAOd,EACP,IAAK,EACL,SAAU,CAACD,EAAQ,QACnB,QAAUgB,GAAwB,CAChC1B,EAAiBU,EAAQ,IAAKgB,CAAW,CAC3C,EACA,KAAK,SACL,UAAU,gDACV,aAAY,GAAG7B,EAAE,eAAiB,cAAc,IAAIa,EAAQ,GAAG,EAAA,CAAA,CACjE,CAAA,EAGJ,SACEO,EAACC,EAAA,CACC,KAAK,eACL,KAAMf,GAAA,YAAAA,EAAO,aACb,QAAS,CAAE,QAAAK,EAAS,SAAAG,EAAU,iBAAAX,CAAA,EAE9B,WAACwB,EAAA,CAAW,OAAQV,EAAU,SAAAD,EAAoB,KAAK,OAAA,CAAQ,CAAA,CAAA,CACjE,EAIJ,GAAIX,EAAS,CACX,MAAMyB,EAAe,CACnB,QACA,UACA,MACA,eACA,QACA,WACA,UAAA,EAEFzB,EAAQ,QAAS0B,GAAQ,CACvB,GACE,CAACD,EAAa,SAASC,EAAI,GAAG,GAC9B,CAAC,OAAO,UAAU,eAAe,KAAKZ,EAAKY,EAAI,GAAG,EAClD,CACA,MAAMC,EAAW,GACfD,EAAI,IAAI,OAAO,CAAC,EAAE,YAAA,EAAgBA,EAAI,IAAI,MAAM,CAAC,CACnD,OACME,EAAQ3B,GAAA,YAAAA,EAAgB0B,GAC1BC,IACFd,EAAIY,EAAI,GAAG,EACTX,EAACC,EAAA,CACC,KAAMW,EACN,KAAAC,EACA,QAAS,CAAE,QAAAtB,EAAS,SAAAG,EAAU,iBAAAX,CAAA,CAAiB,CAAA,EAIvD,CACF,CAAC,CACH,CAEA,OAAOgB,CACT,CAAC,EACA,CAAClB,EAAUD,EAAGG,EAAkBG,EAAOD,CAAO,CAAC,EAE5C,CAAC6B,EAAYC,CAAa,EAAIC,EAAS,EAAK,EAC5CC,EAAe3B,EAAQ,OAASN,EAChCkC,EACJD,GAAgB,CAACH,EACbxB,EAAQ,MAAM,EAAGN,CAA2B,EAC5CM,EAEN,OACEe,EAAC,MAAA,CACC,UAAW/B,EAAQ,CAAC,gCAAiCG,CAAS,CAAC,EAC/D,cAAY,gBAEZ,SAAA,CAAAuB,EAACmB,EAAA,CACC,QAAS9B,EACT,QAAS6B,EACT,QAAApC,EACA,aAAa,UACb,QAASF,EAAE,aACX,UAAU,sCAAA,CAAA,EAGXqC,GACCjB,EAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAACoB,EAAA,CACC,QAAQ,YACR,KAAK,SACL,QAAS,IAAML,EAAc,CAACD,CAAU,EACxC,UAAU,+CAET,SAAAA,EACG,GAAGlC,EAAE,UAAY,WAAW,GAC5B,GAAGA,EAAE,SAAW,UAAU,KAAKU,EAAQ,MAAM,GAAA,CAAA,CACnD,CACF,CAAA,CAAA,CAAA,CAIR,EAEa+B,EAAyBC,EAAK3C,CAA+B,ECvOpE4C,EAEF,CAAC,CACH,EAAA3C,EACA,QAAA4C,EACA,YAAAC,EACA,cAAAC,EACA,WAAAC,EAAa,GACb,cAAAC,EAAgB,EAChB,UAAAnD,EACA,MAAAS,CACF,IAEIc,EAAC,MAAA,CACC,UAAW1B,EAAQ,CAAC,mCAAoCG,CAAS,CAAC,EAClE,cAAY,mBAEZ,SAAAuB,EAACC,EAAA,CACC,KAAK,UACL,KAAMf,GAAA,YAAAA,EAAO,QACb,QAAS,CACP,QAAAsC,EACA,YAAAC,EACA,cAAeC,IAAkB,IAAM,IACvC,WAAAC,EACA,cAAAC,CAAA,EAGF,SAAAvB,EAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAL,EAACoB,EAAA,CACC,QAAQ,YACR,KAAK,SACL,QAASI,EACT,SAAUG,GAAcC,IAAkB,EAC1C,aAAYhD,EAAE,YAEb,SAAAA,EAAE,WAAA,CAAA,EAELoB,EAACoB,EAAA,CACC,QAAQ,UACR,KAAK,SACL,QAASK,EACT,SAAUE,GAAcC,IAAkB,EAC1C,aAAYhD,EAAE,gBAEb,SAAAA,EAAE,eAAA,CAAA,CACL,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAKOiD,EAA4BP,EACvCC,CACF,ECtEaO,EAAW,CAACC,EAAcC,IAAe,CACpD,IAAIC,EACJ,MAAMC,EAAc,YAAwBC,EAAa,CACvD,aAAaF,CAAS,EACtBA,EAAY,WAAW,IAAMF,EAAG,MAAM,KAAMI,CAAI,EAAGH,CAAE,CACvD,EACA,OAAAE,EAAY,OAAS,IAAM,CACzB,aAAaD,CAAS,CACxB,EACOC,CACT","x_google_ignoreList":[0,3]}
1
+ {"version":3,"file":"debounce.js","sources":["../../node_modules/@adobe-commerce/elsie/src/lib/classes.ts","/@dropins/storefront-quick-order/src/components/QuickOrderVariantsGrid/QuickOrderVariantsGrid.tsx","/@dropins/storefront-quick-order/src/components/QuickOrderVariantsActions/QuickOrderVariantsActions.tsx","../../node_modules/@adobe-commerce/elsie/src/lib/debounce.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\n// @ts-ignore\nimport { JSXInternal } from 'preact/src/jsx';\n\ntype ClassName = string | JSXInternal.SignalLike<string | undefined>;\n\nexport const classes = (\n classes: Array<ClassName | [ClassName, boolean] | undefined>\n) => {\n const result = classes.reduce((result, item) => {\n if (!item) return result;\n\n if (typeof item === 'string') result += ` ${item}`;\n\n if (Array.isArray(item)) {\n const [className, isActive] = item;\n if (className && isActive) {\n result += ` ${className}`;\n }\n }\n\n return result;\n }, '') as string;\n\n return result.trim();\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, memo, useMemo, useState } from 'preact/compat';\nimport {\n Table,\n Button,\n Price,\n Tag,\n Incrementer,\n} from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport {\n QuickOrderVariantsGridComponentProps,\n VariantRow,\n} from '@/b2b-quick-order/types';\nimport { Slot } from '@adobe-commerce/elsie/lib';\nimport '@/b2b-quick-order/components/QuickOrderVariantsGrid/QuickOrderVariantsGrid.css';\n\nconst QuickOrderVariantsGridComponent: FunctionComponent<\n QuickOrderVariantsGridComponentProps\n> = ({\n t,\n variants,\n loading = false,\n className,\n onQuantityChange,\n visibleVariantsLimit = 10,\n columns,\n slots,\n}) => {\n const defaultColumns = useMemo(\n () => [\n { key: 'image', label: t.imageColumn || 'Image' },\n { key: 'sku', label: t.skuColumn || 'SKU' },\n { key: 'availability', label: t.availabilityColumn || 'Availability' },\n { key: 'price', label: t.priceColumn || 'Price' },\n { key: 'quantity', label: t.quantityColumn || 'Quantity' },\n { key: 'subtotal', label: t.subtotalColumn || 'Subtotal' },\n ],\n [t]\n );\n\n const tableColumns = columns || defaultColumns;\n\n const rowData = useMemo<VariantRow[]>(() => {\n return variants.map((variant, index) => {\n const { product, quantity } = variant;\n\n const priceValue = product.price.final.amount.value;\n const currency = product.price.final.amount.currency;\n\n const subtotal = priceValue * quantity;\n\n const availability = product.inStock\n ? t.inStock || 'In Stock'\n : t.outOfStock || 'Out of Stock';\n\n const row: VariantRow = {\n id: `${product.sku}-${index}`,\n image: (\n <Slot\n name=\"ImageCell\"\n slot={slots?.ImageCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n {product.images[0]?.url && (\n <img\n src={product.images[0].url}\n alt={product.name}\n className=\"b2b-quick-order-variants-grid__image\"\n />\n )}\n </Slot>\n ),\n sku: (\n <Slot\n name=\"SKUCell\"\n slot={slots?.SKUCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n {product.sku}\n </Slot>\n ),\n availability: (\n <Slot\n name=\"AvailabilityCell\"\n slot={slots?.AvailabilityCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <Tag\n label={availability}\n className={classes([\n 'b2b-quick-order-variants-grid__availability',\n [\n 'b2b-quick-order-variants-grid__availability--in-stock',\n product.inStock,\n ],\n [\n 'b2b-quick-order-variants-grid__availability--out-of-stock',\n !product.inStock,\n ],\n ])}\n />\n </Slot>\n ),\n price: (\n <Slot\n name=\"PriceCell\"\n slot={slots?.PriceCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <Price amount={priceValue} currency={currency} size=\"small\" />\n </Slot>\n ),\n quantity: (\n <Slot\n name=\"QuantityCell\"\n slot={slots?.QuantityCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <div data-testid={`variant-quantity-input-${index}`}>\n <Incrementer\n value={quantity}\n min={0}\n disabled={!product.inStock}\n onValue={(newQuantity: number) => {\n onQuantityChange(product.sku, newQuantity);\n }}\n size=\"medium\"\n className=\"b2b-quick-order-variants-grid__quantity-input\"\n aria-label={`${t.quantityLabel || 'Quantity for'} ${\n product.sku\n }`}\n />\n </div>\n </Slot>\n ),\n subtotal: (\n <Slot\n name=\"SubtotalCell\"\n slot={slots?.SubtotalCell}\n context={{ variant, quantity, onQuantityChange }}\n >\n <Price amount={subtotal} currency={currency} size=\"small\" />\n </Slot>\n ),\n };\n\n if (columns) {\n const standardKeys = [\n 'image',\n 'variant',\n 'sku',\n 'availability',\n 'price',\n 'quantity',\n 'subtotal',\n ];\n columns.forEach((col) => {\n if (\n !standardKeys.includes(col.key) &&\n !Object.prototype.hasOwnProperty.call(row, col.key)\n ) {\n const slotName = `${\n col.key.charAt(0).toUpperCase() + col.key.slice(1)\n }Cell`;\n const slot = (slots as any)?.[slotName];\n if (slot) {\n row[col.key] = (\n <Slot\n name={slotName}\n slot={slot}\n context={{ variant, quantity, onQuantityChange }}\n />\n );\n }\n }\n });\n }\n\n return row;\n });\n }, [variants, t, onQuantityChange, slots, columns]);\n\n const [isExpanded, setIsExpanded] = useState(false);\n const hasMoreItems = rowData.length > visibleVariantsLimit;\n const displayedRowData =\n hasMoreItems && !isExpanded\n ? rowData.slice(0, visibleVariantsLimit)\n : rowData;\n\n return (\n <div\n className={classes(['b2b-quick-order-variants-grid', className])}\n data-testid=\"variants-grid\"\n >\n <Table\n columns={tableColumns}\n rowData={displayedRowData}\n loading={loading}\n mobileLayout=\"stacked\"\n className=\"b2b-quick-order-variants-grid__table\"\n />\n\n {hasMoreItems && (\n <div className=\"b2b-quick-order-variants-grid__footer\">\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"b2b-quick-order-variants-grid__toggle-button\"\n >\n {isExpanded\n ? `${t.showLess || 'Show Less'}`\n : `${t.showAll || 'Show All'} (${rowData.length})`}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nexport const QuickOrderVariantsGrid = memo(QuickOrderVariantsGridComponent);\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, memo } from 'preact/compat';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { QuickOrderVariantsActionsProps } from '@/b2b-quick-order/types';\nimport { Slot } from '@adobe-commerce/elsie/lib';\nimport '@/b2b-quick-order/components/QuickOrderVariantsActions/QuickOrderVariantsActions.css';\n\nconst QuickOrderVariantsActionsComponent: FunctionComponent<\n QuickOrderVariantsActionsProps\n> = ({\n t,\n onClear,\n onSaveToCsv,\n onCollectData,\n isDisabled = false,\n variantsCount = 0,\n className,\n slots,\n}) => {\n return (\n <div\n className={classes(['b2b-quick-order-variants-actions', className])}\n data-testid=\"variants-actions\"\n >\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n onClear,\n onSaveToCsv,\n onCollectData: onCollectData || (() => []),\n isDisabled,\n variantsCount,\n }}\n >\n <div className=\"b2b-quick-order-variants-actions__buttons\">\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={onClear}\n disabled={isDisabled || variantsCount === 0}\n aria-label={t.clearButton}\n data-testid=\"variants-clear-button\"\n >\n {t.clearButton}\n </Button>\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={onSaveToCsv}\n disabled={isDisabled || variantsCount === 0}\n aria-label={t.saveToCsvButton}\n data-testid=\"variants-save-csv-button\"\n >\n {t.saveToCsvButton}\n </Button>\n </div>\n </Slot>\n </div>\n );\n};\n\nexport const QuickOrderVariantsActions = memo(\n QuickOrderVariantsActionsComponent\n);\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const debounce = (fn: Function, ms: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n const debouncedFn = function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n debouncedFn.cancel = () => {\n clearTimeout(timeoutId);\n };\n return debouncedFn;\n};\n"],"names":["classes","result","item","className","isActive","QuickOrderVariantsGridComponent","t","variants","loading","onQuantityChange","visibleVariantsLimit","columns","slots","defaultColumns","useMemo","tableColumns","rowData","variant","index","product","quantity","priceValue","currency","subtotal","availability","row","jsx","Slot","_a","Tag","Price","Incrementer","newQuantity","standardKeys","col","slotName","slot","isExpanded","setIsExpanded","useState","hasMoreItems","displayedRowData","jsxs","Table","Button","QuickOrderVariantsGrid","memo","QuickOrderVariantsActionsComponent","onClear","onSaveToCsv","onCollectData","isDisabled","variantsCount","QuickOrderVariantsActions","debounce","fn","ms","timeoutId","debouncedFn","args"],"mappings":"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","x_google_ignoreList":[0,3]}
@@ -0,0 +1,10 @@
1
+ /*! Copyright 2026 Adobe
2
+ All Rights Reserved. */
3
+ import{Initializer as c}from"@dropins/tools/lib.js";import{FetchGraphQL as a}from"@dropins/tools/fetch-graphql.js";import{events as n}from"@dropins/tools/event-bus.js";const i=new c({init:async r=>{const e={quickOrderActive:!1};try{const t=await g();e.quickOrderActive=t.storeConfig.quickOrderActive}catch(t){console.error("[Quick Order] Failed to fetch store config:",t)}i.config.setConfig({...e,...r})},listeners:()=>[]}),m=i.config,{setEndpoint:C,setFetchGraphQlHeader:k,removeFetchGraphQlHeader:G,setFetchGraphQlHeaders:O,fetchGraphQl:s,getConfig:p}=new a().getMethods(),f=`
4
+ query GET_STORE_CONFIG {
5
+ storeConfig {
6
+ quickorder_active
7
+ }
8
+ }
9
+ `,h=r=>{throw r instanceof DOMException&&r.name==="AbortError"||n.emit("b2b-quick-order/error",{source:"auth",type:"network",error:r}),r},d=r=>{const e=r.map(t=>t.message).join(" ");throw Error(e)},g=async()=>await s(f,{method:"GET",cache:"force-cache"}).then(r=>{var e,t,o;return(e=r.errors)!=null&&e.length?d(r.errors):{storeConfig:{quickOrderActive:((o=(t=r==null?void 0:r.data)==null?void 0:t.storeConfig)==null?void 0:o.quickorder_active)??!1}}}).catch(h);export{g as a,k as b,m as c,O as d,s as f,p as g,i,G as r,C as s};
10
+ //# sourceMappingURL=getStoreConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getStoreConfig.js","sources":["/@dropins/storefront-quick-order/src/api/initialize/initialize.ts","/@dropins/storefront-quick-order/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-quick-order/src/api/getStoreConfig/graphql/getStoreConfig.graphql.ts","/@dropins/storefront-quick-order/src/lib/network-error.ts","/@dropins/storefront-quick-order/src/lib/fetch-error.ts","/@dropins/storefront-quick-order/src/api/getStoreConfig/getStoreConfig.ts"],"sourcesContent":["import { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { getStoreConfig } from '@/b2b-quick-order/api';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n quickOrderActive?: boolean;\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig: Partial<ConfigProps> = {\n quickOrderActive: false,\n };\n\n try {\n const storeConfigResponse = await getStoreConfig();\n defaultConfig.quickOrderActive =\n storeConfigResponse.storeConfig.quickOrderActive;\n } catch (error) {\n console.error('[Quick Order] Failed to fetch store config:', error);\n }\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [],\n});\n\nexport const config = initialize.config;\n","import { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nexport const GET_STORE_CONFIG = /* GraphQL */ `\n query GET_STORE_CONFIG {\n storeConfig {\n quickorder_active\n }\n }\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { events } from '@adobe-commerce/event-bus';\n\n/**\n * A function which can be attached to fetchGraphQL to handle thrown errors in\n * a generic way.\n */\nexport const handleNetworkError = (error: Error) => {\n const isAbortError =\n error instanceof DOMException && error.name === 'AbortError';\n\n if (!isAbortError) {\n events.emit('b2b-quick-order/error', {\n source: 'auth',\n type: 'network',\n error,\n });\n }\n throw error;\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/** Actions */\nexport const handleFetchError = (errors: Array<{ message: string }>) => {\n const errorMessage = errors.map((e: any) => e.message).join(' ');\n\n throw Error(errorMessage);\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { fetchGraphQl } from '../fetch-graphql';\nimport { GET_STORE_CONFIG } from './graphql/getStoreConfig.graphql';\nimport { handleNetworkError } from '@/b2b-quick-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-quick-order/lib/fetch-error';\n\nexport const getStoreConfig = async (): Promise<{\n storeConfig: {\n quickOrderActive: boolean;\n };\n}> => {\n return await fetchGraphQl(GET_STORE_CONFIG, {\n method: 'GET',\n cache: 'force-cache',\n })\n .then((response) => {\n if (response.errors?.length) return handleFetchError(response.errors);\n\n return {\n storeConfig: {\n quickOrderActive:\n response?.data?.storeConfig?.quickorder_active ?? false,\n },\n };\n })\n .catch(handleNetworkError);\n};\n"],"names":["initialize","Initializer","config","defaultConfig","storeConfigResponse","getStoreConfig","error","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","GET_STORE_CONFIG","handleNetworkError","events","handleFetchError","errors","errorMessage","e","response","_a","_c","_b"],"mappings":"wKASO,MAAMA,EAAa,IAAIC,EAAyB,CACrD,KAAM,MAAOC,GAAW,CACtB,MAAMC,EAAsC,CAC1C,iBAAkB,EAAA,EAGpB,GAAI,CACF,MAAMC,EAAsB,MAAMC,EAAA,EAClCF,EAAc,iBACZC,EAAoB,YAAY,gBACpC,OAASE,EAAO,CACd,QAAQ,MAAM,8CAA+CA,CAAK,CACpE,CAEAN,EAAW,OAAO,UAAU,CAAE,GAAGG,EAAe,GAAGD,EAAQ,CAC7D,EAEA,UAAW,IAAM,CAAA,CACnB,CAAC,EAEYA,EAASF,EAAW,OC3BpB,CACX,YAAAO,EACA,sBAAAC,EACA,yBAAAC,EACA,uBAAAC,EACA,aAAAC,EACA,UAAAC,CACF,EAAI,IAAIC,EAAA,EAAe,WAAA,ECQVC,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECMjCC,EAAsBT,GAAiB,CAIlD,MAFEA,aAAiB,cAAgBA,EAAM,OAAS,cAGhDU,EAAO,KAAK,wBAAyB,CACnC,OAAQ,OACR,KAAM,UACN,MAAAV,CAAA,CACD,EAEGA,CACR,ECjBaW,EAAoBC,GAAuC,CACtE,MAAMC,EAAeD,EAAO,IAAKE,GAAWA,EAAE,OAAO,EAAE,KAAK,GAAG,EAE/D,MAAM,MAAMD,CAAY,CAC1B,ECAad,EAAiB,SAKrB,MAAMM,EAAaG,EAAkB,CAC1C,OAAQ,MACR,MAAO,aAAA,CACR,EACE,KAAMO,GAAa,WAClB,OAAIC,EAAAD,EAAS,SAAT,MAAAC,EAAiB,OAAeL,EAAiBI,EAAS,MAAM,EAE7D,CACL,YAAa,CACX,mBACEE,GAAAC,EAAAH,GAAA,YAAAA,EAAU,OAAV,YAAAG,EAAgB,cAAhB,YAAAD,EAA6B,oBAAqB,EAAA,CACtD,CAEJ,CAAC,EACA,MAAMR,CAAkB"}
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as v}from"@dropins/tools/preact-jsx-runtime.js";import{Q as V,C as S}from"../chunks/QuickOrderDisabledOverlay.js";import"@dropins/tools/components.js";import{classes as w}from"@dropins/tools/lib.js";import"../chunks/debounce.js";import{useState as k,useCallback as f}from"@dropins/tools/preact-hooks.js";import{events as h}from"@dropins/tools/event-bus.js";import{useText as Q}from"@dropins/tools/i18n.js";import{c as y}from"../chunks/initialize.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/fetch-graphql.js";const F=l=>l.trim().replace(/^["']|["']$/g,""),O=200,I=(l,t)=>{const i=l.replace(/^\uFEFF/,"").trim().split(/\r?\n|\r/);if(!i.some(e=>e.trim()))return{isValid:!1,error:t.emptyFile};const a=i[0].split(",").map(e=>F(e).toLowerCase()),r=a.indexOf("sku"),c=a.indexOf("qty");if(r===-1||c===-1)return{isValid:!1,error:t.missingColumns};if(a.length!==2)return{isValid:!1,error:t.extraColumns};if(i.length-1>O)return{isValid:!1,error:t.maxRowsExceeded.replace("{maxRows}",O.toString())};const d=[];for(let e=1;e<i.length;e++){const s=i[e].trim();if(!s)continue;const u=s.split(",").map(x=>F(x)),o=u[r],C=u[c];if(!o)return{isValid:!1,error:t.skuRequired.replace("{rowNumber}",e.toString())};const n=parseInt(C,10);if(isNaN(n)||n<=0||!Number.isInteger(n))return{isValid:!1,error:t.invalidQuantity.replace("{rowNumber}",e.toString())};d.push({sku:o,quantity:n})}return d.length===0?{isValid:!1,error:t.noValidData}:{isValid:!0,data:d}},b=({routeSampleCSV:l,onFileUpload:t})=>{const[m,i]=k(null),[p,a]=k(null),r=Q({invalidFile:"QuickOrder.CsvFileInput.uploadCSVErrors.invalidFile",emptyFile:"QuickOrder.CsvFileInput.uploadCSVErrors.emptyFile",missingColumns:"QuickOrder.CsvFileInput.uploadCSVErrors.missingColumns",extraColumns:"QuickOrder.CsvFileInput.uploadCSVErrors.extraColumns",maxRowsExceeded:"QuickOrder.CsvFileInput.uploadCSVErrors.maxRowsExceeded",skuRequired:"QuickOrder.CsvFileInput.uploadCSVErrors.skuRequired",invalidQuantity:"QuickOrder.CsvFileInput.uploadCSVErrors.invalidQuantity",noValidData:"QuickOrder.CsvFileInput.uploadCSVErrors.noValidData",onlyCSV:"QuickOrder.CsvFileInput.uploadCSVErrors.onlyCSV",failedToRead:"QuickOrder.CsvFileInput.uploadCSVErrors.failedToRead",failedToParse:"QuickOrder.CsvFileInput.uploadCSVErrors.failedToParse"}),c=f(e=>{if(i(null),a(e.name),!e.name.toLowerCase().endsWith(".csv")){i(r.onlyCSV);return}const s=new FileReader;s.onload=u=>{var o;try{const C=(o=u.target)==null?void 0:o.result,n=I(C,{emptyFile:r.emptyFile,missingColumns:r.missingColumns,extraColumns:r.extraColumns,maxRowsExceeded:r.maxRowsExceeded,skuRequired:r.skuRequired,invalidQuantity:r.invalidQuantity,noValidData:r.noValidData});if(!n.isValid){i(n.error);return}t?t(n.data):h.emit("quick-order/add-items",n.data),a(null),i(null)}catch{i(r.failedToParse)}},s.onerror=()=>{i(r.failedToRead)},s.readAsText(e)},[t,r]),d=f(()=>{if(l)window.open(l(),"_blank");else{const e=`SKU,QTY
3
+ import{jsx as v}from"@dropins/tools/preact-jsx-runtime.js";import{Q as V,C as S}from"../chunks/QuickOrderDisabledOverlay.js";import"@dropins/tools/components.js";import{classes as w}from"@dropins/tools/lib.js";import"../chunks/debounce.js";import{useState as k,useCallback as f}from"@dropins/tools/preact-hooks.js";import{events as h}from"@dropins/tools/event-bus.js";import{useText as Q}from"@dropins/tools/i18n.js";import{c as y}from"../chunks/getStoreConfig.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/fetch-graphql.js";const F=l=>l.trim().replace(/^["']|["']$/g,""),O=200,I=(l,t)=>{const i=l.replace(/^\uFEFF/,"").trim().split(/\r?\n|\r/);if(!i.some(e=>e.trim()))return{isValid:!1,error:t.emptyFile};const a=i[0].split(",").map(e=>F(e).toLowerCase()),r=a.indexOf("sku"),c=a.indexOf("qty");if(r===-1||c===-1)return{isValid:!1,error:t.missingColumns};if(a.length!==2)return{isValid:!1,error:t.extraColumns};if(i.length-1>O)return{isValid:!1,error:t.maxRowsExceeded.replace("{maxRows}",O.toString())};const d=[];for(let e=1;e<i.length;e++){const s=i[e].trim();if(!s)continue;const u=s.split(",").map(x=>F(x)),o=u[r],C=u[c];if(!o)return{isValid:!1,error:t.skuRequired.replace("{rowNumber}",e.toString())};const n=parseInt(C,10);if(isNaN(n)||n<=0||!Number.isInteger(n))return{isValid:!1,error:t.invalidQuantity.replace("{rowNumber}",e.toString())};d.push({sku:o,quantity:n})}return d.length===0?{isValid:!1,error:t.noValidData}:{isValid:!0,data:d}},b=({routeSampleCSV:l,onFileUpload:t})=>{const[m,i]=k(null),[p,a]=k(null),r=Q({invalidFile:"QuickOrder.CsvFileInput.uploadCSVErrors.invalidFile",emptyFile:"QuickOrder.CsvFileInput.uploadCSVErrors.emptyFile",missingColumns:"QuickOrder.CsvFileInput.uploadCSVErrors.missingColumns",extraColumns:"QuickOrder.CsvFileInput.uploadCSVErrors.extraColumns",maxRowsExceeded:"QuickOrder.CsvFileInput.uploadCSVErrors.maxRowsExceeded",skuRequired:"QuickOrder.CsvFileInput.uploadCSVErrors.skuRequired",invalidQuantity:"QuickOrder.CsvFileInput.uploadCSVErrors.invalidQuantity",noValidData:"QuickOrder.CsvFileInput.uploadCSVErrors.noValidData",onlyCSV:"QuickOrder.CsvFileInput.uploadCSVErrors.onlyCSV",failedToRead:"QuickOrder.CsvFileInput.uploadCSVErrors.failedToRead",failedToParse:"QuickOrder.CsvFileInput.uploadCSVErrors.failedToParse"}),c=f(e=>{if(i(null),a(e.name),!e.name.toLowerCase().endsWith(".csv")){i(r.onlyCSV);return}const s=new FileReader;s.onload=u=>{var o;try{const C=(o=u.target)==null?void 0:o.result,n=I(C,{emptyFile:r.emptyFile,missingColumns:r.missingColumns,extraColumns:r.extraColumns,maxRowsExceeded:r.maxRowsExceeded,skuRequired:r.skuRequired,invalidQuantity:r.invalidQuantity,noValidData:r.noValidData});if(!n.isValid){i(n.error);return}t?t(n.data):h.emit("quick-order/add-items",n.data),a(null),i(null)}catch{i(r.failedToParse)}},s.onerror=()=>{i(r.failedToRead)},s.readAsText(e)},[t,r]),d=f(()=>{if(l)window.open(l(),"_blank");else{const e=`SKU,QTY
4
4
  SKU123,1
5
5
  SKU456,2
6
6
  SKU789,3`,s=new Blob([e],{type:"text/csv"}),u=URL.createObjectURL(s),o=document.createElement("a");o.href=u,o.download="sample-quick-order.csv",document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(u)}},[l]);return{handleFileUpload:c,error:m,fileName:p,handleDownloadSample:d,showSampleDownload:!0}},M=({className:l,routeSampleCSV:t,onFileUpload:m})=>{const i=y.getConfig().quickOrderActive,p=Q({title:"QuickOrder.CsvFileInput.title",helperText:"QuickOrder.CsvFileInput.helperText",downloadSample:"QuickOrder.CsvFileInput.downloadSample",inputLabel:"QuickOrder.CsvFileInput.inputLabel",selectedFile:"QuickOrder.CsvFileInput.selectedFile",disabledMessage:"QuickOrder.QuickOrderItem.disabledMessage"}),{handleFileUpload:a,error:r,fileName:c,handleDownloadSample:d,showSampleDownload:e}=b({routeSampleCSV:t,onFileUpload:m});return v("div",{className:w(["b2b-quick-order-quick-order-upload-csv",l]),"data-testid":"quick-order-upload-csv",children:v(V,{isDisabled:!i,message:p.disabledMessage,children:v(S,{t:p,onFileUpload:a,error:r,fileName:c,onDownloadSample:d,showSampleDownload:e})})})};export{M as QuickOrderCsvUpload,M as default};
@@ -1 +1 @@
1
- {"version":3,"file":"QuickOrderCsvUpload.js","sources":["/@dropins/storefront-quick-order/src/lib/cleanCsvValue.ts","/@dropins/storefront-quick-order/src/lib/validateCsvContent.ts","/@dropins/storefront-quick-order/src/hooks/useQuickOrderCsvUpload.tsx","/@dropins/storefront-quick-order/src/containers/QuickOrderCsvUpload/QuickOrderCsvUpload.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * Cleans CSV value by removing surrounding quotes and trimming whitespace\n * Handles both double quotes (\") and single quotes (')\n * @param val - The raw CSV value to clean\n * @returns Cleaned string value\n */\nexport const cleanCsvValue = (val: string): string =>\n val.trim().replace(/^[\"']|[\"']$/g, '');\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CSVValidationResult, SubmitSkuValue } from '@/b2b-quick-order/types';\nimport { cleanCsvValue } from './cleanCsvValue';\n\n// Maximum number of rows allowed in CSV\nconst MAX_ROWS = 200;\n\nexport interface ValidationMessages {\n emptyFile: string;\n missingColumns: string;\n extraColumns: string;\n maxRowsExceeded: string;\n skuRequired: string;\n invalidQuantity: string;\n noValidData: string;\n}\n\n/**\n * Validates CSV content and extracts SKU/quantity data\n * Handles BOM, different line endings, quoted values, and empty lines\n * @param content - Raw CSV file content\n * @param messages - Localized error messages\n * @returns Validation result with data or error\n */\nexport const validateCsvContent = (\n content: string,\n messages: ValidationMessages\n): CSVValidationResult => {\n // Remove BOM if present\n const cleanContent = content.replace(/^\\uFEFF/, '');\n\n // Split by different line endings (handle \\r\\n, \\n, \\r)\n const lines = cleanContent.trim().split(/\\r?\\n|\\r/);\n\n // Check if file is effectively empty after removing empty lines\n const hasContent = lines.some((line) => line.trim());\n if (!hasContent) {\n return { isValid: false, error: messages.emptyFile };\n }\n\n const header = lines[0]\n .split(',')\n .map((col) => cleanCsvValue(col).toLowerCase());\n const skuIndex = header.indexOf('sku');\n const qtyIndex = header.indexOf('qty');\n\n if (skuIndex === -1 || qtyIndex === -1) {\n return {\n isValid: false,\n error: messages.missingColumns,\n };\n }\n\n if (header.length !== 2) {\n return {\n isValid: false,\n error: messages.extraColumns,\n };\n }\n\n if (lines.length - 1 > MAX_ROWS) {\n return {\n isValid: false,\n error: messages.maxRowsExceeded.replace('{maxRows}', MAX_ROWS.toString()),\n };\n }\n\n const data: SubmitSkuValue = [];\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n const values = line.split(',').map((val) => cleanCsvValue(val));\n const sku = values[skuIndex];\n const qty = values[qtyIndex];\n\n if (!sku) {\n return {\n isValid: false,\n error: messages.skuRequired.replace('{rowNumber}', i.toString()),\n };\n }\n\n const quantity = parseInt(qty, 10);\n if (isNaN(quantity) || quantity <= 0 || !Number.isInteger(quantity)) {\n return {\n isValid: false,\n error: messages.invalidQuantity.replace('{rowNumber}', i.toString()),\n };\n }\n\n data.push({ sku, quantity });\n }\n\n if (data.length === 0) {\n return { isValid: false, error: messages.noValidData };\n }\n\n return { isValid: true, data };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useCallback, useState } from 'preact/hooks';\nimport {\n UseQuickOrderCsvUploadProps,\n UseQuickOrderCsvUploadReturn,\n} from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { validateCsvContent } from '@/b2b-quick-order/lib';\n\nexport const useQuickOrderCsvUpload = ({\n routeSampleCSV,\n onFileUpload,\n}: UseQuickOrderCsvUploadProps): UseQuickOrderCsvUploadReturn => {\n const [error, setError] = useState<string | null>(null);\n const [fileName, setFileName] = useState<string | null>(null);\n\n const t = useText({\n invalidFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidFile',\n emptyFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.emptyFile',\n missingColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.missingColumns',\n extraColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.extraColumns',\n maxRowsExceeded: 'QuickOrder.CsvFileInput.uploadCSVErrors.maxRowsExceeded',\n skuRequired: 'QuickOrder.CsvFileInput.uploadCSVErrors.skuRequired',\n invalidQuantity: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidQuantity',\n noValidData: 'QuickOrder.CsvFileInput.uploadCSVErrors.noValidData',\n onlyCSV: 'QuickOrder.CsvFileInput.uploadCSVErrors.onlyCSV',\n failedToRead: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToRead',\n failedToParse: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToParse',\n });\n\n const handleFileUpload = useCallback(\n (file: File) => {\n setError(null);\n setFileName(file.name);\n\n if (!file.name.toLowerCase().endsWith('.csv')) {\n setError(t.onlyCSV);\n return;\n }\n\n const reader = new FileReader();\n\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const validation = validateCsvContent(content, {\n emptyFile: t.emptyFile,\n missingColumns: t.missingColumns,\n extraColumns: t.extraColumns,\n maxRowsExceeded: t.maxRowsExceeded,\n skuRequired: t.skuRequired,\n invalidQuantity: t.invalidQuantity,\n noValidData: t.noValidData,\n });\n\n if (!validation.isValid) {\n setError(validation.error!);\n return;\n }\n\n // Success - emit event or call custom callback\n if (onFileUpload) {\n onFileUpload(validation.data!);\n } else {\n events.emit('quick-order/add-items', validation.data!);\n }\n\n // Reset state after successful upload\n setFileName(null);\n setError(null);\n } catch (err) {\n setError(t.failedToParse);\n }\n };\n\n reader.onerror = () => {\n setError(t.failedToRead);\n };\n\n reader.readAsText(file);\n },\n [onFileUpload, t]\n );\n\n const handleDownloadSample = useCallback(() => {\n if (routeSampleCSV) {\n window.open(routeSampleCSV(), '_blank');\n } else {\n const csvContent = 'SKU,QTY\\nSKU123,1\\nSKU456,2\\nSKU789,3';\n const blob = new Blob([csvContent], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'sample-quick-order.csv';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n }, [routeSampleCSV]);\n\n return {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload: true,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CsvFileInput } from '@/b2b-quick-order/components/CsvFileInput';\nimport { QuickOrderDisabledOverlay } from '@/b2b-quick-order/components';\nimport { useQuickOrderCsvUpload } from '@/b2b-quick-order/hooks/useQuickOrderCsvUpload';\nimport { QuickOrderCsvUploadProps } from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { config } from '@/b2b-quick-order/api/initialize';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\n\nexport const QuickOrderCsvUpload: Container<QuickOrderCsvUploadProps> = ({\n className,\n routeSampleCSV,\n onFileUpload,\n}) => {\n const isQuickOrderActive = config.getConfig().quickOrderActive;\n\n const t = useText({\n title: 'QuickOrder.CsvFileInput.title',\n helperText: 'QuickOrder.CsvFileInput.helperText',\n downloadSample: 'QuickOrder.CsvFileInput.downloadSample',\n inputLabel: 'QuickOrder.CsvFileInput.inputLabel',\n selectedFile: 'QuickOrder.CsvFileInput.selectedFile',\n disabledMessage: 'QuickOrder.QuickOrderItem.disabledMessage',\n });\n\n const {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload,\n } = useQuickOrderCsvUpload({\n routeSampleCSV,\n onFileUpload,\n });\n\n return (\n <div\n className={classes(['b2b-quick-order-quick-order-upload-csv', className])}\n data-testid=\"quick-order-upload-csv\"\n >\n <QuickOrderDisabledOverlay\n isDisabled={!isQuickOrderActive}\n message={t.disabledMessage}\n >\n <CsvFileInput\n t={t}\n onFileUpload={handleFileUpload}\n error={error}\n fileName={fileName}\n onDownloadSample={handleDownloadSample}\n showSampleDownload={showSampleDownload}\n />\n </QuickOrderDisabledOverlay>\n </div>\n );\n};\n"],"names":["cleanCsvValue","val","MAX_ROWS","validateCsvContent","content","messages","lines","line","header","col","skuIndex","qtyIndex","data","i","values","sku","qty","quantity","useQuickOrderCsvUpload","routeSampleCSV","onFileUpload","error","setError","useState","fileName","setFileName","t","useText","handleFileUpload","useCallback","file","reader","e","_a","validation","events","handleDownloadSample","csvContent","blob","url","link","QuickOrderCsvUpload","className","isQuickOrderActive","config","showSampleDownload","jsx","classes","QuickOrderDisabledOverlay","CsvFileInput"],"mappings":"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"}
1
+ {"version":3,"file":"QuickOrderCsvUpload.js","sources":["/@dropins/storefront-quick-order/src/lib/cleanCsvValue.ts","/@dropins/storefront-quick-order/src/lib/validateCsvContent.ts","/@dropins/storefront-quick-order/src/hooks/useQuickOrderCsvUpload.tsx","/@dropins/storefront-quick-order/src/containers/QuickOrderCsvUpload/QuickOrderCsvUpload.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * Cleans CSV value by removing surrounding quotes and trimming whitespace\n * Handles both double quotes (\") and single quotes (')\n * @param val - The raw CSV value to clean\n * @returns Cleaned string value\n */\nexport const cleanCsvValue = (val: string): string =>\n val.trim().replace(/^[\"']|[\"']$/g, '');\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CSVValidationResult, SubmitSkuValue } from '@/b2b-quick-order/types';\nimport { cleanCsvValue } from './cleanCsvValue';\n\n// Maximum number of rows allowed in CSV\nconst MAX_ROWS = 200;\n\nexport interface ValidationMessages {\n emptyFile: string;\n missingColumns: string;\n extraColumns: string;\n maxRowsExceeded: string;\n skuRequired: string;\n invalidQuantity: string;\n noValidData: string;\n}\n\n/**\n * Validates CSV content and extracts SKU/quantity data\n * Handles BOM, different line endings, quoted values, and empty lines\n * @param content - Raw CSV file content\n * @param messages - Localized error messages\n * @returns Validation result with data or error\n */\nexport const validateCsvContent = (\n content: string,\n messages: ValidationMessages\n): CSVValidationResult => {\n // Remove BOM if present\n const cleanContent = content.replace(/^\\uFEFF/, '');\n\n // Split by different line endings (handle \\r\\n, \\n, \\r)\n const lines = cleanContent.trim().split(/\\r?\\n|\\r/);\n\n // Check if file is effectively empty after removing empty lines\n const hasContent = lines.some((line) => line.trim());\n if (!hasContent) {\n return { isValid: false, error: messages.emptyFile };\n }\n\n const header = lines[0]\n .split(',')\n .map((col) => cleanCsvValue(col).toLowerCase());\n const skuIndex = header.indexOf('sku');\n const qtyIndex = header.indexOf('qty');\n\n if (skuIndex === -1 || qtyIndex === -1) {\n return {\n isValid: false,\n error: messages.missingColumns,\n };\n }\n\n if (header.length !== 2) {\n return {\n isValid: false,\n error: messages.extraColumns,\n };\n }\n\n if (lines.length - 1 > MAX_ROWS) {\n return {\n isValid: false,\n error: messages.maxRowsExceeded.replace('{maxRows}', MAX_ROWS.toString()),\n };\n }\n\n const data: SubmitSkuValue = [];\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n const values = line.split(',').map((val) => cleanCsvValue(val));\n const sku = values[skuIndex];\n const qty = values[qtyIndex];\n\n if (!sku) {\n return {\n isValid: false,\n error: messages.skuRequired.replace('{rowNumber}', i.toString()),\n };\n }\n\n const quantity = parseInt(qty, 10);\n if (isNaN(quantity) || quantity <= 0 || !Number.isInteger(quantity)) {\n return {\n isValid: false,\n error: messages.invalidQuantity.replace('{rowNumber}', i.toString()),\n };\n }\n\n data.push({ sku, quantity });\n }\n\n if (data.length === 0) {\n return { isValid: false, error: messages.noValidData };\n }\n\n return { isValid: true, data };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useCallback, useState } from 'preact/hooks';\nimport {\n UseQuickOrderCsvUploadProps,\n UseQuickOrderCsvUploadReturn,\n} from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { validateCsvContent } from '@/b2b-quick-order/lib';\n\nexport const useQuickOrderCsvUpload = ({\n routeSampleCSV,\n onFileUpload,\n}: UseQuickOrderCsvUploadProps): UseQuickOrderCsvUploadReturn => {\n const [error, setError] = useState<string | null>(null);\n const [fileName, setFileName] = useState<string | null>(null);\n\n const t = useText({\n invalidFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidFile',\n emptyFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.emptyFile',\n missingColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.missingColumns',\n extraColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.extraColumns',\n maxRowsExceeded: 'QuickOrder.CsvFileInput.uploadCSVErrors.maxRowsExceeded',\n skuRequired: 'QuickOrder.CsvFileInput.uploadCSVErrors.skuRequired',\n invalidQuantity: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidQuantity',\n noValidData: 'QuickOrder.CsvFileInput.uploadCSVErrors.noValidData',\n onlyCSV: 'QuickOrder.CsvFileInput.uploadCSVErrors.onlyCSV',\n failedToRead: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToRead',\n failedToParse: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToParse',\n });\n\n const handleFileUpload = useCallback(\n (file: File) => {\n setError(null);\n setFileName(file.name);\n\n if (!file.name.toLowerCase().endsWith('.csv')) {\n setError(t.onlyCSV);\n return;\n }\n\n const reader = new FileReader();\n\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const validation = validateCsvContent(content, {\n emptyFile: t.emptyFile,\n missingColumns: t.missingColumns,\n extraColumns: t.extraColumns,\n maxRowsExceeded: t.maxRowsExceeded,\n skuRequired: t.skuRequired,\n invalidQuantity: t.invalidQuantity,\n noValidData: t.noValidData,\n });\n\n if (!validation.isValid) {\n setError(validation.error!);\n return;\n }\n\n // Success - emit event or call custom callback\n if (onFileUpload) {\n onFileUpload(validation.data!);\n } else {\n events.emit('quick-order/add-items', validation.data!);\n }\n\n // Reset state after successful upload\n setFileName(null);\n setError(null);\n } catch (err) {\n setError(t.failedToParse);\n }\n };\n\n reader.onerror = () => {\n setError(t.failedToRead);\n };\n\n reader.readAsText(file);\n },\n [onFileUpload, t]\n );\n\n const handleDownloadSample = useCallback(() => {\n if (routeSampleCSV) {\n window.open(routeSampleCSV(), '_blank');\n } else {\n const csvContent = 'SKU,QTY\\nSKU123,1\\nSKU456,2\\nSKU789,3';\n const blob = new Blob([csvContent], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'sample-quick-order.csv';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n }, [routeSampleCSV]);\n\n return {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload: true,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CsvFileInput } from '@/b2b-quick-order/components/CsvFileInput';\nimport { QuickOrderDisabledOverlay } from '@/b2b-quick-order/components';\nimport { useQuickOrderCsvUpload } from '@/b2b-quick-order/hooks/useQuickOrderCsvUpload';\nimport { QuickOrderCsvUploadProps } from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { config } from '@/b2b-quick-order/api/initialize';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\n\nexport const QuickOrderCsvUpload: Container<QuickOrderCsvUploadProps> = ({\n className,\n routeSampleCSV,\n onFileUpload,\n}) => {\n const isQuickOrderActive = config.getConfig().quickOrderActive;\n\n const t = useText({\n title: 'QuickOrder.CsvFileInput.title',\n helperText: 'QuickOrder.CsvFileInput.helperText',\n downloadSample: 'QuickOrder.CsvFileInput.downloadSample',\n inputLabel: 'QuickOrder.CsvFileInput.inputLabel',\n selectedFile: 'QuickOrder.CsvFileInput.selectedFile',\n disabledMessage: 'QuickOrder.QuickOrderItem.disabledMessage',\n });\n\n const {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload,\n } = useQuickOrderCsvUpload({\n routeSampleCSV,\n onFileUpload,\n });\n\n return (\n <div\n className={classes(['b2b-quick-order-quick-order-upload-csv', className])}\n data-testid=\"quick-order-upload-csv\"\n >\n <QuickOrderDisabledOverlay\n isDisabled={!isQuickOrderActive}\n message={t.disabledMessage}\n >\n <CsvFileInput\n t={t}\n onFileUpload={handleFileUpload}\n error={error}\n fileName={fileName}\n onDownloadSample={handleDownloadSample}\n showSampleDownload={showSampleDownload}\n />\n </QuickOrderDisabledOverlay>\n </div>\n );\n};\n"],"names":["cleanCsvValue","val","MAX_ROWS","validateCsvContent","content","messages","lines","line","header","col","skuIndex","qtyIndex","data","i","values","sku","qty","quantity","useQuickOrderCsvUpload","routeSampleCSV","onFileUpload","error","setError","useState","fileName","setFileName","t","useText","handleFileUpload","useCallback","file","reader","e","_a","validation","events","handleDownloadSample","csvContent","blob","url","link","QuickOrderCsvUpload","className","isQuickOrderActive","config","showSampleDownload","jsx","classes","QuickOrderDisabledOverlay","CsvFileInput"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as v,jsxs as D}from"@dropins/tools/preact-jsx-runtime.js";import{AlertBanner as rr}from"@dropins/tools/components.js";import{Q as tr,a as er}from"../chunks/QuickOrderDisabledOverlay.js";import{classes as P}from"@dropins/tools/lib.js";import"../chunks/debounce.js";import{useState as R,useRef as J,useCallback as A,useEffect as y}from"@dropins/tools/preact-hooks.js";import{events as S}from"@dropins/tools/event-bus.js";import{useText as z}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-compat.js";import{c as nr}from"../chunks/initialize.js";import"@dropins/tools/fetch-graphql.js";const sr=["sku","parentSku","quantity","optionsUIDs","valid","productType"],ir=e=>{const t=[],r=[];return e.forEach((n,u)=>{if(sr.includes(u))return;const i=n;i&&i.match(/^[A-Za-z0-9+/=]+$/)?t.push(i):r.push({uid:u,value:i})}),{optionUIDs:t,enteredOptions:r}},or=e=>{const t=Number(e.get("quantity")),r=!t||t<1?1:t,n={sku:e.get("sku"),quantity:r},u=e.get("parentSku");u&&(n.parentSku=u);const{optionUIDs:i,enteredOptions:a}=ir(e);return i.length>0&&(n.optionsUIDs=i),a.length>0&&(n.enteredOptions=a),n},_={sku:"",quantity:1,name:"",images:[],inStock:!1,addToCartAllowed:!1,isBundle:!1,prices:{},attributes:[],options:[],url:"",urlKey:"",externalId:"",productType:"simple",shortDescription:"",metaDescription:"",metaKeyword:"",metaTitle:"",description:""},L=(e,t)=>!t||!Array.isArray(t)?e.map(r=>({..._,sku:r.sku,quantity:r.quantity??1})):e.map(r=>{const n=t.find(u=>(u==null?void 0:u.sku)===(r==null?void 0:r.sku));return n?{...n,...r.variantSku&&{variantSku:r.variantSku},quantity:r.quantity??1}:{..._,sku:r.sku,...r.variantSku&&{variantSku:r.variantSku},quantity:r.quantity??1}}),K=e=>e.length===0?!1:e.every(t=>!((t.urlKey||t.url)&&t.name)||t.inStock===!1?!1:t.options&&t.options.length>0?t.options.some(i=>i.required)?t.options.every(i=>{var a;return i.required?(a=i.items)==null?void 0:a.some(l=>l.selected):!0}):t.options.some(i=>i.items&&i.items.length>0&&i.items.some(a=>a.selected===!0)):!0),x=e=>{const t=[];return e.forEach(r=>{if(!((r.urlKey||r.url)&&r.name)){t.push({sku:r.sku,name:r.name||"Unknown",reason:"incomplete_data"});return}if(r.inStock===!1){t.push({sku:r.sku,name:r.name,reason:"out_of_stock"});return}if(r.options&&r.options.length>0){if(r.options.some(a=>a.required)){r.options.every(l=>{var h;return l.required?(h=l.items)==null?void 0:h.some(Q=>Q.selected):!0})||t.push({sku:r.sku,name:r.name,reason:"missing_required_options"});return}r.options.some(a=>a.items&&a.items.length>0&&a.items.some(l=>l.selected===!0))||t.push({sku:r.sku,name:r.name,reason:"missing_options"})}}),t},w=e=>`quick-order-item-${e.id||e.variantSku||e.sku}`,W=e=>`${e}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,j=(e,t)=>e.findIndex(r=>t.variantSku&&r.variantSku?r.variantSku===t.variantSku:r.variantSku&&!t.variantSku&&t.sku?r.variantSku===t.sku:t.variantSku&&!r.variantSku&&r.sku?r.sku===t.variantSku:!t.variantSku&&!r.variantSku?r.sku===t.sku:!1),ar=(e,t,r)=>e.findIndex(n=>n.id===r?!1:t.variantSku&&n.variantSku?n.variantSku===t.variantSku:t.variantSku&&!n.variantSku&&n.sku?n.sku===t.variantSku:!1),ur=(e,t,r,n=1)=>e.map((u,i)=>i===r?{...u,quantity:u.quantity+n}:i===t?null:u).filter(Boolean),cr=(e,t,r)=>{const n=[...e],u=[],i=[],a=[];return t.forEach((l,h)=>{const Q=r[h];if(Q!=null&&Q.replaceItemSku){const p=n.findIndex(g=>g.sku===Q.replaceItemSku||g.id===Q.replaceItemSku);if(p!==-1){const g=j(n,l);if(g!==-1&&g!==p){n.splice(p,1);const O=g>p?g-1:g;n[O]={...n[O],quantity:n[O].quantity+l.quantity},a.push(n[O])}else{const O={...l,id:W(l.sku)};n[p]=O,i.push(O)}return}}const q=j(n,l);if(q!==-1)n[q]={...n[q],quantity:n[q].quantity+l.quantity},a.push(n[q]);else{const p={...l,id:W(l.sku)};n.push(p),u.push(p)}}),{updatedItems:n,addedItems:u,replacedItems:i,mergedItems:a}},dr=(e,t,r,n=1)=>{const u=t?ar(e,r,t):-1;if(u!==-1){const a=e.findIndex(l=>l.id===t);return{updatedItems:ur(e,a,u,n),wasMerged:!0,mergedIntoIndex:u}}return{updatedItems:e.map(a=>t&&a.id===t?{...a,...r,id:t}:!t&&a.sku===r.sku?{...a,...r}:a),wasMerged:!1}},lr=e=>e.map(t=>{const r=t.id||t.sku,n=document.forms[`form-${r}`];if(!n)return null;const u=new FormData(n);return u.get("valid")==="true"?or(u):null}),kr=e=>{let t=[];return e&&typeof e=="object"?e.optionsUIDs&&Array.isArray(e.optionsUIDs)?t=e.optionsUIDs:Array.isArray(e)&&(t=e):typeof e=="string"&&(t=[e]),t},G=e=>{try{const t=localStorage.getItem(e);if(t)return JSON.parse(t)}catch(t){console.error("Error reading from localStorage:",t)}return{}},fr=(e,t,r)=>{if(r.length!==0)try{const n=G(e);n[t]=r,localStorage.setItem(e,JSON.stringify(n))}catch(n){console.error("Error saving to localStorage:",n)}},pr=(e,t,r)=>e.map(n=>{const u=t.find(i=>n.sku===i.sku||n.sku===i.variantSku);if(u){const i=u.id||u.sku,a=r[i];if(a&&a.length>0)return{...n,optionsUIDs:a}}return n}),mr=e=>{const t=!e.inStock||!e.addToCartAllowed;if(e.options&&e.options.length>0){if(e.options.some(i=>!i.items||i.items.length===0))return!0;if(e.options.some(i=>i.required)){const i=e.options.every(a=>{var l;return a.required?(l=a.items)==null?void 0:l.some(h=>h.selected):!0});return t||!i}const u=e.options.some(i=>i.items&&i.items.length>0&&i.items.some(a=>a.selected===!0));return t||!u}return t},hr=({getProductsData:e,handleAddToCart:t}={})=>{const[r,n]=R([]),[u,i]=R(!1),[a,l]=R(new Set),[h,Q]=R(!1),[q,p]=R(null),[g,O]=R([]),C=J([]),I=z({validationError:"QuickOrder.QuickOrderItem.notification.validationError",backendError:"QuickOrder.QuickOrderItem.notification.backendError",success:"QuickOrder.QuickOrderItem.notification.success",partialSuccess:"QuickOrder.QuickOrderItem.notification.partialSuccess",unexpectedError:"QuickOrder.QuickOrderItem.notification.unexpectedError"}),B="quick-order-selected-options",F=A(()=>{p(null)},[]),b=A(s=>{Q(s)},[]);y(()=>{const s=S.on("quick-order/loading",o=>{i(o)},{eager:!0});return()=>{s==null||s.off()}},[]),y(()=>{const s=S.on("quick-order/add-items",async o=>{if(o&&o.length>0){if(!e)return;i(!0),S.emit("quick-order/loading",!0);const k=o.map(d=>d.sku).filter(Boolean);l(d=>new Set([...Array.from(d),...k]));try{let d=[];try{const f=await e(o)??[];b(o.length!==f.length),d=L(o,f)}catch(f){console.error("Error fetching products data:",f),d=L(o,[])}const c=x(d);if(c.length>0){const f=c.map(m=>m.sku);p(m=>{if((m==null?void 0:m.type)==="validation"&&m.clickableSkus){const T=[...new Set([...m.clickableSkus,...f])];return{...m,clickableSkus:T}}return{type:"validation",variant:"warning",message:I.validationError,clickableSkus:f}})}n(f=>{const{updatedItems:m,addedItems:T,mergedItems:H,replacedItems:X}=cr(f,d,o);return X.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),H.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),T.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),m})}finally{i(!1),S.emit("quick-order/loading",!1),l(d=>new Set(Array.from(d).filter(c=>!k.includes(c))))}}},{eager:!0});return()=>{s==null||s.off()}},[e,b]),y(()=>{const s=r.map(o=>{const k=w(o),d=o.id;return S.on(`${k}/pdp/data`,c=>{n(f=>dr(f,d||"",c,o.quantity||1).updatedItems)})});return()=>{s==null||s.forEach(o=>{o==null||o.off()})}},[r]),y(()=>{const s=K(r);b(!s)},[r,b]),y(()=>{p(s=>{if(!s||!s.clickableSkus||s.clickableSkus.length===0)return s;const o=s.clickableSkus.filter(k=>{const d=r.filter(c=>c.sku===k||c.variantSku===k);return d.length===0?!1:d.some(c=>mr(c))});return o.length===0?null:o.length!==s.clickableSkus.length?{...s,clickableSkus:o}:s})},[r]),y(()=>{!h||r.length===0||p(s=>{if(s&&(s.type==="validation"||s.type==="partial-success"))return s;const o=x(r);if(o.length===0)return s;const k=[...new Set(o.map(f=>f.sku))],d=(s==null?void 0:s.clickableSkus)||[];return k.length!==d.length||!k.every(f=>d.includes(f))?{type:"validation",variant:"warning",message:I.validationError,clickableSkus:k}:s})},[h,r,I.validationError]),y(()=>{const s=r.map(o=>{const k=w(o),d=o.id||o.sku;return S.on(`${k}/pdp/values`,c=>{const f=kr(c);fr(B,d,f)})});return()=>{s.forEach(o=>{o==null||o.off()})}},[r,B]),y(()=>{C.current=g},[g]),y(()=>{const s=S.on("cart/product/added",k=>{const d=Array.isArray(k)?k.length:0,c=Array.isArray(k)?k.map(f=>f.sku).filter(Boolean):[];if(g.length>0){const f=g.filter(m=>!c.includes(m));f.length>0&&d>0&&(p({type:"partial-success",variant:"warning",message:I.partialSuccess,count:d,clickableSkus:f}),O([]))}else return}),o=S.on("quick-order/add-to-cart-error",k=>{p({type:"backend-error",variant:"warning",message:I.backendError,details:k.message}),O([])});return()=>{s==null||s.off(),o==null||o.off()}},[g]),y(()=>{const s=S.on("cart/data",o=>{if(C.current.length===0||!(o!=null&&o.items)||o.items.length===0)return;const k=o.items.flatMap(c=>{var m;const f=[];return c.sku&&f.push(c.sku),(m=c.product)!=null&&m.sku&&f.push(c.product.sku),f}),d=C.current.filter(c=>k.includes(c));d.length!==0&&(p({type:"success",variant:"success",message:I.success,count:d.length}),O([]),S.emit("quick-order/loading",!1))},{eager:!0});return()=>{s==null||s.off()}},[]);const M=A(s=>{n(o=>o.filter(k=>k.id!==s&&k.sku!==s))},[]),N=A(()=>{n([]),p(null)},[]),V=A((s,o)=>{n(k=>k.map(d=>d.sku===s?{...d,quantity:o}:d))},[]),$=A(s=>a.has(s),[a]),Z=A(()=>{const s=lr(r).filter(c=>c!==null);if(r.length>0&&!K(r)){const m=x(r).map(T=>T.sku);p({type:"validation",variant:"warning",message:I.validationError,clickableSkus:m});return}if(s.length===0){if(r.length>0){const f=x(r).map(m=>m.sku);p({type:"validation",variant:"warning",message:I.validationError,clickableSkus:f})}return}p(null);const o=s.map(c=>c.sku).filter(c=>!!c);O(o);const k=G(B),d=pr(s,r,k);t?(S.emit("quick-order/loading",!0),Promise.resolve(t(d,N)).then(c=>{c&&typeof c=="string"&&(p({type:"backend-error",variant:"warning",message:I.backendError,details:c}),O([]))}).catch(c=>{p({type:"backend-error",variant:"warning",message:I.backendError,details:c.message||I.unexpectedError}),O([])}).finally(()=>{S.emit("quick-order/loading",!1)})):S.emit("quick-order/add-to-cart",d)},[r,t,B]);return{items:r,loading:u,removeItem:M,clearItems:N,updateItemQuantity:V,addToCart:Z,isItemUpdating:$,isDisabledButton:h,setDisabledCartButton:b,notification:q,dismissNotification:F}},gr=({notification:e,onDismiss:t,onSkuClick:r,validationErrorText:n,backendErrorText:u,successText:i,partialSuccessText:a})=>{if(!e)return null;const l=()=>{switch(e.type){case"validation":return Or(n,e.clickableSkus,e.details,r);case"partial-success":return Sr(a,e.message,e.count,e.clickableSkus,r);case"backend-error":return Ir(u,e.details);case"success":return Qr(i,e.count);default:return v("span",{children:e.message})}};return v("div",{className:P(["b2b-quick-order-notification-banner",[`b2b-quick-order-notification-banner--${e.variant}`,e.variant]]),children:v(rr,{variant:e.variant,message:l(),onDismiss:t})})};function Y(e,t){return e.map((r,n)=>D("span",{children:[v("a",{href:"#",onClick:u=>{u.preventDefault(),t(r)},style:{cursor:"pointer",textDecoration:"underline",color:"white"},children:r}),n<e.length-1?", ":""]},r))}function Or(e,t,r,n){return t!=null&&t.length&&n?D("span",{children:[e," - ",Y(t,n)]}):D("span",{children:[e," - ",r]})}function Sr(e,t,r,n,u){if(!e)return v("span",{children:t});const i=e.replace("{count}",String(r||0)).replace("{total}",String((r||0)+((n==null?void 0:n.length)||0)));return n!=null&&n.length&&u?D("span",{children:[i,": ",Y(n,u)]}):D("span",{children:[i,": ",(n==null?void 0:n.join(", "))||"Unknown"]})}function Ir(e,t){return D("span",{children:[e,t?` - ${t}`:""]})}function Qr(e,t){return t!==void 0?v("span",{children:e.replace("{count}",String(t))}):v("span",{children:e})}const Ur=({className:e,slots:t,getProductsData:r,handleAddToCart:n,productsSearch:u,searchFilter:i})=>{const a=nr.getConfig().quickOrderActive,l=J(null),h=z({title:"QuickOrder.QuickOrderItem.title",quantity:"QuickOrder.QuickOrderItem.quantity",price:"QuickOrder.QuickOrderItem.price",remove:"QuickOrder.QuickOrderItem.remove",removeItem:"QuickOrder.QuickOrderItem.removeItem",showOptions:"QuickOrder.QuickOrderItem.showOptions",hideOptions:"QuickOrder.QuickOrderItem.hideOptions",additionalOptions:"QuickOrder.QuickOrderItem.additionalOptions",noAdditionalOptions:"QuickOrder.QuickOrderItem.noAdditionalOptions",emptyList:"QuickOrder.QuickOrderItem.emptyList",sku:"QuickOrder.QuickOrderItem.sku",loading:"QuickOrder.QuickOrderItem.loading",productNotFound:"QuickOrder.QuickOrderItem.productNotFound",productNotFoundDescription:"QuickOrder.QuickOrderItem.productNotFoundDescription",productOptions:"QuickOrder.QuickOrderItem.productOptions",configurableProductError:"QuickOrder.QuickOrderItem.configurableProductError",configurableProductErrorDescription:"QuickOrder.QuickOrderItem.configurableProductErrorDescription",addAllToCart:"QuickOrder.QuickOrderItem.addAllToCart",configurableOptionsWarning:"QuickOrder.QuickOrderItem.configurableOptionsWarning",configurableOptionsWarningDescription:"QuickOrder.QuickOrderItem.configurableOptionsWarningDescription",outOfStock:"QuickOrder.QuickOrderItem.outOfStock",searchPlaceholder:"QuickOrder.Search.placeholder",searchAriaLabel:"QuickOrder.Search.ariaLabel",searchEmptyState:"QuickOrder.Search.emptyState",resultsAvailable:"QuickOrder.Search.resultsAvailable",resultAvailable:"QuickOrder.Search.resultAvailable",srInstructions:"QuickOrder.Search.srInstructions",notificationValidationError:"QuickOrder.QuickOrderItem.notification.validationError",notificationBackendError:"QuickOrder.QuickOrderItem.notification.backendError",notificationSuccess:"QuickOrder.QuickOrderItem.notification.success",notificationPartialSuccess:"QuickOrder.QuickOrderItem.notification.partialSuccess",disabledMessage:"QuickOrder.QuickOrderItem.disabledMessage"}),{items:Q,loading:q,removeItem:p,clearItems:g,updateItemQuantity:O,addToCart:C,isItemUpdating:I,setDisabledCartButton:B,isDisabledButton:F,notification:b,dismissNotification:M}=hr({getProductsData:r,handleAddToCart:n});y(()=>{b&&b.variant==="warning"&&l.current&&l.current.scrollIntoView({behavior:"smooth",block:"start"})},[b]);const N=V=>{const $=document.querySelector(`form[data-sku="${V}"]`);$&&$.scrollIntoView({behavior:"smooth",block:"center"})};return D("div",{className:P(["b2b-quick-order-quick-order-items",!a&&"b2b-quick-order-disabled",e]),"data-testid":"quick-order-items",style:{position:"relative"},children:[v("div",{ref:l,children:v(gr,{notification:b,onDismiss:M,onSkuClick:N,validationErrorText:h.notificationValidationError,backendErrorText:h.notificationBackendError,successText:h.notificationSuccess,partialSuccessText:h.notificationPartialSuccess})}),v(tr,{isDisabled:!a,message:h.disabledMessage,children:v(er,{t:h,items:Q,onRemove:p,clearItems:g,onUpdateQuantity:O,handleAddToCart:C,isItemUpdating:I,slots:t,loading:q,setDisabledCartButton:B,isDisabledButton:F,productsSearch:u,searchFilter:i})})]})};export{Ur as QuickOrderItems,Ur as default};
3
+ import{jsx as v,jsxs as D}from"@dropins/tools/preact-jsx-runtime.js";import{AlertBanner as rr}from"@dropins/tools/components.js";import{Q as tr,a as er}from"../chunks/QuickOrderDisabledOverlay.js";import{classes as P}from"@dropins/tools/lib.js";import"../chunks/debounce.js";import{useState as R,useRef as J,useCallback as A,useEffect as y}from"@dropins/tools/preact-hooks.js";import{events as S}from"@dropins/tools/event-bus.js";import{useText as z}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-compat.js";import{c as nr}from"../chunks/getStoreConfig.js";import"@dropins/tools/fetch-graphql.js";const sr=["sku","parentSku","quantity","optionsUIDs","valid","productType"],ir=e=>{const t=[],r=[];return e.forEach((n,u)=>{if(sr.includes(u))return;const i=n;i&&i.match(/^[A-Za-z0-9+/=]+$/)?t.push(i):r.push({uid:u,value:i})}),{optionUIDs:t,enteredOptions:r}},or=e=>{const t=Number(e.get("quantity")),r=!t||t<1?1:t,n={sku:e.get("sku"),quantity:r},u=e.get("parentSku");u&&(n.parentSku=u);const{optionUIDs:i,enteredOptions:a}=ir(e);return i.length>0&&(n.optionsUIDs=i),a.length>0&&(n.enteredOptions=a),n},_={sku:"",quantity:1,name:"",images:[],inStock:!1,addToCartAllowed:!1,isBundle:!1,prices:{},attributes:[],options:[],url:"",urlKey:"",externalId:"",productType:"simple",shortDescription:"",metaDescription:"",metaKeyword:"",metaTitle:"",description:""},L=(e,t)=>!t||!Array.isArray(t)?e.map(r=>({..._,sku:r.sku,quantity:r.quantity??1})):e.map(r=>{const n=t.find(u=>(u==null?void 0:u.sku)===(r==null?void 0:r.sku));return n?{...n,...r.variantSku&&{variantSku:r.variantSku},quantity:r.quantity??1}:{..._,sku:r.sku,...r.variantSku&&{variantSku:r.variantSku},quantity:r.quantity??1}}),K=e=>e.length===0?!1:e.every(t=>!((t.urlKey||t.url)&&t.name)||t.inStock===!1?!1:t.options&&t.options.length>0?t.options.some(i=>i.required)?t.options.every(i=>{var a;return i.required?(a=i.items)==null?void 0:a.some(l=>l.selected):!0}):t.options.some(i=>i.items&&i.items.length>0&&i.items.some(a=>a.selected===!0)):!0),x=e=>{const t=[];return e.forEach(r=>{if(!((r.urlKey||r.url)&&r.name)){t.push({sku:r.sku,name:r.name||"Unknown",reason:"incomplete_data"});return}if(r.inStock===!1){t.push({sku:r.sku,name:r.name,reason:"out_of_stock"});return}if(r.options&&r.options.length>0){if(r.options.some(a=>a.required)){r.options.every(l=>{var h;return l.required?(h=l.items)==null?void 0:h.some(Q=>Q.selected):!0})||t.push({sku:r.sku,name:r.name,reason:"missing_required_options"});return}r.options.some(a=>a.items&&a.items.length>0&&a.items.some(l=>l.selected===!0))||t.push({sku:r.sku,name:r.name,reason:"missing_options"})}}),t},w=e=>`quick-order-item-${e.id||e.variantSku||e.sku}`,W=e=>`${e}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,j=(e,t)=>e.findIndex(r=>t.variantSku&&r.variantSku?r.variantSku===t.variantSku:r.variantSku&&!t.variantSku&&t.sku?r.variantSku===t.sku:t.variantSku&&!r.variantSku&&r.sku?r.sku===t.variantSku:!t.variantSku&&!r.variantSku?r.sku===t.sku:!1),ar=(e,t,r)=>e.findIndex(n=>n.id===r?!1:t.variantSku&&n.variantSku?n.variantSku===t.variantSku:t.variantSku&&!n.variantSku&&n.sku?n.sku===t.variantSku:!1),ur=(e,t,r,n=1)=>e.map((u,i)=>i===r?{...u,quantity:u.quantity+n}:i===t?null:u).filter(Boolean),cr=(e,t,r)=>{const n=[...e],u=[],i=[],a=[];return t.forEach((l,h)=>{const Q=r[h];if(Q!=null&&Q.replaceItemSku){const p=n.findIndex(g=>g.sku===Q.replaceItemSku||g.id===Q.replaceItemSku);if(p!==-1){const g=j(n,l);if(g!==-1&&g!==p){n.splice(p,1);const O=g>p?g-1:g;n[O]={...n[O],quantity:n[O].quantity+l.quantity},a.push(n[O])}else{const O={...l,id:W(l.sku)};n[p]=O,i.push(O)}return}}const q=j(n,l);if(q!==-1)n[q]={...n[q],quantity:n[q].quantity+l.quantity},a.push(n[q]);else{const p={...l,id:W(l.sku)};n.push(p),u.push(p)}}),{updatedItems:n,addedItems:u,replacedItems:i,mergedItems:a}},dr=(e,t,r,n=1)=>{const u=t?ar(e,r,t):-1;if(u!==-1){const a=e.findIndex(l=>l.id===t);return{updatedItems:ur(e,a,u,n),wasMerged:!0,mergedIntoIndex:u}}return{updatedItems:e.map(a=>t&&a.id===t?{...a,...r,id:t}:!t&&a.sku===r.sku?{...a,...r}:a),wasMerged:!1}},lr=e=>e.map(t=>{const r=t.id||t.sku,n=document.forms[`form-${r}`];if(!n)return null;const u=new FormData(n);return u.get("valid")==="true"?or(u):null}),kr=e=>{let t=[];return e&&typeof e=="object"?e.optionsUIDs&&Array.isArray(e.optionsUIDs)?t=e.optionsUIDs:Array.isArray(e)&&(t=e):typeof e=="string"&&(t=[e]),t},G=e=>{try{const t=localStorage.getItem(e);if(t)return JSON.parse(t)}catch(t){console.error("Error reading from localStorage:",t)}return{}},fr=(e,t,r)=>{if(r.length!==0)try{const n=G(e);n[t]=r,localStorage.setItem(e,JSON.stringify(n))}catch(n){console.error("Error saving to localStorage:",n)}},pr=(e,t,r)=>e.map(n=>{const u=t.find(i=>n.sku===i.sku||n.sku===i.variantSku);if(u){const i=u.id||u.sku,a=r[i];if(a&&a.length>0)return{...n,optionsUIDs:a}}return n}),mr=e=>{const t=!e.inStock||!e.addToCartAllowed;if(e.options&&e.options.length>0){if(e.options.some(i=>!i.items||i.items.length===0))return!0;if(e.options.some(i=>i.required)){const i=e.options.every(a=>{var l;return a.required?(l=a.items)==null?void 0:l.some(h=>h.selected):!0});return t||!i}const u=e.options.some(i=>i.items&&i.items.length>0&&i.items.some(a=>a.selected===!0));return t||!u}return t},hr=({getProductsData:e,handleAddToCart:t}={})=>{const[r,n]=R([]),[u,i]=R(!1),[a,l]=R(new Set),[h,Q]=R(!1),[q,p]=R(null),[g,O]=R([]),C=J([]),I=z({validationError:"QuickOrder.QuickOrderItem.notification.validationError",backendError:"QuickOrder.QuickOrderItem.notification.backendError",success:"QuickOrder.QuickOrderItem.notification.success",partialSuccess:"QuickOrder.QuickOrderItem.notification.partialSuccess",unexpectedError:"QuickOrder.QuickOrderItem.notification.unexpectedError"}),B="quick-order-selected-options",F=A(()=>{p(null)},[]),b=A(s=>{Q(s)},[]);y(()=>{const s=S.on("quick-order/loading",o=>{i(o)},{eager:!0});return()=>{s==null||s.off()}},[]),y(()=>{const s=S.on("quick-order/add-items",async o=>{if(o&&o.length>0){if(!e)return;i(!0),S.emit("quick-order/loading",!0);const k=o.map(d=>d.sku).filter(Boolean);l(d=>new Set([...Array.from(d),...k]));try{let d=[];try{const f=await e(o)??[];b(o.length!==f.length),d=L(o,f)}catch(f){console.error("Error fetching products data:",f),d=L(o,[])}const c=x(d);if(c.length>0){const f=c.map(m=>m.sku);p(m=>{if((m==null?void 0:m.type)==="validation"&&m.clickableSkus){const T=[...new Set([...m.clickableSkus,...f])];return{...m,clickableSkus:T}}return{type:"validation",variant:"warning",message:I.validationError,clickableSkus:f}})}n(f=>{const{updatedItems:m,addedItems:T,mergedItems:H,replacedItems:X}=cr(f,d,o);return X.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),H.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),T.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),m})}finally{i(!1),S.emit("quick-order/loading",!1),l(d=>new Set(Array.from(d).filter(c=>!k.includes(c))))}}},{eager:!0});return()=>{s==null||s.off()}},[e,b]),y(()=>{const s=r.map(o=>{const k=w(o),d=o.id;return S.on(`${k}/pdp/data`,c=>{n(f=>dr(f,d||"",c,o.quantity||1).updatedItems)})});return()=>{s==null||s.forEach(o=>{o==null||o.off()})}},[r]),y(()=>{const s=K(r);b(!s)},[r,b]),y(()=>{p(s=>{if(!s||!s.clickableSkus||s.clickableSkus.length===0)return s;const o=s.clickableSkus.filter(k=>{const d=r.filter(c=>c.sku===k||c.variantSku===k);return d.length===0?!1:d.some(c=>mr(c))});return o.length===0?null:o.length!==s.clickableSkus.length?{...s,clickableSkus:o}:s})},[r]),y(()=>{!h||r.length===0||p(s=>{if(s&&(s.type==="validation"||s.type==="partial-success"))return s;const o=x(r);if(o.length===0)return s;const k=[...new Set(o.map(f=>f.sku))],d=(s==null?void 0:s.clickableSkus)||[];return k.length!==d.length||!k.every(f=>d.includes(f))?{type:"validation",variant:"warning",message:I.validationError,clickableSkus:k}:s})},[h,r,I.validationError]),y(()=>{const s=r.map(o=>{const k=w(o),d=o.id||o.sku;return S.on(`${k}/pdp/values`,c=>{const f=kr(c);fr(B,d,f)})});return()=>{s.forEach(o=>{o==null||o.off()})}},[r,B]),y(()=>{C.current=g},[g]),y(()=>{const s=S.on("cart/product/added",k=>{const d=Array.isArray(k)?k.length:0,c=Array.isArray(k)?k.map(f=>f.sku).filter(Boolean):[];if(g.length>0){const f=g.filter(m=>!c.includes(m));f.length>0&&d>0&&(p({type:"partial-success",variant:"warning",message:I.partialSuccess,count:d,clickableSkus:f}),O([]))}else return}),o=S.on("quick-order/add-to-cart-error",k=>{p({type:"backend-error",variant:"warning",message:I.backendError,details:k.message}),O([])});return()=>{s==null||s.off(),o==null||o.off()}},[g]),y(()=>{const s=S.on("cart/data",o=>{if(C.current.length===0||!(o!=null&&o.items)||o.items.length===0)return;const k=o.items.flatMap(c=>{var m;const f=[];return c.sku&&f.push(c.sku),(m=c.product)!=null&&m.sku&&f.push(c.product.sku),f}),d=C.current.filter(c=>k.includes(c));d.length!==0&&(p({type:"success",variant:"success",message:I.success,count:d.length}),O([]),S.emit("quick-order/loading",!1))},{eager:!0});return()=>{s==null||s.off()}},[]);const M=A(s=>{n(o=>o.filter(k=>k.id!==s&&k.sku!==s))},[]),N=A(()=>{n([]),p(null)},[]),V=A((s,o)=>{n(k=>k.map(d=>d.sku===s?{...d,quantity:o}:d))},[]),$=A(s=>a.has(s),[a]),Z=A(()=>{const s=lr(r).filter(c=>c!==null);if(r.length>0&&!K(r)){const m=x(r).map(T=>T.sku);p({type:"validation",variant:"warning",message:I.validationError,clickableSkus:m});return}if(s.length===0){if(r.length>0){const f=x(r).map(m=>m.sku);p({type:"validation",variant:"warning",message:I.validationError,clickableSkus:f})}return}p(null);const o=s.map(c=>c.sku).filter(c=>!!c);O(o);const k=G(B),d=pr(s,r,k);t?(S.emit("quick-order/loading",!0),Promise.resolve(t(d,N)).then(c=>{c&&typeof c=="string"&&(p({type:"backend-error",variant:"warning",message:I.backendError,details:c}),O([]))}).catch(c=>{p({type:"backend-error",variant:"warning",message:I.backendError,details:c.message||I.unexpectedError}),O([])}).finally(()=>{S.emit("quick-order/loading",!1)})):S.emit("quick-order/add-to-cart",d)},[r,t,B]);return{items:r,loading:u,removeItem:M,clearItems:N,updateItemQuantity:V,addToCart:Z,isItemUpdating:$,isDisabledButton:h,setDisabledCartButton:b,notification:q,dismissNotification:F}},gr=({notification:e,onDismiss:t,onSkuClick:r,validationErrorText:n,backendErrorText:u,successText:i,partialSuccessText:a})=>{if(!e)return null;const l=()=>{switch(e.type){case"validation":return Or(n,e.clickableSkus,e.details,r);case"partial-success":return Sr(a,e.message,e.count,e.clickableSkus,r);case"backend-error":return Ir(u,e.details);case"success":return Qr(i,e.count);default:return v("span",{children:e.message})}};return v("div",{className:P(["b2b-quick-order-notification-banner",[`b2b-quick-order-notification-banner--${e.variant}`,e.variant]]),children:v(rr,{variant:e.variant,message:l(),onDismiss:t})})};function Y(e,t){return e.map((r,n)=>D("span",{children:[v("a",{href:"#",onClick:u=>{u.preventDefault(),t(r)},style:{cursor:"pointer",textDecoration:"underline",color:"white"},children:r}),n<e.length-1?", ":""]},r))}function Or(e,t,r,n){return t!=null&&t.length&&n?D("span",{children:[e," - ",Y(t,n)]}):D("span",{children:[e," - ",r]})}function Sr(e,t,r,n,u){if(!e)return v("span",{children:t});const i=e.replace("{count}",String(r||0)).replace("{total}",String((r||0)+((n==null?void 0:n.length)||0)));return n!=null&&n.length&&u?D("span",{children:[i,": ",Y(n,u)]}):D("span",{children:[i,": ",(n==null?void 0:n.join(", "))||"Unknown"]})}function Ir(e,t){return D("span",{children:[e,t?` - ${t}`:""]})}function Qr(e,t){return t!==void 0?v("span",{children:e.replace("{count}",String(t))}):v("span",{children:e})}const Ur=({className:e,slots:t,getProductsData:r,handleAddToCart:n,productsSearch:u,searchFilter:i})=>{const a=nr.getConfig().quickOrderActive,l=J(null),h=z({title:"QuickOrder.QuickOrderItem.title",quantity:"QuickOrder.QuickOrderItem.quantity",price:"QuickOrder.QuickOrderItem.price",remove:"QuickOrder.QuickOrderItem.remove",removeItem:"QuickOrder.QuickOrderItem.removeItem",showOptions:"QuickOrder.QuickOrderItem.showOptions",hideOptions:"QuickOrder.QuickOrderItem.hideOptions",additionalOptions:"QuickOrder.QuickOrderItem.additionalOptions",noAdditionalOptions:"QuickOrder.QuickOrderItem.noAdditionalOptions",emptyList:"QuickOrder.QuickOrderItem.emptyList",sku:"QuickOrder.QuickOrderItem.sku",loading:"QuickOrder.QuickOrderItem.loading",productNotFound:"QuickOrder.QuickOrderItem.productNotFound",productNotFoundDescription:"QuickOrder.QuickOrderItem.productNotFoundDescription",productOptions:"QuickOrder.QuickOrderItem.productOptions",configurableProductError:"QuickOrder.QuickOrderItem.configurableProductError",configurableProductErrorDescription:"QuickOrder.QuickOrderItem.configurableProductErrorDescription",addAllToCart:"QuickOrder.QuickOrderItem.addAllToCart",configurableOptionsWarning:"QuickOrder.QuickOrderItem.configurableOptionsWarning",configurableOptionsWarningDescription:"QuickOrder.QuickOrderItem.configurableOptionsWarningDescription",outOfStock:"QuickOrder.QuickOrderItem.outOfStock",searchPlaceholder:"QuickOrder.Search.placeholder",searchAriaLabel:"QuickOrder.Search.ariaLabel",searchEmptyState:"QuickOrder.Search.emptyState",resultsAvailable:"QuickOrder.Search.resultsAvailable",resultAvailable:"QuickOrder.Search.resultAvailable",srInstructions:"QuickOrder.Search.srInstructions",notificationValidationError:"QuickOrder.QuickOrderItem.notification.validationError",notificationBackendError:"QuickOrder.QuickOrderItem.notification.backendError",notificationSuccess:"QuickOrder.QuickOrderItem.notification.success",notificationPartialSuccess:"QuickOrder.QuickOrderItem.notification.partialSuccess",disabledMessage:"QuickOrder.QuickOrderItem.disabledMessage"}),{items:Q,loading:q,removeItem:p,clearItems:g,updateItemQuantity:O,addToCart:C,isItemUpdating:I,setDisabledCartButton:B,isDisabledButton:F,notification:b,dismissNotification:M}=hr({getProductsData:r,handleAddToCart:n});y(()=>{b&&b.variant==="warning"&&l.current&&l.current.scrollIntoView({behavior:"smooth",block:"start"})},[b]);const N=V=>{const $=document.querySelector(`form[data-sku="${V}"]`);$&&$.scrollIntoView({behavior:"smooth",block:"center"})};return D("div",{className:P(["b2b-quick-order-quick-order-items",!a&&"b2b-quick-order-disabled",e]),"data-testid":"quick-order-items",style:{position:"relative"},children:[v("div",{ref:l,children:v(gr,{notification:b,onDismiss:M,onSkuClick:N,validationErrorText:h.notificationValidationError,backendErrorText:h.notificationBackendError,successText:h.notificationSuccess,partialSuccessText:h.notificationPartialSuccess})}),v(tr,{isDisabled:!a,message:h.disabledMessage,children:v(er,{t:h,items:Q,onRemove:p,clearItems:g,onUpdateQuantity:O,handleAddToCart:C,isItemUpdating:I,slots:t,loading:q,setDisabledCartButton:B,isDisabledButton:F,productsSearch:u,searchFilter:i})})]})};export{Ur as QuickOrderItems,Ur as default};
4
4
  //# sourceMappingURL=QuickOrderItems.js.map